diff --git a/.github/workflows/airdodge_faf_reminder.yml b/.github/workflows/airdodge_faf_reminder.yml new file mode 100644 index 0000000000..1fb0c573c3 --- /dev/null +++ b/.github/workflows/airdodge_faf_reminder.yml @@ -0,0 +1,47 @@ +name: Reminder to update airdodge FAF when fallspeed params are edited + +on: + pull_request: + branches: + - pre-release + types: [opened, reopened, synchronize] + +jobs: + scan-diff: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Search for air_accel_y/air_speed_y_stable param edits + id: param_change_search + run: | + FILE_PATH="romfs/source/fighter/common/param/fighter_param.prcxml" + + BEFORE=${{ github.event.before }} + AFTER=${{ github.event.after }} + + # If 'before' is all zeros (initial push), compare against the parent of HEAD + if [ "${{ github.event.action }}" == "opened" ] || [ "${{ github.event.action }}" == "reopened" ]; then + BEFORE="HEAD^" + fi + + if git diff --unified=0 $BEFORE $AFTER -- "$FILE_PATH" | grep -qE "(air_accel_y|air_speed_y_stable)"; then + echo "found=true" >> $GITHUB_OUTPUT + else + echo "found=false" >> $GITHUB_OUTPUT + fi + + - name: Post Comment + if: steps.param_change_search.outputs.found == 'true' + uses: peter-evans/create-or-update-comment@v4 + with: + issue-number: ${{ github.event.pull_request.number }} + body: | + I see you have edited either the `air_accel_y` or `air_speed_y_stable` params for a character. Did you remember to update their airdodge FAF params accordingly? :) + + You can use the airdodge FAF calculator here: https://www.desmos.com/calculator/8rgzdgk19v + + Airdodge FAF params (`escape_air_cancel_frame` and `escape_air_slide_cancel_frame`) are found in *fighter_param_motion.prcxml*. diff --git a/.github/workflows/build_devrelease.yml b/.github/workflows/build_devrelease.yml index acfe5816d0..d7be85f022 100644 --- a/.github/workflows/build_devrelease.yml +++ b/.github/workflows/build_devrelease.yml @@ -1,41 +1,26 @@ name: build_devrelease on: workflow_dispatch: + inputs: + romfs-ref: + description: 'Git ref for the hdr-private romfs clone (branch, tag, or sha)' + required: false + default: 'dev' + type: string + bundle-stages: + description: 'Include hdr-stages in romfs.zip' + required: false + default: false + type: boolean jobs: - version_check: - runs-on: ubuntu-24.04 - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} - steps: - - id: latest_package - continue-on-error: true - uses: pozetroninc/github-action-get-latest-release@master - with: - repository: HDR-Development/HDR-DevReleases - token: ${{ secrets.RELEASE_TOKEN }} - - # fail out if there's already a release for this commit - - name: ensure one build per sha - if: ${{ contains(steps.latest_package.outputs.description, github.sha) }} - run: exit 1 - plugin_build: env: PLUGIN_NAME: hdr runs-on: ubuntu-24.04 - needs: version_check - container: + container: image: wuboyth/skyline-plugin-builder:latest steps: - # - name: Free Disk Space (Ubuntu) - # uses: jlumbroso/free-disk-space@v1.3.1 - - # - name: setup python - # uses: actions/setup-python@v5.1.0 - # with: - # python-version: '3.9' # Version range or exact version of a Python version to use, using SemVer's version range syntax - - name: checkout version uses: actions/checkout@v4.1.4 @@ -53,87 +38,87 @@ jobs: current_version: ${{ steps.package_latest.outputs.release }} level: patch + - name: clone romfs + id: clone_romfs + run: | + apt-get update && apt-get install -y zip + git clone --branch ${{ github.event.inputs.romfs-ref }} --depth 1 \ + https://x-access-token:${{ secrets.RELEASE_TOKEN }}@github.com/HDR-Development/hdr-private.git hdr-private + cd hdr-private/romfs + if [ "${{ github.event.inputs.bundle-stages }}" = "true" ]; then + zip -r ../../romfs.zip hdr-assets hdr-stages + else + zip -r ../../romfs.zip hdr-assets + fi + env: + GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} + # build the project - run: | - cd scripts && NO_RUST_NIGHTLY=1 python3 make_dist.py build version=${{ steps.bump-semver.outputs.new_version }}-private name=hdr-private && cd .. + cd scripts && NO_RUST_NIGHTLY=1 python3 make_dist.py build version=${{ steps.bump-semver.outputs.new_version }}-private name=hdr && cd .. du -sh * rm -rf target du -sh * env: HOME: /root - - id: romfs_version - uses: pozetroninc/github-action-get-latest-release@master - with: - token: ${{ secrets.RELEASE_TOKEN }} - repository: HDR-Development/romfs-release - - - name: Download romfs - id: get_romfs - uses: dsaltares/fetch-gh-release-asset@master - with: - repo: 'HDR-Development/romfs-release' - version: 'tags/${{ steps.romfs_version.outputs.release }}' - file: 'romfs.zip' - token: ${{ secrets.RELEASE_TOKEN }} - - name: make package run: | python3 scripts/full_package.py devrelease none - - name: Download latest switch package - id: get_old_switch_package - if: steps.package_latest.outcome != 'failure' - uses: dsaltares/fetch-gh-release-asset@master - with: - repo: 'HDR-Development/HDR-DevReleases' - version: 'tags/${{ steps.package_latest.outputs.release }}' - file: 'switch-package.zip' - token: ${{ secrets.RELEASE_TOKEN }} + # - name: Download latest switch package + # id: get_old_switch_package + # if: steps.package_latest.outcome != 'failure' + # uses: dsaltares/fetch-gh-release-asset@master + # with: + # repo: 'HDR-Development/HDR-DevReleases' + # version: 'tags/${{ steps.package_latest.outputs.release }}' + # file: 'switch-package.zip' + # token: ${{ secrets.RELEASE_TOKEN }} # build the upgrade.zip and deletions.json - - name: make upgrade artifacts - if: steps.package_latest.outcome != 'failure' - run: | - python3 scripts/make_diff.py devrelease + # - name: make upgrade artifacts + # if: steps.package_latest.outcome != 'failure' + # run: | + # python3 scripts/make_diff.py devrelease - - name: show upgrade artifacts - if: steps.package_latest.outcome != 'failure' - run: | - ls && stat * && echo && ls upgrade_artifacts && stat upgrade_artifacts/* + # - name: show upgrade artifacts + # if: steps.package_latest.outcome != 'failure' + # run: | + # ls && stat * && echo && ls upgrade_artifacts && stat upgrade_artifacts/* # upload the upgrade data to the previous release for auto updater - - name: Upload upgrade data to previous release - if: steps.package_latest.outcome != 'failure' - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.RELEASE_TOKEN }} - file: upgrade_artifacts/upgrade.zip - prerelease: true - make_latest: false - file_glob: true - asset_name: upgrade - repo_name: HDR-Development/HDR-DevReleases - tag: ${{ steps.package_latest.outputs.release }} - overwrite: true + # - name: Upload upgrade data to previous release + # if: steps.package_latest.outcome != 'failure' + # uses: svenstaro/upload-release-action@v2 + # with: + # repo_token: ${{ secrets.RELEASE_TOKEN }} + # file: upgrade_artifacts/upgrade.zip + # prerelease: true + # make_latest: false + # file_glob: true + # asset_name: upgrade + # repo_name: HDR-Development/HDR-DevReleases + # tag: ${{ steps.package_latest.outputs.release }} + # overwrite: true # upload the upgrade deletions to the previous release for auto updater - - name: Upload upgrade deletions to previous release - if: steps.package_latest.outcome != 'failure' - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.RELEASE_TOKEN }} - file: upgrade_artifacts/deletions.json - prerelease: true - make_latest: false - file_glob: true - asset_name: deletions - repo_name: HDR-Development/HDR-DevReleases - tag: ${{ steps.package_latest.outputs.release }} - overwrite: true - - - name: Display structure of downloaded version - run: ls -R && cp hdr_version.txt artifacts + # - name: Upload upgrade deletions to previous release + # if: steps.package_latest.outcome != 'failure' + # uses: svenstaro/upload-release-action@v2 + # with: + # repo_token: ${{ secrets.RELEASE_TOKEN }} + # file: upgrade_artifacts/deletions.json + # prerelease: true + # make_latest: false + # file_glob: true + # asset_name: deletions + # repo_name: HDR-Development/HDR-DevReleases + # tag: ${{ steps.package_latest.outputs.release }} + # overwrite: true + + # - name: Display structure of downloaded version + # run: ls -R && cp hdr_version.txt artifacts - name: Upload full package to devreleases uses: svenstaro/upload-release-action@v2 diff --git a/.github/workflows/build_prerelease.yml b/.github/workflows/build_prerelease.yml index 1d5197b8c5..6e5fe4fa47 100644 --- a/.github/workflows/build_prerelease.yml +++ b/.github/workflows/build_prerelease.yml @@ -1,8 +1,12 @@ name: build_prerelease on: - push: - branches: - - dev + workflow_dispatch: + inputs: + romfs_version: + type: string + description: 'The romfs version tag to use' + required: true + default: 'latest' jobs: # bump the version and build the changelog @@ -10,20 +14,22 @@ jobs: runs-on: ubuntu-24.04 env: GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} - outputs: + outputs: version: ${{ steps.push_tag.outputs.version }} changelog: ${{ steps.github_changelog.outputs.changelog }} steps: - # fail out if this is not a merge commit - - name: ensure merge - if: ${{ !startsWith(github.event.head_commit.message, 'Merge') }} - run: exit 1 - - name: checkout version uses: actions/checkout@v4.1.4 - with: + with: fetch-depth: 0 + # fail out if this is not a merge commit + - name: ensure merge + run: | + if ! git log -1 --pretty=%s | grep -q "^Merge"; then + exit 1 + fi + - name: get last merge id: last_merge shell: bash @@ -80,14 +86,14 @@ jobs: PLUGIN_NAME: hdr runs-on: ubuntu-24.04 needs: version_and_changelog - container: + container: image: wuboyth/skyline-plugin-builder:latest steps: # - name: setup python # uses: actions/setup-python@v5.1.0 # with: # python-version: '3.9' # Version range or exact version of a Python version to use, using SemVer's version range syntax - + - name: checkout version uses: actions/checkout@v4.1.4 @@ -143,8 +149,8 @@ jobs: tag: ${{ needs.version_and_changelog.outputs.version }} overwrite: true body: ${{ needs.version_and_changelog.outputs.changelog }} - - # wait for any previous prereleases to complete, since we dont want to step on any + + # wait for any previous prereleases to complete, since we dont want to step on any # full package uploads prior to this one. wait_for_previous_builds: runs-on: ubuntu-24.04 @@ -152,7 +158,7 @@ jobs: steps: - name: checkout version uses: actions/checkout@v4.1.4 - with: + with: fetch-depth: 0 - uses: ahmadnassri/action-workflow-queue@v1 with: @@ -168,10 +174,16 @@ jobs: uses: actions/checkout@v4.1.4 - id: romfs_version - uses: pozetroninc/github-action-get-latest-release@master - with: - token: ${{ secrets.RELEASE_TOKEN }} - repository: HDR-Development/romfs-release + shell: bash + run: | + if [ "${{ inputs.romfs_version }}" = "latest" ]; then + RELEASE=$(curl -s -H "Authorization: Bearer ${{ secrets.RELEASE_TOKEN }}" \ + https://api.github.com/repos/HDR-Development/romfs-release/releases/latest \ + | python3 -c "import sys,json; print(json.load(sys.stdin)['tag_name'])") + echo "release=$RELEASE" >> $GITHUB_OUTPUT + else + echo "release=${{ inputs.romfs_version }}" >> $GITHUB_OUTPUT + fi - name: Download romfs id: get_romfs @@ -235,14 +247,14 @@ jobs: - uses: actions/download-artifact@v4.1.7 with: name: changelog - + - name: Display structure of downloaded changelog run: ls -R && cp CHANGELOG.md artifacts - uses: actions/download-artifact@v4.1.7 with: name: version - + # build the lvd files # - id: lvd_files # uses: robinraju/release-downloader@v1.7 @@ -400,7 +412,7 @@ jobs: repo_name: HDR-Development/HDR-PreReleases tag: ${{ needs.version_and_changelog.outputs.version }} overwrite: true - + # upload the to_beta_deletions.json to the beta for the launcher - name: Upload to_beta_deletions.json to prerelease uses: svenstaro/upload-release-action@v2 diff --git a/Cargo.toml b/Cargo.toml index 3a5a0ea6ce..f79445337c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,10 +13,12 @@ prefix = "hdr" [workspace.dependencies] skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } skyline-web = { git = "https://github.com/skyline-rs/skyline-web" } smashline = { git = "https://github.com/HDR-Development/smashline" } -ssbusync = { git = "https://github.com/BlankMauser/ssbu-sync.git", default-features = false } +# ssbusync = { git = "https://github.com/BlankMauser/ssbu-sync.git", tag = "1.0.3", default-features = false } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } dynamic = { path = "dynamic" } hdr-macros = { path = "hdr-macros" } @@ -220,26 +222,28 @@ zelda = { workspace = true, optional = true } dynamic.workspace = true locks = { git = "https://github.com/HDR-Development/smashline" } -hid-hdr = { git = "https://github.com/HDR-Development/hid-hdr", features = ["warnings"] } +# hid-hdr = { git = "https://github.com/HDR-Development/hid-hdr", features = ["warnings"] } once_cell = "1" -ninput = { git = "https://github.com/blu-dev/ninput" } +ninput = { git = "https://github.com/HDR-Development/ninput" } rand = { git = "https://github.com/skyline-rs/rand" } serde = { version = "1", features = ["derive"] } toml = "0.8.20" parking_lot = "0.12.3" -runtime-motion-patcher.git = "https://github.com/blu-dev/runtime-motion-patcher" +runtime-motion-patcher.git = "https://github.com/WuBoytH/runtime-motion-patcher" skyline.workspace = true skyline_smash.workspace = true smashline.workspace = true -ssbusync = { git = "https://github.com/BlankMauser/ssbu-sync.git", default-features = false, features = ["disabler-symbol"] } +# ssbusync = { git = "https://github.com/BlankMauser/ssbu-sync.git", tag = "1.0.3", default-features = false, features = ["disabler-symbol"] } skyline-web = { workspace = true, optional = true } utils.workspace = true hash40 = "1.2.0" smash-arc = { version = "0.6.0", features = ["rust-zstd", "smash-runtime"] } -smash2 = { git = "https://github.com/blu-dev/smash-rs", package = "smash"} +smash2 = { git = "https://github.com/WuBoytH/smash-rs", package = "smash"} +rlua-lua53-sys = { git = "https://github.com/HDR-Development/rlua", branch = "smash" } [patch.crates-io] nnsdk = { git = "https://github.com/ultimate-research/nnsdk-rs" } +libc = { git="https://github.com/rust-lang/libc", rev = "0.2.166"} [features] default = [ diff --git a/dynamic/Cargo.toml b/dynamic/Cargo.toml index 245ca4a469..1cd8045d82 100644 --- a/dynamic/Cargo.toml +++ b/dynamic/Cargo.toml @@ -6,11 +6,13 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } hdr-macros = { path = "../hdr-macros" } bitflags = "2" modular-bitfield = "0.11.2" -smash2 = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } -once_cell = "1.15.0" \ No newline at end of file +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +once_cell = "1.15.0" +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/dynamic/src/consts.rs b/dynamic/src/consts.rs index ab0b67d53b..2baf905471 100644 --- a/dynamic/src/consts.rs +++ b/dynamic/src/consts.rs @@ -137,8 +137,8 @@ pub mod vars { pub const SHOULD_TRUMP_TETHER: i32 = 0x0022; - pub const UP_SPECIAL_INTERRUPT: i32 = 0x0023; // Ness and Lucas use this - pub const UP_SPECIAL_INTERRUPT_AIRTIME: i32 = 0x0024; // Ness and Lucas use this + pub const UP_SPECIAL_LAG: i32 = 0x0023; // Mewtwo and Palutena (actionable teleports) + pub const UP_SPECIAL_INTERRUPT_AIRTIME: i32 = 0x0024; // Unused pub const SPECIAL_PROJECTILE_SPAWNED: i32 = 0x0025; // Luigi, Ivysaur, and Young Link use this @@ -153,7 +153,7 @@ pub mod vars { pub const ENABLE_AIR_ESCAPE_JUMPSQUAT: i32 = 0x0051; - pub const IS_KNOCKDOWN_THROW: i32 = 0x0052; + pub const FORCE_TUMBLE_NO_BOUNCE: i32 = 0x0052; pub const IS_HEAVY_ATTACK: i32 = 0x0053; @@ -181,7 +181,7 @@ pub mod vars { pub const IS_INIT: i32 = 0x0065; - pub const IS_FLOAT: i32 = 0x0066; + pub const IS_FLOATING: i32 = 0x0066; pub const WEIRD_ASS_TURN_RUN_ANIMATION: i32 = 0x0067; @@ -199,6 +199,12 @@ pub mod vars { pub const IS_DITCIT: i32 = 0x006E; + pub const IGNORE_REDUCED_SCREENSHAKE: i32 = 0x006F; + + pub const DISABLE_AIR_LASSO: i32 = 0x0070; + + pub const DISABLE_FLOAT: i32 = 0x0071; + // ints pub const LAST_ATTACK_RECEIVER_ENTRY_ID: i32 = 0x0000; @@ -220,7 +226,7 @@ pub mod vars { pub const CSTICK_LIFE: i32 = 0x0008; - pub const AGT_USED_COUNTER: i32 = 0x0009; + // pub const AGT_USED_COUNTER: i32 = 0x0009; pub const CLIFF_XLU_FRAME: i32 = 0x000A; pub const LAST_ATTACK_HITBOX_ID: i32 = 0x000B; @@ -231,15 +237,21 @@ pub mod vars { pub const LEFT_STICK_FLICK_X: i32 = 0x000E; pub const LEFT_STICK_FLICK_Y: i32 = 0x000F; - pub const LEDGE_ID: i32 = 0x0010; + pub const OCCUPIED_LEDGE_ID: i32 = 0x0010; pub const RIGHT_STICK_FLICK_X: i32 = 0x0011; pub const RIGHT_STICK_FLICK_Y: i32 = 0x0012; pub const PREV_STATUS_TRANSITION_FRAME: i32 = 0x0013; + pub const PREV_STATUS_INFLICT_STATUS: i32 = 0x0014; + + + pub const ATTACK_LR_CHECK: i32 = 0x0015; + + pub const OCCUPIED_LEDGE_ID_FOR_TETHERS: i32 = 0x0016; + + pub const DISABLE_ESCAPE_AIR_EFFECT_HANDLE: i32 = 0x0017; - pub const ATTACK_LR_CHECK: i32 = 0x0014; - // pub const PREVIOUS_FRAME_FRAMES_IN_AIR: i32 = 0x0015; // floats @@ -283,17 +295,31 @@ pub mod vars { pub const LAST_RECEIVED_ATTACK_HIT_LOCATION_Y: i32 = 0x0024; pub const LAST_RECEIVED_ATTACK_HIT_LOCATION_Z: i32 = 0x0025; pub const LAND_CANCEL_LAG: i32 = 0x0026; + pub const LANDING_LAG_FOR_RIVALS_MODE: i32 = 0x0027; + pub const DAMAGE_DEALT_THIS_STOCK: i32 = 0x0028; + pub const LAST_ATTACKER_ENTRY_ID: i32 = 0x0029; } pub mod status { // flags + + /// global + /// can be used in any status + pub const CHECK_HOLD_INPUT: i32 = 0x10F9; + pub const NO_POCKET: i32 = 0x10FA; + pub const HIT_EFFECT_DROP_ITEM: i32 = 0x10FB; + pub const ENABLE_SPECIAL_WALLJUMP: i32 = 0x10FC; pub const FAF_REACHED: i32 = 0x10FD; pub const PREV_AUTOCANCEL_FLAG: i32 = 0x10FE; pub const DISABLE_ECB_SHIFT: i32 = 0x10FF; + /// dash statuses + /// e.g. FIGHTER_STATUS_KIND_DASH, FIGHTER_RYU_STATUS_KIND_DASH_BACK, etc. pub const IS_DASH_TO_RUN_FRAME: i32 = 0x1000; pub const IS_AFTER_DASH_TO_RUN_FRAME: i32 = 0x1001; pub const APPLY_DASH_END_SPEED_MUL: i32 = 0x1002; + pub const IS_DASH_CANCEL: i32 = 0x1003; + /// FIGHTER_STATUS_KIND_ATTACK_DASH pub const ATTACK_DASH_CANCEL_DISABLE: i32 = 0x1000; pub const ATTACK_DASH_ENABLE_AIR_FALL: i32 = 0x1001; pub const ATTACK_DASH_ENABLE_AIR_CONTINUE: i32 = 0x1002; @@ -301,53 +327,65 @@ pub mod vars { pub const ATTACK_DASH_AIR_DRIFT_ENABLED: i32 = 0x1004; pub const ATTACK_DASH_ENABLE_AIR_LANDING: i32 = 0x1005; + /// FIGHTER_STATUS_KIND_ESCAPE_AIR pub const SHOULD_WAVELAND: i32 = 0x1000; + /// damage statuses pub const IS_JAB_LOCK_ROLL: i32 = 0x1000; pub const IS_SPIKE: i32 = 0x1001; pub const DAMAGE_FLY_RESET_TRIGGER: i32 = 0x1002; + /// FIGHTER_STATUS_KIND_THROWN pub const SUICIDE_THROW_CAN_CLATTER: i32 = 0x1000; - pub const ENABLE_UCF: i32 = 0x1000; - + /// FIGHTER_STATUS_KIND_CATCH_ATTACK pub const PUMMEL_OVERRIDE_GLOBAL_STATS: i32 = 0x1000; + /// FIGHTER_STATUS_KIND_JUMP_SQUAT pub const CSTICK_IRAR: i32 = 0x1000; + /// FLOAT statuses + /// e.g. FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT, statuses::mewtwo::FLOAT, etc. pub const FLOAT_INHERIT_AERIAL: i32 = 0x1000; + /// teleport up special statuses + /// e.g. FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_2, FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2, etc. pub const IS_TELEPORT_WALL_RIDE: i32 = 0x1000; // Mewtwo, Palutena, Sheik, and Zelda use this - pub const ENABLE_SPECIAL_WALLJUMP: i32 = 0x1050; - - pub const HIT_EFFECT_DROP_ITEM: i32 = 0x1051; - + /// FIGHTER_STATUS_KIND_ATTACK_AIR pub const SHOULD_HITFALL: i32 = 0x1006; - pub const NO_POCKET: i32 = 0x1052; - - pub const IS_DASH_CANCEL: i32 = 0x1055; // ints + /// FIGHTER_STATUS_KIND_DOWN_DAMAGE pub const DOWN_STAND_FB_KIND: i32 = 0x1000; + /// FLOAT statuses + /// e.g. FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT, statuses::mewtwo::FLOAT, etc. pub const FLOAT_FRAME: i32 = 0x1000; pub const FLOAT_ENABLE_UNIQ: i32 = 0x1001; pub const FLOAT_MTRANS: i32 = 0x1002; - pub const WARP_EFF_HANDLER: i32 = 0x1000; + /// FIGHTER_STATUS_KIND_ESCAPE_AIR + pub const ESCAPE_AIR_CLIFF_CATCH_FRAME: i32 = 0x1000; + pub const ESCAPE_AIR_CANCEL_FRAME: i32 = 0x1001; + // floats + /// damage statuses pub const INITIAL_KNOCKBACK_VEL_X: i32 = 0x1000; pub const INITIAL_KNOCKBACK_VEL_Y: i32 = 0x1001; + /// FIGHTER_STATUS_KIND_DOWN pub const RESTING_HIP_OFFSET_Y: i32 = 0x1000; + /// teleport up special statuses + /// e.g. FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_2, FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2, etc. pub const TELEPORT_INITIAL_SPEED_X: i32 = 0x1000; pub const TELEPORT_INITIAL_SPEED_Y: i32 = 0x1001; + pub const TELEPORT_FLOOR_SPEED_X: i32 = 0x1002; } } @@ -358,13 +396,26 @@ pub mod vars { // ints pub const RECOVERY_RESOURCE_COUNT: i32 = 0x0100; - pub const ATTACK_AIR_F_COUNT: i32 = 0x0101; - pub const SPECIAL_N_CANCEL_TYPE: i32 = 0x0102; //used for both cancel and firing - pub const SPECIAL_S_DABK_COUNT: i32 = 0x0103; + pub const ATTACK_S3_COUNT: i32 = 0x0101; + pub const ATTACK_AIR_F_COUNT: i32 = 0x0102; + pub const SPECIAL_N_CANCEL_TYPE: i32 = 0x0103; // used for both cancel and firing + pub const SPECIAL_S_DABK_COUNT: i32 = 0x0104; + pub const SPECIAL_BULLET_ARTS_COUNT: i32 = 0x0105; // held variant added lag } pub mod status { + // flags + pub const RECOVERY_RESOURCE_BYPASS_CHECK: i32 = 0x1100; + pub const RECOVERY_RESOURCE_INVALID_INPUT: i32 = 0x1101; + pub const SPECIAL_1F_CHECK: i32 = 0x1102; + pub const SPECIAL_HIT_NO_BULLET: i32 = 0x1103; + pub const BULLET_FIRST_FIRE: i32 = 0x1104; // used for slotting bullet arts + pub const ATTACK_INVALID_COMBO_INPUT: i32 = 0x1105; + // ints + pub const EFFECT_HANDLE: i32 = 0x1100; + pub const SPECIAL_S_BULLET_STAGE: i32 = 0x1101; // used for weird vanilla movement calc // floats pub const SPECIAL_S_ABK_ANGLE: i32 = 0x1100; + pub const SPECIAL_S_MOTION_XY: i32 = 0x0101; // Vec2 } } @@ -376,6 +427,7 @@ pub mod vars { pub const PSYCHE_UP_ACTIVE: i32 = 0x0102; pub const MENU_TRAINING_MODE_LOCK: i32 = 0x0103; pub const SPECIAL_LW_CSTICK_BUFFER: i32 = 0x0104; + pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0105; // ints pub const SPELL_SLOT_1: i32 = 0x0100; @@ -388,10 +440,11 @@ pub mod vars { pub const SPELL_SLOT_USED_1_4: i32 = 0x0107; pub const SPELL_SLOT_USED_2_1: i32 = 0x0108; pub const SPELL_SLOT_USED_2_2: i32 = 0x0109; - pub const SPELL_SLOT_USED_2_3: i32 = 0x0110; - pub const SPELL_SLOT_USED_2_4: i32 = 0x0111; - pub const CURSOR_SLOT: i32 = 0x0112; - pub const MENU_TRAINING_MODE_INDEX: i32 = 0x0113; + pub const SPELL_SLOT_USED_2_3: i32 = 0x010A; + pub const SPELL_SLOT_USED_2_4: i32 = 0x010B; + pub const CURSOR_SLOT: i32 = 0x010C; + pub const MENU_TRAINING_MODE_INDEX: i32 = 0x010D; + pub const MENU_ICON_EFFECT_HANDLE: i32 = 0x010E; // floats pub const SPECIAL_LW_CSTICK_BUFFER_DIR: i32 = 0x0100; @@ -406,9 +459,10 @@ pub mod vars { pub mod instance { // flag pub const SPECIAL_S_BEAKBOMB_ACTIVE: i32 = 0x0100; - pub const SPECIAL_N_BAYONET_ACTIVE: i32 = 0x0101; - pub const SPECIAL_S_FAIL_ENABLE: i32 = 0x0102; - pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0103; + pub const SPECIAL_N_LAND_CANCEL: i32 = 0x0101; + pub const SPECIAL_N_BAYONET_DISABLE: i32 = 0x0102; + pub const SPECIAL_S_FAIL_ENABLE: i32 = 0x0103; + pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0104; // int pub const HUD_DISPLAY_TIME: i32 = 0x0100; @@ -416,6 +470,8 @@ pub mod vars { pub const SPECIAL_S_BEAKBOMB_FRAME: i32 = 0x0101; // 0: Normal Bounce (can be cancelled) 1: weak bounce 2: heavy bounce. pub const SPECIAL_S_BEAKBOMB_BOUNCE_TYPE: i32 = 0x0102; + pub const BOUNCE_TYPE_NORMAL: i32 = 0; + pub const BOUNCE_TYPE_ATTACK: i32 = 1; //Eggs fired gets reset when entering Bayonet, so we have to temporarily store current eggs fired pub const SPECIAL_N_BAYONET_EGGS_FIRED: i32 = 0x0103; @@ -451,6 +507,7 @@ pub mod vars { pub mod instance { // flag pub const SPECIAL_S_DISABLE_STALL: i32 = 0x0100; + pub const DISABLE_SPECIAL_LW: i32 = 0x0101; } pub mod status { // flags @@ -463,7 +520,9 @@ pub mod vars { pub mod instance { // flag pub const DISABLE_SPECIAL_S: i32 = 0x0100; - pub const SPECIAL_S_GROUND_START: i32 = 0x0101; + + //floats + pub const SPECIAL_HI_ANGLE: i32 = 0x0100; } pub mod status { // flags @@ -523,6 +582,11 @@ pub mod vars { // ints pub const CAMERA_LOCKOUT_TIMER: i32 = 0x0105; } + pub mod status { + // flags + pub const CHECK_STEP_CANCEL: i32 = 0x1100; + pub const ENABLE_STEP_CANCEL: i32 = 0x1101; + } } pub mod diddy { @@ -591,6 +655,7 @@ pub mod vars { pub mod instance { // flag pub const SPECIAL_HI2_ENABLE: i32 = 0x0100; + pub const SPECIAL_HI_AERIAL_USED: i32 = 0x0101; // int pub const SPECIAL_LW_GUNMAN_TIMER: i32 = 0x0100; @@ -617,7 +682,8 @@ pub mod vars { pub mod edge { pub mod status { // flags - pub const FLASH_HOLD: i32 = 0x1100; + pub const SPECIAL_LW_CHECK_HOLD: i32 = 0x1100; + pub const SPECIAL_LW_HOLD: i32 = 0x1101; } } @@ -696,6 +762,7 @@ pub mod vars { pub mod instance { // flags pub const SPECIAL_LW_DISABLE_STALL: i32 = 0x0100; + pub const SPECIAL_LW_DISABLE_JC: i32 = 0x0101; } pub mod status { // flags @@ -709,7 +776,10 @@ pub mod vars { } pub mod fox { - + pub mod instance { + // flags + pub const SPECIAL_LW_DISABLE_JC: i32 = 0x0100; + } } pub mod gamewatch { @@ -746,6 +816,7 @@ pub mod vars { pub const SPECIAL_S_ALTERNATE_GRAB: i32 = 0x0100; pub const SPECIAL_S_LOW_GRAB: i32 = 0x0101; pub const SPECIAL_S_HIGH_GRAB: i32 = 0x0102; + pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0103; } pub mod status { // flags @@ -836,14 +907,20 @@ pub mod vars { pub const SPECIAL_LW_USED_JUMPS: i32 = 0x01F5; pub const DISABLE_SPECIAL_LW: i32 = 0x01F8; pub use super::super::bayonetta::instance::WAS_CANCEL; + pub use super::super::miigunner::status::SPECIAL_N1_CLEAR_CRIT; + pub const BUDDY_SPECIAL_N_BAYONET_ACTIVE: i32 = 0x01F6; pub use super::super::ridley::instance::SPECIAL_N_EXPLODE; + pub use super::super::buddy::instance::SPECIAL_N_LAND_CANCEL; + pub use super::super::buddy::instance::SPECIAL_N_BAYONET_DISABLE; + pub const SPECIAL_N_PFUSHIGISOU_SEED_FIRED: i32 = 0x01F7; // Unique var as it doesn't like borrowing from pfushigisou // ints pub const SPECIAL_N_PICKEL_MATERIAL_INDEX: i32 = 0x01F5; - pub use super::super::bayonetta::instance::SPECIAL_N_CANCEL_TYPE; pub const SPECIAL_N_PTRAINER_PLEDGE_STATE: i32 = 0x01F6; // Unique var as it doesn't like borrowing from ptrainer - pub use super::super::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER; pub const SPECIAL_N_PTRAINER_PLEDGE_EFFECT_HANDLE: i32 = 0x01F7; + + pub use super::super::bayonetta::instance::SPECIAL_N_CANCEL_TYPE; + pub use super::super::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER; // floats pub use super::super::reflet::instance::SPECIAL_N_CHARGE; @@ -852,6 +929,11 @@ pub mod vars { // ints pub const PURIN_SPECIAL_N_ENABLE_HIT_CANCEL_FRAME: i32 = 0x11F9; + pub use super::super::miifighter::status::SPECIAL_N1_ANGLE; + pub use super::super::miifighter::status::SPECIAL_N1_SPEED; + pub use super::super::miifighter::status::SPECIAL_N1_EFFECT_HANDLE; + pub use super::super::miifighter::status::SPECIAL_N1_CHARGE; + // flags pub const SPECIAL_N_PICKEL_MINING_TIMER: i32 = 0x11F4; pub const SPECIAL_N_LITTLEMAC_GRAVITY_ENABLE: i32 = 0x11F5; @@ -861,13 +943,18 @@ pub mod vars { pub const PURIN_SPECIAL_N_HIT_CANCEL_OK: i32 = 0x11F9; pub const PALUTENA_SPECIAL_N_HOLD: i32 = 0x11FA; - pub use super::super::mario::status::SPECIAL_N_FIREBRAND; - pub use super::super::luigi::status::SPECIAL_N_THUNDERHAND; - pub use super::super::mariod::status::SPECIAL_N_CHILL_PILL; + pub use super::super::cloud::status::SPECIAL_N_HOLD; pub use super::super::daisy::status::SPECIAL_N_CRYSTAL_ACTIVE; pub use super::super::daisy::status::SPECIAL_N_AIR_START; pub use super::super::daisy::status::SPECIAL_N_DIVE; pub use super::super::daisy::status::SPECIAL_N_AUTOCANCEL; + pub use super::super::krool::status::SPECIAL_N_ANGLED; + pub use super::super::luigi::status::SPECIAL_N_THUNDERHAND; + pub use super::super::mario::status::SPECIAL_N_FIREBRAND; + pub use super::super::mariod::status::SPECIAL_N_CHILL_PILL; + pub use super::super::miifighter::status::SPECIAL_N1_START_HOLD; + pub use super::super::miifighter::status::SPECIAL_N1_END_HOLD; + pub use super::super::miigunner::status::ATTACK_CHARGE; } } @@ -875,6 +962,7 @@ pub mod vars { pub mod instance { // flags pub const ATTACK_S4_EXCELLENT_PUNCH: i32 = 0x0100; // determines if forward smash is an excellent punch + pub const SPECIAL_S_DISABLE_STALL: i32 = 0x0101; // ints pub const SPECIAL_N_FIREBALL_COOLDOWN: i32 = 0x0100; @@ -914,12 +1002,16 @@ pub mod vars { pub const ATTACK_CHARGE: i32 = 0x1100; // flags - pub const SPECIAL_LW_GUT_CHARGED: i32 = 0x1100; + pub const SPECIAL_N_ANGLED: i32 = 0x1100; + pub const SPECIAL_LW_GUT_CHARGED: i32 = 0x1101; } } pub mod link { - + pub mod status { + // flags + pub const ENABLE_SPECIAL_LW_CANCEL: i32 = 0x1000; + } } pub mod littlemac { @@ -994,6 +1086,7 @@ pub mod vars { pub const ATTACK_S4_ANGLE_DOWN: i32 = 0x0103; pub const ATTACK_S4_ANGLE_UP: i32 = 0x0104; pub const ATTACK_AIR_N_LANDING_HITBOX: i32 = 0x0105; + pub const SPECIAL_LW_DISABLE_JC: i32 = 0x0106; // int pub const SPECIAL_N_OFFENSE_UP_EFFECT_HANDLE1: i32 = 0x01DF; @@ -1044,20 +1137,10 @@ pub mod vars { pub mod luigi { pub mod instance { // flag - pub const SPECIAL_S_MISFIRE_STORED: i32 = 0x0100; pub const SPECIAL_S_TRAINING_MISFIRE: i32 = 0x0101; pub const SPECIAL_S_MISFIRE_INIT: i32 = 0x0102; // int - /// This int stores the handle of the charge smoke effect for killing it if we store misfire - pub const SPECIAL_S_SMOKE_EFFECT_HANDLE: i32 = 0x0101; - /// This int stores the handle of the pulsing effect for killing it if we store misfire - pub const SPECIAL_S_PULSE_EFFECT_HANDLE: i32 = 0x0102; pub const SPECIAL_S_MISFIRE_COUNT: i32 = 0x0103; - pub const SPECIAL_S_MISFIRE_BITFLAG: i32 = 0x0104; - - // float - /// This float holds the current multiplier on damage for misfire - pub const SPECIAL_S_MISFIRE_DAMAGE_MUL: i32 = 0x0100; } pub mod status { // flag @@ -1137,31 +1220,56 @@ pub mod vars { } pub mod mewtwo { + pub mod status { + // ints + pub const EFFECT_HANDLER: i32 = 0x1100; + pub const EFFECT_HANDLER_2: i32 = 0x1101; + // floats + pub const SPECIAL_S_THROW_POS: i32 = 0x1100; // vec2 + pub const SPECIAL_S_THROW_CAPTURED_POS_OFFSET: i32 = 0x1102; // vec2 + } pub mod instance { // flags - pub const SPECIAL_HI_TELEPORT_CANCEL: i32 = 0x0100; - pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0101; - pub const SPECIAL_HI_GROUNDED_TELEPORT: i32 = 0x0102; + pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0100; + pub const SPECIAL_HI_GROUNDED_TELEPORT: i32 = 0x0101; + pub const SPECIAL_HI_LANDING: i32 = 0x0102; } } pub mod miifighter { pub mod instance { // ints - pub const SPECIAL_LW1_QUAKE_EFFECT_HANDLE: i32 = 0x0100; + pub const SPECIAL_N2_CHARGE_COUNT: i32 = 0x0100; + pub const SPECIAL_LW3_STAGE: i32 = 0x0101; + pub const SPECIAL_LW3_TIMER: i32 = 0x0102; + pub const SPECIAL_LW3_EFFECT_HANDLE_1: i32 = 0x0103; + pub const SPECIAL_LW3_EFFECT_HANDLE_2: i32 = 0x0104; // flags - pub const SPECIAL_LW3_STALL: i32 = 0x0100; + pub const SPECIAL_N3_STALL: i32 = 0x0100; + pub const SPECIAL_LW3_STALL: i32 = 0x0101; } pub mod status { // ints - pub const SPECIAL_LW1_CHARGE: i32 = 0x1100; + pub const SPECIAL_N1_CHARGE: i32 = 0x1100; + pub const SPECIAL_N1_EFFECT_HANDLE: i32 = 0x1101; + pub const SPECIAL_N2_CANCEL_TYPE: i32 = 0x1102; + pub const SPECIAL_LW1_CHARGE: i32 = 0x1103; + pub const SPECIAL_LW1_QUAKE_EFFECT_HANDLE: i32 = 0x1104; // floats - pub const SPECIAL_LW1_CHARGE_DISTANCE: i32 = 0x1101; + pub const SPECIAL_N1_ANGLE: i32 = 0x1100; + pub const SPECIAL_N1_SPEED: i32 = 0x1101; + pub const SPECIAL_LW1_CHARGE_DISTANCE: i32 = 0x1102; // flags - pub const SPECIAL_LW2_CHECK_HOLD: i32 = 0x1100; + pub const SPECIAL_N1_START_HOLD: i32 = 0x1100; + pub const SPECIAL_N1_END_HOLD: i32 = 0x1101; + pub const SPECIAL_LW1_HOLD: i32 = 0x1102; + pub const SPECIAL_LW3_INC_STAGE: i32 = 0x1103; + pub const SPECIAL_LW3_ENABLE_LANDING: i32 = 0x1104; + pub const SPECIAL_LW3_CLEAR_CRIT: i32 = 0x1105; + pub const SPECIAL_LW3_ENABLE_BOUNCE: i32 = 0x1106; } } @@ -1169,6 +1277,8 @@ pub mod vars { pub mod status { // flags pub const BOOSTED_AERIAL: i32 = 0x1100; + pub const CHECK_BOOSTED_AERIAL: i32 = 0x1101; + pub const SPECIAL_N1_CLEAR_CRIT: i32 = 0x1102; // floats pub const ATTACK_CHARGE: i32 = 0x1100; @@ -1177,15 +1287,17 @@ pub mod vars { // flags pub const BOOSTED_AERIAL_LANDING: i32 = 0x0100; pub const BOOSTED_ATTACK_AIR_LW_AIRTIME: i32 = 0x0101; - pub const SPECIAL_HI1_LAUNCH_AIR_USED: i32 = 0x0102; - + pub const SPECIAL_HI1_AIR_USED: i32 = 0x0102; + pub const SPECIAL_LW_DISABLE_JC: i32 = 0x0103; + // ints pub const SPECIAL_S2_STEALTHBOMB_EFFECT_HANDLE: i32 = 0x0100; pub const SPECIAL_S3_MISSILE_OBJECT_ID: i32 = 0x0101; pub const SPECIAL_HI1_LAUNCH_EFFECT_HANDLE: i32 = 0x0102; - + // floats pub const SPECIAL_N3_CHARGE: i32 = 0x0102; + pub const SPECIAL_HI3_ROT: i32 = 0x0103; } } @@ -1201,18 +1313,48 @@ pub mod vars { } } + pub mod miigunner_stealthbomb { + pub mod instance { + // floats + pub const ANGLE: i32 = 0x0100; + } + pub mod status { + // flags + pub const REFLECT: i32 = 0x1100; // remove if not needed + + // ints + pub const FOLLOW_FRAME: i32 = 0x1100; + pub const BACK_ROT_FRAME: i32 = 0x1101; + + // floats + pub const TURN_DIST: i32 = 0x1100; + } + } + pub mod miiswordsman { pub mod instance { // flags - pub const SPECIAL_S3_CHAKRAM_STICK: i32 = 0x0100; - pub const SPECIAL_HI2_DASH_HIT: i32 = 0x0101; + pub const SPECIAL_HI2_DASH_HIT: i32 = 0x0100; } pub mod status { // flags - pub const SPECIAL_N1_WAVE: i32 = 0x1100; + pub const SPECIAL_S2_GROUND_START: i32 = 0x1100; pub const SPECIAL_S2_EDGE_CANCEL: i32 = 0x1101; - pub const SPECIAL_LW2_SHOCK_SPELL_HOLD: i32 = 0x1102; - pub const SPECIAL_S2_GROUND_START: i32 = 0x1103; + pub const SPECIAL_LW1_CHECK_INPUT: i32 = 0x1102; + pub const SPECIAL_LW1_CHANGE_KINETIC: i32 = 0x1103; + pub const SPECIAL_LW2_HOLD: i32 = 0x1104; + pub const SPECIAL_LW2_CHANGE_ARTICLE: i32 = 0x1105; + pub const SPECIAL_LW3_CHECK_INPUT: i32 = 0x1106; + + // floats + pub const SPECIAL_S2_SPEED_Y: i32 = 0x1100; + } + } + + pub mod miiswordsman_shockspell { + pub mod status { + // flags + pub const SHOCK_SPELL_HOLD: i32 = 0x1100; } } @@ -1238,6 +1380,7 @@ pub mod vars { //flags pub const DISABLE_SPECIAL_HI: i32 = 0x0100; pub const SPECIAL_LW_DISABLE_STALL: i32 = 0x0101; + pub const SPECIAL_LW_DISABLE_JC: i32 = 0x0102; } pub mod status { // flags @@ -1252,13 +1395,9 @@ pub mod vars { pub mod instance { // flags pub const STANCE_ENABLE_CHANGE_SPEED: i32 = 0x0100; - pub const APPEAL_STANCE_INIT: i32 = 0x0101; - pub const APPEAL_STANCE_REVERSE: i32 = 0x0102; // floats pub const SPECIAL_N_PTOOIE_SCALE: i32 = 0x01BF; - pub const FIRE_POS_X: i32 = 0x0101; - pub const FIRE_POS_Y: i32 = 0x0102; // ints pub const CURRENT_STANCE: i32 = 0x01BE; // 0 = Normal, 1 = Putrid, 2 = Prickly @@ -1266,10 +1405,8 @@ pub mod vars { } pub mod status { // flags - pub const POSION_BREATH_ENABLE_STANDARD_FLAME: i32 = 0x1100; - pub const APPEAL_CLOUD_COVER: i32 = 0x1101; - pub const POISON_BREATH_ENABLE_PRICKLY_BITE: i32 = 0x1102; - pub const POISON_BREATH_BURST: i32 = 0x1103; + pub const STANCE_INIT: i32 = 0x1100; + pub const APPEAL_CLOUD_COVER: i32 = 0x1100; } } @@ -1283,14 +1420,16 @@ pub mod vars { pub mod pacman { pub mod instance { // flags - pub const DISABLE_SPECIAL_HI: i32 = 0x0100; - pub const SPECIAL_HI_GROUND_START: i32 = 0x0101; - pub const SPECIAL_HI_AERIAL_USED: i32 = 0x0102; - pub const SPECIAL_S_GROUND_START: i32 = 0x0103; + pub const SPECIAL_S_GROUND_START: i32 = 0x0100; + pub const DISABLE_SPECIAL_HI: i32 = 0x0101; + pub const SPECIAL_HI_GROUND_START: i32 = 0x0102; + pub const SPECIAL_HI_AERIAL_USED: i32 = 0x0103; + pub const SPECIAL_HI_DISABLE_AERIAL: i32 = 0x0104; } pub mod status { // flags - pub const SPECIAL_HI_AERIAL: i32 = 0x1100; + pub const SPECIAL_S_HIT: i32 = 0x1100; + pub const SPECIAL_HI_AERIAL: i32 = 0x1101; } } @@ -1298,10 +1437,13 @@ pub mod vars { pub mod status { // flags pub const ENABLE_COLOR_INCREMENT: i32 = 0x1100; - pub const SPECIAL_HI_TELEPORT_AIR_START: i32 = 0x1101; - pub const SPECIAL_N_PRIMARY_POWERED: i32 = 0x1102; + pub const SPECIAL_N_PRIMARY_POWERED: i32 = 0x1101; pub const POWER_BOARD_FLUSHED: i32 = 0x1150; + // ints + pub const SPECIAL_N_GREEN_BUTTON_TIMER: i32 = 0x1100; + pub const SPECIAL_N_GREEN_LOOP: i32 = 0x1101; + // floats pub const SPECIAL_LW_STORED_DAMAGE: i32 = 0x1100; } @@ -1310,7 +1452,8 @@ pub mod vars { pub const SPECIAL_HI_TELEPORT_GROUND_START: i32 = 0x0100; pub const SPECIAL_HI_JUMP_REFRESH: i32 = 0x0101; pub const SPECIAL_N_FLUSH_BOARD: i32 = 0x0102; - pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0104; + pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0103; + pub const SPECIAL_HI_LANDING: i32 = 0x0104; // ints pub const POWER_BOARD_SLOT_1: i32 = 0x0100; @@ -1335,6 +1478,9 @@ pub mod vars { pub mod pfushigisou { pub mod instance { + // flags + pub const SPECIAL_N_SEED_FIRED: i32 = 0x0100; + // ints pub const SPECIAL_N_PLEDGE_EFFECT_HANDLE: i32 = 0x0100; } @@ -1429,6 +1575,7 @@ pub mod vars { // flags pub const ATTACK_AIR_LANDING_HIT: i32 = 0x0100; + pub const DISABLE_SPECIAL_S: i32 = 0x0101; } pub mod status { // ints @@ -1459,7 +1606,10 @@ pub mod vars { } pub mod pitb { - + pub mod instance { + // flags + pub const SPECIAL_LW_DISABLE_JC: i32 = 0x0100; + } } pub mod plizardon { @@ -1530,16 +1680,14 @@ pub mod vars { } pub mod reflet { - pub mod status { - // flags - pub const SPECIAL_HI_ELWIND1_CANCEL: i32 = 0x1100; - } pub mod instance { // flags pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0100; + pub const DISCARD_SKIP_STATUS: i32 = 0x0101; // ints pub const ATTACK_AIR_LEVIN_LENIENCY: i32 = 0x0100; + pub const DISCARD_TYPE: i32 = 0x0101; // floats pub const SPECIAL_N_CHARGE: i32 = 0x0100; @@ -1594,10 +1742,10 @@ pub mod vars { pub const ATTACK_AIR_B_USED: i32 = 0x0100; pub const SPECIAL_S_AIR_USED: i32 = 0x0101; pub const SPECIAL_HI_GROUND_START: i32 = 0x0103; - pub const SPECIAL_HI_MARKER_EFFECT_HANDLE: i32 = 0x0104; // ints pub const SPECIAL_HI_CHARGE_FRAME: i32 = 0x0100; + pub const SPECIAL_HI_MARKER_EFFECT_HANDLE: i32 = 0x0101; // floats pub const SPECIAL_HI_ROT_X: i32 = 0x0100; @@ -1608,6 +1756,9 @@ pub mod vars { pub const IS_CHARGE_FINISHED: i32 = 0x1101; pub const ATTACK_AIR_B_MAX_CHARGE: i32 = 0x1102; pub const ATTACK_AIR_B_CHARGE_LEVEL: i32 = 0x1103; + + // ints + pub const SPECIAL_HI_KEEP_FRAME: i32 = 0x1100; } } @@ -1646,12 +1797,11 @@ pub mod vars { pub const ROSA_Y: i32 = 0x0102; pub const TICO_X: i32 = 0x0103; pub const TICO_Y: i32 = 0x0104; - pub const TICO_RAYCAST: i32 = 0x0106; - pub const TICO_X_DIST: i32 = 0x0107; - pub const TICO_Y_DIST: i32 = 0x0108; + pub const TICO_CHARGE_LEVEL: i32 = 0x0105; // flags pub const SPECIAL_LW_TICO_UNAVAILABLE: i32 = 0x0100; + pub const TICO_SPAWN_HAS_SYNCED: i32 = 0x0101; } pub mod status { // flags @@ -1817,6 +1967,7 @@ pub mod vars { pub const SPECIAL_S_HOP: i32 = 0x1100; pub const SPECIAL_S_ENABLE_JUMP: i32 = 0x1101; pub const SPECIAL_S_ENABLE_CONTROL: i32 = 0x1102; + pub const SPECIAL_S_HIT_SHIELD: i32 = 0x1103; // ints pub const SPECIAL_S_STEP: i32 = 0x1100; @@ -1837,17 +1988,20 @@ pub mod vars { pub mod tantan { pub mod instance { // flags - pub const SPECIAL_HI_GROUND_START: i32 = 0x0100; - pub const SPECIAL_HI_AIR_JUMP: i32 = 0x0101; - pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0102; + pub const ARMS_ATTACK_CANCEL: i32 = 0x0100; + pub const SPECIAL_HI_GROUND_START: i32 = 0x0101; + pub const SPECIAL_HI_AIR_JUMP: i32 = 0x0102; + pub const SPECIAL_HI_ENABLE_FREEFALL: i32 = 0x0103; // ints pub const ARMR_DRAGONIZE_EFFECT_HANDLE: i32 = 0x0100; } pub mod status { // flags - pub const ARMS_ATTACK_CANCEL: i32 = 0x1100; - pub const ATTACK_S4_CLEAR_CRIT: i32 = 0x1101; + pub const ATTACK_S4_CLEAR_CRIT: i32 = 0x1100; + + // ints + pub const RECOIL_CANCEL_STATUS: i32 = 0x1100; } } @@ -1872,7 +2026,10 @@ pub mod vars { // flags pub const SPECIAL_S_HIT: i32 = 0x1100; pub const SPECIAL_S_INPUT_CHECK: i32 = 0x1101; - pub const SPECIAL_S_STOP: i32 = 0x1102; + + pub const SPECIAL_LW_AIR_FALL: i32 = 0x1100; + pub const SPECIAL_LW_ENABLE_CONTROL: i32 = 0x1100; + pub const SPECIAL_LW_ENABLE_GRAVITY: i32 = 0x1101; // ints pub const ATTACK_LW4_TIMER: i32 = 0x1100; @@ -1886,34 +2043,23 @@ pub mod vars { pub mod instance { // flags pub const PUMMEL_SKIP_STALE: i32 = 0x0100; + pub const SPECIAL_S_CANCEL: i32 = 0x0101; } } pub mod wiifit { pub mod instance { // flags - pub const SPECIAL_LW_RESPAWN_COOLDOWN: i32 = 0x0100; - pub const RING_EFFECT_VISIBLE: i32 = 0x0101; - pub const SPECIAL_S_DISABLE_STALL: i32 = 0x0102; - - // ints - pub const RING_SHOW_MOTION: i32 = 0x0100; - pub const RING_EFFECT_HANDLE: i32 = 0x0101; - pub const RING_SECOND_EFFECT_HANDLE: i32 = 0x0102; - pub const RING_THIRD_EFFECT_HANDLE: i32 = 0x0103; - - // floats - pub const RING_START_FRAME: i32 = 0x0100; - pub const RING_CURRENT_FRAME: i32 = 0x0101; - pub const RING_END_FRAME: i32 = 0x0102; - pub const RING_START_SIZE: i32 = 0x0103; - pub const RING_END_SIZE: i32 = 0x0104; - pub const RING_COLOR: i32 = 0x0105; // this is a vector, so it needs three values (next value starts at 0x0108) - pub const RING_SECOND_COLOR: i32 = 0x108; + pub const SPECIAL_S_DISABLE_STALL: i32 = 0x0100; + pub const SPECIAL_LW_EFFECT_ON: i32 = 0x0101; } } pub mod wolf { + pub mod instance { + // flags + pub const SPECIAL_LW_DISABLE_JC: i32 = 0x0100; + } pub mod status { // flags pub const SPECIAL_S_RESERVE_FALL: i32 = 0x1100; @@ -1965,7 +2111,8 @@ pub mod vars { pub mod statuses { pub mod bayonetta { pub const SPECIAL_S_KICK: i32 = 0x1F2; - pub const SPECIAL_N_CANCEL: i32 = 0x1F3; + pub const SPECIAL_S_EDGE: i32 = 0x1F3; + pub const SPECIAL_N_CANCEL: i32 = 0x1F4; } pub mod chrom { @@ -1974,13 +2121,22 @@ pub mod statuses { } pub mod buddy { - pub const SPECIAL_N_BAYONET_END: i32 = 0x1FB; + pub const SPECIAL_N_BAYONET: i32 = 0x1FB; + } + + pub mod daisy { + pub const SPECIAL_LW_THROW: i32 = 0x1EB; + pub const SPECIAL_AIR_LW: i32 = 0x1EC; } pub mod daisy_kinopio { pub const YAP: i32 = 0x1; } + pub mod demon { + pub const CANCEL_STEP: i32 = 0x213; + } + pub mod diddy { pub const SPECIAL_N_CANCEL: i32 = 0x1FF; pub const SPECIAL_N_CANCEL_JUMP: i32 = 0x200; @@ -2035,7 +2191,7 @@ pub mod statuses { pub const DIDDY_SPECIAL_N_CANCEL: i32 = 0x3EA; pub const DIDDY_SPECIAL_N_CANCEL_JUMP: i32 = 0x3EB; pub const BAYONETTA_SPECIAL_N_CANCEL: i32 = 0x3EC; - pub const BUDDY_SPECIAL_N_BAYONET_END: i32 = 0x3ED; + pub const BUDDY_SPECIAL_N_BAYONET: i32 = 0x3ED; pub const PIKMIN_SPECIAL_N_FAILURE: i32 = 0x3EE; } @@ -2058,7 +2214,20 @@ pub mod statuses { pub mod mewtwo { pub const FLOAT: i32 = 0x1E9; } + + pub mod miifighter { + pub const SPECIAL_N2_HOLD: i32 = 0x208; + pub const SPECIAL_N2_CANCEL: i32 = 0x209; + pub const SPECIAL_N2_JUMP_CANCEL: i32 = 0x20A; + } + + pub mod miiswordsman_tornadoshot { + pub const SHOCK_SPELL: i32 = 0x1; + } + pub mod miigunner_stealthbomb { + pub const TURN: i32 = 0x2; + } pub mod packun_firebreath { pub const REGULAR: i32 = 0x0; } @@ -2073,14 +2242,17 @@ pub mod statuses { } pub mod palutena_explosiveflame { - pub const CHECK_KIRBY: i32 = 0x4; - pub const EXPLODE_KIRBY: i32 = 0x5; } pub mod palutena_meteor { pub const MOVE: i32 = 0x0; } + pub mod peach { + pub const SPECIAL_LW_THROW: i32 = 0x1EB; + pub const SPECIAL_AIR_LW: i32 = 0x1EC; + } + pub mod pickel { pub const SPECIAL_RUN: i32 = 0x21B; } @@ -2106,6 +2278,11 @@ pub mod statuses { pub const FLOAT: i32 = 0x1FD; } + pub mod rosetta_tico { + pub const STANDBY: i32 = 0x34; + pub const POP: i32 = 0x35; + } + pub mod ryu { pub const SPECIAL_LW_INSTALL: i32 = 0x202; pub const ATTACK_COMMAND_4: i32 = 0x203; @@ -2121,6 +2298,10 @@ pub mod statuses { pub const SPECIAL_HI_END: i32 = 0x1F8; } + pub mod trail { + pub const SPECIAL_LW_LANDING: i32 = 0x1F5; + } + pub mod wolf { pub const SPECIAL_S_RUSH: i32 = 0x1EA; pub const SPECIAL_S_END: i32 = 0x1EB; @@ -2169,6 +2350,11 @@ pub mod melee_mode { pub const TIPS: i32 = 0x1b; } +pub mod smash_mode { + pub const TIME: i32 = 0x0; + pub const STOCK: i32 = 0x1; +} + // extra lua_consts pub const COLLISION_KIND_MASK_PARRY: smash::lib::LuaConst = smash::lib::LuaConst::new(0x80); diff --git a/dynamic/src/ext.rs b/dynamic/src/ext.rs index 0bf23dac98..690ddab5da 100644 --- a/dynamic/src/ext.rs +++ b/dynamic/src/ext.rs @@ -8,7 +8,15 @@ use smash::lib::{lua_const::*, *}; use smash::lua2cpp::*; use smash::phx::*; use crate::{InputModule, VarModule}; +pub trait I32Ext { + fn mul_f32(self, f: f32) -> i32; +} +impl I32Ext for i32 { + fn mul_f32(self, f: f32) -> i32 { + (self as f32 * f).round() as i32 + } +} pub trait Vec2Ext { fn new(x: f32, y: f32) -> Self where @@ -402,6 +410,7 @@ pub trait BomaExt { // INPUTS unsafe fn clear_commands>(&mut self, fighter_pad_cmd_flag: T); unsafe fn get_command_life>(&mut self, fighter_pad_cmd_flag: T) -> u8; + unsafe fn set_command_life>(&mut self, fighter_pad_cmd_flag: T, life: u8); unsafe fn is_cat_flag>(&mut self, fighter_pad_cmd_flag: T) -> bool; unsafe fn is_cat_flag_all>(&mut self, fighter_pad_cmd_flag: T) -> bool; unsafe fn is_pad_flag(&mut self, pad_flag: PadFlag) -> bool; @@ -413,6 +422,7 @@ pub trait BomaExt { unsafe fn was_prev_button_off(&mut self, buttons: Buttons) -> bool; unsafe fn stick_x(&mut self) -> f32; unsafe fn stick_y(&mut self) -> f32; + unsafe fn stick_polar(&mut self) -> (f32, f32); unsafe fn prev_stick_x(&mut self) -> f32; unsafe fn prev_stick_y(&mut self) -> f32; unsafe fn is_input_jump(&mut self) -> bool; @@ -433,6 +443,7 @@ pub trait BomaExt { unsafe fn prev_right_stick_x(&mut self) -> f32; unsafe fn right_stick_y(&mut self) -> f32; unsafe fn prev_right_stick_y(&mut self) -> f32; + unsafe fn check_hold_input(&mut self, start_frame: i32, end_frame: i32, input: Buttons) -> bool; // STATE unsafe fn is_status(&mut self, kind: i32) -> bool; @@ -480,6 +491,7 @@ pub trait BomaExt { // gets the boma of the player who is grabbing you unsafe fn get_grabber_boma(&mut self) -> &mut BattleObjectModuleAccessor; unsafe fn get_owner_boma(&mut self) -> &mut BattleObjectModuleAccessor; + unsafe fn get_team_owner_boma(&mut self) -> &mut BattleObjectModuleAccessor; // WORK unsafe fn get_int(&mut self, what: i32) -> i32; @@ -538,7 +550,7 @@ pub trait BomaExt { // Checks for status and enables transition to jump - unsafe fn check_jump_cancel(&mut self, update_lr: bool, skip_other_checks: bool) -> bool; + unsafe fn check_jump_cancel(&mut self, update_lr: bool, skip_usmash_check: bool, skip_parry_check: bool) -> bool; // Checks for status and enables transition to airdodge unsafe fn check_airdodge_cancel(&mut self) -> bool; unsafe fn check_aerial_cancel(&mut self) -> bool; @@ -565,6 +577,10 @@ pub trait BomaExt { unsafe fn clone_command_input(&mut self, command: usize, replace_command: usize); + unsafe fn get_escape_air_cliff_catch_frame(&mut self) -> i32; + + unsafe fn get_escape_air_cancel_frame(&mut self) -> i32; + } impl BomaExt for BattleObjectModuleAccessor { @@ -594,6 +610,19 @@ impl BomaExt for BattleObjectModuleAccessor { return crate::modules::InputModule::get_command_life(self.object(), cat, bits); } + unsafe fn set_command_life>(&mut self, fighter_pad_cmd_flag: T, life: u8) { + let cat = fighter_pad_cmd_flag.into(); + let (cat, bits) = match cat { + CommandCat::Cat1(cat) => (0, cat.bits()), + CommandCat::Cat2(cat) => (1, cat.bits()), + CommandCat::Cat3(cat) => (2, cat.bits()), + CommandCat::Cat4(cat) => (3, cat.bits()), + CommandCat::CatHdr(cat) => (4, cat.bits()), + }; + + crate::modules::InputModule::set_command_life(self.object(), cat, bits, life); + } + unsafe fn is_cat_flag>(&mut self, fighter_pad_cmd_flag: T) -> bool { let cat = fighter_pad_cmd_flag.into(); match cat { @@ -652,6 +681,14 @@ impl BomaExt for BattleObjectModuleAccessor { return ControlModule::get_stick_y(self); } + unsafe fn stick_polar(&mut self) -> (f32, f32) { + let stick_x = self.stick_x(); + let stick_y = self.stick_y(); + let mag = (stick_x.powi(2) + stick_y.powi(2)).sqrt(); + let rad = stick_y.atan2(stick_x); + (mag, rad) + } + unsafe fn prev_stick_x(&mut self) -> f32 { return ControlModule::get_stick_prev_x(self); } @@ -761,6 +798,42 @@ impl BomaExt for BattleObjectModuleAccessor { } } + /// Checks if a given input is held and turns off the check if released + /// + /// # Arguments + /// * `start_frame` - the status frame to start checking for the held input + /// * `end_frame` - the status frame which to stop checking + /// * `input` - a Button input (ie Buttons::Special) + /// + /// Returns true if the end of the hold check has completed, if the end frame has been specified + unsafe fn check_hold_input(&mut self, start_frame: i32, end_frame: i32, input: Buttons) -> bool { + // if out of range, return early + if !(start_frame..=end_frame).contains(&self.status_frame()) { + return false; + } + + // start the check once we have reached the starting frame + if self.status_frame() == start_frame && !self.is_button_off(input) { + VarModule::on_flag(self.object(), vars::common::status::CHECK_HOLD_INPUT); + } + + if VarModule::is_flag(self.object(), vars::common::status::CHECK_HOLD_INPUT) { + // if we are still checking for the hold and we are ready to end the check + if self.status_frame() == end_frame { + VarModule::off_flag(self.object(), vars::common::status::CHECK_HOLD_INPUT); + return true; + } + + // check for the input being released, in which case we disable the check + if self.is_button_release(input) { + VarModule::off_flag(self.object(), vars::common::status::CHECK_HOLD_INPUT); + return false; + } + } + + return false; + } + unsafe fn get_aerial(&mut self) -> Option { if self.is_cat_flag(Cat1::AttackHi3 | Cat1::AttackHi4) { Some(AerialKind::Uair) @@ -923,6 +996,12 @@ impl BomaExt for BattleObjectModuleAccessor { return &mut *sv_battle_object::module_accessor((WorkModule::get_int(self, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID)) as u32); } + unsafe fn get_team_owner_boma(&mut self) -> &mut BattleObjectModuleAccessor { + let team_owner_id = TeamModule::team_owner_id(self) as u32; + let owner_object = super::util::get_battle_object_from_id(team_owner_id); + &mut *(*owner_object).module_accessor + } + unsafe fn get_num_used_jumps(&mut self) -> i32 { return WorkModule::get_int(self, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); } @@ -1144,8 +1223,15 @@ impl BomaExt for BattleObjectModuleAccessor { } /// If update_lr is true, we set your facing direction based on your stick position - /// If skip_other_checks is true, we do not check for USmash - unsafe fn check_jump_cancel(&mut self, update_lr: bool, skip_other_checks: bool) -> bool { + /// If skip_usmash_check is true, we do not check for USmash + /// If skip_disable_parry_check is true, we do not disable jump cancel on parry + unsafe fn check_jump_cancel(&mut self, update_lr: bool, skip_usmash_check: bool, skip_disable_parry_check: bool) -> bool { + + if !skip_disable_parry_check + && AttackModule::is_infliction_status(self, *crate::consts::COLLISION_KIND_MASK_PARRY) { + return false; + } + let fighter = crate::util::get_fighter_common_from_accessor(self); if fighter.is_situation(*SITUATION_KIND_GROUND) { WorkModule::enable_transition_term( @@ -1156,14 +1242,14 @@ impl BomaExt for BattleObjectModuleAccessor { fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT_BUTTON, ); - if !skip_other_checks { + if !skip_usmash_check { WorkModule::enable_transition_term( fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_HI4_START, ); } if fighter.sub_transition_group_check_ground_jump_mini_attack().get_bool() // buffered aerials - || (!skip_other_checks && fighter.sub_transition_group_check_ground_attack().get_bool()) // up smash + || (!skip_usmash_check && fighter.sub_transition_group_check_ground_attack().get_bool()) // up smash || fighter.sub_transition_group_check_ground_jump().get_bool() // regular jumps { if update_lr { @@ -1537,6 +1623,13 @@ impl BomaExt for BattleObjectModuleAccessor { StatusModule::change_status_request_from_script(self, *FIGHTER_STATUS_KIND_SPECIAL_LW,false); } } + + // Airdodge cancels + if [ + *FIGHTER_STATUS_KIND_ATTACK_AIR + ].contains(&status_kind) { + self.check_airdodge_cancel(); + } } unsafe fn try_pickup_item(&mut self, range: f32, bone: Option, offset: Option<&Vector2f>) -> Option<&mut BattleObjectModuleAccessor> { @@ -1618,6 +1711,44 @@ impl BomaExt for BattleObjectModuleAccessor { let replace = *control_module.add((0x7f0 + (replace_command * 8)) / 8) as *mut CommandInputState; *replace = *original.clone(); } + + unsafe fn get_escape_air_cliff_catch_frame(&mut self) -> i32 { + let escape_air_slide_fall_frame = crate::ParamModule::get_int(self.object(), crate::ParamType::Common, "escape_air_slide_fall_frame"); + let escape_air_enable_cliff_catch_fall_distance = crate::ParamModule::get_float(self.object(), crate::ParamType::Common, "escape_air_enable_cliff_catch_fall_distance"); + let escape_air_slide_speed_mul = crate::ParamModule::get_float(self.object(), crate::ParamType::Common, "escape_air_slide_speed_mul"); + let air_accel_y = WorkModule::get_param_float(self, Hash40::new("air_accel_y").hash, 0); + let air_speed_y_stable = WorkModule::get_param_float(self, Hash40::new("air_speed_y_stable").hash, 0); + let escape_air_slide_speed = WorkModule::get_param_float(self, Hash40::new("param_motion").hash, Hash40::new("escape_air_slide_speed").hash); + let escape_air_stick_vec_y = 1.0; // Simulate a straight vertically-up airdodge + let adjusted_escape_air_slide_speed = escape_air_slide_speed * escape_air_stick_vec_y; + let remaining_y_speed_on_escape_air_fall_frame = adjusted_escape_air_slide_speed * escape_air_slide_speed_mul.powi(escape_air_slide_fall_frame + 1); + let fall_time_to_enable_cliff_catch = super::util::get_time_to_fall_distance( + escape_air_enable_cliff_catch_fall_distance, + air_accel_y, + air_speed_y_stable, + remaining_y_speed_on_escape_air_fall_frame + ); + (escape_air_slide_fall_frame + 1) + fall_time_to_enable_cliff_catch.ceil() as i32 + } + + unsafe fn get_escape_air_cancel_frame(&mut self) -> i32 { + let escape_air_slide_fall_frame = crate::ParamModule::get_int(self.object(), crate::ParamType::Common, "escape_air_slide_fall_frame"); + let escape_air_enable_cancel_fall_distance = crate::ParamModule::get_float(self.object(), crate::ParamType::Common, "escape_air_enable_cancel_fall_distance"); + let escape_air_slide_speed_mul = crate::ParamModule::get_float(self.object(), crate::ParamType::Common, "escape_air_slide_speed_mul"); + let air_accel_y = WorkModule::get_param_float(self, Hash40::new("air_accel_y").hash, 0); + let air_speed_y_stable = WorkModule::get_param_float(self, Hash40::new("air_speed_y_stable").hash, 0); + let escape_air_slide_speed = WorkModule::get_param_float(self, Hash40::new("param_motion").hash, Hash40::new("escape_air_slide_speed").hash); + let escape_air_stick_vec_y = 0.707; // Simulate a 45º airdodge + let adjusted_escape_air_slide_speed = escape_air_slide_speed * escape_air_stick_vec_y; + let remaining_y_speed_on_escape_air_fall_frame = adjusted_escape_air_slide_speed * escape_air_slide_speed_mul.powi(escape_air_slide_fall_frame + 1); + let fall_time_to_enable_cancel = super::util::get_time_to_fall_distance( + escape_air_enable_cancel_fall_distance, + air_accel_y, + air_speed_y_stable, + remaining_y_speed_on_escape_air_fall_frame + ); + (escape_air_slide_fall_frame + 1) + fall_time_to_enable_cancel.ceil() as i32 + } } pub trait LuaUtil { diff --git a/dynamic/src/game_modes.rs b/dynamic/src/game_modes.rs index fb4d40b0e8..de1da4a2ad 100644 --- a/dynamic/src/game_modes.rs +++ b/dynamic/src/game_modes.rs @@ -11,6 +11,11 @@ pub enum CustomMode { Smash64Mode = 4, MagicSeriesMode = 5, ElementMode = 6, + RivalsOfAetherMode = 7, + RampageMode = 8, + WarMode = 9, + VampirismMode = 10, + RandomAngleMode = 11, } impl fmt::Display for CustomMode { @@ -23,6 +28,11 @@ impl fmt::Display for CustomMode { CustomMode::Smash64Mode => write!(f, "Smash64"), CustomMode::MagicSeriesMode => write!(f, "MagicSeries"), CustomMode::ElementMode => write!(f, "Element"), + CustomMode::RivalsOfAetherMode => write!(f, "RivalsOfAether"), + CustomMode::RampageMode => write!(f, "Rampage"), + CustomMode::WarMode => write!(f, "War"), + CustomMode::VampirismMode => write!(f, "Vampirism"), + CustomMode::RandomAngleMode => write!(f, "RandomAngle"), } } } @@ -40,6 +50,11 @@ impl FromStr for CustomMode { "smash64" => Ok(CustomMode::Smash64Mode), "magicseries" => Ok(CustomMode::MagicSeriesMode), "element" => Ok(CustomMode::ElementMode), + "rivalsofaether" => Ok(CustomMode::RivalsOfAetherMode), + "rampage" => Ok(CustomMode::RampageMode), + "war" => Ok(CustomMode::WarMode), + "vampirism" => Ok(CustomMode::VampirismMode), + "randomangle" => Ok(CustomMode::RandomAngleMode), _ => Err(()), } } @@ -52,6 +67,9 @@ extern "Rust" { #[link_name = "hdr__game_modes__get_custom_mode"] fn _get_custom_mode() -> Option>; + #[link_name = "hdr__game_modes__reset_custom_mode"] + fn _reset_custom_mode(); + #[link_name = "hdr__game_modes__signal_new_game"] fn _signal_new_game(); @@ -65,12 +83,27 @@ pub fn is_custom_mode() -> bool { } } +pub fn check_custom_mode(mode: CustomMode) -> bool { + unsafe { + match _get_custom_mode() { + Some(modes) => modes.contains(&mode), + None => false, + } + } +} + pub fn get_custom_mode() -> Option> { unsafe { _get_custom_mode() } } +pub fn reset_custom_mode() { + unsafe { + _reset_custom_mode() + } +} + pub fn signal_new_game() { unsafe { _signal_new_game() diff --git a/dynamic/src/hitboxes.rs b/dynamic/src/hitboxes.rs new file mode 100644 index 0000000000..c988047aec --- /dev/null +++ b/dynamic/src/hitboxes.rs @@ -0,0 +1,118 @@ +pub use proc_hitbox::{ + CollisionPart, + CollisionSituation, + CollisionCategory, + ShieldDamage, + SoundLevel, + CollisionSound, + AttackRegion, + SetOff, + LrCheck, + HitboxTemplate, + HitboxData, + create_hitbox, +}; +pub use proc_hitbox_macro::{ + hitbox_templates, + decl_hitbox, + hitbox +}; + +// hitbox_templates +// the final result MUST include all of these: + // part: 0, + // fkb: 0, + // hitlag: 1.0, + // sdi: 1.0, + // clank: SetOff::On, + // facing: LrCheck::Pos, + // set_weight: false, + // shield_dmg: ShieldDamage::Add(0.0), + // trip: 0.0, + // rehit: 0, + // reflectable: false, + // absorbable: false, + // flinchless: false, + // disable_hitlag: false, + // direct: true, + // friendly_fire: false, + // situation: CollisionSituation::GA, + // category: CollisionCategory::all(), + // hit_part: CollisionPart::all(), + // effect: "collision_attr_normal", + // hit_sound: CollisionSound::Punch, + // sound_level: SoundLevel::M, + // region: AttackRegion::Punch, + +// these are also required, but should be included in the hitbox data itself: + // id: 0, + // bone: "top", + // dmg: 9.0, + // angle: 361 + // kbg: 100, + // bkb: 0, + // size: 4.0, + // x: 0.0, + // y: 0.0, + // z: 0.0, + +// optional fields for capsule hitboxes: + // x2: 0.0, + // y2: 0.0, + // z2: 0.0, + +hitbox_templates! { + pub BASE_HITBOX = { + part: 0, + fkb: 0, + hitlag: 1.0, + sdi: 1.0, + clank: SetOff::On, + facing: LrCheck::Pos, + set_weight: false, + shield_dmg: ShieldDamage::Add(0.0), + trip: 0.0, + rehit: 0, + reflectable: false, + absorbable: false, + flinchless: false, + disable_hitlag: false, + direct: true, + friendly_fire: false, + situation: CollisionSituation::GA, + category: CollisionCategory::all(), + hit_part: CollisionPart::all(), + }; + pub PHYSICAL_PROJECTILE_HITBOX = { + extends: BASE_HITBOX, + facing: LrCheck::Speed, + reflectable: true, + direct: false, + }; + pub ENERGY_PROJECTILE_HITBOX = { + extends: PHYSICAL_PROJECTILE_HITBOX, + absorbable: true, + }; + pub BASE_WINDBOX = { + extends: BASE_HITBOX, + clank: SetOff::Off, + facing: LrCheck::F, + flinchless: true, + disable_hitlag: true, + direct: false, + category: CollisionCategory::all().difference(CollisionCategory::FLOOR), + effect: "collision_attr_normal", + sound_level: SoundLevel::S, + hit_sound: CollisionSound::None, + region: AttackRegion::None, + }; + pub BASE_SEARCHBOX = { + extends: BASE_WINDBOX, + dmg: 0.0, + angle: 361, + kbg: 0, + fkb: 0, + bkb: 0, + effect: "collision_attr_search", + }; +} \ No newline at end of file diff --git a/dynamic/src/lib.rs b/dynamic/src/lib.rs index 81c065fd46..bdbb0aaeaf 100644 --- a/dynamic/src/lib.rs +++ b/dynamic/src/lib.rs @@ -11,6 +11,7 @@ pub mod frame_info; pub mod game_modes; pub mod ui; pub mod se; +pub mod hitboxes; #[macro_use] extern crate modular_bitfield; @@ -26,3 +27,4 @@ pub use hdr_macros as macros; pub use modules::*; pub use frame_info::*; +pub use hitboxes::*; diff --git a/dynamic/src/modules/input.rs b/dynamic/src/modules/input.rs index cd3de3035e..90d41512e8 100644 --- a/dynamic/src/modules/input.rs +++ b/dynamic/src/modules/input.rs @@ -43,6 +43,9 @@ extern "Rust" { #[link_name = "InputModule__get_command_life"] fn InputModule__get_command_life(object: *mut BattleObject, category: i32, flag: i32) -> u8; + #[link_name = "InputModule__set_command_life"] + fn InputModule__set_command_life(object: *mut BattleObject, category: i32, flag: i32, life: u8); + #[link_name = "InputModule__is_persist"] fn InputModule__is_persist(object: *mut BattleObject) -> bool; @@ -257,14 +260,24 @@ pub mod InputModule { /// Returns the remaining valid frames of an input in the buffer /// # Arguments /// * `object` - Owning `BattleObject` instance - /// * `category` - Which command flag category the input is under (valid values are 0-3) - /// * `flag` - Which flag in the category you are checking hold buffer for + /// * `category` - Which command flag category the input is under + /// * `flag` - Which flag in the category you are checking /// # Returns /// The frame count until the input will no longer be valid pub fn get_command_life(object: *mut BattleObject, category: i32, flag: i32) -> u8 { unsafe { InputModule__get_command_life(object, category, flag) } } + /// Updates the remaining valid frames of an input in the buffer + /// # Arguments + /// * `object` - Owning `BattleObject` instance + /// * `category` - Which command flag category the input is under + /// * `flag` - Which flag in the category you are updating + /// * `life` - The new lifetime of the input + pub fn set_command_life(object: *mut BattleObject, category: i32, flag: i32, life: u8) { + unsafe { InputModule__set_command_life(object, category, flag, life) } + } + /// Sets the global tap buffer lifetime /// # Arguments /// * `object` - Owning `BattleObject` instance diff --git a/dynamic/src/util.rs b/dynamic/src/util.rs index fbf84c9fb8..62716cfe74 100644 --- a/dynamic/src/util.rs +++ b/dynamic/src/util.rs @@ -2,9 +2,11 @@ use smash::app::{BattleObject, BattleObjectModuleAccessor}; use smash::lua2cpp::L2CFighterCommon; use crate::offsets; use crate::ext::*; -// use std::arch::asm; +use std::sync::atomic::AtomicBool; use smash::phx::Vector2f; -// use crate::se; + +// Flag for if salty quit was triggered. Reset every scene transition. +pub static MATCH_EXITING: AtomicBool = AtomicBool::new(false); #[macro_export] macro_rules! dump_trace { @@ -347,4 +349,33 @@ pub unsafe extern "C" fn nlerp(min: f32, max: f32, power: f32, ratio: f32) -> f3 if ratio >= 1.0 { return max; } let nlerp = (ratio.powf(power) * (max - min) + min).clamp(min, max); return nlerp; +} + +pub unsafe extern "C" fn get_time_to_fall_distance(distance: f32, air_accel_y: f32, air_speed_y_stable: f32, start_speed_y: f32) -> f32 { + let distance = -distance.abs(); + let air_accel_y = -air_accel_y.abs(); + let air_speed_y_stable = -air_speed_y_stable.abs(); + + if start_speed_y <= air_speed_y_stable { + return distance / air_speed_y_stable; + } + + // Calculates the distance required to reach max fall speed from your starting speed + // Using the kinematic formula: v_final^2 = v_initial^2 + 2ad + // d = (v_f^2 - v_i^2) / 2a + let dist_to_stable = (air_speed_y_stable.powi(2) - start_speed_y.powi(2)) / (2.0 * air_accel_y); + + if dist_to_stable < distance { + // Case 1: We hit target distance before reaching max fall speed + // Using standard kinematics: d = v_i*t + 0.5*a*t^2 + // Solved for t via Quadratic Formula: t = (-v_i + sqrt(v_i^2 + 2ad)) / a + (-start_speed_y - (start_speed_y.powi(2) - 2.0 * air_accel_y * -distance).sqrt()) / air_accel_y + } else { + // Case 2: We reach max fall speed, then hit target distance + let time_to_stable = (air_speed_y_stable - start_speed_y) / air_accel_y; + let remaining_dist = distance - dist_to_stable; + let remaining_time = remaining_dist / air_speed_y_stable; + + time_to_stable + remaining_time + } } \ No newline at end of file diff --git a/fighters/bayonetta/Cargo.toml b/fighters/bayonetta/Cargo.toml index af6e39bef5..e581c9c986 100644 --- a/fighters/bayonetta/Cargo.toml +++ b/fighters/bayonetta/Cargo.toml @@ -8,6 +8,8 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/bayonetta/src/acmd/aerials.rs b/fighters/bayonetta/src/acmd/aerials.rs index eceb7dd7e4..2da5694e7c 100644 --- a/fighters/bayonetta/src/acmd/aerials.rs +++ b/fighters/bayonetta/src/acmd/aerials.rs @@ -6,41 +6,44 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 19.5, 3.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, false, false, true, 20, 0, 15, 0, false); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 20); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 20, 0, 10, 0, false); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, false, false, true, 20); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, true, 20); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 20); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 19.5); FT_MOTION_RATE_RANGE(agent, 19.5, 23.0, 2.0); frame(lua_state, 23.0); FT_MOTION_RATE_RANGE(agent, 23.0, 40.0, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 48, 103, 0, 35, 4.3, -2.6, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 48, 103, 0, 35, 3.9, 1.5, 0.0, 1.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footr"), 8.0, 48, 103, 0, 35, 3.8, 1.5, 0.0, 1.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 48, 103, 0, 35, 4.3, -2.6, 0.0, 0.25, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 48, 103, 0, 35, 3.9, 1.0, 0.0, 1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 8.0, 48, 103, 0, 35, 3.8, 1.0, 0.0, 1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneel"), 8.0, 48, 103, 0, 35, 1.6, 1.0, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 27.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 6.0, 48, 103, 0, 15, 4.3, -2.6, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 48, 103, 0, 15, 3.9, 1.5, 0.0, 1.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footr"), 6.0, 48, 103, 0, 15, 3.8, 1.5, 0.0, 1.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 6.0, 48, 103, 0, 15, 4.0, -2.4, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 48, 103, 0, 15, 3.6, 1.4, 0.0, 1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 6.0, 48, 103, 0, 15, 3.4, 1.4, 0.0, 1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::clear(boma, 3, false); } frame(lua_state, 40.0); - FT_MOTION_RATE(agent, 1.0); //30faf + FT_MOTION_RATE(agent, 1.0); // 30faf if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + CHECK_BA(agent, true); AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_FLAG_CHECK_HOLD); + agent.on_flag(*FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_FLAG_CHECK_HOLD); } frame(lua_state, 43.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2bfb02b69a), false); - AttackModule::clear_all(boma); //clear ba hitbox + AttackModule::clear_all(boma); // clear ba hitbox } frame(lua_state, 48.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } @@ -50,14 +53,16 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { let facing = PostureModule::lr(boma); frame(lua_state, 21.0); if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 9.0 + 0.5*facing, 0, 0, 100, 174, 1.2, true); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 8.8, -0.25, 0, 100, 174, 1.2, true); LAST_EFFECT_SET_RATE(agent, 0.85); + LAST_EFFECT_SET_SCALE_W(agent, 1.15, 1.27, 1.15); } frame(lua_state, 28.0); if is_excute(agent) { EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, false, true); - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 9, 0, 0, -88, 174, 1.2, true); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 8.8, 0.25, 0, -88, 174, 1.2, true); LAST_EFFECT_SET_RATE(agent, 0.9); + LAST_EFFECT_SET_SCALE_W(agent, 1.15, 1.27, 1.15); } frame(lua_state, 42.0); if is_excute(agent) { @@ -70,175 +75,208 @@ unsafe extern "C" fn game_attackairnhold(agent: &mut L2CAgentBase) { let boma = agent.boma(); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 2.0, 361, 65, 0, 30, 4.8, 3.0, 0.0, 1.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 9, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.0, 361, 65, 0, 30, 3.3, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 9, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 7, 1, Hash40::new("top"), 0.5, 361, 0, 0, 0, 2.5, 0.0, 14.0, -6.0, Some(0.0), Some(14.0), Some(-66.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); - ATTACK(agent, 8, 1, Hash40::new("top"), 0.5, 361, 0, 0, 0, 2.5, 0.0, 11.0, 13.0, Some(0.0), Some(11.0), Some(73.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); - ATTACK(agent, 9, 1, Hash40::new("top"), 0.5, 330, 0, 0, 0, 2.5, 0.0, 3.2, 2.0, Some(0.0), Some(-26.799999), Some(54.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), 7, 12, 4); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), 8, 15, 4); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), 9, 3, 4); + ATTACK(agent, 0, 0, Hash40::new("hip"), 2.0, 48, 65, 0, 30, 4.0, -2.4, 0.0, 0.5, None, None, None, 1.0, 1.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.0, 48, 65, 0, 30, 3.6, 0.4, 0.0, 1.5, None, None, None, 1.0, 1.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 2.0, 48, 65, 0, 30, 3.4, -0.6, 0.0, 1.5, None, None, None, 1.0, 1.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear(boma, 7, false); - AttackModule::clear(boma, 8, false); - AttackModule::clear(boma, 9, false); - } - frame(lua_state, 6.0); +} + +unsafe extern "C" fn effect_attackairnhold(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let facing = boma.lr(); if is_excute(agent) { - ATTACK(agent, 7, 1, Hash40::new("top"), 0.5, 361, 0, 0, 0, 2.5, 0.0, 14.0, 6.0, Some(0.0), Some(14.0), Some(66.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); - ATTACK(agent, 8, 1, Hash40::new("top"), 0.5, 361, 0, 0, 0, 2.5, 0.0, 11.0, -13.0, Some(0.0), Some(11.0), Some(-73.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); - ATTACK(agent, 9, 1, Hash40::new("top"), 0.5, 330, 0, 0, 0, 2.5, 0.0, 3.2, -2.0, Some(0.0), Some(-26.799999), Some(-54.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), 7, 12, 4); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), 8, 15, 4); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), 9, 3, 4); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 9.6, -0.5, 0, 150, 174, 1.25, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + LAST_EFFECT_SET_SCALE_W(agent, 1.02, 1.28, 1.02); } - wait(lua_state, 1.0); + frame(lua_state, 4.0); if is_excute(agent) { - AttackModule::clear(boma, 7, false); - AttackModule::clear(boma, 8, false); - AttackModule::clear(boma, 9, false); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC3, Hash40::new("top"), 0, 9.6, 0.5, 0, 330, 174, 1.25, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + LAST_EFFECT_SET_SCALE_W(agent, 1.02, 1.28, 1.02); } } unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 5.5, 2.0); + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 4.5, 2.0); if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 5.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, false, true, 10, 3, 10, 0, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, false, true, 10, 0, 10, 0, true); } - frame(lua_state, 5.5); - FT_MOTION_RATE_RANGE(agent, 5.5, 7.0, 2.0); + frame(lua_state, 4.5); + FT_MOTION_RATE_RANGE(agent, 4.5, 7.0, 2.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 7.0); - FT_MOTION_RATE_RANGE(agent, 7.0, 11.0, 2.0); - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 65, 10, 0, 60, 2.5, 0.0, 9.2, 3.2, Some(0.0), Some(9.2), Some(7.5), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 52, 10, 0, 58, 2.5, 0.0, 14.8, 3.2, Some(0.0), Some(14.8), Some(7.5), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 78, 10, 0, 68, 5.0, 0.0, 12.0, 5.0, Some(0.0), Some(12.0), Some(11.0), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 78, 10, 0, 54, 5.0, 0.0, 12.0, 5.0, Some(0.0), Some(12.0), Some(11.0), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 0, 0, Hash40::new("kneel"), 3.0, 68, 10, 0, 71, 1.8, 0.0, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame_revised(boma, 2, 1.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 3, -2.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 4, 3.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 0, -3.0, false); + FT_MOTION_RATE_RANGE(agent, 7.0, 13.0, 3.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneel"), 3.0, 80, 15, 0, 60, 1.6, 1.0, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 75, 15, 0, 55, 2.5, 0.0, 13.25, 2.5, Some(0.0), Some(8.25), Some(2.5), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 80, 15, 0, 55, 2.5, 0.0, 13.25, 5.5, Some(0.0), Some(8.25), Some(5.5), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 85, 15, 0, 55, 5.0, 0.0, 10.75, 5.0, Some(0.0), Some(10.75), Some(10.5), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 80, 15, 0, 60, 5.0, 0.0, 10.75, 5.0, Some(0.0), Some(10.75), Some(10.5), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); VarModule::set_int(boma.object(), vars::bayonetta::instance::ATTACK_AIR_F_COUNT, 1); } - frame(lua_state, 11.0);//7 - FT_MOTION_RATE_RANGE(agent, 11.0, 30.0, 18.0); //25 faf + frame(lua_state, 13.0); // 8 + FT_MOTION_RATE_RANGE(agent, 13.0, 30.0, 16.0); // 24 faf if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } frame(lua_state, 15.0); if is_excute(agent) { agent.on_flag(*FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_F_FLAG_ENABLE_COMBO); } - frame(lua_state, 30.0);//24 + frame(lua_state, 30.0); // 24 FT_MOTION_RATE_RANGE(agent, 30.0, 36.0, 10.0); - frame(lua_state, 36.0); //34 + frame(lua_state, 36.0); // 34 if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } -unsafe extern "C" fn game_attackairf2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 4.5); if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.0, 5.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, false, true, 10, 3, 10, 0, true); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_LINE1, Hash40::new("top"), 4, 12.75, -2.0, 0, -6, 0, 1.2, true); + LAST_EFFECT_SET_RATE(agent, 1.33); + LAST_EFFECT_SET_SCALE_W(agent, 1.375, 1.175, 1.375); } + frame(lua_state, 5.75); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("bayonetta_speedline"), Hash40::new("top"), 0, 9, 0.0, 0, 0, 0, 1, true); + if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(agent, 0.871, 0.145, 0.184); } + else {LAST_EFFECT_SET_COLOR(agent, 0.024, 0.285, 1); } + LAST_EFFECT_SET_ALPHA(agent, 0.75); + } +} + +unsafe extern "C" fn game_attackairf2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); frame(lua_state, 3.0); + FT_MOTION_RATE_RANGE(agent, 3.0, 7.0, 6.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, false, true, 10, 0, 10, 0, true); } - frame(lua_state, 7.0); + frame(lua_state, 4.0); // 3 + if is_excute(agent) { + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } + frame(lua_state, 7.0); // 7 FT_MOTION_RATE_RANGE(agent, 7.0, 9.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 65, 10, 0, 60, 3.5, 0.0, 9.5, 6.0, Some(0.0), Some(9.5), Some(11.0), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 52, 10, 0, 58, 3.5, 0.0, 14.5, 6.0, Some(0.0), Some(14.5), Some(11.0), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 78, 10, 0, 68, 6.0, 0.0, 12.0, 10.0, Some(0.0), Some(12.0), Some(15.0), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 78, 10, 0, 54, 6.0, 0.0, 12.0, 10.0, Some(0.0), Some(12.0), Some(15.0), 1.1, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame_revised(boma, 1, 1.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, -2.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 3, 3.0, false); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 75, 15, 0, 55, 2.5, 0.0, 15.05, 3.0, Some(0.0), Some(8.5), Some(3.0), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 80, 15, 0, 55, 2.5, 0.0, 15.05, 6.0, Some(0.0), Some(8.5), Some(6.0), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 85, 15, 0, 55, 6.0, 0.0, 11.5, 6.5, Some(0.0), Some(11.5), Some(11.0), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 80, 15, 0, 60, 6.0, 0.0, 11.5, 6.5, Some(0.0), Some(11.5), Some(11.0), 1.2, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); VarModule::set_int(boma.object(), vars::bayonetta::instance::ATTACK_AIR_F_COUNT, 2); } - frame(lua_state, 9.0);//10 + frame(lua_state, 9.0); // 10 FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 10.0);//11 - FT_MOTION_RATE_RANGE(agent, 10.0, 30.0, 14.0); //25 + frame(lua_state, 10.0); // 11 + FT_MOTION_RATE_RANGE(agent, 10.0, 30.0, 13.0); // 24 if is_excute(agent) { agent.on_flag(*FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_F_FLAG_ENABLE_COMBO); } - frame(lua_state, 12.0); + frame(lua_state, 11.0); // 12 if is_excute(agent) { - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + CHECK_BA(agent, true); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } frame(lua_state, 30.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 39.0); //33 + frame(lua_state, 39.0); // 33 if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } +} + +unsafe extern "C" fn effect_attackairf2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.66); + if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 11.75, 2.4, -5, 0, 197, 1.15, true); + LAST_EFFECT_SET_RATE(agent, 1.3); + LAST_EFFECT_SET_SCALE_W(agent, 1.06, 1.35, 1.06); } } unsafe extern "C" fn game_attackairf3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 2.0); + frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 7.0, 2.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, true, 10, 3, 10, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, true, 10, 0, 10, 5, true); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, false, false, true, 10); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 10); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 10); } frame(lua_state, 7.0); - FT_MOTION_RATE_RANGE(agent, 7.0, 11.5, 4.0); + FT_MOTION_RATE_RANGE(agent, 7.0, 11.5, 5.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 11.5); //7 + frame(lua_state, 11.5); // 8 FT_MOTION_RATE_RANGE(agent, 11.5, 16.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.0, 55, 78, 0, 55, 3.6, -4.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 55, 78, 0, 55, 4.1, 1.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 7.0, 55, 78, 0, 55, 4.6, 6.95, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.0, 55, 88, 0, 55, 3.6, -4.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 55, 88, 0, 55, 4.1, 1.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 7.0, 55, 88, 0, 55, 4.6, 6.95, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); VarModule::set_int(boma.object(), vars::bayonetta::instance::ATTACK_AIR_F_COUNT, 0); } - frame(lua_state, 16.0); + frame(lua_state, 16.0); // 12 FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 18.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } - frame(lua_state, 20.0); //15 - FT_MOTION_RATE_RANGE(agent, 20.0, 45.0, 17.0); //37 - frame(lua_state, 35.0); + frame(lua_state, 20.0); // 16 + FT_MOTION_RATE_RANGE(agent, 20.0, 42.0, 16.0); // 37 + frame(lua_state, 33.75); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } + frame(lua_state, 42.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_attackairf3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let eff = if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == *FIGHTER_BAYONETTA_COSTUME_KIND_BAYONETTA_1 { + Hash40::new("bayonetta_attack_arc4_red") + } else { + Hash40::new("bayonetta_attack_arc4_blue") + }; + frame(lua_state, 11.5); + if is_excute(agent) { + EFFECT_FOLLOW(agent, eff, Hash40::new("top"), -1, 11, 0.5, -20, 75, -83, 1.15, true); + LAST_EFFECT_SET_RATE(agent, 1.75); + LAST_EFFECT_SET_SCALE_W(agent, 1.15, 1.35, 1.15); + } + frame(lua_state, 16.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, eff, -1); } } @@ -248,39 +286,57 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 20.0, 8.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 10, 3, 10, 5, true); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 10, 0, 10, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 20); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 6.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 20.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 10.0, 48, 120, 0, 15, 3.2, -0.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 38, 120, 0, 15, 3.7, 0.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 12.0, 38, 120, 0, 10, 4.2, 6.8, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 10.0, 48, 120, 0, 15, 3.2, -0.5, -0.75, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 38, 120, 0, 15, 3.7, -0.8, -0.75, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 12.0, 38, 120, 0, 8, 4.2, -0.2, -0.75, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 3, 0, Hash40::new("kneer"), 8.0, 48, 120, 0, 15, 1.8, 1.2, -0.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 23.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 48, 120, 0, 15, 3.2, -0.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 48, 120, 0, 15, 3.7, 0.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 10.0, 48, 120, 0, 15, 4.2, 6.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 48, 120, 0, 15, 3.0, -0.3, -0.75, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 48, 120, 0, 15, 3.4, -0.5, -0.75, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 10.0, 48, 120, 0, 15, 3.8, 0.2, -0.75, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::clear(boma, 3, false); } frame(lua_state, 26.0); - FT_MOTION_RATE_RANGE(agent, 26.0, 45.0, 16.0);//31 + FT_MOTION_RATE_RANGE(agent, 26.0, 45.0, 16.0); // 31 if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } frame(lua_state, 31.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } + frame(lua_state, 45.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC2, Hash40::new("top"), 2, 10.5, 0, 0, 165, 120, 1.1, true); + LAST_EFFECT_SET_RATE(agent, 1.2); + LAST_EFFECT_SET_SCALE_W(agent, 1.02, 1.25, 1.02); + } + frame(lua_state, 25.0); + if is_excute(agent) { + EFFECT_DETACH_KIND_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC2, -1); } } @@ -301,56 +357,99 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 6.45); + FT_MOTION_RATE_RANGE(agent, 1.0, 10.5, 7.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, true, 20, 3, 15, 0, false); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, true, 20, 0, 10, 0, false); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, false, false, true, 20); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 20); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 20); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } + frame(lua_state, 10.45); // 8 + FT_MOTION_RATE_RANGE(agent, 10.45, 18.0, 5.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.7, 70, 119, 0, 40, 3.0, -2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.7, 70, 119, 0, 40, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 7.7, 70, 119, 0, 40, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 10.0); //8 - FT_MOTION_RATE_RANGE(agent, 10.0, 20.3, 5.25); + frame(lua_state, 10.55); // 9 if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 8.0, 75, 115, 0, 40, 4.2, 6.3, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 75, 115, 0, 40, 3.6, 2.1, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 75, 115, 0, 40, 3.2, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::set_vector(boma, 0, 77, false); + AttackModule::set_vector(boma, 1, 77, false); + AttackModule::set_vector(boma, 2, 77, false); } - frame(lua_state, 20.3);//14 - FT_MOTION_RATE_RANGE(agent, 20.3, 28.0, 3.0); + frame(lua_state, 18.0); // 14 + FT_MOTION_RATE_RANGE(agent, 18.0, 29.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.0, 55, 84, 0, 40, 4.2, 6.3, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 55, 84, 0, 40, 3.6, 2.1, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 7.0, 55, 84, 0, 40, 3.2, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 6.5, 55, 89, 0, 40, 3.0, -2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.5, 55, 89, 0, 40, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 6.5, 55, 89, 0, 40, 4.0, -0.25, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 28.0);//17 - FT_MOTION_RATE_RANGE(agent, 28.0, 39.0, 15.0); //30 + frame(lua_state, 29.0); // 18 + FT_MOTION_RATE_RANGE(agent, 29.0, 39.0, 14.0); // 30 if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_FLAG_CHECK_HOLD); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_FLAG_CHECK_HOLD); } frame(lua_state, 33.0); if is_excute(agent) { AttackModule::clear_all(boma); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2bfb02b69a), false); } - frame(lua_state, 34.0); + frame(lua_state, 35.0); // 25 if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 39.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; + let boma = agent.boma(); frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 14.6, -0.1, 0, -55, -90, 1.14, true); - LAST_EFFECT_SET_RATE(agent, 0.84); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 14.1, -0.6, 0, -46, -90, 1.15, true); + let effect = EffectModule::get_last_handle(boma) as u64; + VarModule::set_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE, effect); + EffectModule::set_rate(boma, effect as u32, 0.95); } - frame(lua_state, 29.0); + frame(lua_state, 12.0); if is_excute(agent) { - EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, false, true); + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rot(boma, effect as u32, &Vector3f{x: 0.0, y: -60.0, z: -90.0}); + } + frame(lua_state, 14.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rot(boma, effect as u32, &Vector3f{x: 0.0, y: -63.0, z: -90.0}); + } + frame(lua_state, 16.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rot(boma, effect as u32, &Vector3f{x: 0.0, y: -67.0, z: -90.0}); + } + frame(lua_state, 18.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rate(boma, effect as u32, 1.65); + EffectModule::set_rot(boma, effect as u32, &Vector3f{x: 0.0, y: -75.0, z: -90.0}); + } //quick fadeout effect instead of instantly deleted + frame(lua_state, 20.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rot(boma, effect as u32, &Vector3f{x: 0.0, y: -79.0, z: -90.0}); + } + frame(lua_state, 22.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rot(boma, effect as u32, &Vector3f{x: 0.0, y: -77.0, z: -90.0}); + } + frame(lua_state, 26.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rot(boma, effect as u32, &Vector3f{x: 0.0, y: -74.0, z: -90.0}); } } @@ -361,7 +460,7 @@ unsafe extern "C" fn expression_attackairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 10.0); + frame(lua_state, 9.0); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); } @@ -374,15 +473,29 @@ unsafe extern "C" fn expression_attackairhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairhihold(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - AttackModule::clear(boma, 0, false); - AttackModule::clear(boma, 1, false); - AttackModule::clear(boma, 2, false); - ATTACK(agent, 3, 0, Hash40::new("kneel"), 1.5, 48, 45, 0, 25, 3.5, 4.5, 1.0, 0.0, None, None, None, 1.0, 1.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 9, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneer"), 1.5, 48, 45, 0, 25, 3.5, 4.5, 1.0, 0.0, None, None, None, 1.0, 1.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 9, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("footl"), 1.5, 55, 75, 0, 25, 3.5, -1.75, 0.0, 0.0, None, None, None, 1.0, 1.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("footr"), 1.5, 55, 75, 0, 25, 3.5, -1.75, 0.0, 0.0, None, None, None, 1.0, 1.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } +} + + +unsafe extern "C" fn effect_attackairhihold(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC3, Hash40::new("top"), 0, 13.4, 0, 0, 200, -90, 1.1, true); + LAST_EFFECT_SET_SCALE_W(agent, 1.025, 1.2, 1.025); + EFFECT_FOLLOW(agent, Hash40::new("bayonetta_cartridge"), Hash40::new("haver2"), 0, 0.6, 2.5, 0, 0, 0, 1, true); } + wait(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC3, Hash40::new("top"), 0, 13.4, 0, 0, 85, -90, 1.1, true); + LAST_EFFECT_SET_SCALE_W(agent, 1.025, 1.2, 1.025); + EFFECT_FOLLOW(agent, Hash40::new("bayonetta_cartridge"), Hash40::new("havel"), 0, 0.6, 2, 0, 0, 0, 1, true); + } + wait(lua_state, 6.0); } unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { @@ -391,42 +504,42 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 25.0, 15.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + agent.on_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); SET_SPEED_EX(agent, 0, 0.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + agent.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); } - frame(lua_state, 10.0);//7 + frame(lua_state, 10.0); // 7 if is_excute(agent) { KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - WorkModule::on_flag(boma, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); + agent.on_flag(*FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); } frame(lua_state, 23.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_KEEP_AIR); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_KEEP_AIR); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 25.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + agent.on_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); SET_SPEED_EX(agent, 0, -3.8, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + agent.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); /* Air-only */ - ATTACK(agent, 0, 0, Hash40::new("kneel"), 8.0, 70, 120, 0, 30, 4.0, -5.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 270, 42, 0, 45, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 10.0, 270, 42, 0, 45, 4.0, 5.5, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 8.0, 70, 120, 0, 30, 3.5, -5.25, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 270, 42, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 10.0, 270, 42, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); /* Ground-only */ - ATTACK(agent, 3, 0, Hash40::new("kneel"), 8.0, 50, 100, 45, 0, 4.0, -5.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneel"), 10.0, 270, 100, 45, 0, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("kneel"), 10.0, 250, 100, 45, 0, 4.0, 5.5, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneel"), 8.0, 330, 100, 45, 0, 3.5, -5.25, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("kneel"), 10.0, 270, 100, 45, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("footl"), 10.0, 210, 100, 45, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 33.0); - FT_MOTION_RATE_RANGE(agent, 33.0, 43.0, 8.0); //48 + FT_MOTION_RATE_RANGE(agent, 33.0, 43.0, 8.0); // 48 if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); - ATTACK(agent, 0, 0, Hash40::new("kneel"), 8.0, 50, 50, 0, 30, 4.0, -5.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 50, 50, 0, 30, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 8.0, 50, 50, 0, 30, 4.0, 5.5, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + agent.off_flag(*FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 8.0, 50, 50, 0, 30, 3.5, -5.25, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 50, 50, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 8.0, 50, 50, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::clear(boma, 3, false); AttackModule::clear(boma, 4, false); AttackModule::clear(boma, 5, false); @@ -439,11 +552,11 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 49.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_FLAG_LANDING_DISABLE_ATTACK); + agent.on_flag(*FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_FLAG_LANDING_DISABLE_ATTACK); } frame(lua_state, 57.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } @@ -453,16 +566,16 @@ unsafe extern "C" fn game_landingairlw(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { SET_SPEED_EX(agent, 0, 0, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, false, 10, 3, 3, 0, true); - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 45, 111, 0, 78, 4.0, 0.0, 3.0, 4.0, Some(0.0), Some(3.0), Some(13.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 45, 111, 0, 78, 4.0, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(13.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, false, 10, 0, 1, 0, true); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 34, 140, 0, 30, 4.0, 0.0, 3.0, 4.0, Some(0.0), Some(3.0), Some(13.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 34, 140, 0, 30, 4.0, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(13.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } } @@ -470,18 +583,27 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); agent.acmd("effect_attackairn", effect_attackairn, Priority::Low); agent.acmd("game_attackairnhold", game_attackairnhold, Priority::Low); + agent.acmd("effect_attackairnhold", effect_attackairnhold, Priority::Low); agent.acmd("game_attackairf", game_attackairf, Priority::Low); + agent.acmd("effect_attackairf", effect_attackairf, Priority::Low); + agent.acmd("game_attackairf2", game_attackairf2, Priority::Low); + agent.acmd("effect_attackairf2", effect_attackairf2, Priority::Low); + agent.acmd("game_attackairf3", game_attackairf3, Priority::Low); + agent.acmd("effect_attackairf3", effect_attackairf3, Priority::Low); agent.acmd("game_attackairb", game_attackairb, Priority::Low); + agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); agent.acmd("expression_attackairb", expression_attackairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); agent.acmd("effect_attackairhi", effect_attackairhi, Priority::Low); agent.acmd("expression_attackairhi", expression_attackairhi, Priority::Low); + agent.acmd("game_attackairhihold", game_attackairhihold, Priority::Low); + agent.acmd("effect_attackairhihold", effect_attackairhihold, Priority::Low); agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); agent.acmd("game_landingairlw", game_landingairlw, Priority::Low); diff --git a/fighters/bayonetta/src/acmd/bullets.rs b/fighters/bayonetta/src/acmd/bullets.rs new file mode 100644 index 0000000000..239706322c --- /dev/null +++ b/fighters/bayonetta/src/acmd/bullets.rs @@ -0,0 +1,89 @@ +use super::*; + +unsafe extern "C" fn BA_SHOOTING_ON(agent: &mut L2CAgentBase, hand: bool, joint: Hash40, msc_arg_1: f32, msc_arg_2: f32) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let lr = agent.lr(); + // check if this gun is first to fire + let mut first_fire = false; + if !VarModule::is_flag(agent.battle_object, vars::bayonetta::status::BULLET_FIRST_FIRE) { + VarModule::on_flag(agent.battle_object, vars::bayonetta::status::BULLET_FIRST_FIRE); + first_fire = true; + } + // calc firing position and angle + let mut gun_pos = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + let mut gun_pos_2 = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + let top_pos = *PostureModule::pos(boma); + let mut ground_bounce = false; // vanilla ricochet mechanic from dsmash (but automated) + if hand { + ModelModule::joint_global_position_with_offset(boma, joint, &Vector3f{x: 1.0, y: 0.0, z: 0.65}, gun_pos, true); + ModelModule::joint_global_position_with_offset(boma, joint, &Vector3f{x: 7.0, y: 0.0, z: 0.65}, gun_pos_2, true); + } else { + ModelModule::joint_global_position_with_offset(boma, joint, &Vector3f{x: -2.5, y: 0.0, z: 0.0}, gun_pos, true); + ModelModule::joint_global_position_with_offset(boma, joint, &Vector3f{x: 3.5, y: 0.0, z: 0.0}, gun_pos_2, true); + } + // calc for ricochet + let ground_pos_any = &mut Vector2f::zero(); + let ground_pos_stage = &mut Vector2f::zero(); + let is_touch_any = !GroundModule::line_segment_check(boma, &Vector2f{x: gun_pos.x, y: gun_pos.y}, &Vector2f{x: gun_pos_2.x, y: gun_pos_2.y}, &Vector2f::zero(), ground_pos_any, true).is_null(); + let is_touch_stage = !GroundModule::line_segment_check(boma, &Vector2f{x: gun_pos.x, y: gun_pos.y}, &Vector2f{x: gun_pos_2.x, y: gun_pos_2.y}, &Vector2f::zero(), ground_pos_stage, false).is_null(); + let ground_bounce = is_touch_stage || (is_touch_any && ground_pos_any.y < gun_pos.y); // dont bounce on bottom of platform + // calc angle of hitboxes + let angle = if ground_bounce { (gun_pos_2.y - gun_pos.y).atan2((gun_pos_2.x - gun_pos.x) * lr) - std::f32::consts::PI} else {(gun_pos_2.y - gun_pos.y).atan2((gun_pos_2.x - gun_pos.x) * lr)}; //? + let angle_deg = if angle.to_degrees() < 0.0 {angle.to_degrees().round() + 360.0 } else {angle.to_degrees().round() }; // launch angle cant be negative + let gun_offset = Vector3f{ x: gun_pos.x - top_pos.x, y: gun_pos.y - top_pos.y, z: gun_pos.z - top_pos.z}; + let offset_y = 100.0 * angle.sin(); + let offset_x = 100.0 * angle.cos(); + let push_y = 25.0 * angle.sin(); + let push_x = 25.0 * angle.cos(); + // hitbox properties + let hitbox_id = if first_fire {*FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_00} else {*FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_02}; + if is_excute(agent) { + if !agent.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_DISABLE_ROOT_ATTACK) { + ATTACK(agent, hitbox_id as u64, 1, Hash40::new("top"), 0.6, angle_deg as u64, 0, 0, 0, 3.25, 0.0, gun_offset.y, gun_offset.x * lr, Some(0.0), Some(gun_offset.y + push_y), Some(gun_offset.x * lr + push_x), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); + } + ATTACK(agent, hitbox_id as u64 + 1, 1, Hash40::new("top"), 0.4, angle_deg as u64, 0, 0, 0, 2.75, 0.0, gun_offset.y, gun_offset.x * lr, Some(0.0), Some(gun_offset.y + offset_y), Some(gun_offset.x * lr + offset_x), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 4, true, *BATTLE_OBJECT_ID_INVALID as u32); + if msc_arg_1 > -1.0 && !ground_bounce { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), smash::lib::LuaConst::new(hitbox_id as u32), msc_arg_1, msc_arg_2); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), smash::lib::LuaConst::new(hitbox_id as u32 + 1), msc_arg_1, msc_arg_2); + } // truncates hitbox length when it goes through a wall + } +} + +unsafe extern "C" fn game_shootingon_generic_arml(agent: &mut L2CAgentBase) { + BA_SHOOTING_ON(agent, true, Hash40::new("handl"), 6.0, 4.0); +} +unsafe extern "C" fn game_shootingon_generic_armr(agent: &mut L2CAgentBase) { + BA_SHOOTING_ON(agent, true, Hash40::new("handr"), 6.0, 4.0); +} +unsafe extern "C" fn game_shootingon_generic_legl(agent: &mut L2CAgentBase) { + BA_SHOOTING_ON(agent, false, Hash40::new("footl2"), 6.0, 4.0); +} +unsafe extern "C" fn game_shootingon_generic_legr(agent: &mut L2CAgentBase) { + BA_SHOOTING_ON(agent, false, Hash40::new("footr2"), 6.0, 4.0); +} + +// floats are for determining hitbox cut off when clipping thru stage + +unsafe extern "C" fn game_shootingoff_generic(agent: &mut L2CAgentBase) { + let boma = agent.boma(); + if is_excute(agent) { + AttackModule::clear(boma, *FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_01, false); + AttackModule::clear(boma, *FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_03, false); + if !agent.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_DISABLE_ROOT_ATTACK) { + AttackModule::clear(boma, *FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_00, false); + AttackModule::clear(boma, *FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_02, false); + } + VarModule::off_flag(agent.battle_object, vars::bayonetta::status::BULLET_FIRST_FIRE); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_shootingon_generic_arml", game_shootingon_generic_arml, Priority::Low); + agent.acmd("game_shootingon_generic_armr", game_shootingon_generic_armr, Priority::Low); + agent.acmd("game_shootingon_generic_legl", game_shootingon_generic_legl, Priority::Low); + agent.acmd("game_shootingon_generic_legr", game_shootingon_generic_legr, Priority::Low); + + agent.acmd("game_shootingoff_generic", game_shootingoff_generic, Priority::Low); +} diff --git a/fighters/bayonetta/src/acmd/ground.rs b/fighters/bayonetta/src/acmd/ground.rs index da2c8ba96b..8b37cf6ced 100644 --- a/fighters/bayonetta/src/acmd/ground.rs +++ b/fighters/bayonetta/src/acmd/ground.rs @@ -3,68 +3,92 @@ use super::*; unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.8); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 3.0); if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.5, 5.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, true, false, 10, 3, 10, 5, true); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.5); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, true, false, 10, 0, 10, 5, true); + VarModule::set_int(agent.battle_object, vars::bayonetta::instance::ATTACK_S3_COUNT, 2); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 9.0); //5 + frame(lua_state, 9.0); // 5 FT_MOTION_RATE_RANGE(agent, 9.0, 13.0, 3.0); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.0, 5.0); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 52, 10, 0, 35, 3.5, 0.0, 10.0, 3.2, None, None, None, 1.0, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 58, 10, 0, 35, 3.5, 0.0, 10.0, 7.2, None, None, None, 1.0, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 64, 10, 0, 32, 4.0, 0.0, 10.0, 11.0, None, None, None, 1.0, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 10, 0, 35, 2.5, 0.0, 5.0, 3.0, Some(0.0), Some(5.0), Some(11.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame_revised(boma, 0, 1.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 1.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 2.0, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 63, 10, 0, 35, 3.0, 0.0, 9.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 70, 10, 0, 35, 3.6, 0.0, 8.8, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 77, 10, 0, 32, 4.0, 0.0, 8.6, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 10, 0, 35, 3.0, 0.0, 4.5, 3.0, Some(0.0), Some(4.5), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_down_only(boma, 3, true); } - frame(lua_state, 13.0); //8 - FT_MOTION_RATE_RANGE(agent, 13.0, 27.0, 12.0);//20f + frame(lua_state, 13.0); // 8 + FT_MOTION_RATE_RANGE(agent, 13.0, 27.0, 11.0); // 19f if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 14.0); if is_excute(agent) { if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + CHECK_BA(agent, true); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } } frame(lua_state, 16.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } +unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_LINE1, Hash40::new("top"), 2.5*boma.lr(), 10.5, 0.4, 0, 0, 0, 1, false); + LAST_EFFECT_SET_SCALE_W(agent, 1.15, 0.9, 1.15); + LAST_EFFECT_SET_RATE(agent, 1.25); + EffectModule::set_disable_render_offset_last(boma); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT_DETACH_KIND_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_LINE1, -1); + } + frame(lua_state, 14.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("bayonetta_beretta_rotation"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 1, true); + if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(agent, 1, 0.118, 0.118); } + else {LAST_EFFECT_SET_COLOR(agent, 0.059, 0.38, 1); } + } + frame(lua_state, 30.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("bayonetta_beretta_rotation"), true, true); + } +} + unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.25); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 6.0); if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 3.5, 5.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, true, false, 10, 3, 10, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, true, false, 10, 0, 10, 5, true); + VarModule::set_int(agent.battle_object, vars::bayonetta::instance::ATTACK_S3_COUNT, 0); } frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 52, 10, 0, 40, 3.0, 0.0, 10.8, 3.2, None, None, None, 1.0, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 58, 10, 0, 40, 3.2, 0.0, 10.6, 7.2, None, None, None, 1.0, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 64, 10, 0, 40, 4.0, 0.0, 10.3, 11.0, None, None, None, 1.0, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 63, 10, 0, 40, 3.0, 0.0, 9.8, 2.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 70, 10, 0, 40, 3.5, 0.0, 9.5, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 77, 10, 0, 38, 4.0, 0.0, 9.25, 9.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 10, 0, 35, 3.0, 0.0, 4.5, 6.0, Some(0.0), Some(4.5), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame_revised(boma, 0, 1.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 1.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 1.0, false); AttackModule::set_down_only(boma, 3, true); } - frame(lua_state, 12.0);//10 + frame(lua_state, 12.0); // 10 FT_MOTION_RATE_RANGE(agent, 12.0, 27.0, 10.0); if is_excute(agent) { AttackModule::clear_all(boma); @@ -72,7 +96,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); if is_excute(agent) { if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + CHECK_BA(agent, true); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } @@ -86,33 +110,80 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } - frame(lua_state, 27.0);//20f + frame(lua_state, 27.0); // 20f FT_MOTION_RATE(agent, 1.0); } +unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let lr = boma.lr(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("bayonetta_beretta_rotation"), true, true); + } + frame(lua_state, 4.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 9.25+0.5*boma.lr(), 0.5, -2.0-2.0*lr, 0, 182.0 + 12.0*lr, 1, true); + LAST_EFFECT_SET_SCALE_W(agent, 0.9, 1.1, 0.9); + LAST_EFFECT_SET_RATE(agent, 1.125); + EffectModule::set_disable_render_offset_last(boma); + } + frame(lua_state, 11.0); + if is_excute(agent) { + EFFECT_DETACH_KIND_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, -1); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("bayonetta_beretta_rotation"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 1, true); + if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(agent, 1, 0.118, 0.118); } + else {LAST_EFFECT_SET_COLOR(agent, 0.059, 0.38, 1); } + } + frame(lua_state, 35.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("bayonetta_beretta_rotation"), true, true); + } +} + unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.55); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 6.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 7.0); if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 6.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 3, 10, 5, true); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, true, false, 10); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, true, false, 10, 0, 10, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10); } frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handl"), 5.0, 57, 101, 0, 57, 4.0, 0.0, 0.0, 2.5, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 5.0, 57, 101, 0, 57, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 5.0, 57, 101, 0, 57, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handl"), 5.0, 50, 105, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 5.0, 50, 105, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 5.0, 50, 105, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 15.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + } +} + +unsafe extern "C" fn expression_attack13(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 7.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 10.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); } } @@ -124,7 +195,7 @@ unsafe extern "C" fn game_attack100(agent: &mut L2CAgentBase) { if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, true, 10, 0, 3, 0, false); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, true, true, 10); - //fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + CHECK_BA(agent, true); } frame(lua_state, 2.0); if is_excute(agent) { @@ -176,7 +247,7 @@ unsafe extern "C" fn game_attack100(agent: &mut L2CAgentBase) { } wait_loop_clear(agent); agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_100_CONTINUE_CHECK); - //loc.imp._Unwind_Resume(); + // loc.imp._Unwind_Resume(); } } @@ -187,30 +258,31 @@ unsafe extern "C" fn game_attack100end(agent: &mut L2CAgentBase) { if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2bfb02b69a), true); GroundModule::correct(boma, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 3, 15, 5, true); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 0, 15, 5, true); + CHECK_BA(agent, true); } frame(lua_state, 4.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 0.5, 90, 100, 30, 0, 3.0, 0.0, 6.0, 23.5, Some(0.0), Some(6.0), Some(8.5), 0.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 0.5, 90, 100, 20, 0, 4.5, 0.0, 11.0, 22.5, Some(0.0), Some(11.0), Some(9.5), 0.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } - wait(lua_state, 2.0); + frame(lua_state, 6.0); if is_excute(agent) { - AttackModule::clear_all(boma); + AttackModule::clear(boma, 0, false); + AttackModule::clear(boma, 1, false); } frame(lua_state, 11.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 45, 136, 0, 60, 6.5, 0.0, 8.5, 6.8, Some(0.0), Some(8.5), Some(13.8), 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } - wait(lua_state, 2.0); + frame(lua_state, 13.0); if is_excute(agent) { - AttackModule::clear_all(boma); + AttackModule::clear(boma, 0, false); GroundModule::correct(boma, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); } frame(lua_state, 15.0); if is_excute(agent) { - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + CHECK_BA(agent, true); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } @@ -221,46 +293,100 @@ unsafe extern "C" fn game_attack100end(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.93); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 16.5, 10.5); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 4.0); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 6.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 3, 15, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 0, 15, 5, true); } - frame(lua_state, 16.5); - FT_MOTION_RATE_RANGE(agent, 16.5, 27.0, 11.5); - frame(lua_state, 17.5); + frame(lua_state, 9.0); + FT_MOTION_RATE_RANGE(agent, 9.0, 17.0, 7.0); + frame(lua_state, 17.0); // 12 + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 18.0); // 13 + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.9); + FT_MOTION_RATE_RANGE(agent, 18.0, 28.0, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 58, 100, 0, 50, 5.0, 0.0, 10.0, 10.5, Some(0.0), Some(10.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 58, 100, 0, 50, 1.0, 0.0, 4.0, 11.0, Some(0.0), Some(4.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 11.0, 60, 100, 0, 50, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 11.0, 60, 100, 0, 50, 4.75, 1.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("footr"), 11.0, 60, 100, 0, 50, 2.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } - frame(lua_state, 21.5); + frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 58, 60, 0, 60, 4.5, 0.0, 10.0, 10.5, Some(0.0), Some(10.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 58, 60, 0, 60, 1.0, 0.0, 4.0, 11.0, Some(0.0), Some(4.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 60, 100, 0, 37, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"),7.0, 60, 100, 0, 37, 4.25, -0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("footr"),7.0, 60, 100, 0, 37, 2.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } - frame(lua_state, 26.0); + frame(lua_state, 28.0); // 22 + FT_MOTION_RATE_RANGE(agent, 28.0, 43.0, 20.0); if is_excute(agent) { AttackModule::clear_all(boma); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } - frame(lua_state, 27.0); + frame(lua_state, 43.0); // 42 FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("armr"), 7, 0.5, 0, 0, 0, 0, 1.4, true); + } + frame(lua_state, 13.0); + if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_STILETTO, Hash40::new("armr"), 6.5, 0.5, 0, 0, 90, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 1.2); + EffectModule::enable_sync_init_pos_last(boma); + } + frame(lua_state, 16.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 22.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 23.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 26.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 27.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } frame(lua_state, 28.0); - FT_MOTION_RATE_RANGE(agent, 28.0, 43.0, 20.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + EFFECT_FOLLOW(agent, Hash40::new("bayonetta_beretta_rotation"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); + if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(agent, 1, 0.118, 0.118); } + else {LAST_EFFECT_SET_COLOR(agent, 0.059, 0.38, 1); } + } + frame(lua_state, 42.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("bayonetta_beretta_rotation"), true, true); } } pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); + agent.acmd("effect_attack11", effect_attack11, Priority::Low); + agent.acmd("game_attack12", game_attack12, Priority::Low); + agent.acmd("effect_attack12", effect_attack12, Priority::Low); + agent.acmd("game_attack13", game_attack13, Priority::Low); + agent.acmd("expression_attack13", expression_attack13, Priority::Low); + agent.acmd("game_attack100", game_attack100, Priority::Low); agent.acmd("game_attack100end", game_attack100end, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); + agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); } diff --git a/fighters/bayonetta/src/acmd/mod.rs b/fighters/bayonetta/src/acmd/mod.rs index d8a22387b4..9c7ecb597a 100644 --- a/fighters/bayonetta/src/acmd/mod.rs +++ b/fighters/bayonetta/src/acmd/mod.rs @@ -7,6 +7,30 @@ mod aerials; mod specials; mod throws; mod other; +mod bullets; + +pub unsafe fn CHECK_BA(agent: &mut L2CAgentBase, enable: bool) -> bool { + // only enables bullet arts if button has been held longer than 5f + let buffer = ControlModule::get_command_life_count_max(agent.module_accessor) as usize; + if agent.is_button_on(Buttons::Special) { + if agent.is_button_trigger(Buttons::Special) + || InputModule::get_trigger_count(agent.battle_object, Buttons::Special) < buffer { + return false.into() + } + if enable{agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); } + return true.into() + } + if agent.is_button_on(Buttons::Attack) { + if agent.is_button_trigger(Buttons::Attack) + || InputModule::get_trigger_count(agent.battle_object, Buttons::Attack) < buffer { + return false.into() + } + if enable{agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); } + return true.into() + } + agent.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + false.into() +} pub fn install(agent: &mut Agent) { ground::install(agent); @@ -16,4 +40,5 @@ pub fn install(agent: &mut Agent) { specials::install(agent); throws::install(agent); other::install(agent); + bullets::install(agent); } \ No newline at end of file diff --git a/fighters/bayonetta/src/acmd/other.rs b/fighters/bayonetta/src/acmd/other.rs index 2d9f83487b..4c1c93c677 100644 --- a/fighters/bayonetta/src/acmd/other.rs +++ b/fighters/bayonetta/src/acmd/other.rs @@ -77,7 +77,6 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 4.0); if is_excute(agent) { @@ -91,10 +90,7 @@ unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -113,10 +109,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapen(agent: &mut L2CAgentBase) {} diff --git a/fighters/bayonetta/src/acmd/smashes.rs b/fighters/bayonetta/src/acmd/smashes.rs index 5f8d546255..279eae81e8 100644 --- a/fighters/bayonetta/src/acmd/smashes.rs +++ b/fighters/bayonetta/src/acmd/smashes.rs @@ -4,67 +4,138 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); frame(lua_state, 3.0); if is_excute(agent) { agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } app::sv_animcmd::execute(lua_state, 3.0); - FT_MOTION_RATE(agent, 1.0); frame(lua_state, 5.0); app::sv_animcmd::execute(lua_state, 5.0); if is_excute(agent) { if agent.is_flag(*FIGHTER_STATUS_ATTACK_FLAG_SMASH_SMASH_HOLD_TO_ATTACK) { ArticleModule::generate_article(boma, *FIGHTER_BAYONETTA_GENERATE_ARTICLE_WICKEDWEAVEARM, false, -1); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 3, 5, 0, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 0, 5, 0, true); } } frame(lua_state, 22.0); + FT_MOTION_RATE_RANGE(agent, 22.0, 68.0, 45.0); if is_excute(agent) { AttackModule::set_power_mul_status(boma, 1.0); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } + frame(lua_state, 68.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 1.75); + FT_MOTION_RATE(agent, 1.5); frame(lua_state, 5.0); FT_MOTION_RATE(agent, 1.0); app::sv_animcmd::execute(lua_state, 5.0); if is_excute(agent) { agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); if agent.is_flag(*FIGHTER_STATUS_ATTACK_FLAG_SMASH_SMASH_HOLD_TO_ATTACK) { - ArticleModule::generate_article(boma, *FIGHTER_BAYONETTA_GENERATE_ARTICLE_WICKEDWEAVEARM, false, -1); //f17 ingame + ArticleModule::generate_article(boma, *FIGHTER_BAYONETTA_GENERATE_ARTICLE_WICKEDWEAVEARM, false, -1); // f17 ingame } } frame(lua_state, 9.0); + FT_MOTION_RATE_RANGE(agent, 9.0, 25.0, 18.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, false, true, 10, 3, 5, 0, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, false, true, 10, 0, 5, 0, true); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, true, false, true, 10); } frame(lua_state, 25.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::set_power_mul_status(boma, 1.0); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } frame(lua_state, 30.0); - FT_MOTION_RATE_RANGE(agent, 30.0, 65.0, 32.0);//makeup for slowed start + FT_MOTION_RATE_RANGE(agent, 30.0, 65.0, 31.0); // makeup for slowed start if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2aa2fe5e2f), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM); } } +unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + app::sv_animcmd::execute(lua_state, 9.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + } + frame(lua_state, 10.0); + if is_excute(agent) { + if agent.is_flag(*FIGHTER_STATUS_ATTACK_FLAG_SMASH_SMASH_HOLD_TO_ATTACK) { + ArticleModule::generate_article(boma, *FIGHTER_BAYONETTA_GENERATE_ARTICLE_WICKEDWEAVELEG, false, -1); // 21 -> f23 ingame + } + } + frame(lua_state, 11.0); + FT_MOTION_RATE_RANGE(agent, 11.0, 16.0, 6.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, false, 10, 0, 10, 0, false); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, false, 10); + } + frame(lua_state, 12.0); + //FT_MOTION_RATE_RANGE(agent, 12.0, 16.0, 3.0); + frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 20.0, 2.0); + frame(lua_state, 20.0); // 17 -> 19 + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 0, 100, 20, 0, 4.0, 0.0, 3.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + agent.clear_lua_stack(); + lua_args!(agent, 0); + sv_animcmd::ATK_NO_REACTION_SEARCH_WITCH_TIME(lua_state); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 28.0); + FT_MOTION_RATE_RANGE(agent, 28.0, 69.0, 39.0); // 65 -> 64 + if is_excute(agent) { + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + } + frame(lua_state, 69.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("bayonetta_change_circle"), Hash40::new("waist"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("footl"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("bayonetta_heelstomp"), Hash40::new("top"), 5, 0, 0, 0, 0, 0, 0.55, 0, 0, 0, 0, 0, 0, false); + if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(agent, 1.498, 0.298, 0.498); } + else {LAST_EFFECT_SET_COLOR(agent, 0.098, 0.698, 1.498); } + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 5, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); agent.acmd("game_attacks4hi", game_attacks4, Priority::Low); agent.acmd("game_attacks4lw", game_attacks4, Priority::Low); agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); + + agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); + agent.acmd("effect_attacklw4", effect_attacklw4, Priority::Low); } diff --git a/fighters/bayonetta/src/acmd/specials.rs b/fighters/bayonetta/src/acmd/specials.rs index 4372e9f58e..c34cb1a19f 100644 --- a/fighters/bayonetta/src/acmd/specials.rs +++ b/fighters/bayonetta/src/acmd/specials.rs @@ -6,10 +6,14 @@ unsafe extern "C" fn game_specialnstarth(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); let startup_frame = if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.startup_frame") -1.0} else {14.0}; - MotionModule::set_rate(boma, 30.0/startup_frame);//van (15f before charge) - if VarModule::is_flag(agent.battle_object, vars::common::instance::WAS_PREV_STATUS_CANCELABLE) { - VarModule::off_flag(agent.battle_object, vars::bayonetta::instance::WAS_CANCEL);//should maybe hopefully disable the flag if she didnt cancel into it w/o messing with end statuses - }//if change update kirby manually + MotionModule::set_rate(boma, 30.0/startup_frame); // van (15f before charge) + let prev_inflict_status = VarModule::get_int(agent.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + let prev_status_0 = StatusModule::prev_status_kind(boma, 0); + VarModule::off_flag(agent.battle_object, vars::bayonetta::instance::WAS_CANCEL); + if [*FIGHTER_STATUS_KIND_ATTACK_AIR, *FIGHTER_STATUS_KIND_LANDING_ATTACK_AIR].contains(&prev_status_0) + && prev_inflict_status & *COLLISION_KIND_MASK_HIT != 0 { + VarModule::on_flag(agent.battle_object, vars::bayonetta::instance::WAS_CANCEL); + } // faster charge if hit cancelled into } unsafe extern "C" fn game_specialnchargeh(agent: &mut L2CAgentBase) { @@ -19,9 +23,9 @@ unsafe extern "C" fn game_specialnchargeh(agent: &mut L2CAgentBase) { let charge_frame_max = if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.charge_frame_max") -1.0} else {28.0} ; let charge_frame_max_cancel = if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.charge_frame_max_cancel") -1.0} else {18.0}; if VarModule::is_flag(agent.battle_object, vars::bayonetta::instance::WAS_CANCEL) { - MotionModule::set_rate(boma, (15.0-1.0)/charge_frame_max_cancel);//van - 4, 35f total + MotionModule::set_rate(boma, (15.0-1.0)/charge_frame_max_cancel); // van - 4, 35f total } else { - MotionModule::set_rate(boma, (15.0-1.0)/charge_frame_max);//van + 4, 44f total (1 decimal off goes to 46f??) + MotionModule::set_rate(boma, (15.0-1.0)/charge_frame_max); // van + 4, 44f total (1 decimal off goes to 46f??) } } @@ -30,21 +34,21 @@ unsafe extern "C" fn game_specialnendh(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.0); - //check for accumulated special lag on a2g BA + // check for accumulated special lag on a2g BA let cancel_frame_param = agent.get_param_int("param_special_n", "cancel_frame") as f32; let special_lag = agent.get_float(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); - //check for accumulated BA lag + // check for accumulated BA lag let max_repeat = agent.get_param_int("param_special_n", "add_fire_max"); let remaining_repeats = VarModule::get_int(agent.battle_object, vars::bayonetta::instance::SPECIAL_N_CANCEL_TYPE); let used_rounds = (max_repeat - remaining_repeats) as f32; let lag_per_round = if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.lag_per_round")} else {5.0}; - let base_endlag= if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.base_endlag") -1.0} else {24.0}; //32 faf van, 25 here and 40 max + let base_endlag= if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.base_endlag") -1.0} else {24.0}; // 32 faf van, 25 here and 40 max let cancel_frame= if agent.kind() == *FIGHTER_KIND_BAYONETTA {58.0} else {58.0}; if agent.is_status(statuses::bayonetta::SPECIAL_N_CANCEL) { MotionModule::set_rate(boma, (cancel_frame - 1.0)/base_endlag); } else if special_lag < cancel_frame_param { MotionModule::set_rate(boma, (cancel_frame - 1.0)/(base_endlag + lag_per_round*used_rounds)); - }//do not change motion rate on special lag cancel anim + }// do not change motion rate on special lag cancel anim } unsafe extern "C" fn game_specialnendf(agent: &mut L2CAgentBase) { @@ -56,7 +60,7 @@ unsafe extern "C" fn game_specialnendf(agent: &mut L2CAgentBase) { let remaining_repeats = VarModule::get_int(agent.battle_object, vars::bayonetta::instance::SPECIAL_N_CANCEL_TYPE); let used_rounds = (max_repeat - remaining_repeats) as f32; let lag_per_round = if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.lag_per_round")} else {5.0}; - let base_endlag= if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.base_endlag") -1.0} else {24.0}; //32 faf van, 25 here and 40 max + let base_endlag= if agent.kind() == *FIGHTER_KIND_BAYONETTA {ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_n.base_endlag") -1.0} else {24.0}; // 32 faf van, 25 here and 40 max let cancel_frame= if agent.kind() == *FIGHTER_KIND_BAYONETTA {48.0} else {48.0}; if agent.is_status(statuses::bayonetta::SPECIAL_N_CANCEL) { MotionModule::set_rate(boma, (cancel_frame - 1.0)/base_endlag); @@ -69,40 +73,44 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 6.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 10, 0, 20, 0, false); } - frame(lua_state, 15.0); + frame(lua_state, 5.0); // 17 see iff snappier + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 15.0); // 17 see iff snappier if is_excute(agent) { - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + CHECK_BA(agent, true); GroundModule::set_correct(boma, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - ATTACK(agent, 0, 0, Hash40::new("footr"), 8.0, 361, 8, 0, 85, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 8.0, 361, 15, 0, 80, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 17.0); + frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("footr"), 8.0, 361, 8, 0, 80, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 8.0, 361, 15, 0, 70, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 19.0); if is_excute(agent) { agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_WALL_CHECK); - ATTACK(agent, 0, 0, Hash40::new("footr"), 7.5, 50, 8, 0, 75, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 7.5, 55, 15, 0, 60, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 25.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("footr"), 7.0, 62, 8, 0, 65, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 7.0, 65, 15, 0, 55, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 36.0); //57faf -> 60 - FT_MOTION_RATE_RANGE(agent, 36.0, 62.0, 24.0); + frame(lua_state, 36.0); // 38 + FT_MOTION_RATE_RANGE(agent, 36.0, 62.0, 24.0); // 62 faf (+2) if is_excute(agent) { AttackModule::clear_all(boma); agent.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP); agent.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + VarModule::on_flag(agent.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK); // allow held-kick on hitbox clear frame } - frame(lua_state, 41.0); //41 + frame(lua_state, 41.0); if is_excute(agent) { agent.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_WALL_CHECK); } - frame(lua_state, 51.0); //50 frames + frame(lua_state, 49.0); // 50 if is_excute(agent) { if agent.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_HIT_BEFORE_GUARD) { CancelModule::enable_cancel(boma); @@ -112,42 +120,25 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialsedge(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; - let boma: &mut BattleObjectModuleAccessor = agent.boma(); - let status_frame = boma.status_frame() - 15; - let slide_frame = status_frame.clamp(1, 24) / 4;//6 - //let game_frame = 14.0 - slide_frame; - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 8.0 - slide_frame as f32); //14 -> 8f faf spaced - if is_excute(agent) { - if AttackModule::is_attack(boma, 0, false) { - ATTACK(agent, 0, 0, Hash40::new("footr"), 7.0, 62, 8, 0, 65, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 10, 0, 20, 0, false); - } + let boma = agent.boma(); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 5.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); agent.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_WALL_CHECK); agent.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); agent.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP); - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_MOTION_FALL); - sv_kinetic_energy!(set_accel, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.015); - } - frame(lua_state, 15.0); - if is_excute(agent) { - CancelModule::enable_cancel(boma); } } unsafe extern "C" fn effect_specialsedge(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 3.0); + frame(lua_state, 5.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("bayonetta_heelslide_burst"), false, false); } @@ -175,33 +166,38 @@ unsafe extern "C" fn game_specialsholdend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 34.5, 11.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 34.5, 12.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 2, 0, 0, 0, false); - ATTACK(agent, 0, 0, Hash40::new("footr"), 7.0, 70, 8, 0, 50, 4.0, 0.5, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 0, 0, 0, 0, false); + CHECK_BA(agent, true); + if AttackModule::is_attack(boma, 0, false) { + ATTACK(agent, 0, 0, Hash40::new("footr"), 7.0, 70, 15, 0, 50, 4.0, 0.5, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } } frame(lua_state, 23.0); if is_excute(agent) { agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); AttackModule::clear_all(boma); - //agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_END_SPECIAL_S); + // agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_END_SPECIAL_S); } frame(lua_state, 34.5); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 37.5); FT_MOTION_RATE_RANGE(agent, 37.5, 40.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("footr"), 5.0, 101, 75, 0, 60, 4.8, 1.2, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 5.0, 101, 75, 0, 60, 4.3, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("waist"), 5.0, 101, 75, 0, 60, 3.9, 0.0, -0.9, -1.1, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 5.0, 101, 101, 0, 55, 4.8, 1.2, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 5.0, 101, 101, 0, 55, 4.3, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("waist"), 5.0, 101, 101, 0, 55, 3.9, 0.0, -0.9, -1.1, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 40.0); FT_MOTION_RATE_RANGE(agent, 40.0, 44.0, 2.0); frame(lua_state, 44.0); - FT_MOTION_RATE_RANGE(agent, 44.0, 61.0, 15.0); //35 faf kick + FT_MOTION_RATE_RANGE(agent, 44.0, 61.0, 14.0); // 35 faf kick if is_excute(agent) { AttackModule::clear_all(boma); + agent.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_WALL_CHECK); + agent.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + agent.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP); } } @@ -209,14 +205,14 @@ unsafe extern "C" fn game_specialairsu(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 13.0, 8.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 13.0, 10.0); if is_excute(agent) { JostleModule::set_status(boma, false); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 5, 0, 20, 0, false); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 5); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 10, 0, 20, 0, false); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 10); } frame(lua_state, 13.0); - FT_MOTION_RATE(agent, 1.0); + FT_MOTION_RATE_RANGE(agent, 13.0, 25.0, 11.0); if is_excute(agent) { agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_FLAG_WALL_CHECK); ATTACK(agent, 0, 0, Hash40::new("kneer"), 6.0, 65, 27, 0, 72, 4.5, 4.0, 0.0, 0.0, Some(-2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); @@ -227,40 +223,48 @@ unsafe extern "C" fn game_specialairsu(agent: &mut L2CAgentBase) { } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.0, 47, 100, 70, 0, 4.5, 4.0, 0.0, 0.0, Some(-2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 6.5, 51, 100, 73, 0, 4.5, 4.0, 0.0, 0.0, Some(-2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.7, 47, 100, 65, 0, 4.5, 4.0, 0.0, 0.0, Some(-2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.0, 51, 100, 70, 0, 4.5, 4.0, 0.0, 0.0, Some(-2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.7, 51, 100, 52, 0, 4.5, 4.0, 0.0, 0.0, Some(-2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.5, 55, 100, 58, 0, 4.5, 4.0, 0.0, 0.0, Some(-2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 25.0); + frame(lua_state, 25.0); // 21 + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { JostleModule::set_status(boma, true); AttackModule::clear_all(boma); if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { VarModule::inc_int(boma.object(), vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT); + } else { + VarModule::on_flag(agent.battle_object, vars::bayonetta::status::SPECIAL_HIT_NO_BULLET); + } + if CHECK_BA(agent, true) { + VarModule::inc_int(agent.battle_object, vars::bayonetta::instance::SPECIAL_BULLET_ARTS_COUNT); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } frame(lua_state, 30.0); if is_excute(agent) { agent.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_FLAG_WALL_CHECK); } - frame(lua_state, 32.0); //28 + frame(lua_state, 36.0); // 32 if is_excute(agent) { - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + if VarModule::is_flag(agent.battle_object, vars::bayonetta::status::SPECIAL_HIT_NO_BULLET) { CancelModule::enable_cancel(boma); } } - frame(lua_state, 38.0); //32 + frame(lua_state, 37.0); // 33 (12 after) if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); + } + frame(lua_state, 39.0); // 35 + if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } } @@ -270,7 +274,7 @@ unsafe extern "C" fn effect_specialairsu(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); if is_excute(agent) { EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_AFTERBURNER_LINE, Hash40::new("rot"), 0, 0.4, 12.0, -21.1, 0, 0, 0.95, true); - LAST_EFFECT_SET_RATE(agent, 1.15); + LAST_EFFECT_SET_RATE(agent, 1.2); EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_afterburner_line2"), Hash40::new("rot"), 0, 0.4, 12.0, -21.1, 0, 0, 0.9, true); } frame(lua_state, 27.0); @@ -284,56 +288,74 @@ unsafe extern "C" fn effect_specialairsu(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_shootinglegl_atkon_specialairsu(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - if !agent.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_DISABLE_ROOT_ATTACK) { - ATTACK(agent, *FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_00 as u64, 0, Hash40::new("top"), 0.5, 340, 100, 0, 10, 3.5, 0.0, 4.5, -0.5, Some(0.0), Some(4.5), Some(3.5), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 7, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); - } - ATTACK(agent, *FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_01 as u64, 0, Hash40::new("top"), 0.5, 340, 0, 0, 0, 2.5, 0.0, 2.5, 3.0, Some(0.0), Some(-18.0), Some(59.4), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 7, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_01, *ATTACK_REGION_NONE); - ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 4, true, *BATTLE_OBJECT_ID_INVALID as u32); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x36db1a34c9), FIGHTER_BAYONETTA_SHOOTING_ATTACK_ID_01, 6, 4.05); - } -} - unsafe extern "C" fn game_specialairsd(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { JostleModule::set_status(boma, false); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, false, false, true, 10, 0, 20, 0, false); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 10); } - frame(lua_state, 8.0); + frame(lua_state, 8.0); // 12 if is_excute(agent) { agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_FLAG_WALL_CHECK); - ATTACK(agent, 0, 0, Hash40::new("legr"), 7.5, 86, 40, 0, 85, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.5, 86, 40, 0, 85, 5.0, 0.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 7.0, 86, 42, 0, 85, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 86, 42, 0, 85, 5.0, 0.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 25.0); + frame(lua_state, 14.0); // 18 + if is_excute(agent) { + agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_FLAG_WALL_CHECK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 8.5, 86, 36, 0, 86, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.5, 86, 36, 0, 86, 5.0, 0.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 25.0); // 29 if is_excute(agent) { AttackModule::clear_all(boma); VarModule::inc_int(boma.object(), vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT); + if CHECK_BA(agent, true) { + agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_LANDING_FALL_SPECIAL); + VarModule::inc_int(agent.battle_object, vars::bayonetta::instance::SPECIAL_BULLET_ARTS_COUNT); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + } } frame(lua_state, 27.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); agent.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_FLAG_WALL_CHECK); } - frame(lua_state, 30.0); + frame(lua_state, 30.0); // 35 if is_excute(agent) { JostleModule::set_status(boma, true); agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_LANDING_FALL_SPECIAL); } + frame(lua_state, 33.0); // 37 (8 after clear) + FT_MOTION_RATE_RANGE(agent, 33.0, 41.0, 12.0); // faf 46 -> 49 + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); + agent.clear_lua_stack(); + lua_args!(agent, FIGHTER_KINETIC_ENERGY_ID_MOTION); + let og_speed_mul = app::sv_kinetic_energy::get_speed_mul(lua_state); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 11.0/8.0 * og_speed_mul); // partial comp movement during endlag + } + frame(lua_state, 37.66); // 47 + if is_excute(agent) { + KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } + frame(lua_state, 41.0); // 49 + //FT_MOTION_RATE(agent, 1.0); keep it rated for appearance + if is_excute(agent) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); // clear mot energy + } } unsafe extern "C" fn effect_specialairsd(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; frame(lua_state, 8.0); if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_AFTERBURNER_LINE, Hash40::new("top"), 0, 0.5, 6.5, 45, -6, 0, 1.1, true); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_AFTERBURNER_LINE, Hash40::new("rot"), 0, -11.0, 6.5, 45, -6, 0, 1.1, true); LAST_EFFECT_SET_RATE(agent, 0.85); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_afterburner_line2"), Hash40::new("top"), 0, 0.5, 6.5, 45, -5, 0, 1.1, true); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_afterburner_line2"), Hash40::new("rot"), 0, -11.0, 6.5, 45, -5, 0, 1.1, true); } } @@ -353,73 +375,103 @@ unsafe extern "C" fn expression_specialairsd(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialairsdlanding(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 15.0); + frame(lua_state, 16.0); if is_excute(agent) { KineticModule::unable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_MOTION); } } -unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialairsbounce(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 4.0, 4.0); + frame(lua_state, 4.0); // 5 + FT_MOTION_RATE_RANGE(agent, 4.0, 41.0, 27.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, false, false, true, 20, 0, 15, 0, false); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, true, 20); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 20); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 20); + VarModule::on_flag(agent.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK); } - frame(lua_state, 8.0); + frame(lua_state, 41.0); + FT_MOTION_RATE(agent, 1.0); // faf 25 -> 32 +} + +unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 14.0, 7.0); + frame(lua_state, 14.0); // 8 + FT_MOTION_RATE_RANGE(agent, 14.0, 18.0, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 368, 10, 0, 0, 3.0, 0.0, 4.5, 0.0, Some(0.0), Some(12.5), Some(0.0), 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 368, 10, 0, 0, 3.5, 0.0, 5.5, 5.0, Some(0.0), Some(10.0), Some(5.0), 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f{x: 0.5, y: 16.0}, 4, false); - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &Vector2f{x: -0.3, y: 16.0}, 4, false); + let speed = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let pos_diff: f32 = speed*4.0; + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 368, 100, 30, 0, 3.0, 0.0, 4.5, 0.0, Some(0.0), Some(12.5), Some(0.0), 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 368, 100, 30, 0, 3.5, 0.0, 5.5, 5.0, Some(0.0), Some(10.0), Some(5.0), 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f{x: 1.0 + pos_diff, y: 16.0}, 4, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &Vector2f{x: 1.0 + pos_diff, y: 16.0}, 4, false); } - frame(lua_state, 10.0); + frame(lua_state, 14.5); // 9 if is_excute(agent) { agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_JUMP); - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + } + frame(lua_state, 16.0); // 11 + if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 11.0); + frame(lua_state, 18.0); // 14 + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 368, 10, 0, 0, 4.3, 0.0, 18.2, 0.5, Some(0.0), Some(20.4), Some(0.5), 1.2, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 368, 10, 0, 0, 2.6, 0.0, 16.0, 0.5, Some(0.0), Some(23.7), Some(0.5), 1.2, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - AttackModule::set_vec_target_pos(boma, 0, Hash40::new("trans"), &Vector2f{x: 0.0, y: 35.0}, 8, false); - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("trans"), &Vector2f{x: 0.0, y: 35.0}, 8, false); + let speed = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let pos_diff: f32 = speed*4.75; + VarModule::on_flag(agent.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 368, 100, 30, 0, 3.5, 0.0, 13.0, 0.5, Some(0.0), Some(13.0), Some(0.5), 1.2, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new( "top"), 3.0, 368, 100, 30, 0, 2.85, 0.0, 23.7, 0.5, Some(0.0), Some(23.7), Some(0.5), 1.2, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 368, 100, 30, 0, 4.85, 0.0, 17.0, 0.5, Some(0.0), Some(20.3), Some(0.5), 1.2, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + AttackModule::set_vec_target_pos(boma, 0, Hash40::new("trans"), &Vector2f{x: 1.0 + pos_diff, y: 35.0}, 8, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("trans"), &Vector2f{x: 1.0 + pos_diff, y: 35.0}, 8, false); + AttackModule::set_vec_target_pos(boma, 2, Hash40::new("trans"), &Vector2f{x: 1.0 + pos_diff, y: 35.0}, 8, false); } - frame(lua_state, 19.0); + frame(lua_state, 24.0); // 19 if is_excute(agent) { AttackModule::clear_all(boma); - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); if agent.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_REUSE) { - VarModule::on_flag(agent.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 15, 35, 0, 40, 4.6, 0.0, 23.1, 0.0, Some(0.0), Some(18.4), Some(0.0), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 15, 35, 0, 40, 3.5, 0.0, 23.5, 0.5, Some(0.0), Some(14.0), Some(0.5), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 15, 35, 0, 40, 5.5, 0.0, 18.5, 0.5, Some(0.0), Some(19.5), Some(0.5), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } else { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 32, 55, 0, 45, 4.6, 0.0, 23.1, 0.0, Some(0.0), Some(18.4), Some(0.0), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 32, 55, 0, 45, 3.5, 0.0, 23.5, 0.5, Some(0.0), Some(14.0), Some(0.5), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 32, 55, 0, 45, 5.5, 0.0, 18.5, 0.5, Some(0.0), Some(19.5), Some(0.5), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } } - frame(lua_state, 23.0); + frame(lua_state, 27.0); // 22, 35 faf? + FT_MOTION_RATE_RANGE(agent, 27.0, 36.0, 13.0); if is_excute(agent) { AttackModule::clear_all(boma); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2bfb02b69a), true); - if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + let prev_inflict_status = VarModule::get_int(agent.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) + && prev_inflict_status & *COLLISION_KIND_MASK_HIT == 0 { VarModule::inc_int(boma.object(), vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT); } } - frame(lua_state, 27.0); + frame(lua_state, 30.46); // 27 + frame(lua_state, 31.15); // 28 if is_excute(agent) { - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + let prev_inflict_status = VarModule::get_int(agent.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) + || prev_inflict_status & *COLLISION_KIND_MASK_HIT != 0 { CancelModule::enable_cancel(boma); } } - frame(lua_state, 29.0); + frame(lua_state, 31.5); // 29 + if is_excute(agent) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } + frame(lua_state, 32.53); // 30 if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } - frame(lua_state, 32.0); + frame(lua_state, 36.0); // 35 + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } @@ -428,28 +480,26 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 14.0); if is_excute(agent) { - if agent.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_GROUND_START) { - FOOT_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); - LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + if agent.is_situation(*SITUATION_KIND_GROUND) { + FOOT_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, -0.5, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); } } - frame(lua_state, 11.0); + frame(lua_state, 15.0); if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_WITCHTWIST_WIND, Hash40::new("top"), 0, 25.5, 0, 0, 0, 0, 0.84, true); + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 0, 0, -0.5, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_WITCHTWIST_WIND, Hash40::new("top"), 0, 25.1, 0, 0, 0, 0, 0.84, true); LAST_EFFECT_SET_RATE(agent, 0.8); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_afterburner_line2"), Hash40::new("top"), 0, 25.1, 0, -90, 0, 0, 0.82, true); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_afterburner_line2"), Hash40::new("top"), 0, 24.7, 0, -90, 0, 0, 0.82, true); if agent.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_REUSE) { EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_WITCHTWIST_SPIRAL, Hash40::new("top"), 0, 25.3, 0, 0, 0, 0, 0.8, true); - LAST_EFFECT_SET_RATE(agent, 1.7); + LAST_EFFECT_SET_RATE(agent, 1.8); } } - frame(lua_state, 22.0); - if is_excute(agent) { - EFFECT_DETACH_KIND_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_WITCHTWIST_WIND, -1); - } - frame(lua_state, 24.0); + frame(lua_state, 28.1); if is_excute(agent) { let mut twist = "bayonetta_witchtwist_wind_blue"; if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {twist = "bayonetta_witchtwist_wind_red"; } @@ -463,62 +513,235 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn sound_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 7.0); + frame(lua_state, 12.0); if is_excute(agent) { PLAY_SEQUENCE(agent, Hash40::new("seq_bayonetta_rnd_attack01")); PLAY_SE(agent, Hash40::new("se_bayonetta_special_h01")); } - frame(lua_state, 12.0); + frame(lua_state, 19.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_bayonetta_attackair_f02")); } - frame(lua_state, 18.0); + frame(lua_state, 24.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_bayonetta_special_h02")); + } +} + +unsafe extern "C" fn expression_specialhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 14.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } + frame(lua_state, 15.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_NONE, 3); + } + frame(lua_state, 19.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackss"), 6); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitll"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 25.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } +} + +unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { // 14 + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, false, false, true, 30, 0, 1, 0, false); // max rounds?, rounds until flinch spawns, first shoot frame, frames to return after releasing BA, something ab vibrating?? + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, true, 30); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 30); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, true, 30); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_KEEP); + let speed = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let pos_diff: f32 = speed*4.5; + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 368, 100, 30, 0, 3.5, 0.0, 13.0, 0.5, Some(0.0), Some(13.0), Some(0.5), 0.75, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 368, 100, 30, 0, 2.85, 0.0, 23.7, 0.5, Some(0.0), Some(23.7), Some(0.5), 0.75, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 368, 100, 30, 0, 4.85, 0.0, 17.0, 0.5, Some(0.0), Some(20.3), Some(0.5), 0.75, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + AttackModule::set_vec_target_pos(boma, 0, Hash40::new("trans"), &Vector2f{x: 1.5 + pos_diff, y: 29.0}, 6, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("trans"), &Vector2f{x: 1.5 + pos_diff, y: 29.0}, 6, false); + AttackModule::set_vec_target_pos(boma, 2, Hash40::new("trans"), &Vector2f{x: 1.5 + pos_diff, y: 29.0}, 6, false); + } + frame(lua_state, 7.0); // 20 + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 0.75, 120, 100, 65, 0, 3.5, 0.0, 13.0, 0.5, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.75, 260, 100, 10, 0, 2.85, 0.0, 23.7, 0.5, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.75, 140, 100, 60, 0, 4.85, 0.0, 17.0, 0.5, Some(0.0), Some(20.3), Some(0.5), 0.75, 0.75, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + AttackModule::set_add_reaction_frame_revised(boma, 1, 14.7, false); + } + frame(lua_state, 15.0); // 28 + if is_excute(agent) { + AttackModule::clear(boma, 0, false); + AttackModule::clear(boma, 1, false); + AttackModule::clear(boma, 2, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 40, 100, 0, 45, 3.5, 0.0, 23.5, 0.5, Some(0.0), Some(14.0), Some(0.5), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 40, 100, 0, 45, 5.5, 0.0, 18.5, 0.5, Some(0.0), Some(19.5), Some(0.5), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 18.0); // 31 + FT_MOTION_RATE_RANGE(agent, 18.0, 28.0, 15.0); // looks better + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2bfb02b69a), true); + AttackModule::clear(boma, 0, false); + AttackModule::clear(boma, 1, false); + let prev_inflict_status = VarModule::get_int(agent.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if !agent.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_NO_SHOOTING_ENABLE_CANCEL) + && prev_inflict_status & *COLLISION_KIND_MASK_HIT == 0 { + VarModule::inc_int(boma.object(), vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT); + } + } + frame(lua_state, 22.0); // 37, stall for a bit + if is_excute(agent) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } + frame(lua_state, 24.0); // 40 + if is_excute(agent) { + agent.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_KEEP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + agent.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP); + } + frame(lua_state, 24.66); // 41 + if is_excute(agent) { + let prev_inflict_status = VarModule::get_int(agent.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if VarModule::is_flag(agent.battle_object, vars::bayonetta::status::SPECIAL_HIT_NO_BULLET) + || prev_inflict_status & *COLLISION_KIND_MASK_HIT != 0 { + CancelModule::enable_cancel(boma); + } + } + frame(lua_state, 26.0); // 43 + if is_excute(agent) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); // (12 after) + } + frame(lua_state, 28.0); // 49 FAF + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_WITCHTWIST_WIND, Hash40::new("top"), 0, 25.1, 0, 0, 0, 0, 0.84, true); + LAST_EFFECT_SET_RATE(agent, 0.85); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_afterburner_line2"), Hash40::new("top"), 0, 24.7, 0, -90, 0, 0, 0.82, true); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_WITCHTWIST_SPIRAL, Hash40::new("top"), 0, 25.3, 0, 0, 0, 0, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 1.3); + } + frame(lua_state, 19.0); + if is_excute(agent) { + let mut twist = "bayonetta_witchtwist_wind_blue"; + if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {twist = "bayonetta_witchtwist_wind_red"; } + agent.clear_lua_stack(); + lua_args!(agent, MA_MSC_CMD_EFFECT_EFFECT_OFF_KIND, Hash40::new(twist), true, true); + sv_module_access::effect(agent.lua_state_agent); + EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_WITCHTWIST_SPIRAL, true, true); + } +} + +unsafe extern "C" fn sound_specialairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_bayonetta_attackhard_s02")); + } + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_bayonetta_attackhard_s01")); + } + frame(lua_state, 15.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_bayonetta_special_h02")); } } +unsafe extern "C" fn expression_specialairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_NONE, 3); + } + frame(lua_state, 7.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackss"), 6); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitll"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 18.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } +} + unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 2.0); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 4.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 3.0); if is_excute(agent) { agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_LW_FLAG_ENABLE_NEXT_NO_COMP); - sv_kinetic_energy!(set_stable_speed, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 1.3); } - frame(lua_state, 8.0); - FT_MOTION_RATE_RANGE(agent, 8.0, 15.0, 4.0); //5 + frame(lua_state, 8.0); // 4 + FT_MOTION_RATE_RANGE(agent, 8.0, 44.0, 25.0); + frame(lua_state, 9.0); // 5 if is_excute(agent) { - if agent.is_situation(*SITUATION_KIND_AIR) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2ea0f68425), true); - } agent.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_LW_FLAG_WITCH_TIME); SEARCH(agent, 0, 0, Hash40::new("top"), 11.5, -2.0, 10.0, 0.0, None, None, None, *COLLISION_KIND_MASK_ATTACK, *HIT_STATUS_MASK_ALL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIEB, *COLLISION_PART_MASK_BODY_HEAD, false); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2ea0f68425), true);// BAT FAF 60 normal faf 37 -> 50 / 40 } - frame(lua_state, 15.0); - FT_MOTION_RATE(agent, 1.0); //9 + frame(lua_state, 9.5); // 6 if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2ea0f68425), true); } - frame(lua_state, 21.0); - FT_MOTION_RATE_RANGE(agent, 21.0, 31.0, 7.0); //15 - if is_excute(agent) { - agent.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_LW_FLAG_WITCH_TIME); - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); - } - frame(lua_state, 31.0);//22 - if agent.is_situation(*SITUATION_KIND_GROUND) { - FT_MOTION_RATE_RANGE(agent, 31.0, 66.0, 28.0); - } else { FT_MOTION_RATE_RANGE(agent, 31.0, 66.0, 23.0); } + frame(lua_state, 18.0); // 11 if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2ea0f68425), false); } - frame(lua_state, 44.0); + frame(lua_state, 26.7); // 17 if is_excute(agent) { + agent.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_LW_FLAG_WITCH_TIME); + search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); + } + frame(lua_state, 44.0); // 29, faf 45 + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { agent.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_LW_FLAG_ENABLE_NEXT_NO_COMP); } -} //faf 50/45 +} + +unsafe extern "C" fn effect_speciallw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 2, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 8.0); + if is_excute(agent) { + FLASH(agent, 1, 1, 1, 0.75); + } + wait(lua_state, 1.0); + if is_excute(agent) { + COL_NORMAL(agent); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_witchtime_flash"), Hash40::new("top"), -2.0, 10.0, 0.0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 10.0/14.0); + } + frame(lua_state, 40.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("bayonetta_butterfly_walk"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, false); + } +} pub fn install(agent: &mut Agent) { agent.acmd("game_specialnstarth", game_specialnstarth, Priority::Low); @@ -540,18 +763,36 @@ pub fn install(agent: &mut Agent) { agent.acmd("sound_specialsedge", sound_specialsedge, Priority::Low); agent.acmd("expression_specialsedge", expression_specialsedge, Priority::Low); agent.acmd("game_specialsholdend", game_specialsholdend, Priority::Low); + agent.acmd("game_specialairsu", game_specialairsu, Priority::Low); agent.acmd("effect_specialairsu", effect_specialairsu, Priority::Low); - agent.acmd("game_shootinglegl_atkon_specialairsu", game_shootinglegl_atkon_specialairsu, Priority::Low); + agent.acmd("game_specialairsd", game_specialairsd, Priority::Low); agent.acmd("effect_specialairsd", effect_specialairsd, Priority::Low); + agent.acmd("game_specialairsdlanding", game_specialairsdlanding, Priority::Low); - agent.acmd("game_specialairhi", game_specialhi, Priority::Low); + agent.acmd("game_specialairsuwallend", game_specialairsbounce, Priority::Low); + agent.acmd("game_specialairsdhit", game_specialairsbounce, Priority::Low); + agent.acmd("game_specialairsdwallend", game_specialairsbounce, Priority::Low); + + agent.acmd("game_specialairsdlandingedge", acmd_stub, Priority::Low); + agent.acmd("effect_specialairsdlandingedge", acmd_stub, Priority::Low); + agent.acmd("sound_specialairsdlandingedge", acmd_stub, Priority::Low); + agent.acmd("expression_specialairsdlandingedge", acmd_stub, Priority::Low); + agent.acmd("game_specialhi", game_specialhi, Priority::Low); agent.acmd("effect_specialhi", effect_specialhi, Priority::Low); agent.acmd("sound_specialhi", sound_specialhi, Priority::Low); + agent.acmd("expression_specialhi", expression_specialhi, Priority::Low); + agent.acmd("game_specialairhi", game_specialairhi, Priority::Low); + agent.acmd("effect_specialairhi", effect_specialairhi, Priority::Low); + agent.acmd("sound_specialairhi", sound_specialairhi, Priority::Low); + agent.acmd("expression_specialairhi", expression_specialairhi, Priority::Low); + agent.acmd("game_speciallw", game_speciallw, Priority::Low); + agent.acmd("effect_speciallw", effect_speciallw, Priority::Low); agent.acmd("game_specialairlw", game_speciallw, Priority::Low); + agent.acmd("effect_specialairlw", effect_speciallw, Priority::Low); } diff --git a/fighters/bayonetta/src/acmd/throws.rs b/fighters/bayonetta/src/acmd/throws.rs index da7e09ea54..796df63bf0 100644 --- a/fighters/bayonetta/src/acmd/throws.rs +++ b/fighters/bayonetta/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(10.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 6.0, Some(0.0), Some(6.6), Some(10.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -29,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(10.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(8.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-15.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -6.0, Some(0.0), Some(6.6), Some(-14.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -89,7 +89,7 @@ unsafe extern "C" fn game_catchattack(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE_RANGE(agent, 1.0, 14.0, 16.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 14.0, 17.0); if is_excute(agent) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 42, 165, 0, 46, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); @@ -102,7 +102,7 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { CHECK_FINISH_CAMERA(agent, 14, 7); } frame(lua_state, 15.0); - FT_MOTION_RATE_RANGE(agent, 15.0, 50.0, 27.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 50.0, 26.0); if is_excute(agent) { let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); @@ -118,7 +118,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 50, 80, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 50, 85, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 11.0); @@ -127,10 +127,9 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 48, 150, 0, 60, 6.0, 0.0, 17.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 50, 150, 0, 60, 6.0, 0.0, 17.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 13, 10); - //lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 1.3); } frame(lua_state, 15.0); FT_MOTION_RATE_RANGE(agent, 15.0, 45.0, 21.0); @@ -150,38 +149,43 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 10.0); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.5, 82, 87, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.5, 101, 86, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 3.0, 80, 170, 0, 60, 5.0, 6.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 3.0, 80, 170, 0, 60, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 3.0, 101, 170, 0, 60, 5.0, 6.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 3.0, 101, 170, 0, 60, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 8, 18); } - frame(lua_state, 10.0); + frame(lua_state, 13.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); } frame(lua_state, 15.0); - FT_MOTION_RATE_RANGE(agent, 15.0, 35.0, 15.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 35.0); + frame(lua_state, 24.0); + FT_MOTION_RATE_RANGE(agent, 24.0, 37.0, 6.0); + frame(lua_state, 37.0); FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 18.0, 19.0); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 81, 175, 0, 26, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 80, 175, 0, 25, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 18.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 20.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 68, 140, 0, 60, 6.0, 0.0, 3.0, 12.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); @@ -189,12 +193,37 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { CHECK_FINISH_CAMERA(agent, 15, 0); } frame(lua_state, 21.0); - FT_MOTION_RATE_RANGE(agent, 21.0, 44.0, 18.0);//37->39 + FT_MOTION_RATE_RANGE(agent, 21.0, 51.0, 16.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); } - frame(lua_state, 44.0); + frame(lua_state, 51.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn sound_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_bayonetta_rnd_attack_throw_l")); + } + frame(lua_state, 16.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_bayonetta_throw_l01")); + } + frame(lua_state, 20.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_bayonetta_throw_l02")); + } +} + +unsafe extern "C" fn game_thrownhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 15.0); + frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); } @@ -212,4 +241,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); + agent.acmd("sound_throwlw", sound_throwlw, Priority::Low); + + agent.acmd("game_thrownhi", game_thrownhi, Priority::Low); } diff --git a/fighters/bayonetta/src/acmd/tilts.rs b/fighters/bayonetta/src/acmd/tilts.rs index 8fc544cee4..d3e0b3ef55 100644 --- a/fighters/bayonetta/src/acmd/tilts.rs +++ b/fighters/bayonetta/src/acmd/tilts.rs @@ -4,29 +4,33 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 22.0, 5.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 22.0, 6.0); if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.0, 6.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, true, false, false, 10, 3, 10, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, true, false, false, 10, 0, 10, 5, true); } frame(lua_state, 22.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 24.0); + frame(lua_state, 24.0); // 9 + FT_MOTION_RATE_RANGE(agent, 24.0, 30.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 57, 0, 19, 5.0, -2.0, 1.0, 4.0, Some(4.5), Some(1.0), Some(4.0), 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 4.0, 60, 25, 0, 33, 3.5, -4.2, 1.0, 1.9, Some(-4.2), Some(1.0), Some(4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 4.0, 80, 25, 0, 33, 4.8, -2.7, 1.0, 3.2, Some(3.7), Some(1.0), Some(3.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 28.0); - FT_MOTION_RATE_RANGE(agent, 28.0, 45.0, 14.0); //26 + frame(lua_state, 30.0); + FT_MOTION_RATE_RANGE(agent, 30.0, 48.0, 15.0); // 26 if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.5, 6.0); AttackModule::clear_all(boma); if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + CHECK_BA(agent, true); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } } - frame(lua_state, 45.0); + frame(lua_state, 30.1); + if is_excute(agent) { + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } + frame(lua_state, 48.0); FT_MOTION_RATE(agent, 1.0); } @@ -39,16 +43,35 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { } frame(lua_state, 24.0); if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_LINE2, Hash40::new("top"), 0, 12, 0.1, 0, 0, 0, 1.0, true); - LAST_EFFECT_SET_SCALE_W(agent, 1.23, 1.1, 1.23); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_LINE2, Hash40::new("top"), 0, 11.75, -2.0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_SCALE_W(agent, 1.25, 1.125, 1.25); LAST_EFFECT_SET_RATE(agent, 0.45); + let effect = EffectModule::get_last_handle(boma) as u64; + VarModule::set_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE, effect); FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 29.0); + frame(lua_state, 25.25); if is_excute(agent) { - EffectModule::kill_kind(agent.module_accessor, Hash40::new("bayonetta_attack_line2_blue"), true, true); - EffectModule::kill_kind(agent.module_accessor, Hash40::new("bayonetta_attack_line2_red"), true, true); + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_pos(boma, effect as u32, &Vector3f{x: 0.0, y: 11.75, z: -1.0}); } + frame(lua_state, 26.5); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_pos(boma, effect as u32, &Vector3f{x: 0.0, y: 11.75, z: -0.5}); + } + frame(lua_state, 27.75); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_pos(boma, effect as u32, &Vector3f{x: 0.0, y: 11.75, z: 0.0}); + } + frame(lua_state, 29.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rate(boma, effect as u32, 2.0); + EffectModule::set_scale(boma, effect as u32, &Vector3f::new(1.1, 0.85, 1.1)); + EffectModule::set_pos(boma, effect as u32, &Vector3f{x: 0.0, y: 11.75, z: 3.7}); + } //quick fadeout effect?? } unsafe extern "C" fn expression_attacks3(agent: &mut L2CAgentBase) { @@ -82,30 +105,57 @@ unsafe extern "C" fn expression_attacks3(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacks32(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.8); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 16.75, 9.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 16.75, 8.0); if is_excute(agent) { - KineticModule::clear_speed_energy_id(boma, *FIGHTER_KINETIC_ENERGY_ID_MOTION); - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.5, 6.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, true, false, false, 10, 3, 10, 5, true); + KineticModule::clear_speed_energy_id(boma, *FIGHTER_KINETIC_ENERGY_ID_MOTION); //prevents diff combo timings changing momentum + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, true, false, false, 10, 0, 10, 5, true); // activates both legs for some reason??? but with no hitbox } frame(lua_state, 16.75); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 18.75); - FT_MOTION_RATE_RANGE(agent, 18.75, 20.5, 3.0); + frame(lua_state, 18.75); //11 + FT_MOTION_RATE_RANGE(agent, 18.75, 23.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 5.0, 62, 52, 0, 77, 5.0, 0.0, 0.0, -3.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 5.0, 67, 52, 0, 77, 5.0, 0.0, 0.0, -3.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 5.0, 67, 52, 0, 77, 5.0, 4.0, 0.0, -3.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("trans"), 5.0, 67, 52, 0, 77, 3.0, 0.0, 9.0, 7.5, Some(0.0), Some(9.0), Some(10.5), 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 5.0, 52, 20, 0, 35, 4.25, -1.5, 0.0, -3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 5.0, 66, 20, 0, 35, 4.5, -2.75, 0.0, -2.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 5.0, 79, 20, 0, 35, 4.75, 4.25, 0.0, -2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("trans"), 5.0, 82, 20, 0, 35, 3.0, 0.0, 8.5, 6.5, Some(0.0), Some(9.5), Some(10.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 20.5); - FT_MOTION_RATE_RANGE(agent, 20.5, 47.0, 14.0); //28faf + frame(lua_state, 23.0); + FT_MOTION_RATE_RANGE(agent, 23.0, 47.0, 12.0); // 27faf if is_excute(agent) { AttackModule::clear_all(boma); - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { + && CHECK_BA(agent, false); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + } + } + frame(lua_state, 24.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } + frame(lua_state, 47.0); + FT_MOTION_RATE_RANGE(agent, 47.0, 78.0, 27.0); // for aesthetics only +} + +unsafe extern "C" fn effect_attacks32(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("bayonetta_butterfly_walk"), Hash40::new("top"), 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0, 12, 1, 13, -20, 155, 1.00, true); + LAST_EFFECT_SET_RATE(agent, 1.3); + } + frame(lua_state, 16.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } } @@ -136,33 +186,87 @@ unsafe extern "C" fn expression_attacks32(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacks33(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.95); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 20.0, 9.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 21.0, 11.0); if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, true, false, false, 10, 0, 10, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, false, 10); KineticModule::clear_speed_energy_id(boma, *FIGHTER_KINETIC_ENERGY_ID_MOTION); - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.5, 6.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, true, false, false, 10, 3, 10, 5, true); } - frame(lua_state, 20.0); + frame(lua_state, 21.0); // 12 FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 21.0); - FT_MOTION_RATE_RANGE(agent, 21.0, 21.5, 1.0); - frame(lua_state, 21.5); if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.5, 6.0); - ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 87, 63, 0, 75, 5.5, 0.0, 0.0, 3.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 87, 63, 0, 75, 5.5, 0.0, 0.0, 3.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.0, 87, 63, 0, 75, 5.5, 5.0, 0.0, 3.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 78, 158, 0, 45, 5.0, -1.0, 0.0, 4.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 78, 158, 0, 45, 5.0, -0.5, 0.0, 2.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.0, 78, 158, 0, 45, 5.0, 5.5, 0.0, 1.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 22.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 25.0); - FT_MOTION_RATE_RANGE(agent, 25.0, 53.0, 22.0); //38 + if is_excute(agent) { + AttackModule::set_offset(boma, 1, &Vector3f{ x: -0.5, y: 0.0, z: 3.0}); + AttackModule::set_offset(boma, 2, &Vector3f{ x: 5.5, y: 0.0, z: 2.0}); + } + frame(lua_state, 26.0); // 16 + FT_MOTION_RATE_RANGE(agent, 26.0, 50.0, 16.0); // 33 if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + } + frame(lua_state, 50.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_attacks33(agent: &mut L2CAgentBase) { //closer to P -> K's angle + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 19.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("bayonetta_butterfly_walk"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 22.0); + if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_LINE2, Hash40::new("top"), 0, 11.2, 5.1, -64, 0, 0, 1.08, true); + LAST_EFFECT_SET_RATE(agent, 0.65); + let effect = EffectModule::get_last_handle(boma) as u64; + VarModule::set_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE, effect); + } + frame(lua_state, 26.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::bayonetta::status::EFFECT_HANDLE); + EffectModule::set_rate(boma, effect as u32, 2.0); + EffectModule::set_scale(boma, effect as u32, &Vector3f::new(1.08, 0.8, 1.08)); + EffectModule::set_pos(boma, effect as u32, &Vector3f{x: 0.5, y: 12.2, z: 6.0}); + } +} + +unsafe extern "C" fn expression_attacks33(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_R); + } + frame(lua_state, 6.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 3); + } + frame(lua_state, 16.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_L, 3); + } + frame(lua_state, 19.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 21.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); + } + frame(lua_state, 36.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 3); } } @@ -170,47 +274,54 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 6.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.75, 7.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 3, 10, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_ARM, true, true, false, 10, 0, 10, 5, true); } - frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 6.75); // 7 + FT_MOTION_RATE_RANGE(agent, 6.75, 9.75, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 2.0, 368, 100, 30, 0, 3.2, 0.9, 0.0, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 368, 100, 30, 0, 3.8, 3.6, 0.0, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f{x: 0.0, y: 18.0}, 7, false); - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &Vector2f{x: 0.0, y: 18.0}, 8, false); - + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.0, 368, 100, 30, 0, 3.25, 0.0, 0.0, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 2.0, 368, 100, 30, 0, 3.75, 1.25, 0.0, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f{x: 1.0, y: 20.0}, 7, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &Vector2f{x: 1.0, y: 20.0}, 8, false); } - frame(lua_state, 9.0); + frame(lua_state, 7.5); // 8 if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 2.0, 368, 100, 30, 0, 3.2, 0.9, 0.0, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 368, 100, 30, 0, 3.8, 4.45, 0.0, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f{x: 0.0, y: 18.0}, 5, false); - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &Vector2f{x: 0.5, y: 18.0}, 5, false); + AttackModule::set_offset(boma, 1, &Vector3f{ x: 0.75, y: 0.0, z: 0.0}); } - frame(lua_state, 10.0); - FT_MOTION_RATE_RANGE(agent, 10.0, 12.0, 5.0); + frame(lua_state, 8.25); // 9 if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 6.0, 95, 66, 0, 80, 3.3, 0.0, 0.0, -1.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 6.0, 95, 66, 0, 80, 4.5, 6.2, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.0, 368, 100, 30, 0, 3.25, 0.0, 0.0, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 2.0, 368, 100, 30, 0, 3.75, 1.5, 0.0, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f{x: 1.0, y: 20.0}, 5, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &Vector2f{x: 1.0, y: 20.0}, 5, false); } - frame(lua_state, 10.8); + frame(lua_state, 9.0); // 10 if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("armr"), 6.0, 95, 68, 0, 80, 4.8, 6.7, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_offset(boma, 1, &Vector3f{ x: 2.75, y: 0.0, z: 0.0}); } - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 9.75); // 11 + FT_MOTION_RATE_RANGE(agent, 9.75, 12.0, 4.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 6.0, 97, 68, 0, 80, 3.5, 0.0, 0.0, -0.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 6.0, 97, 68, 0, 80, 4.25, 3.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 10.3125); // 12 + if is_excute(agent) { + AttackModule::set_offset(boma, 1, &Vector3f{ x: 4.25, y: 0.0, z: 0.0}); + } + frame(lua_state, 12.0); // 15 + FT_MOTION_RATE_RANGE(agent, 12.0, 13.0, 3.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } - frame(lua_state, 20.0); - FT_MOTION_RATE_RANGE(agent, 20.0, 26.0, 9.0); //31 - frame(lua_state, 26.0); + frame(lua_state, 13.0); // 18 + FT_MOTION_RATE_RANGE(agent, 13.0, 28.0, 14.0); // faf 32 + frame(lua_state, 28.0); FT_MOTION_RATE(agent, 1.0); } @@ -218,9 +329,9 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let facing = PostureModule::lr(boma); - frame(lua_state, 6.0); + frame(lua_state, 5.5); if is_excute(agent) { - if WorkModule::get_int(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {EFFECT_FOLLOW(agent, Hash40::new("bayonetta_attack_arc4_red"), Hash40::new("top"), 1.5, 14.1, -0.58, -90.0, 56, 20, 1.15, true); } + if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {EFFECT_FOLLOW(agent, Hash40::new("bayonetta_attack_arc4_red"), Hash40::new("top"), 1.5, 14.1, -0.58, -90.0, 56, 20, 1.15, true); } else {EFFECT_FOLLOW(agent, Hash40::new("bayonetta_attack_arc4_blue"), Hash40::new("top"), 1.5, 14.1, -0.55, -90.0, 56, 20, 1.15, true); } LAST_EFFECT_SET_RATE(agent, 1.4); } @@ -229,15 +340,15 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); EFFECT(agent, Hash40::new("bayonetta_butterfly_walk"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 10.5); + frame(lua_state, 9.75); if is_excute(agent) { EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("top"), 0, 26, 0, 0, 0, 0, 0.75, 0, 0, 0, 0, 0, 0, false); LAST_EFFECT_SET_RATE(agent, 2.0); } - frame(lua_state, 13.0); + frame(lua_state, 12.3); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("bayonetta_beretta_rotation"), Hash40::new("haver"), 0, 0, 0, -10, -60, -10, 1, true); - if WorkModule::get_int(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(agent, 1, 0.118, 0.118); } + if agent.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(agent, 1, 0.118, 0.118); } else {LAST_EFFECT_SET_COLOR(agent, 0.059, 0.38, 1); } } frame(lua_state, 36.0); @@ -246,23 +357,39 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn expression_attackhi3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 5.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 6.5); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } +} + unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 5.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, false, 10, 3, 15, 5, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_LEG, false, false, false, 10, 0, 15, 5, true); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, false, 10); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2b7cb92b79), *FIGHTER_BAYONETTA_SHOOTING_SLOT_L_ARM, false, false, false, 10); FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 6.5); } frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0);//26faf + FT_MOTION_RATE(agent, 1.0); // 26faf if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 7.0, 85, 63, 0, 71, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 90, 60, 0, 71, 3.5, 1.7, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 90, 60, 0, 71, 3.5, 7.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 7.0, 79, 80, 0, 55, 3.2, 1.0, 0.0, 0.4, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 84, 80, 0, 55, 3.4, 1.0, 0.0, 0.2, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 8.0, 94, 80, 0, 55, 3.6, 1.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 16.0); @@ -271,9 +398,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { } frame(lua_state, 29.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); - WorkModule::on_flag(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); + CHECK_BA(agent, true); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_MOTION_STOP); + agent.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END); } } @@ -282,7 +409,7 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 7.0); if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0.0, 3.55, 2.8, 2.4, 3, 2, 1.29, true); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_EFFECT_KIND_BAYONETTA_ATTACK_ARC1, Hash40::new("top"), 0.0, 3.55, 3.1, 2.4, 3, 2, 1.31, true); LAST_EFFECT_SET_RATE(agent, 1.05); } frame(lua_state, 12.0); @@ -311,11 +438,18 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attacks3", game_attacks3, Priority::Low); agent.acmd("effect_attacks3", effect_attacks3, Priority::Low); agent.acmd("expression_attacks3", expression_attacks3, Priority::Low); + agent.acmd("game_attacks32", game_attacks32, Priority::Low); + agent.acmd("effect_attacks32", effect_attacks32, Priority::Low); agent.acmd("expression_attacks32", expression_attacks32, Priority::Low); + agent.acmd("game_attacks33", game_attacks33, Priority::Low); + agent.acmd("effect_attacks33", effect_attacks33, Priority::Low); + agent.acmd("expression_attacks33", expression_attacks33, Priority::Low); + agent.acmd("game_attackhi3", game_attackhi3, Priority::Low); agent.acmd("effect_attackhi3", effect_attackhi3, Priority::Low); + agent.acmd("game_attacklw3", game_attacklw3, Priority::Low); agent.acmd("effect_attacklw3", effect_attacklw3, Priority::Low); agent.acmd("expression_attacklw3", expression_attacklw3, Priority::Low); diff --git a/fighters/bayonetta/src/lib.rs b/fighters/bayonetta/src/lib.rs index 3c1721d4e3..635faf185c 100644 --- a/fighters/bayonetta/src/lib.rs +++ b/fighters/bayonetta/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/bayonetta/src/opff.rs b/fighters/bayonetta/src/opff.rs index 6b260e36d0..dc67aa17e2 100644 --- a/fighters/bayonetta/src/opff.rs +++ b/fighters/bayonetta/src/opff.rs @@ -3,72 +3,66 @@ use globals::*; utils::import_noreturn!(common::opff::fighter_common_opff); unsafe fn aerial_cancels(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if fighter.is_motion_one_of(&[Hash40::new("attack_air_n"), Hash40::new("attack_air_hi"), Hash40::new("attack_air_lw"), Hash40::new("attack_air_f3"), Hash40::new("attack_air_b")]) //dont cancel with fair 1/2 - && AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) //dont cancel on shield - && !fighter.is_in_hitlag() //dont cancel during hitstop - && !fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_ATTACK_AIR_FLAG_SHOOTING) { //don't cancel DURING bullet arts - let mut new_status = 0; - let mut is_input_cancel = false; - if fighter.is_cat_flag(Cat1::SpecialN) { - is_input_cancel = true; - new_status = *FIGHTER_STATUS_KIND_SPECIAL_N; - VarModule::on_flag(fighter.battle_object, vars::bayonetta::instance::WAS_CANCEL); - StatusModule::change_status_request_from_script(boma, new_status, true); - return; - } else if fighter.is_cat_flag(Cat1::SpecialHi) { - if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT) < 2 { - is_input_cancel = true; - new_status = *FIGHTER_STATUS_KIND_SPECIAL_HI; + if fighter.is_motion_one_of(&[Hash40::new("attack_air_n"), Hash40::new("attack_air_f3"), Hash40::new("attack_air_b"), Hash40::new("attack_air_hi"), Hash40::new("attack_air_lw")]) { + // dont cancel with fair 1/2 + if AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT) { // dont cancel on shield + WorkModule::enable_transition_term_group(boma, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_SPECIAL); + WorkModule::enable_transition_term_group(boma, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_ESCAPE); + // cancel into second wtw/abk without prereq + if VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT) < 2 { + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::RECOVERY_RESOURCE_BYPASS_CHECK); } - } else if fighter.is_cat_flag(Cat1::SpecialS) { - if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) < 2 { - is_input_cancel = true; - new_status = *FIGHTER_STATUS_KIND_SPECIAL_S; + } + if !fighter.is_in_hitlag() // dont cancel during hitstop + && !StopModule::is_stop(boma) + && !fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION) { // don't cancel DURING bullet arts + fighter.sub_transition_group_check_air_special(); + fighter.sub_transition_group_check_air_escape(); + } + } + if fighter.is_motion(Hash40::new("landing_air_lw")) { + // hitstop checks dont work with dair.. + if AttackModule::is_attack(boma, 0, false) { + WorkModule::unable_transition_term_group(boma, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_SPECIAL); + WorkModule::unable_transition_term_group(boma, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_ESCAPE); + } else { + // cancel dair landing if either falling dair or landing hit made contact + if VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS) & *COLLISION_KIND_MASK_HIT != 0 + || AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_SPECIAL); } + fighter.sub_transition_group_check_ground_special(); } - if !fighter.is_motion(Hash40::new("attack_air_lw")) {fighter.check_airdodge_cancel(); } - if is_input_cancel && VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT) < 2 { - StatusModule::change_status_force(boma, new_status, true); - } //special cancel + } } unsafe fn reset_flags(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - //reset fair state + // reset fair state if !fighter.is_situation(*SITUATION_KIND_AIR) {VarModule::set_int(boma.object(), vars::bayonetta::instance::ATTACK_AIR_F_COUNT, 0); } - //reset dabk count - if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) == 0 {VarModule::set_int(boma.object(), vars::bayonetta::instance::SPECIAL_S_DABK_COUNT, 0); } - //refresh hdr resources + // refresh hdr resources let resource = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT); let lag = fighter.get_float(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); - if lag < 1.0 { //same methd as vanilla - //filters out lag-cancel techs - if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) == 0 && fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT) == 0 { - if fighter.is_situation(*SITUATION_KIND_AIR) && resource >= 1 { - VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT, 1); - } else { //only gives back 2nd resource - VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT, 0); - } + //if lag < 1.0 { // same methd as vanilla + // filters out lag-cancel techs + if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) == 0 + && fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT) == 0 { + // reset added special use trackers + fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI); + fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_S); + VarModule::set_int(boma.object(), vars::bayonetta::instance::SPECIAL_S_DABK_COUNT, 0); + VarModule::set_int(boma.object(), vars::bayonetta::instance::SPECIAL_BULLET_ARTS_COUNT, 0); + // give back 1 resource if burnt out + if fighter.is_situation(*SITUATION_KIND_AIR) && resource >= 1 { + VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT, 1); + } else { + VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT, 0); } - } else if resource >= 2 { - fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI); //double check if need to set use count to 2 if jump restores it + } + //} else + if resource >= 2 { // skip using HDR flags (vanilla seems to more thoroughly reset it?) + fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI); fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_S); - //fighter.set_int(2, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT); - //fighter.set_int(2, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT); - } //check vanilla lag counter -} - -unsafe fn forward_tilt(boma: &mut BattleObjectModuleAccessor) { - if boma.is_motion(Hash40::new("attack_s3_s")) && MotionModule::frame(boma) >= 28.0 { - if !boma.is_cat_flag(Cat1::AttackLw3 | Cat1::Catch) { - if boma.is_cat_flag(Cat1::AttackHi3 | Cat1::SpecialN | Cat1::SpecialHi) {//vert kick - MotionModule::change_motion(boma, smash::phx::Hash40::new("attack_s3_s3"), 0.0, 1.0, false, 0.0, false, false); - } else if boma.is_cat_flag(Cat1::AttackS3 | Cat1::AttackN) { //side kick - MotionModule::change_motion(boma, smash::phx::Hash40::new("attack_s3_s2"), 0.0, 1.0, false, 0.0, false, false); - } else if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) && boma.is_button_on(Buttons::Attack) { - MotionModule::change_motion(boma, smash::phx::Hash40::new("attack_s3_s3"), 0.0, 1.0, false, 0.0, false, false); - }//hold - } } } @@ -77,7 +71,7 @@ unsafe fn bat_within_air_motion(fighter: &mut L2CFighterCommon) { if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_ATTACK_LW4_HOLD, *FIGHTER_STATUS_KIND_ATTACK_S4_HOLD, *FIGHTER_STATUS_KIND_ATTACK_HI4_HOLD, *FIGHTER_STATUS_KIND_ITEM_SWING_S4_HOLD]) && !fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_WITCH_TIME) { fighter.set_int(0, *FIGHTER_BAYONETTA_STATUS_ATTACK_INT_WITCH_TIME_SMASH_HOLD); - } //witch time charge nerf check frame 0 -> every frame + } // witch time charge nerf check frame 0 -> every frame if fighter.is_situation(*SITUATION_KIND_AIR) { if fighter.is_status(*FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_LW_BATWITHIN) { KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); @@ -94,12 +88,12 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_N_CHARGE, + //*FIGHTER_STATUS_KIND_SPECIAL_N, + //*FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_N_CHARGE, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_N_FIRE, - *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_N_END, - statuses::bayonetta::SPECIAL_N_CANCEL, - *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_HI_JUMP, + //*FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_N_END, + //statuses::bayonetta::SPECIAL_N_CANCEL, + //*FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_HI_JUMP, *FIGHTER_STATUS_KIND_SPECIAL_S, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_HIT, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_WALL_END]) @@ -111,7 +105,6 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, frame: f32) { aerial_cancels(fighter, boma); reset_flags(fighter, boma); - forward_tilt(boma); bat_within_air_motion(fighter); fastfall_specials(fighter); } diff --git a/fighters/bayonetta/src/specialn_bullet/acmd.rs b/fighters/bayonetta/src/specialn_bullet/acmd.rs index 8ed1ed1fb9..0a5e612c69 100644 --- a/fighters/bayonetta/src/specialn_bullet/acmd.rs +++ b/fighters/bayonetta/src/specialn_bullet/acmd.rs @@ -4,7 +4,7 @@ unsafe extern "C" fn game_movechargebullet(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 47, 200, 0, 15, 1.6, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_02, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 47, 200, 0, 15, 1.6, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BAYONETTA_HIT_02, *ATTACK_REGION_OBJECT); AttackModule::enable_safe_pos(boma); } } diff --git a/fighters/bayonetta/src/status/attackair.rs b/fighters/bayonetta/src/status/attackair.rs index b608f8f623..c08ebde3f9 100644 --- a/fighters/bayonetta/src/status/attackair.rs +++ b/fighters/bayonetta/src/status/attackair.rs @@ -4,6 +4,9 @@ use super::*; unsafe extern "C" fn attack_air_pre(fighter: &mut L2CFighterCommon) -> L2CValue { WorkModule::on_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_JUMP_NO_LIMIT_ONCE); + if fighter.global_table[CURRENT_FRAME].get_i32() as f32 <= fighter.get_param_float("param_special_hi", "jump_count_reset_frame") { + EffectModule::req_follow(fighter.module_accessor, Hash40::new("bayonetta_feather_twinkle"), Hash40::new("waist"), &Vector3f{x: 0.0, y: 0.0, z: 0.0}, &Vector3f::zero(), 0.8, true, 0, 0, 0, 0, 0, false, false); + } smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_ATTACK_AIR)(fighter) } @@ -51,17 +54,7 @@ unsafe extern "C" fn bayonetta_attack_air_f_loop(fighter: &mut L2CFighterCommon) } if AttackModule::is_infliction(fighter.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) && !fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION) { - let control_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL) as *mut smash::app::KineticEnergy; - sv_kinetic_energy!(controller_set_accel_x_mul, fighter, 0.055); - if fighter.is_motion(Hash40::new("attack_air_f")) { - let y_speed = fighter.get_param_float("param_private", "attack_air_f_hit_speed_y"); - smash::app::lua_bind::KineticEnergy::mul_speed(control_energy, &Vector3f::new(0.55, 1.0, 1.0)); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, y_speed); - } else if fighter.is_motion(Hash40::new("attack_air_f2")) { - let y_speed = fighter.get_param_float("param_private", "attack_air_f2_hit_speed_y"); - smash::app::lua_bind::KineticEnergy::mul_speed(control_energy, &Vector3f::new(0.60, 1.0, 1.0)); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, y_speed); - } + cut_speed(fighter); } if !fighter.status_AttackAir_Main_common().get_bool() { fighter.sub_air_check_superleaf_fall_slowly(); @@ -74,15 +67,19 @@ unsafe extern "C" fn bayonetta_attack_air_f_loop(fighter: &mut L2CFighterCommon) } unsafe extern "C" fn fair_motion(fighter: &mut L2CFighterCommon) -> L2CValue { + // doesn't autocancel during startup if fair was combo'd + if fighter.is_prev_status(*FIGHTER_BAYONETTA_STATUS_KIND_ATTACK_AIR_F) { + fighter.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } let fair = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::ATTACK_AIR_F_COUNT); if fair == 1 { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_air_f2"), 0.0, 1.0, false, 0.0, false, false); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_air_f2"), 2.0, 1.0, false, 0.0, false, false); //notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2b94de0d96), FIGHTER_LOG_ACTION_CATEGORY_ATTACK, FIGHTER_LOG_ATTACK_KIND_ATTACK_AIR_F2); makes each fair stale separately } else if fair == 2 { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_air_f3"), 0.0, 1.0, false, 0.0, false, false); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_air_f3"), 3.0, 1.0, false, 0.0, false, false); //notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2b94de0d96), FIGHTER_LOG_ACTION_CATEGORY_ATTACK, FIGHTER_LOG_ATTACK_KIND_ATTACK_AIR_F3); } else { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_air_f"), 0.0, 1.0, false, 0.0, false, false); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_air_f"), 1.0, 1.0, false, 0.0, false, false); //notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2b94de0d96), FIGHTER_LOG_ACTION_CATEGORY_ATTACK, FIGHTER_LOG_ATTACK_KIND_ATTACK_AIR_F); } if ItemModule::is_have_item(fighter.module_accessor, 0) { @@ -92,6 +89,35 @@ unsafe extern "C" fn fair_motion(fighter: &mut L2CFighterCommon) -> L2CValue { false.into() } +unsafe extern "C" fn cut_speed(fighter: &mut L2CFighterCommon) -> L2CValue { + let control_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL) as *mut app::KineticEnergy; + let x_speed = lua_bind::KineticEnergy::get_speed_x(control_energy); + let hitbox_id = VarModule::get_int(fighter.battle_object, vars::common::instance::LAST_ATTACK_HITBOX_ID); + let mut hit_x = 0.0; + let mut hit_y = 0.0; + if fighter.is_motion(Hash40::new("attack_air_f")) { + hit_y = fighter.get_param_float("param_private", "attack_air_f_hit_speed_y"); + } else if fighter.is_motion(Hash40::new("attack_air_f2")) { + hit_y = fighter.get_param_float("param_private", "attack_air_f2_hit_speed_y"); + } else { + return 1.into(); + } + match hitbox_id { + 0 => {hit_x = 0.4; + hit_y += -0.1}, // fair 1 knee hitbox + 1 => hit_x = 0.5, // inner hit + 2 => hit_x = 0.55, // middle hit + 3 => hit_x = 0.65, // outer hit + _ => {hit_x = 0.6; + hit_y += -0.05} // gr hit + }; + let lr = fighter.lr(); + sv_kinetic_energy!(controller_set_accel_x_mul, fighter, 0.055); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, (x_speed*lr).max(-0.1)*hit_x*lr, 0.0); // nerf fadeback fair on shield + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, hit_y); + 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_ATTACK_AIR, attack_air_pre); diff --git a/fighters/bayonetta/src/status/attacks3.rs b/fighters/bayonetta/src/status/attacks3.rs new file mode 100644 index 0000000000..7a4b0ba474 --- /dev/null +++ b/fighters/bayonetta/src/status/attacks3.rs @@ -0,0 +1,126 @@ +use super::*; + +// FIGHTER_STATUS_KIND_ATTACK_S3 + +unsafe extern "C" fn attack_s3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_AttackS3Common(); + fighter.main_shift(attack_s3_main_loop) +} +// cheated by editing wuboy's dtilt rewrite (idk how to read dat_xxx in ghidra) +unsafe extern "C" fn attack_s3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) { + fighter.attack_s3_mtrans(); + check_stage(fighter); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) + && fighter.sub_wait_ground_check_common(false.into()).get_bool() { + if VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT) { + VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::ATTACK_S3_COUNT, 0); + } + return 1.into(); + } + if fighter.global_table[globals::SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()) + } + let jump_attack_frame = fighter.get_int(*FIGHTER_STATUS_WORK_ID_INT_RESERVE_ATTACK_MINI_JUMP_ATTACK_FRAME); + if 0 < jump_attack_frame { + if !StopModule::is_stop(fighter.module_accessor) + && fighter.sub_check_button_jump().get_bool() { + let log = fighter.status_attack(); + let info = log[0x10f40d7b92u64].get_i64(); + let mot = MotionModule::motion_kind(fighter.module_accessor); + MotionAnimcmdModule::call_script_single( + fighter.module_accessor, + *FIGHTER_ANIMCMD_EXPRESSION, + Hash40::new_raw(mot), + -1 + ); + fighter.set_int64(info, *FIGHTER_STATUS_WORK_ID_INT_RESERVE_LOG_ATTACK_KIND); + fighter.change_status_jump_mini_attack(true.into()); + return 1.into(); + } + } + if 1 == jump_attack_frame { + if !fighter.global_table[globals::IS_STOPPING].get_bool() + && fighter.get_int64(*FIGHTER_STATUS_WORK_ID_INT_RESERVE_LOG_ATTACK_KIND) > 0 { + let log = fighter.get_int64(*FIGHTER_STATUS_WORK_ID_INT_RESERVE_LOG_ATTACK_KIND); + FighterStatusModuleImpl::reset_log_action_info(fighter.module_accessor, log); + fighter.set_int64(0, *FIGHTER_STATUS_WORK_ID_INT_RESERVE_LOG_ATTACK_KIND); + } + } + // combo input + if check_input(fighter) { + if fighter.is_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO) + && (fighter.is_cat_flag(Cat1::AttackS3 | Cat1::AttackN) + || (!fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) + && fighter.is_button_on(Buttons::Attack) + && !fighter.is_button_trigger(Buttons::Attack) + && !VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT))) + { + fighter.change_status(FIGHTER_STATUS_KIND_ATTACK_S3.into(), true.into()) + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + } + 0.into() +} + +unsafe extern "C" fn check_input(fighter: &mut L2CFighterCommon) -> bool { + let special_stick_y = fighter.get_param_float("common", "special_stick_y"); + let lr = fighter.lr(); + // f1 of input try to filter non jab/ftilt inputs + if fighter.is_button_trigger(Buttons::Attack) { + if fighter.is_stick_backward() + || fighter.stick_y().abs() > special_stick_y { + fighter.clear_commands(Cat1::AttackN); + fighter.clear_commands(Cat1::AttackS3); + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT); + return false.into(); + } + VarModule::off_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT); + } + // hold input restriction + if fighter.is_stick_backward() + || fighter.left_stick_y().abs() > special_stick_y + || fighter.right_stick_y().abs() > special_stick_y { + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT); + return false.into(); + } + // again but also filter grab + if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_CATCH) + || fighter.global_table[CMD_CAT1].get_i32() & ( + //*FIGHTER_PAD_CMD_CAT1_FLAG_SPECIAL_LW | *FIGHTER_PAD_CMD_CAT1_FLAG_SPECIAL_HI | + //*FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_HI3 | *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_LW3 | + //*FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_HI4 | *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_LW4 | + *FIGHTER_PAD_CMD_CAT1_FLAG_CATCH + ) == 1 { + return false.into(); + } + true.into() +} + +unsafe extern "C" fn check_stage(fighter: &mut L2CFighterCommon) { + let prev_status_0 = StatusModule::prev_status_kind(fighter.module_accessor, 0); + let mut stage = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::ATTACK_S3_COUNT); + let mut motion = Hash40::new("attack_s3_s"); + // fuck combo module + if ![*FIGHTER_STATUS_KIND_ATTACK, *FIGHTER_STATUS_KIND_ATTACK_S3].contains(&prev_status_0) { + VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::ATTACK_S3_COUNT, 0); + stage = 0; + } + match stage { + 0 => VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::ATTACK_S3_COUNT, 1), + 1 => {VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::ATTACK_S3_COUNT, 2); + motion = Hash40::new("attack_s3_s2");}, + _ => {VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::ATTACK_S3_COUNT, 0); + motion = Hash40::new("attack_s3_s3");}, + }; + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + return; +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_S3, attack_s3_main); +} \ No newline at end of file diff --git a/fighters/bayonetta/src/status/jumpaerial.rs b/fighters/bayonetta/src/status/jumpaerial.rs deleted file mode 100644 index 63eb675d85..0000000000 --- a/fighters/bayonetta/src/status/jumpaerial.rs +++ /dev/null @@ -1,24 +0,0 @@ -use super::*; - -// FIGHTER_STATUS_KIND_JUMP_AERIAL - -unsafe extern "C" fn jump_aerial_end(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.status_end_JumpAerial(); - let frame = fighter.global_table[CURRENT_FRAME].get_i32() as f32; - if frame <= fighter.get_param_float("param_special_hi", "jump_count_reset_frame") { - if [*FIGHTER_STATUS_KIND_SPECIAL_HI, *FIGHTER_STATUS_KIND_SPECIAL_S].contains(&fighter.global_table[STATUS_KIND].get_i32()) { - fighter.set_int(1, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - EFFECT(fighter, Hash40::new("bayonetta_witchtime_flash"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - EffectModule::req_follow(fighter.module_accessor, Hash40::new("bayonetta_feather_twinkle"), Hash40::new("waist"), &Vector3f{x: 0.0, y: 0.0, z: 0.0}, &Vector3f::zero(), 0.8, true, 0, 0, 0, 0, 0, false, false); - PostureModule::set_pos(fighter.module_accessor, &Vector3f{x: PostureModule::pos_x(fighter.module_accessor), y: PostureModule::pos_y(fighter.module_accessor) - (frame * 1.2), z: PostureModule::pos_z(fighter.module_accessor)}); - } - else if fighter.global_table[globals::STATUS_KIND] == FIGHTER_STATUS_KIND_ATTACK_AIR { - EffectModule::req_follow(fighter.module_accessor, Hash40::new("bayonetta_feather_twinkle"), Hash40::new("waist"), &Vector3f{x: 0.0, y: 0.0, z: 0.0}, &Vector3f::zero(), 0.8, true, 0, 0, 0, 0, 0, false, false); - } - } - 0.into() -} - -pub fn install(agent: &mut Agent) { - agent.status(End, *FIGHTER_STATUS_KIND_JUMP_AERIAL, jump_aerial_end); -} diff --git a/fighters/bayonetta/src/status/mod.rs b/fighters/bayonetta/src/status/mod.rs index fc5b905023..a8cba0e9cd 100644 --- a/fighters/bayonetta/src/status/mod.rs +++ b/fighters/bayonetta/src/status/mod.rs @@ -2,25 +2,144 @@ use super::*; use globals::*; mod attack; +mod attackair; +mod attacks3; mod batwithin; mod escape; -mod attackair; mod specialairs; mod specialn; mod specials; mod specialhi; -mod jumpaerial; +mod speciallw; mod wait; +unsafe extern "C" fn set_lag(fighter: &mut L2CFighterCommon) { + // resource usage count + let resources = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT) as f32; + let bullet_count = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_BULLET_ARTS_COUNT) as f32; + let dabk = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_DABK_COUNT) as f32; // lag added to base abk lag + let abk_total_count = fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) as f32; + let witch_twist_count = fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT) as f32; + // lag frame params + let whiff_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.whiff_lag"); + let bullet_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.bullet_arts_lag"); + let dabk_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.dive_side_special"); + let abk_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.side_special"); + let witch_twist_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.up_special"); + let base_lag: f32 = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.base_lag"); + let special_landing_frame_mul = fighter.get_param_float("special_landing_frame_mul", ""); + // combine + let special_lag = (resources*whiff_lag)+(bullet_count*bullet_lag)+(dabk*dabk_lag)+(abk_total_count*abk_lag)+(witch_twist_count*witch_twist_lag)+base_lag; + // after lag frames decided + let adjusted_special_lag = special_landing_frame_mul * special_lag; + if adjusted_special_lag < 1.0 {let adjusted_special_lag = 1.0;} // vanilla + fighter.set_float(adjusted_special_lag, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); +} + +unsafe extern "C" fn hold_check(fighter: &mut L2CFighterCommon) -> bool { + let buffer = ControlModule::get_command_life_count_max(fighter.module_accessor) as usize; + if fighter.is_button_on(Buttons::Special) { + if fighter.is_button_trigger(Buttons::Special) + || InputModule::get_trigger_count(fighter.battle_object, Buttons::Special) < buffer { + return false.into() + } + return true.into() + } + if fighter.is_button_on(Buttons::Attack) { + if fighter.is_button_trigger(Buttons::Attack) + || InputModule::get_trigger_count(fighter.battle_object, Buttons::Attack) < buffer { + return false.into() + } + return true.into() + } + false.into() +} + +unsafe extern "C" fn var_reset(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_float(0.0, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); + fighter.set_int(0, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT); + fighter.set_int(0, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_REUSE_FRAME); + fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_S); + fighter.set_int(0, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT); + fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI); + fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SPECIAL_HI_AFTER_ACTION); + return 0.into(); +} + +unsafe extern "C" fn special_buzzer(fighter: &mut L2CFighterCommon) -> L2CValue { + if !VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::RECOVERY_RESOURCE_INVALID_INPUT) { + let sound = SoundModule::play_se(fighter.module_accessor, Hash40::new("se_system_beep"), true, false, false, false, app::enSEType(0)); + SoundModule::set_se_vol(fighter.module_accessor, sound as i32, 0.6, 0); + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::RECOVERY_RESOURCE_INVALID_INPUT); + } + 0.into() +} + +unsafe extern "C" fn jump_refresh(fighter: &mut L2CFighterCommon) -> L2CValue { + let frame = fighter.global_table[globals::CURRENT_FRAME].get_i32() as f32; + if fighter.is_status(*FIGHTER_STATUS_KIND_JUMP_AERIAL) + && frame <= fighter.get_param_float("param_special_hi", "jump_count_reset_frame") { + fighter.set_int(1, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + EFFECT(fighter, Hash40::new("bayonetta_witchtime_flash"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); + EffectModule::req_follow(fighter.module_accessor, Hash40::new("bayonetta_feather_twinkle"), Hash40::new("waist"), &Vector3f{x: 0.0, y: 0.0, z: 0.0}, &Vector3f::zero(), 0.8, true, 0, 0, 0, 0, 0, false, false); + PostureModule::set_pos(fighter.module_accessor, &Vector3f{x: PostureModule::pos_x(fighter.module_accessor), y: PostureModule::pos_y(fighter.module_accessor) - (frame * 1.2), z: PostureModule::pos_z(fighter.module_accessor)}); + } + 0.into() +} + +unsafe extern "C" fn should_use_special_s_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[globals::SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) > 1 // no abks + || (fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_S) // no resource + || (fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_REUSE_FRAME) <= 0 // frame limit ran out + && fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) > 0) + && !VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::RECOVERY_RESOURCE_BYPASS_CHECK)) { + //special_buzzer(fighter); + return false.into(); + } + jump_refresh(fighter); + } + true.into() +} + +unsafe extern "C" fn should_use_special_hi_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[globals::SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT) > 1 + || (fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI) + && !VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::RECOVERY_RESOURCE_BYPASS_CHECK)) { + //special_buzzer(fighter); + return false.into(); + } + jump_refresh(fighter); + } + true.into() +} + +unsafe extern "C" fn should_use_special_lw_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SPECIAL_AIR_LW) { + return false.into(); + } + true.into() +} + +unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { + fighter.global_table[globals::USE_SPECIAL_S_CALLBACK].assign(&L2CValue::Ptr(should_use_special_s_callback as *const () as _)); + fighter.global_table[globals::USE_SPECIAL_HI_CALLBACK].assign(&L2CValue::Ptr(should_use_special_hi_callback as *const () as _)); + fighter.global_table[globals::USE_SPECIAL_LW_CALLBACK].assign(&L2CValue::Ptr(should_use_special_lw_callback as *const () as _)); +} + pub fn install(agent: &mut Agent) { + agent.on_start(on_start); + attack::install(agent); + attackair::install(agent); + attacks3::install(agent); batwithin::install(agent); escape::install(agent); - attackair::install(agent); specialairs::install(agent); specialn::install(agent); specials::install(agent); specialhi::install(agent); - jumpaerial::install(agent); + speciallw::install(agent); wait::install(agent); } \ No newline at end of file diff --git a/fighters/bayonetta/src/status/specialairs.rs b/fighters/bayonetta/src/status/specialairs.rs index d94785e5a7..cb5740763c 100644 --- a/fighters/bayonetta/src/status/specialairs.rs +++ b/fighters/bayonetta/src/status/specialairs.rs @@ -1,35 +1,74 @@ use super::*; +unsafe extern "C" fn special_air_s_x_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_MOTION_FALL, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + 0.into() +} + // FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D unsafe extern "C" fn special_air_s_d_main(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::inc_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_DABK_COUNT); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_BAYONETTA_SPECIAL_AIR_S); + set_startup_speed(fighter); + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); + fighter.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP); + fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); if fighter.is_prev_status(*FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_U) { MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_d"), 5.0, 1.0, false, 0.0, false, false); } else { //removed qc input MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_d"), 0.0, 1.0, false, 0.0, false, false); } - bounce_check(fighter); fighter.sub_shift_status_main(L2CValue::Ptr(special_air_s_d_main_loop as *const () as _)) } unsafe extern "C" fn special_air_s_d_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + // angling + if fighter.motion_frame() < 8.0 { // should return true until hitboxes spawn + VarModule::set_float(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_ABK_ANGLE, fighter.left_stick_x() * fighter.lr()); + } else { + if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP) { + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP); + } + } + angling(fighter, true); + bounce_check(fighter); + //bullet_checks(fighter); + bullet_movement(fighter); if (CancelModule::is_enable_cancel(fighter.module_accessor) && fighter.sub_air_check_fall_common().get_bool()) || fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } - bounce_check(fighter); - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { - set_lag(fighter); + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + if AttackModule::is_attack(fighter.module_accessor, 0, false) { + VarModule::inc_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT); + } if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_LANDING_FALL_SPECIAL) { fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); } else { - let mut special_lag = fighter.get_float(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); - let whiff_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.whiff_lag"); //5 - if AttackModule::is_attack(fighter.module_accessor, 0, false) {special_lag+=whiff_lag;} //if resource hasnt been used yet manually add the lag - let dabk_slide_lag = special_lag.max(fighter.get_param_int("param_special_s", "ab_d_landing_frame") as f32); //solid 30f landing lag min - fighter.set_float(dabk_slide_lag, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); fighter.change_status(FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_LANDING.into(), false.into()); } } else if MotionModule::is_end(fighter.module_accessor) { @@ -38,15 +77,19 @@ unsafe extern "C" fn special_air_s_d_main_loop(fighter: &mut L2CFighterCommon) - 0.into() } -unsafe extern "C" fn special_air_s_d_end(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND {set_lag(fighter); } +unsafe extern "C" fn special_air_s_x_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP) { + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP); + } + set_lag(fighter); 0.into() } // FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_U unsafe extern "C" fn special_air_s_u_main(fighter: &mut L2CFighterCommon) -> L2CValue { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR_ANGLE); + set_startup_speed(fighter); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_u"), 0.0, 1.0, false, 0.0, false, false); fighter.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP); fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); @@ -54,6 +97,9 @@ unsafe extern "C" fn special_air_s_u_main(fighter: &mut L2CFighterCommon) -> L2C } unsafe extern "C" fn special_air_s_u_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + //bullet_checks(fighter); // use to enable flag + bullet_movement(fighter); + angling(fighter, false); let frame = fighter.global_table[CURRENT_FRAME].get_i32(); if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP) { if fighter.get_param_int("param_special_s", "ab_u_disable_landing_frame") <= frame { @@ -61,23 +107,21 @@ unsafe extern "C" fn special_air_s_u_main_loop(fighter: &mut L2CFighterCommon) - fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP); } } - if frame < 8 { + if frame <= 9 { cache_input(fighter); - if frame == 7 && fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_AIR_SPECIAL_S_U_TO_D) { - fighter.change_status(FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D.into(), false.into()); - }//dabk - } + } + // downwards afterburner kick input + if frame == 9 && fighter.is_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_AIR_SPECIAL_S_U_TO_D) { + fighter.change_status(FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D.into(), false.into()); + } if (CancelModule::is_enable_cancel(fighter.module_accessor) && fighter.sub_air_check_fall_common().get_bool()) || fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_FLAG_WALL_CHECK) {wall_check(fighter); } - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { - set_lag(fighter); + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); } else { - bullet_movement(fighter); - angling(fighter); if MotionModule::is_end(fighter.module_accessor) { fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } @@ -85,25 +129,162 @@ unsafe extern "C" fn special_air_s_u_main_loop(fighter: &mut L2CFighterCommon) - 0.into() } -unsafe extern "C" fn special_air_s_u_end(fighter: &mut L2CFighterCommon) -> L2CValue { - set_lag(fighter); - if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP) { - fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); - fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLAG_SITUATION_KEEP); +// FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_HIT + +unsafe extern "C" fn special_air_s_bounce_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_MOTION_AIR, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + false, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + 0.into() +} + +unsafe extern "C" fn special_air_s_d_hit_main(fighter: &mut L2CFighterCommon) -> L2CValue { + SlowModule::clear(fighter.module_accessor); // manually balanced faf + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_d_hit"), 0.0, 1.0, false, 0.0, false, false); + fighter.sub_shift_status_main(L2CValue::Ptr(special_air_s_bounce_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_air_s_bounce_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + // apply momentum at x fraame of anim + if VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK) { + // use normal gravity/drift values (no custom values for now) + let ab_d_hit_after_speed_x = fighter.get_param_float("param_special_s", "ab_d_hit_after_speed_x"); + let ab_d_hit_after_speed_y = fighter.get_param_float("param_special_s", "ab_d_hit_after_speed_y"); + KineticModule::clear_speed_all(fighter.module_accessor); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + let lr = fighter.lr(); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL, -ab_d_hit_after_speed_x*lr, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ab_d_hit_after_speed_y); + KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + VarModule::off_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK); + } + // drift lock + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + let hit_drift_lockout_frame = fighter.get_param_int("param_special_s", "ab_d_hit_after_stick_control_start_frame"); + let whiff_drift_lockout_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_s.whiff_drift_lockout_frame"); + if fighter.global_table[CURRENT_FRAME].get_i32() >= hit_drift_lockout_frame + && prev_inflict_status & *COLLISION_KIND_MASK_HIT != 0 { + KineticModule::resume_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + if prev_inflict_status & *COLLISION_KIND_MASK_HIT == 0 + && fighter.global_table[CURRENT_FRAME].get_i32() == whiff_drift_lockout_frame { + let whiff_drift_mul_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.whiff_drift_mul_x"); + sv_kinetic_energy!(controller_set_accel_x_mul, fighter, whiff_drift_mul_x); + KineticModule::resume_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + + if (CancelModule::is_enable_cancel(fighter.module_accessor) && fighter.sub_air_check_fall_common().get_bool()) + || fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); + } else { + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + } + } + 0.into() +} + +// FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_WALL_END + +unsafe extern "C" fn special_air_s_wall_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); // stall until bounce portion + let motion = if fighter.global_table[PREV_STATUS_KIND].get_i32() == *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D {"special_air_s_d_wall_end"} else {"special_air_s_u_wall_end"}; + MotionModule::change_motion(fighter.module_accessor, Hash40::new(motion), 0.0, 1.0, false, 0.0, false, false); + fighter.sub_shift_status_main(L2CValue::Ptr(special_air_s_bounce_main_loop as *const () as _)) +} + +// FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_LANDING + +unsafe extern "C" fn special_air_s_d_landing_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let end_frame = MotionModule::end_frame_from_hash(fighter.module_accessor, Hash40::new("special_air_s_d_landing")); + let cancel_frame = FighterMotionModuleImpl::get_cancel_frame(fighter.module_accessor, Hash40::new("special_air_s_d_landing"), true); + let special_lag = fighter.get_float(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); + let motion_rate = if cancel_frame > 0.0 {cancel_frame/special_lag} else {end_frame/special_lag}; + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_d_landing"), 0.0, motion_rate, false, 0.0, false, false); + GroundModule::set_correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + var_reset(fighter); // reset special vars + fighter.sub_shift_status_main(L2CValue::Ptr(special_air_s_d_landing_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_air_s_d_landing_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) + && (fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool()) { + return 1.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_MOTION, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_d_landing_edge"), 0.0, 1.0, false, 0.0, false, false); + } else { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); + } + } // 6f faf edge cancel + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); } 0.into() } +// helpers + +// using current up b stats +unsafe extern "C" fn set_startup_speed(fighter: &mut L2CFighterCommon) -> L2CValue { + let x_speed = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let y_speed = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let air_start_speed_mul_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.air_start_speed_mul_x"); + let air_start_speed_mul_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.air_start_speed_mul_y"); + let air_accel_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.air_accel_y"); + let air_max_speed_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.air_max_speed_y"); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL, x_speed * air_start_speed_mul_x, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, y_speed * air_start_speed_mul_y); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_accel_y); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_max_speed_y); + 0.into() +} + unsafe extern "C" fn bounce_check(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_D_FLAG_HIT) { - if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) - && !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { - VarModule::inc_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT); + if AttackModule::is_attack(fighter.module_accessor, 0, false) { // don't activate during bullet arts + if AttackModule::is_infliction(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY) { + fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_D_FLAG_HIT); + return 1.into(); + } + if AttackModule::is_infliction(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_HIT) { + if !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { + VarModule::inc_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT); + } + fighter.change_status(FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_HIT.into(), false.into()); + return 1.into(); } - fighter.change_status(FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_HIT.into(), false.into()); - } else { - wall_check(fighter); } + wall_check(fighter); 0.into() } @@ -129,7 +310,8 @@ unsafe extern "C" fn cache_input(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.is_button_on(Buttons::Attack | Buttons::Catch) && !fighter.is_button_on(Buttons::CStickOn) && !fighter.is_cat_flag(Cat1::AttackHi3 | Cat1::SpecialHi) { - EFFECT(fighter, Hash40::new("sys_smash_flash_s"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 4, 4, 4, 0, 0, 0, false); + EFFECT(fighter, Hash40::new("sys_smash_flash_s"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1.75, 4, 4, 4, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(fighter, 0.5); fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_AIR_SPECIAL_S_U_TO_D); VarModule::set_float(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_ABK_ANGLE, -1.15); //angle forced down during dabk windup } else { @@ -139,37 +321,86 @@ unsafe extern "C" fn cache_input(fighter: &mut L2CFighterCommon) -> L2CValue { 0.into() } -unsafe extern "C" fn angling(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn angling(fighter: &mut L2CFighterCommon, dive: bool) -> L2CValue { let frame = MotionModule::frame(fighter.module_accessor); - let facing = PostureModule::lr(fighter.module_accessor); - let sticky = VarModule::get_float(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_ABK_ANGLE); - joint_rotator(fighter, frame, Hash40::new("rot"), Vector3f{x: -14.5*sticky, y:0.0, z:0.0}, 1.0, 12.0, 31.0, 40.0); - if fighter.global_table[CURRENT_FRAME].get_i32() == 7 { - let base = fighter.get_param_float("param_special_s", "ab_u_rotate"); - let speed = fighter.get_param_float("param_special_s", "ab_u_motion_speed_mul"); - let maxrot = 13.0; - let angle = if facing < 0.0 { - -base - sticky *maxrot //l - } else { - base + sticky *maxrot //r - }; - let angle = angle.to_radians(); - sv_kinetic_energy!(set_angle, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, angle); - sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, speed - sticky*0.08); //min .71, max .87 + let facing = fighter.lr(); + let stick = VarModule::get_float(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_ABK_ANGLE); + if dive { + joint_rotator(fighter, frame, Hash40::new("rot"), Vector3f{x: -6.0*stick, y:0.0, z:0.0}, 1.0, 7.0, 25.0, 32.0); + if frame > 7.0 && !VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK) { + KineticModule::clear_speed_all(fighter.module_accessor); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR_ANGLE); + let base = fighter.get_param_float("param_special_s", "ab_d_rotate"); + let speed = fighter.get_param_float("param_special_s", "ab_d_motion_speed_mul"); + let maxrot = 6.0; + let angle = if facing < 0.0 { + -base - stick *maxrot //l + } else { + base + stick *maxrot //r + }; + let angle_rad = angle.to_radians(); + + // have to manually calculate what the horizontal distance should be.. + let base_angle: f32 = 45.0; + let base_angle_c: f32 = 90.0 - base_angle; + let base_c = 113.14; + let base_dist = (base_c*f32::sin(90.0_f32.to_radians()))/f32::sin(base_angle_c.to_radians()); + let angle_c: f32 = 90.0 - angle; + let new_dist = (base_c*f32::sin(90.0_f32.to_radians()))/f32::sin(angle_c.to_radians()); + let ratio = new_dist / base_dist; + let new_speed = ratio*speed; + + sv_kinetic_energy!(set_angle, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, angle_rad); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, new_speed); + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK); //only angle once + } + } else { + joint_rotator(fighter, frame, Hash40::new("rot"), Vector3f{x: -15.0*stick, y:0.0, z:0.0}, 1.0, 12.0, 31.0, 40.0); + if frame > 11.0 && !VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK) { + KineticModule::clear_speed_all(fighter.module_accessor); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR_ANGLE); + let base = fighter.get_param_float("param_special_s", "ab_u_rotate"); // base seems to actually be 35* before falling?? + let speed = fighter.get_param_float("param_special_s", "ab_u_motion_speed_mul"); + let maxrot = 15.0; + let angle = if facing < 0.0 { + -base - stick *maxrot //l + } else { + base + stick *maxrot //r + }; + let angle_rad = angle.to_radians(); + + // have to manually calculate what the horizontal distance should be.. + let base_angle: f32 = 35.0; + let base_angle_c: f32 = 90.0 - base_angle; + let base_c = 63.0; + let base_dist = (base_c*f32::sin(90.0_f32.to_radians()))/f32::sin(base_angle_c.to_radians()); + let angle_c: f32 = 90.0 - angle; + let new_dist = (base_c*f32::sin(90.0_f32.to_radians()))/f32::sin(angle_c.to_radians()); + let ratio = new_dist / base_dist; + let new_speed = ratio*speed; + + sv_kinetic_energy!(set_angle, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, angle_rad); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, new_speed); + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK); //only angle once + } } 0.into() } unsafe extern "C" fn bullet_movement(fighter: &mut L2CFighterCommon) -> L2CValue { //was like 400 lines - if fighter.get_int(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_INT_STEP) == *FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT { + let dabk = fighter.is_status(*FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D); + if VarModule::get_int(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_BULLET_STAGE) == *FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT { if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP) != *FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT { if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP) == *FIGHTER_BAYONETTA_SHOOTING_STEP_SHOOTING { - let x_reset = fighter.get_float(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLOAT_MOTION_SPEED_X); - let y_reset = fighter.get_float(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLOAT_MOTION_SPEED_Y); - let initial_x = fighter.get_param_float("param_special_s", "ab_u_shooting_speed_x_mul"); - let initial_y = fighter.get_param_float("param_special_s", "ab_u_shooting_speed_y_mul"); - let mut stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; //272 - let mut gravity_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) as *mut app::KineticEnergy; //288 + // this runs the first time it shoots + //VarModule::inc_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_BULLET_ARTS_COUNT); + let speed = VarModule::get_vec2(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_MOTION_XY); + let x_reset = speed.x; + let y_reset = speed.y; + let initial_x = if dabk { 0.8 } else {fighter.get_param_float("param_special_s", "ab_u_shooting_speed_x_mul")}; + let initial_y = if dabk { 0.2 } else {fighter.get_param_float("param_special_s", "ab_u_shooting_speed_y_mul")}; + let mut stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let mut gravity_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) as *mut app::KineticEnergy; let mut motion_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION) as *mut app::KineticEnergy; //motion to stop energy lua_bind::KineticEnergy::reset_energy(stop_energy as _, *ENERGY_STOP_RESET_TYPE_AIR, &Vector2f { x: x_reset * initial_x, y: 0.0 }, &Vector3f::zero(), fighter.module_accessor); @@ -179,23 +410,22 @@ unsafe extern "C" fn bullet_movement(fighter: &mut L2CFighterCommon) -> L2CValue lua_bind::KineticEnergyNormal::set_limit_speed(stop_energy as *mut app::KineticEnergyNormal, &Vector2f { x: -1.0, y: -1.0 }); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); //motion to gravity - lua_bind::KineticEnergy::reset_energy(gravity_energy as _, *ENERGY_GRAVITY_RESET_TYPE_GRAVITY, &Vector2f { x: 0.0, y: initial_y }, &Vector3f::zero(), fighter.module_accessor); + lua_bind::KineticEnergy::reset_energy(gravity_energy as _, *ENERGY_GRAVITY_RESET_TYPE_GRAVITY, &Vector2f { x: 0.0, y: y_reset * initial_y + 0.125 }, &Vector3f::zero(), fighter.module_accessor); lua_bind::FighterKineticEnergyGravity::set_accel(gravity_energy as *mut app::FighterKineticEnergyGravity, -fighter.get_param_float("param_special_s", "ab_u_shooting_accel_y")); lua_bind::FighterKineticEnergyGravity::set_stable_speed(gravity_energy as *mut app::FighterKineticEnergyGravity, fighter.get_param_float("param_special_s", "ab_u_shooting_max_speed_y")); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_FLAG_WALL_CHECK); - fighter.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_SHOOTING, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_INT_STEP); + VarModule::set_int(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_BULLET_STAGE, *FIGHTER_BAYONETTA_SHOOTING_STEP_SHOOTING) } } else { //save motion to vars let speed = Vector2f{ x: KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN), y: KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) }; - fighter.set_float(speed.x, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLOAT_MOTION_SPEED_X); - fighter.set_float(speed.y, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_FLOAT_MOTION_SPEED_Y); + VarModule::set_vec2(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_MOTION_XY, Vector2f{x: speed.x, y: speed.y}); } - } else if fighter.get_int(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_INT_STEP) == *FIGHTER_BAYONETTA_SHOOTING_STEP_SHOOTING { //shooting + } else if VarModule::get_int(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_BULLET_STAGE) == *FIGHTER_BAYONETTA_SHOOTING_STEP_SHOOTING { // shooting start if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP) != *FIGHTER_BAYONETTA_SHOOTING_STEP_SHOOTING { let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; let speed = Vector2f{ @@ -205,7 +435,7 @@ unsafe extern "C" fn bullet_movement(fighter: &mut L2CFighterCommon) -> L2CValue let x_cap = fighter.get_param_float("param_special_s", "ab_u_shooting_stable_speed_x"); if speed.x.abs() <= x_cap { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); - fighter.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_AIR_S_U_INT_STEP); + VarModule::set_int(fighter.battle_object, vars::bayonetta::status::SPECIAL_S_BULLET_STAGE, *FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END) } } } @@ -276,35 +506,19 @@ unsafe fn joint_rotator(fighter: &mut L2CFighterCommon, frame: f32, joint: Hash4 } } -unsafe fn set_lag(fighter: &mut L2CFighterCommon) { - //vanilla: if special lag variable < lag to be set from current status, skips it to keep the higher number (the problem w whiff lag). Multiplies special lag by landing frame mul then sets it over lag variable (not sure if applicable here but idk) - let resources = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT) as f32; - let dabk = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_DABK_COUNT) as f32; //lag added to base abk lag - let abk_total_count = fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) as f32; - let witch_twist_count = fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT) as f32; - let whiff_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.whiff_lag"); //6 - let dabk_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.dive_side_special");//9 - let abk_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.side_special");//6 - let witch_twist_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.up_special");//6 - let base_lag: f32 = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.whiff_lag"); //8 - let special_landing_frame_mul = fighter.get_param_float("special_landing_frame_mul", ""); - //normal special lag calc - //reworked from hard coded value based on move order (contrived) -> - //calculate all burned resources, and add a base value. 14 -> 50 range - let special_lag = (resources*whiff_lag)+(dabk*dabk_lag)+(abk_total_count*abk_lag)+(witch_twist_count*witch_twist_lag)+base_lag; - //after lag frames decided - let adjusted_special_lag = special_landing_frame_mul * special_lag; - if adjusted_special_lag < 1.0 {let adjusted_special_lag = 1.0;} //vanilla - //if abk_total_count + witch_twist_count > 0 && current_lag <= autocancel_lag { - // let adjusted_special_lag = autocancel_lag;//if lag was cleared via vanilla tech, set it to base value and leave it - //} concept to keep the autocancel if you use another special after firing bullets, since it'd be really niche since she's a fastfaller. idrk - fighter.set_float(adjusted_special_lag, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); -} - pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D, special_air_s_x_pre); agent.status(Main, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D, special_air_s_d_main); - agent.status(End, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D, special_air_s_d_end); + agent.status(End, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D, special_air_s_x_end); + agent.status(Pre, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_U, special_air_s_x_pre); agent.status(Main, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_U, special_air_s_u_main); - agent.status(End, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_U, special_air_s_u_end); + agent.status(End, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_U, special_air_s_x_end); + + agent.status(Pre, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_HIT, special_air_s_bounce_pre); + agent.status(Main, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_HIT, special_air_s_d_hit_main); + agent.status(Pre, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_WALL_END, special_air_s_bounce_pre); + agent.status(Main, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_WALL_END, special_air_s_wall_end_main); + + agent.status(Main, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_LANDING, special_air_s_d_landing_main); } diff --git a/fighters/bayonetta/src/status/specialhi.rs b/fighters/bayonetta/src/status/specialhi.rs index 67d31fd5a6..5aee20c624 100644 --- a/fighters/bayonetta/src/status/specialhi.rs +++ b/fighters/bayonetta/src/status/specialhi.rs @@ -28,35 +28,116 @@ unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } +unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi"), 0.0, 1.0, false, 0.0, false, false); + if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); + fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_SITUATION_KEEP); + } else { + fighter.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_GROUND_START); + } + ItemModule::set_change_status_event(fighter.module_accessor, true); + fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into() + } + if StatusModule::is_situation_changed(fighter.module_accessor) && !StatusModule::is_changing(fighter.module_accessor) { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_MOTION, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + if fighter.global_table[globals::SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + let accel_y = fighter.get_param_float("param_special_hi", "air_accel_y"); + let air_max_speed_y = fighter.get_param_float("param_special_hi", "air_max_speed_y"); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, accel_y); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_max_speed_y); + } + } + if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_JUMP) { + if fighter.global_table[globals::SITUATION_KIND] != *SITUATION_KIND_GROUND { + fighter.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_AIR); + } + fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_JUMP); + KineticModule::clear_speed_energy_id(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); // make distance not based on current speed + fighter.change_status(FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_HI_JUMP.into(), false.into()); + return 1.into(); + } + 0.into() +} + +unsafe extern "C" fn special_hi_heavy_check(fighter: &mut L2CFighterCommon) -> L2CValue { + if hold_check(fighter) { + EFFECT(fighter, Hash40::new("sys_smash_flash_s"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1.75, 4, 4, 4, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(fighter, 0.5); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi"), 0.0, 1.0, false, 0.0, false, false); + VarModule::inc_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_BULLET_ARTS_COUNT); + } + 0.into() +} + +unsafe extern "C" fn special_hi_jump_main(fighter: &mut L2CFighterCommon) -> L2CValue { + ItemModule::set_change_status_event(fighter.module_accessor, true); + fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_jump_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_hi_jump_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into() + } + if CancelModule::is_enable_cancel(fighter.module_accessor) && (fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool()) { + return 1.into(); + } + if MotionModule::is_end(fighter.module_accessor) { + if fighter.global_table[globals::SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 1.into(); + } + } + fighter.sub_air_check_dive(); + // vanilla land before move ends during fall portion + if fighter.global_table[globals::SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + let motion_y: f32 = MotionModule::trans_move_speed(fighter.module_accessor).x(); + if !KineticModule::is_enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION) + || motion_y < 0.0 { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); + return 1.into(); + } + } + // vanilla cancel mechanic on tap up b + if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP) == *FIGHTER_BAYONETTA_SHOOTING_STEP_SHOOTING { + fighter.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_SHOOTING); + } + if !fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_SHOOTING) + && fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_NO_SHOOTING_ENABLE_CANCEL) { + fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_NO_SHOOTING_ENABLE_CANCEL); + CancelModule::enable_cancel(fighter.module_accessor); + } + // heavy variant on bullet arts input + if VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK) { + special_hi_heavy_check(fighter); + VarModule::off_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK); + } + // enable cancel flag if non-BA lands? + if !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) + && VarModule::get_int(fighter.battle_object, vars::common::instance::LAST_ATTACK_HITBOX_ID) < 6 { + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_HIT_NO_BULLET); + } + 0.into() +} + unsafe extern "C" fn special_hi_jump_end(fighter: &mut L2CFighterCommon) -> L2CValue { let ret = smashline::original_status(End, fighter, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_HI_JUMP)(fighter); + fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION); + fighter.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP); set_lag(fighter); ret } -unsafe fn set_lag(fighter: &mut L2CFighterCommon) { - //vanilla: if special lag variable < lag to be set from current status, skips it to keep the higher number (the problem w whiff lag). Multiplies special lag by landing frame mul then sets it over lag variable (not sure if applicable here but idk) - let resources = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::RECOVERY_RESOURCE_COUNT) as f32; - let dabk = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_DABK_COUNT) as f32; //lag added to base abk lag - let abk_total_count = fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT) as f32; - let witch_twist_count = fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT) as f32; - let whiff_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.whiff_lag"); //6 - let dabk_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.dive_side_special");//9 - let abk_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.side_special");//6 - let witch_twist_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.up_special");//6 - let base_lag: f32 = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lag.whiff_lag"); //8 - let special_landing_frame_mul = fighter.get_param_float("special_landing_frame_mul", ""); - //normal special lag calc - //reworked from hard coded value based on move order (contrived) -> - //calculate all burned resources, and add a base value. 14 -> 50 range - let special_lag = (resources*whiff_lag)+(dabk*dabk_lag)+(abk_total_count*abk_lag)+(witch_twist_count*witch_twist_lag)+base_lag; - //after lag frames decided - let adjusted_special_lag = special_landing_frame_mul * special_lag; - if adjusted_special_lag < 1.0 {let adjusted_special_lag = 1.0;} //vanilla - fighter.set_float(adjusted_special_lag, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); -} - pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_main); + + agent.status(Main, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_main); agent.status(End, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_end); } \ No newline at end of file diff --git a/fighters/bayonetta/src/status/speciallw.rs b/fighters/bayonetta/src/status/speciallw.rs new file mode 100644 index 0000000000..02c8e29aed --- /dev/null +++ b/fighters/bayonetta/src/status/speciallw.rs @@ -0,0 +1,32 @@ +use super::*; + +unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings(fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_KEEP as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, + 0 + ); + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); +} \ No newline at end of file diff --git a/fighters/bayonetta/src/status/specialn.rs b/fighters/bayonetta/src/status/specialn.rs index f6e0680f6d..1916d036da 100644 --- a/fighters/bayonetta/src/status/specialn.rs +++ b/fighters/bayonetta/src/status/specialn.rs @@ -2,9 +2,17 @@ use super::*; // FIGHTER_STATUS_KIND_SPECIAL_N +unsafe extern "C" fn special_n_init(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + return smashline::original_status(Init, fighter, *FIGHTER_STATUS_KIND_SPECIAL_N)(fighter); + } + air_stall(fighter); + 0.into() +} + unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_N_CANCEL_TYPE, 0); - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SPECIAL_N_FOOT); fighter.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_FLAG_SPECIAL_N_FOOT); fighter.set_int64(hash40("special_n_start_f") as i64, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_INT_MOTION_KIND_G); @@ -44,6 +52,7 @@ unsafe extern "C" fn special_n_charge_main(fighter: &mut L2CFighterCommon) -> L2 } fighter.set_float(1.0, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_FLOAT_MOTION_RATE); motion_handling(fighter, true); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_JUMP); fighter.sub_shift_status_main(L2CValue::Ptr(special_n_charge_main_loop as *const () as _)) } @@ -121,9 +130,7 @@ unsafe extern "C" fn special_n_cancel_main(fighter: &mut L2CFighterCommon) -> L2 fighter.set_int(special_lag, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_INT_CANCEL_FRAME); } } else { - let gravity = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) as *mut smash::app::KineticEnergy; - let start_y = fighter.get_param_float("param_special_n", "air_start_speed_mul_y"); - smash::app::lua_bind::KineticEnergy::mul_speed(gravity, &Vector3f::new(1.0, start_y, 1.0)); + air_stall(fighter); } fighter.set_float(1.0, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_FLOAT_MOTION_RATE); motion_handling(fighter, false); @@ -189,10 +196,23 @@ unsafe extern "C" fn special_n_cancel_end(fighter: &mut L2CFighterCommon) -> L2C 0.into() } +unsafe extern "C" fn air_stall(fighter: &mut L2CFighterCommon) -> L2CValue { + let x_speed = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let y_speed = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let air_start_speed_mul_x = fighter.get_param_float("param_special_n", "air_start_speed_mul_x"); + let air_start_speed_mul_y = fighter.get_param_float("param_special_n", "air_start_speed_mul_y"); + let stall_min_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_n.stall_min_y"); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL, x_speed * air_start_speed_mul_x, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, (y_speed * air_start_speed_mul_y).max(stall_min_y)); + 0.into() +} + unsafe extern "C" fn motion_handling(fighter: &mut L2CFighterCommon, drift: bool) -> L2CValue { let mot_gr = fighter.get_int64(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_INT_MOTION_KIND_G); let mot_air = fighter.get_int64(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_INT_MOTION_KIND_A); let air = if drift {*FIGHTER_KINETIC_TYPE_MOTION_FALL} else {*FIGHTER_KINETIC_TYPE_AIR_STOP}; + fighter.sub_air_check_dive(); if StatusModule::is_changing(fighter.module_accessor) { fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, air); @@ -239,26 +259,21 @@ unsafe extern "C" fn cancel_check(fighter: &mut L2CFighterCommon) -> L2CValue { } return true.into() } else { - fighter.check_jump_cancel(false, false); if fighter.is_cat_flag(Cat1::AirEscape) { VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_N_CANCEL_TYPE, 0); return true.into() } + else if ( fighter.is_cat_flag(Cat1::JumpButton) + || (ControlModule::is_enable_flick_jump(fighter.module_accessor) && fighter.is_cat_flag(Cat1::Jump)) ) + && fighter.get_num_used_jumps() < fighter.get_jump_count_max() + { + VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_N_CANCEL_TYPE, *FIGHTER_STATUS_KIND_JUMP_AERIAL); + return true.into() + } } return false.into(); } -unsafe extern "C" fn var_reset(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.set_float(0.0, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLOAT_SPECIAL_LANDING_FRAME); - fighter.set_int(0, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_USED_COUNT); - fighter.set_int(0, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_AIR_S_REUSE_FRAME); - fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_S); - fighter.set_int(0, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SPECIAL_HI_USED_COUNT); - fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI); - fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SPECIAL_HI_AFTER_ACTION); - return 0.into(); -} - unsafe extern "C" fn special_n_fire_end(fighter: &mut L2CFighterCommon) -> L2CValue { let remaining_repeats = fighter.get_int(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_INT_ADD_FIRE_COUNT); VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_N_CANCEL_TYPE, remaining_repeats); @@ -270,6 +285,7 @@ unsafe extern "C" fn special_n_fire_end(fighter: &mut L2CFighterCommon) -> L2CVa } pub fn install(agent: &mut Agent) { + agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_init); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_main); agent.status(Init, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_N_CHARGE, special_n_charge_init); diff --git a/fighters/bayonetta/src/status/specials.rs b/fighters/bayonetta/src/status/specials.rs index 5fb7c06cba..15a3bbe5c1 100644 --- a/fighters/bayonetta/src/status/specials.rs +++ b/fighters/bayonetta/src/status/specials.rs @@ -16,42 +16,113 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV } wall_bounce(fighter); var_reset(fighter); - if fighter.is_motion(Hash40::new("special_s")) {ground_checks(fighter); } - else {air_checks(fighter); } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.motion_frame() < 44.0 { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, statuses::bayonetta::SPECIAL_S_EDGE, false); + return 1.into(); + } + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + if fighter.is_in_hitlag() {special_s_slow_hit(fighter); } + kick_checks(fighter); 0.into() } -unsafe extern "C" fn ground_checks(fighter: &mut L2CFighterCommon) -> L2CValue { - let frame = fighter.global_table[CURRENT_FRAME].get_i32() + 1; - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { - if fighter.is_in_hitlag() {special_s_slow_hit(fighter); } - else if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_HIT) { - if fighter.is_cat_flag(Cat1::SpecialS | Cat1::AttackS3) - && !fighter.is_button_trigger(Buttons::CStickOn) - && frame >= 20 && frame <= 35 { +unsafe extern "C" fn kick_checks(fighter: &mut L2CFighterCommon) -> L2CValue { + let motion_frame = fighter.motion_frame(); + if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_HIT) { + // manual heelslide kick on jab/ftilt or nb/sb input, buffered heel slide legacy input on last frame if input is held + if check_input(fighter) + && !fighter.is_in_hitlag() { + if (fighter.is_cat_flag(Cat1::SpecialN | Cat1::SpecialS | Cat1::AttackN | Cat1::AttackS3) + && motion_frame > 19.0 + && AttackModule::is_attack(fighter.module_accessor, 0, false)) + || (hold_check(fighter) + && VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK)) + && !VarModule::is_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT) + { + EFFECT(fighter, Hash40::new("sys_smash_flash_s"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1.75, 4, 4, 4, 0, 0, 0, false); // flash on manual activation to match dabk + LAST_EFFECT_SET_RATE(fighter, 0.5); GroundModule::set_correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); - fighter.change_status(statuses::bayonetta::SPECIAL_S_KICK.into(), true.into()); - }//heelslide kick - } - if frame == 35 {EFFECT_OFF_KIND(fighter, Hash40::new("bayonetta_heelslide_burst"), false, false); } //fx - if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into());} //end transition - } else { - if frame >= 45 {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } - else if StatusModule::is_situation_changed(fighter.module_accessor) { - let slide_frame = (frame - 15).clamp(1, 24) as f32; - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_edge"), 0.0, 1.0, false, 0.0, false, false); //1x speed -> 1.5x - fighter.set_situation(SITUATION_KIND_AIR.into()); - GroundModule::set_correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); - sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.045 - 0.043*slide_frame); //1.006x -> 0.015x dist + fighter.change_status(statuses::bayonetta::SPECIAL_S_KICK.into(), true.into()) + } } + VarModule::off_flag(fighter.battle_object, vars::bayonetta::status::SPECIAL_1F_CHECK); } + if motion_frame > 35.0 {EFFECT_OFF_KIND(fighter, Hash40::new("bayonetta_heelslide_burst"), false, false); } //fx 0.into() } -unsafe extern "C" fn air_checks(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND {fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); } - else if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } +// FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_S_KICK + +unsafe extern "C" fn special_s_edge_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_MOTION_FALL, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + *FS_SUCCEEDS_KEEP_ATTACK + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + 0.into() +} + +unsafe extern "C" fn special_s_edge_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let frame: i32 = fighter.global_table[PREV_STATUS_FRAME].get_i32() - 15; + let start_frame = (frame as f32/10.0).round(); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_edge"), start_frame, 1.0, false, 0.0, false, false); + // calc speed + let air_accel_y = fighter.get_param_float("air_accel_y", ""); + let mut speed = (1.125 - (frame as f32/23.0)).max(0.00125); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y / 1.25); + //sv_kinetic_energy!(controller_set_accel_x_mul, fighter, 0.03); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, speed); + // force late hit + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 10, 0, 20, 0, false); + if AttackModule::is_attack(fighter.module_accessor, 0, false) { // force late-hit hitbox + ATTACK(fighter, 0, 0, Hash40::new("footr"), 7.0, 65, 15, 0, 55, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + fighter.sub_shift_status_main(L2CValue::Ptr(special_s_kick_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_s_edge_end(fighter: &mut L2CFighterCommon) -> L2CValue { + EFFECT_OFF_KIND(fighter, Hash40::new("bayonetta_heelslide_burst"), false, false); + 0.into() +} + +unsafe extern "C" fn special_s_edge_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) && fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + if fighter.is_in_hitlag() {special_s_slow_hit(fighter); } 0.into() } @@ -86,12 +157,18 @@ unsafe extern "C" fn special_s_kick_pre(fighter: &mut L2CFighterCommon) -> L2CVa } unsafe extern "C" fn special_s_kick_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let mul_x = fighter.get_param_float("param_special_s", "hs_shooting_speed_mul_x"); let shield_x = fighter.get_param_float("param_special_s", "guard_speed_mul_x"); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_hold_end"), 0.0, 1.0, false, 0.0, false, false); let frame = fighter.global_table[PREV_STATUS_FRAME].get_i32() - 20; - let mut speed = 1.15 - (0.017 * frame as f32); //instant kick = 1.15, last second kick ~ 0.89 - if VarModule::is_flag(fighter.battle_object, vars::bayonetta::instance::WAS_CANCEL) {speed=speed*shield_x;} - VarModule::off_flag(fighter.battle_object, vars::bayonetta::instance::WAS_CANCEL); //shield-kick starts with cut speed + let mut speed = 1.15 - (0.015 * frame as f32); //instant kick = 1.15, last second kick ~ 0.89 + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 { + speed=speed*shield_x; + } // shield-kick starts with cut speed + else if prev_inflict_status & *COLLISION_KIND_MASK_HIT != 0 { + speed=speed*mul_x; + } // less speed if part 1 hit, shouldnt be able to use on whiff but anyways sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, speed); fighter.sub_shift_status_main(L2CValue::Ptr(special_s_kick_main_loop as *const () as _)) } @@ -103,10 +180,17 @@ unsafe extern "C" fn special_s_kick_end(fighter: &mut L2CFighterCommon) -> L2CVa } unsafe extern "C" fn special_s_kick_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if CancelModule::is_enable_cancel(fighter.module_accessor) && (fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool()) { + if CancelModule::is_enable_cancel(fighter.module_accessor) && fighter.sub_wait_ground_check_common(false.into()).get_bool() { + return 1.into(); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, *FIGHTER_STATUS_KIND_FALL, false); return 1.into(); } - if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); } if fighter.is_in_hitlag() {special_s_slow_hit(fighter); } 0.into() } @@ -149,9 +233,46 @@ unsafe extern "C" fn var_reset(fighter: &mut L2CFighterCommon) -> L2CValue { return 0.into(); } +unsafe extern "C" fn check_input(fighter: &mut L2CFighterCommon) -> bool { + let special_stick_y = fighter.get_param_float("common", "special_stick_y"); + let lr = fighter.lr(); + // f1 of input try to filter non jab/ftilt inputs + if fighter.is_button_trigger(Buttons::Attack | Buttons::Special) { + if fighter.is_stick_backward() + || fighter.stick_y().abs() > special_stick_y { + fighter.clear_commands(Cat1::AttackN); + fighter.clear_commands(Cat1::AttackS3); + fighter.clear_commands(Cat1::SpecialN); + fighter.clear_commands(Cat1::SpecialS); + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT); + return false.into(); + } + VarModule::off_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT); + } + // hold input restriction + if fighter.is_stick_backward() + || fighter.left_stick_y().abs() > special_stick_y + || fighter.right_stick_y().abs() > special_stick_y { + VarModule::on_flag(fighter.battle_object, vars::bayonetta::status::ATTACK_INVALID_COMBO_INPUT); + return false.into(); + } + // again but also filter grab + if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_CATCH) + || fighter.global_table[CMD_CAT1].get_i32() & ( + *FIGHTER_PAD_CMD_CAT1_FLAG_CATCH + ) == 1 { + return false.into(); + } + true.into() +} + pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); + agent.status(Pre, statuses::bayonetta::SPECIAL_S_EDGE, special_s_edge_pre); + agent.status(Main, statuses::bayonetta::SPECIAL_S_EDGE, special_s_edge_main); + agent.status(End, statuses::bayonetta::SPECIAL_S_EDGE, special_s_edge_end); + agent.status(Pre, statuses::bayonetta::SPECIAL_S_KICK, special_s_kick_pre); agent.status(Main, statuses::bayonetta::SPECIAL_S_KICK, special_s_kick_main); agent.status(End, statuses::bayonetta::SPECIAL_S_KICK, special_s_kick_end); diff --git a/fighters/bayonetta/src/wickedweavearm/acmd.rs b/fighters/bayonetta/src/wickedweavearm/acmd.rs index 696ecc470b..3044302469 100644 --- a/fighters/bayonetta/src/wickedweavearm/acmd.rs +++ b/fighters/bayonetta/src/wickedweavearm/acmd.rs @@ -135,18 +135,17 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { VisibilityModule::set_int64(boma, hash40("body") as i64, hash40("body_hide") as i64); } - frame(lua_state, 8.0); - MotionModule::set_rate(boma, (10.0-8.0)/1.0); + frame(lua_state, 9.0); if is_excute(agent) { ModelModule::set_scale(boma, 0.9); VisibilityModule::set_int64(boma, hash40("body") as i64, hash40("body_show") as i64); - WorkModule::on_flag(boma, *WEAPON_BAYONETTA_WICKEDWEAVEARM_INSTANCE_WORK_ID_FLAG_DISABLE_LINK_STOP); + agent.on_flag(*WEAPON_BAYONETTA_WICKEDWEAVEARM_INSTANCE_WORK_ID_FLAG_DISABLE_LINK_STOP); LinkModule::unlink_all(boma); } frame(lua_state, 10.0); MotionModule::set_rate(boma, (23.0-10.0)/11.0); if is_excute(agent) { - WorkModule::on_flag(boma, *WEAPON_BAYONETTA_WICKEDWEAVEARM_INSTANCE_WORK_ID_FLAG_CANCEL_EFFECT); + agent.on_flag(*WEAPON_BAYONETTA_WICKEDWEAVEARM_INSTANCE_WORK_ID_FLAG_CANCEL_EFFECT); ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 89, 93, 0, 31, 8.5, 0.0, 8.8, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 17.0, 89, 93, 0, 31, 8.5, 0.0, 8.8, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } diff --git a/fighters/bayonetta/src/wickedweaveleg/acmd.rs b/fighters/bayonetta/src/wickedweaveleg/acmd.rs index e3d2875964..00d2201da8 100644 --- a/fighters/bayonetta/src/wickedweaveleg/acmd.rs +++ b/fighters/bayonetta/src/wickedweaveleg/acmd.rs @@ -9,23 +9,24 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); if is_excute(agent) { VisibilityModule::set_int64(boma, hash40("body") as i64, hash40("body_show") as i64); - WorkModule::on_flag(boma, *WEAPON_BAYONETTA_WICKEDWEAVELEG_INSTANCE_WORK_ID_FLAG_DISABLE_LINK_STOP); + agent.on_flag(*WEAPON_BAYONETTA_WICKEDWEAVELEG_INSTANCE_WORK_ID_FLAG_DISABLE_LINK_STOP); LinkModule::unlink_all(boma); } frame(lua_state, 16.0); if is_excute(agent) { // Ground-only - ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 273, 100, 115, 0, 9.0, 0.0, 28.0, 16.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 268, 100, 115, 0, 9.5, 0.0, 27.5, 13.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); // Air-only - ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 270, 63, 0, 10, 9.0, 0.0, 28.0, 16.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 268, 55, 0, 15, 9.5, 0.0, 27.5, 13.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } // weaker @35 wait(lua_state, 1.0); if is_excute(agent) { // Ground-only - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 273, 100, 115, 0, 12.0, 0.0, 8.0, 18.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 272, 100, 115, 0, 10.5, 0.0, 7.5, 16.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); // Air-only - ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 270, 63, 0, 10, 12.0, 0.0, 8.0, 18.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - WorkModule::on_flag(boma, *WEAPON_BAYONETTA_WICKEDWEAVELEG_INSTANCE_WORK_ID_FLAG_CANCEL_EFFECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 272, 55, 0, 15, 10.5, 0.0, 7.5, 16.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + agent.on_flag(*WEAPON_BAYONETTA_WICKEDWEAVELEG_INSTANCE_WORK_ID_FLAG_CANCEL_EFFECT); // weaker @37 + ModelModule::set_scale(boma, 0.975); } wait(lua_state, 5.0); if is_excute(agent) { @@ -37,6 +38,37 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let owner_id = agent.get_int(*WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; + let bayo = utils::util::get_battle_object_from_id(owner_id); + let bayo_boma = &mut *(*bayo).module_accessor; + let lr = boma.lr(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("bayonetta_wickedweave_circle"), Hash40::new("rot"), 0, 0, 0, 0, 0, -90, 1, true); + if bayo_boma.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) != 1 {LAST_PARTICLE_SET_COLOR(agent, 0.037, 0.04, 0.039); } + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_wickedweave_appearance"), Hash40::new("rot"), 0, 0, 0, 0, -45.0+90.0*lr, -90, 1, true); + if bayo_boma.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) != 1 {LAST_PARTICLE_SET_COLOR(agent, 0.037, 0.04, 0.039); } + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("bayonetta_wickedweave_line"), Hash40::new("rot"), 0, 0, 0, 0, 0, -90, 1, true); + } + frame(lua_state, 17.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_quake"), Hash40::new("top"), 18, -1, 0, 0, 0, 0, 0.82, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 1.3); + LANDING_EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 18, -1, 0, 0, 0, 0, 0.82, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 37.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("bayonetta_wickedweave_hiar1"), Hash40::new("rot"), 0, 0, 0, 0, 0, -90, 1, true); + if bayo_boma.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) != 1 {LAST_PARTICLE_SET_COLOR(agent, 0.037, 0.04, 0.039); } + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); + agent.acmd("effect_attacklw4", effect_attacklw4, Priority::Low); } \ No newline at end of file diff --git a/fighters/brave/Cargo.toml b/fighters/brave/Cargo.toml index 5e795255e0..cece1a981d 100644 --- a/fighters/brave/Cargo.toml +++ b/fighters/brave/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -smash2 = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } \ No newline at end of file +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/brave/src/acmd/aerials.rs b/fighters/brave/src/acmd/aerials.rs index 9bfb3b72cc..8ad690f533 100644 --- a/fighters/brave/src/acmd/aerials.rs +++ b/fighters/brave/src/acmd/aerials.rs @@ -117,11 +117,14 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 2.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 14.0); - FT_MOTION_RATE_RANGE(agent, 14.0, 17.5, 3.0); + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 17.5, 2.0); frame(lua_state, 17.5); FT_MOTION_RATE_RANGE(agent, 17.5, 21.0, 4.0); if is_excute(agent) { @@ -153,12 +156,12 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 17.0); + frame(lua_state, 16.3); if is_excute(agent) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_brave_sword_hdr"), Hash40::new("tex_brave_sword2"), 6, Hash40::new("sword1"), 1.5, 0, 0, Hash40::new("sword1"), 14.1, 0, 0, true, Hash40::new("null"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0.0, 0.0, -90.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_SWORD_FLARE, Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); } - frame(lua_state, 23.0); + frame(lua_state, 22.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 1); } diff --git a/fighters/brave/src/acmd/ground.rs b/fighters/brave/src/acmd/ground.rs index 4d3db2bb00..efc932047f 100644 --- a/fighters/brave/src/acmd/ground.rs +++ b/fighters/brave/src/acmd/ground.rs @@ -5,18 +5,15 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword1"), 3.0, 90, 25, 0, 25, 2.5, 2.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword1"), 3.0, 90, 25, 0, 25, 2.5, 6.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 3.0, 90, 25, 0, 25, 2.5, 10.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 90, 25, 0, 25, 2.5, 0.0, 6.0, 16.5, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword1"), 3.0, 90, 40, 0, 25, 2.5, 2.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword1"), 3.0, 90, 40, 0, 25, 2.5, 6.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 3.0, 90, 40, 0, 25, 2.5, 10.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 90, 40, 0, 25, 2.5, 0.0, 6.0, 16.5, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 20, 0, 15, 2.5, 0.0, 6.0, 16.5, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame(boma, 0, 3.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 3.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 3.0, false); - AttackModule::set_add_reaction_frame(boma, 3, 3.0, false); AttackModule::set_down_only(boma, 4, true); } - frame(lua_state, 8.0); + frame(lua_state, 10.0); if is_excute(agent) { AttackModule::clear_all(boma); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); @@ -73,12 +70,16 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 15, 2.5, 0.0, 6.0, 18.0, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 8.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 10.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } diff --git a/fighters/brave/src/acmd/other.rs b/fighters/brave/src/acmd/other.rs index 038e8af3b6..7c69ab1a11 100644 --- a/fighters/brave/src/acmd/other.rs +++ b/fighters/brave/src/acmd/other.rs @@ -77,15 +77,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -95,10 +91,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealhi(agent: &mut L2CAgentBase) { diff --git a/fighters/brave/src/acmd/specials/mod.rs b/fighters/brave/src/acmd/specials/mod.rs index 73f3de24f8..f6f3a64c27 100644 --- a/fighters/brave/src/acmd/specials/mod.rs +++ b/fighters/brave/src/acmd/specials/mod.rs @@ -1,482 +1,13 @@ use super::*; +mod special_hi; mod special_lw; - -use super::*; - -unsafe extern "C" fn game_specialn1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); - } - frame(lua_state, 10.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { - ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_FIREBALL, false, 0); - } - } - frame(lua_state, 24.0); - FT_MOTION_RATE_RANGE(agent, 24.0, 44.0, 9.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_REVERT_FALL_SPEED); - } - frame(lua_state, 44.0); - FT_MOTION_RATE(agent, 1.0); -} - -unsafe extern "C" fn game_specialn2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 8.0, 6.0); - } - frame(lua_state, 9.0); - if is_excute(agent) { - if agent.is_situation(*SITUATION_KIND_AIR) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_HOP); - } - } - frame(lua_state, 11.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { - ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_FIREBALL, false, 0); - } - } - frame(lua_state, 26.0); - FT_MOTION_RATE_RANGE(agent, 26.0, 52.0, 16.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); - } - frame(lua_state, 52.0); - FT_MOTION_RATE(agent, 1.0); - -} - -unsafe extern "C" fn game_specialn3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 16.0, 19.0); - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 9.0, 6.0); - } - frame(lua_state, 16.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { - ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_FIREBALL, false, 0); - } - } - frame(lua_state, 38.0); - FT_MOTION_RATE_RANGE(agent, 38.0, 68.0, 20.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.0, 4.0); - } - frame(lua_state, 68.0); - FT_MOTION_RATE(agent, 1.0); - -} - -unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 9.0); - if is_excute(agent) { - if boma.is_stick_backward() { - PostureModule::reverse_lr(boma); - PostureModule::update_rot_y_lr(boma); - } - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 11.0, 6.0); - } - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_ENABLE_SPARK); - } - if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_SUCCESS_SP) { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 45, 100, 0, 35, 8.0, 0.0, 8.0, 11.5, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_no_finish_camera(boma, 0, true, false); - } - wait(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 100, 0, 35, 6.0, 0.0, 10.5, 17.0, Some(0.0), Some(10.5), Some(17.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - AttackModule::set_no_finish_camera(boma, 0, true, false); - } - wait(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 100, 0, 35, 6.0, 0.0, 10.5, 22.0, Some(0.0), Some(10.5), Some(22.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - AttackModule::set_no_finish_camera(boma, 0, true, false); - } - wait(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 100, 0, 35, 6.0, 0.0, 10.5, 26.5, Some(0.0), Some(10.5), Some(26.5), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - AttackModule::set_no_finish_camera(boma, 0, true, false); - } - wait(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 100, 0, 35, 5.5, 0.0, 10.5, 29.0, Some(0.0), Some(10.5), Some(29.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - AttackModule::set_no_finish_camera(boma, 0, true, false); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - } - else { - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_INSTANCE_WORK_ID_FLAG_PLAY_MISS_SE); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 45, 100, 0, 30, 7.0, 0.0, 9.0, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - } - frame(lua_state, 12.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.0, 6.0); - } -} - -unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 13.0); - if is_excute(agent) { - if boma.is_stick_backward() { - PostureModule::reverse_lr(boma); - PostureModule::update_rot_y_lr(boma); - } - } - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_ENABLE_SPARK); - if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_SUCCESS_SP) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 90, 0, 25, 4.5, 0.0, 11.5, 12.0, Some(0.0), Some(11.5), Some(50.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - AttackModule::set_no_finish_camera(boma, 0, true, false); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 10, 4); - } - } - frame(lua_state, 16.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn game_specials32(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 11.0, 11.0); - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 15); - } - frame(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 120, 50, 50, 0, 17.5, 0.0, 11.0, 0.0, None, None, None, 1.8, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 23.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 100, 50, 50, 0, 8.5, 0.0, 8.5, 9.0, Some(0.0), Some(8.5), Some(12.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 26.0); - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 100, 50, 50, 0, 8.5, 0.0, 8.5, -9.0, Some(0.0), Some(8.5), Some(-10.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 32.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_ENABLE_SPARK); - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 361, 100, 0, 75, 9.0, 0.0, 8.5, 9.0, Some(0.0), Some(8.5), Some(12.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 361, 100, 0, 75, 9.0, 0.0, 8.5, -9.0, Some(0.0), Some(8.5), Some(-10.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 70, 0, 75, 9.0, 0.0, 8.5, 17.0, Some(0.0), Some(8.5), Some(-17.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - ATK_SET_SHIELD_SETOFF_MUL_arg4(agent, 0, 1, 2, 0.3); - } - wait(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 70, 0, 75, 9.0, 0.0, 8.5, 21.0, Some(0.0), Some(8.5), Some(-21.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear(boma, 0, false); - AttackModule::clear(boma, 1, false); - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 70, 0, 75, 9.0, 0.0, 8.5, 25.0, Some(0.0), Some(8.5), Some(-25.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - } - frame(lua_state, 35.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - } - frame(lua_state, 39.0); - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.0, 6.0); - } -} - -unsafe extern "C" fn effect_specials32(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - EFFECT(agent, Hash40::new("brave_lightning3_hit2"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_LIGHTNING_SWORD_FLARE, Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); - EFFECT(agent, Hash40::new("brave_lightning3_hit"), Hash40::new("top"), 0, 10.2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); - EFFECT(agent, Hash40::new("brave_lightning3_lightning2"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); - } - for _ in 0..6 { - if is_excute(agent) { - FLASH(agent, 1, 1, 0.3, 0.6); - } - wait(lua_state, 2.0); - if is_excute(agent) { - FLASH(agent, 0, 0, 0, 0.7); - } - wait(lua_state, 2.0); - if is_excute(agent) { - COL_NORMAL(agent); - } - } - frame(lua_state, 21.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_swordspark"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); - } - frame(lua_state, 22.0); - if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_brave_zapsword"), Hash40::new("tex_brave_sword2"), 16, Hash40::new("sword1"), 3, 0, 0, Hash40::new("sword1"), 14, 0, 0, true, Hash40::new("null"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); - } - frame(lua_state, 26.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - LAST_EFFECT_SET_RATE(agent, 0.8); - } - frame(lua_state, 28.0); - if PostureModule::lr(agent.module_accessor) < 0.0 { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_rolllightning"), Hash40::new("top"), 0, 10, 0, 0, 0, -5, 1, true); - EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_swordspark"), false, true); - } - } - frame(lua_state, 30.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_swordspark"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); - } - else { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_rolllightning"), Hash40::new("top"), 0, 10, 0, 0, 0, 4, 1, true); - } - } - frame(lua_state, 34.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_swordspark"), false, true); - } - frame(lua_state, 40.0); - if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 10); - EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_LIGHTNING_SWORD_FLARE, false, true); - EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_sword"), false, true); - } -} - -unsafe extern "C" fn effect_specialairs32(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - EFFECT(agent, Hash40::new("brave_lightning3_hit2"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_LIGHTNING_SWORD_FLARE, Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); - EFFECT(agent, Hash40::new("brave_lightning3_hit"), Hash40::new("top"), 0, 10.2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); - EFFECT(agent, Hash40::new("brave_lightning3_lightning2"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); - } - for _ in 0..6 { - if is_excute(agent) { - FLASH(agent, 1, 1, 0.3, 0.6); - } - wait(lua_state, 2.0); - if is_excute(agent) { - FLASH(agent, 0, 0, 0, 0.7); - } - wait(lua_state, 2.0); - if is_excute(agent) { - COL_NORMAL(agent); - } - } - frame(lua_state, 21.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_swordspark"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); - } - frame(lua_state, 22.0); - if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_brave_zapsword"), Hash40::new("tex_brave_sword2"), 16, Hash40::new("sword1"), 3, 0, 0, Hash40::new("sword1"), 14, 0, 0, true, Hash40::new("null"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); - } - frame(lua_state, 28.0); - if PostureModule::lr(agent.module_accessor) < 0.0 { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_rolllightning"), Hash40::new("top"), 0, 10, 0, 0, 0, -5, 1, true); - EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_swordspark"), false, true); - } - } - frame(lua_state, 30.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_swordspark"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); - } - else { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_rolllightning"), Hash40::new("top"), 0, 10, 0, 0, 0, 4, 1, true); - } - } - frame(lua_state, 34.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_swordspark"), false, true); - } - frame(lua_state, 40.0); - if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 10); - EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_LIGHTNING_SWORD_FLARE, false, true); - EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_sword"), false, true); - } -} - -unsafe extern "C" fn game_specialhiempty(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 5.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_JUMP_START); - } - frame(lua_state, 11.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } - frame(lua_state, 20.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_REVERT_ANGLE); - } - frame(lua_state, 41.0); - if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); - boma.change_status_req(*FIGHTER_STATUS_KIND_FALL, true); - } -} - -unsafe extern "C" fn game_specialhi1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 4.0, 7.0); - frame(lua_state, 4.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_TORNADO, false, 0); - } - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_JUMP_START); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } - frame(lua_state, 20.0); - FT_MOTION_RATE_RANGE(agent, 2.0, 41.0, 11.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_REVERT_ANGLE); - } - frame(lua_state, 41.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); - boma.change_status_req(*FIGHTER_STATUS_KIND_FALL, true); - } -} - -unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 11.0); - frame(lua_state, 6.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_TORNADO, false, 0); - } - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_JUMP_START); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } - frame(lua_state, 40.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_REVERT_ANGLE); - } -} - -unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 14.0); - frame(lua_state, 8.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_TORNADO, false, 0); - } - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_JUMP_START); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } - frame(lua_state, 30.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_REVERT_ANGLE); - } -} +mod special_n; +mod special_s; pub fn install(agent: &mut Agent) { - agent.acmd("game_specialn1", game_specialn1, Priority::Low); - agent.acmd("game_specialairn1", game_specialn1, Priority::Low); - - agent.acmd("game_specialn2", game_specialn2, Priority::Low); - agent.acmd("game_specialair2", game_specialn2, Priority::Low); - - agent.acmd("game_specialn3", game_specialn3, Priority::Low); - agent.acmd("game_specialairn3", game_specialn3, Priority::Low); - - agent.acmd("game_specials1", game_specials1, Priority::Low); - agent.acmd("game_specialairs1", game_specials1, Priority::Low); - - agent.acmd("game_specials2", game_specials2, Priority::Low); - agent.acmd("game_specialairs2", game_specials2, Priority::Low); - - agent.acmd("game_specials32", game_specials32, Priority::Low); - agent.acmd("effect_specials32", effect_specials32, Priority::Low); - agent.acmd("game_specialairs32", game_specials32, Priority::Low); - agent.acmd("effect_specialairs32", effect_specialairs32, Priority::Low); - - agent.acmd("game_specialhi1", game_specialhi1, Priority::Low); - agent.acmd("game_specialairhi1", game_specialhi1, Priority::Low); - - agent.acmd("game_specialhiempty", game_specialhiempty, Priority::Low); - agent.acmd("game_specialairhiempty", game_specialhiempty, Priority::Low); - - agent.acmd("game_specialhi2", game_specialhi2, Priority::Low); - agent.acmd("game_specialairhi2", game_specialhi2, Priority::Low); - - agent.acmd("game_specialhi3", game_specialhi3, Priority::Low); - agent.acmd("game_specialairhi3", game_specialhi3, Priority::Low); - + special_hi::install(agent); special_lw::install(agent); + special_n::install(agent); + special_s::install(agent); } \ No newline at end of file diff --git a/fighters/brave/src/acmd/specials/special_hi.rs b/fighters/brave/src/acmd/specials/special_hi.rs new file mode 100644 index 0000000000..4cc955da6c --- /dev/null +++ b/fighters/brave/src/acmd/specials/special_hi.rs @@ -0,0 +1,150 @@ +use super::*; + +unsafe extern "C" fn effect_specialhihold(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_chant"), Hash40::new("top"), 0, 9, 0, 0, -60, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("brave_tornado1_hold"), Hash40::new("handl"), 2, 2, 0, 0, 0, 0, 1, true); + } +} + +unsafe extern "C" fn effect_specialhiholdm(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("brave_tornado1_hold"), false, true); + EFFECT_FOLLOW(agent, Hash40::new("brave_tornado2_hold_flash"), Hash40::new("handl"), 2, 2, 0, 0, 0, 0, 0.75, false); + EFFECT_FOLLOW(agent, Hash40::new("brave_tornado2_hold"), Hash40::new("handl"), 2, 2, 0, 0, 0, 0, 1, true); + } +} + +unsafe extern "C" fn game_specialhiempty(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_JUMP_START); + } + frame(lua_state, 11.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + } + frame(lua_state, 20.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_REVERT_ANGLE); + } +} + +unsafe extern "C" fn game_specialhi1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 4.0, 7.0); + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_TORNADO, false, 0); + } + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_JUMP_START); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + } + frame(lua_state, 20.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 41.0, 11.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_REVERT_ANGLE); + } + frame(lua_state, 41.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + if !VarModule::is_flag(agent.battle_object, vars::brave::instance::SPECIAL_HI_ENABLE_FREEFALL) { + boma.change_status_req(*FIGHTER_STATUS_KIND_FALL, true); + } + } +} + +unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 11.0); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_TORNADO, false, 0); + } + frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_JUMP_START); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + } + frame(lua_state, 40.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_REVERT_ANGLE); + } +} + +unsafe extern "C" fn effect_specialhi2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_chant_finish"), Hash40::new("top"), 0, 9, 0, 0, -60, 0, 1, false); + EFFECT_FOLLOW(agent, Hash40::new("brave_tornado3_hold_flash"), Hash40::new("handl"), 2, 2, 0, 0, 0, 0, 0.5, false); + } + frame(lua_state, 9.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, false); + } + EFFECT_FOLLOW(agent, Hash40::new("brave_tornado2_wind"), Hash40::new("top"), 0, 10, 0, 0, 0, 0, 1, true); + EffectModule::enable_sync_init_pos_last(boma); + } +} + +unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 14.0); + frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_TORNADO, false, 0); + } + frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_JUMP_START); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + } + frame(lua_state, 30.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_HI_FLAG_REVERT_ANGLE); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("effect_specialhihold", effect_specialhihold, Priority::Low); + agent.acmd("effect_specialairhihold", effect_specialhihold, Priority::Low); + + agent.acmd("effect_specialhiholdm", effect_specialhiholdm, Priority::Low); + agent.acmd("effect_specialhiholdm", effect_specialhiholdm, Priority::Low); + + agent.acmd("game_specialhi1", game_specialhi1, Priority::Low); + agent.acmd("game_specialairhi1", game_specialhi1, Priority::Low); + + agent.acmd("game_specialhiempty", game_specialhiempty, Priority::Low); + agent.acmd("game_specialairhiempty", game_specialhiempty, Priority::Low); + + agent.acmd("game_specialhi2", game_specialhi2, Priority::Low); + agent.acmd("game_specialairhi2", game_specialhi2, Priority::Low); + agent.acmd("effect_specialhi2", effect_specialhi2, Priority::Low); + agent.acmd("effect_specialairhi2", effect_specialhi2, Priority::Low); + + agent.acmd("game_specialhi3", game_specialhi3, Priority::Low); + agent.acmd("game_specialairhi3", game_specialhi3, Priority::Low); +} \ No newline at end of file diff --git a/fighters/brave/src/acmd/specials/special_n.rs b/fighters/brave/src/acmd/specials/special_n.rs new file mode 100644 index 0000000000..70f8d607a0 --- /dev/null +++ b/fighters/brave/src/acmd/specials/special_n.rs @@ -0,0 +1,86 @@ +use super::*; + +unsafe extern "C" fn game_specialn1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + } + frame(lua_state, 10.0); + if is_excute(agent) { + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_FIREBALL, false, 0); + } + } + frame(lua_state, 24.0); + FT_MOTION_RATE_RANGE(agent, 24.0, 44.0, 9.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_REVERT_FALL_SPEED); + } + frame(lua_state, 44.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn game_specialn2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 8.0, 6.0); + } + frame(lua_state, 9.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_AIR) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_HOP); + } + } + frame(lua_state, 11.0); + if is_excute(agent) { + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_FIREBALL, false, 0); + } + } + frame(lua_state, 26.0); + FT_MOTION_RATE_RANGE(agent, 26.0, 52.0, 16.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + } + frame(lua_state, 52.0); + FT_MOTION_RATE(agent, 1.0); + +} + +unsafe extern "C" fn game_specialn3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 16.0, 19.0); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 9.0, 6.0); + } + frame(lua_state, 16.0); + if is_excute(agent) { + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + ArticleModule::generate_article(boma, *FIGHTER_BRAVE_GENERATE_ARTICLE_FIREBALL, false, 0); + } + } + frame(lua_state, 38.0); + FT_MOTION_RATE_RANGE(agent, 38.0, 68.0, 20.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.0, 4.0); + } + frame(lua_state, 68.0); + FT_MOTION_RATE(agent, 1.0); + +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialn1", game_specialn1, Priority::Low); + agent.acmd("game_specialairn1", game_specialn1, Priority::Low); + + agent.acmd("game_specialn2", game_specialn2, Priority::Low); + agent.acmd("game_specialair2", game_specialn2, Priority::Low); + + agent.acmd("game_specialn3", game_specialn3, Priority::Low); + agent.acmd("game_specialairn3", game_specialn3, Priority::Low); +} \ No newline at end of file diff --git a/fighters/brave/src/acmd/specials/special_s.rs b/fighters/brave/src/acmd/specials/special_s.rs new file mode 100644 index 0000000000..7ca74ae219 --- /dev/null +++ b/fighters/brave/src/acmd/specials/special_s.rs @@ -0,0 +1,278 @@ +use super::*; + +unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 9.0); + if is_excute(agent) { + if boma.is_stick_backward() { + PostureModule::reverse_lr(boma); + PostureModule::update_rot_y_lr(boma); + } + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 11.0, 6.0); + } + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_ENABLE_SPARK); + } + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_SUCCESS_SP) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 45, 100, 0, 35, 8.0, 0.0, 8.0, 11.5, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + AttackModule::set_no_finish_camera(boma, 0, true, false); + } + wait(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 100, 0, 35, 6.0, 0.0, 10.5, 17.0, Some(0.0), Some(10.5), Some(17.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + AttackModule::set_no_finish_camera(boma, 0, true, false); + } + wait(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 100, 0, 35, 6.0, 0.0, 10.5, 22.0, Some(0.0), Some(10.5), Some(22.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + AttackModule::set_no_finish_camera(boma, 0, true, false); + } + wait(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 100, 0, 35, 6.0, 0.0, 10.5, 26.5, Some(0.0), Some(10.5), Some(26.5), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + AttackModule::set_no_finish_camera(boma, 0, true, false); + } + wait(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 100, 0, 35, 5.5, 0.0, 10.5, 29.0, Some(0.0), Some(10.5), Some(29.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + AttackModule::set_no_finish_camera(boma, 0, true, false); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + } + else { + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_INSTANCE_WORK_ID_FLAG_PLAY_MISS_SE); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 45, 100, 0, 30, 7.0, 0.0, 9.0, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + } + frame(lua_state, 12.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.0, 6.0); + } +} + +unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 13.0); + if is_excute(agent) { + if boma.is_stick_backward() { + PostureModule::reverse_lr(boma); + PostureModule::update_rot_y_lr(boma); + } + } + frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_ENABLE_SPARK); + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_SUCCESS_SP) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 90, 0, 25, 4.5, 0.0, 11.5, 12.0, Some(0.0), Some(11.5), Some(50.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + AttackModule::set_no_finish_camera(boma, 0, true, false); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 10, 4); + } + } + frame(lua_state, 16.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn game_specials32(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 11.0, 11.0); + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 15); + } + frame(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 120, 50, 50, 0, 14.0, 0.0, 11.0, 0.0, None, None, None, 1.8, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 23.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 100, 50, 50, 0, 8.5, 0.0, 8.5, 7.0, Some(0.0), Some(8.5), Some(10.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 26.0); + if is_excute(agent) { + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 100, 50, 50, 0, 8.5, 0.0, 8.5, -9.0, Some(0.0), Some(8.5), Some(-12.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 32.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_S_FLAG_ENABLE_SPARK); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 361, 100, 0, 75, 9.0, 0.0, 8.5, 12.0, Some(0.0), Some(8.5), Some(-10.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.3); + } + frame(lua_state, 33.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 70, 0, 75, 9.0, 0.0, 8.5, 12.0, Some(0.0), Some(8.5), Some(-10.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + } + frame(lua_state, 35.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + } + frame(lua_state, 39.0); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.0, 6.0); + } +} + +unsafe extern "C" fn effect_specials32(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("brave_lightning3_hit2"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_LIGHTNING_SWORD_FLARE, Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); + EFFECT(agent, Hash40::new("brave_lightning3_hit"), Hash40::new("top"), 0, 10.2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("brave_lightning3_lightning2"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + for _ in 0..6 { + if is_excute(agent) { + FLASH(agent, 1, 1, 0.3, 0.6); + } + wait(lua_state, 2.0); + if is_excute(agent) { + FLASH(agent, 0, 0, 0, 0.7); + } + wait(lua_state, 2.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + } + frame(lua_state, 21.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_swordspark"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); + } + frame(lua_state, 22.0); + if is_excute(agent) { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_brave_zapsword"), Hash40::new("tex_brave_sword2"), 16, Hash40::new("sword1"), 3, 0, 0, Hash40::new("sword1"), 14, 0, 0, true, Hash40::new("null"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + } + frame(lua_state, 26.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 28.0); + if PostureModule::lr(agent.module_accessor) < 0.0 { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_rolllightning"), Hash40::new("top"), 0, 10, 0, 0, 0, -5, 1, true); + EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_swordspark"), false, true); + } + } + frame(lua_state, 30.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_swordspark"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); + } + else { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_rolllightning"), Hash40::new("top"), 0, 10, 0, 0, 0, 4, 1, true); + } + } + frame(lua_state, 34.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_swordspark"), false, true); + } + frame(lua_state, 40.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 10); + EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_LIGHTNING_SWORD_FLARE, false, true); + EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_sword"), false, true); + } +} + +unsafe extern "C" fn effect_specialairs32(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT(agent, Hash40::new("brave_lightning3_hit2"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_LIGHTNING_SWORD_FLARE, Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); + EFFECT(agent, Hash40::new("brave_lightning3_hit"), Hash40::new("top"), 0, 10.2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("brave_lightning3_lightning2"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + for _ in 0..6 { + if is_excute(agent) { + FLASH(agent, 1, 1, 0.3, 0.6); + } + wait(lua_state, 2.0); + if is_excute(agent) { + FLASH(agent, 0, 0, 0, 0.7); + } + wait(lua_state, 2.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + } + frame(lua_state, 21.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_swordspark"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); + } + frame(lua_state, 22.0); + if is_excute(agent) { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_brave_zapsword"), Hash40::new("tex_brave_sword2"), 16, Hash40::new("sword1"), 3, 0, 0, Hash40::new("sword1"), 14, 0, 0, true, Hash40::new("null"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + } + frame(lua_state, 28.0); + if PostureModule::lr(agent.module_accessor) < 0.0 { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_rolllightning"), Hash40::new("top"), 0, 10, 0, 0, 0, -5, 1, true); + EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_swordspark"), false, true); + } + } + frame(lua_state, 30.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_swordspark"), Hash40::new("sword1"), 0, 0, 0, 0, 0, -90, 1, true); + } + else { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("brave_lightning3_rolllightning"), Hash40::new("top"), 0, 10, 0, 0, 0, 4, 1, true); + } + } + frame(lua_state, 34.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_swordspark"), false, true); + } + frame(lua_state, 40.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 10); + EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_EFFECT_KIND_LIGHTNING_SWORD_FLARE, false, true); + EFFECT_OFF_KIND(agent, Hash40::new("brave_lightning3_sword"), false, true); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specials1", game_specials1, Priority::Low); + agent.acmd("game_specialairs1", game_specials1, Priority::Low); + + agent.acmd("game_specials2", game_specials2, Priority::Low); + agent.acmd("game_specialairs2", game_specials2, Priority::Low); + + agent.acmd("game_specials32", game_specials32, Priority::Low); + agent.acmd("effect_specials32", effect_specials32, Priority::Low); + agent.acmd("game_specialairs32", game_specials32, Priority::Low); + agent.acmd("effect_specialairs32", effect_specialairs32, Priority::Low); +} \ No newline at end of file diff --git a/fighters/brave/src/acmd/throws.rs b/fighters/brave/src/acmd/throws.rs index fcd7317946..20e7edb5c4 100644 --- a/fighters/brave/src/acmd/throws.rs +++ b/fighters/brave/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(7.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 7.0, 4.3, Some(0.0), Some(7.0), Some(7.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(9.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 7.0, 4.8, Some(0.0), Some(7.0), Some(9.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 7.0, -4.0, Some(0.0), Some(7.0), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 7.0, -5.8, Some(0.0), Some(7.0), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/brave/src/fireball/acmd.rs b/fighters/brave/src/fireball/acmd.rs index 1c217efc9d..93d3fb08d2 100644 --- a/fighters/brave/src/fireball/acmd.rs +++ b/fighters/brave/src/fireball/acmd.rs @@ -19,8 +19,8 @@ unsafe extern "C" fn game_burstl(agent: &mut L2CAgentBase) { } frame(lua_state, 19.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 46, 345, 0, 15, 13.0, 0.0, 0.0, 0.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 361, 70, 0, 50, 17.5, 0.0, 0.0, 0.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 48, 322, 0, 15, 13.0, 0.0, 0.0, 0.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 361, 70, 0, 50, 17.5, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); } } diff --git a/fighters/brave/src/flash/mod.rs b/fighters/brave/src/flash/mod.rs new file mode 100644 index 0000000000..217b091d8b --- /dev/null +++ b/fighters/brave/src/flash/mod.rs @@ -0,0 +1,9 @@ +use super::*; + +mod status; + +pub fn install() { + let agent = &mut Agent::new("brave_flash"); + status::install(agent); + agent.install(); +} \ No newline at end of file diff --git a/fighters/brave/src/flash/status.rs b/fighters/brave/src/flash/status.rs new file mode 100644 index 0000000000..831a6bda37 --- /dev/null +++ b/fighters/brave/src/flash/status.rs @@ -0,0 +1,26 @@ +use super::*; + +unsafe extern "C" fn start2_main(weapon: &mut L2CFighterCommon) -> L2CValue { + let life = weapon.get_param_int("param_flash", "life2"); + weapon.set_int(life, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); + weapon.set_int(life, *WEAPON_INSTANCE_WORK_ID_INT_INIT_LIFE); + MotionModule::change_motion(weapon.module_accessor, Hash40::new("flash2"), 0.0, 1.0, false, 0.0, false, false); + + weapon.fastshift(L2CValue::Ptr(start2_main_loop as *const () as _)) +} + +unsafe extern "C" fn start2_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { + if AttackModule::is_infliction_status(weapon.module_accessor, *COLLISION_KIND_MASK_PARRY | *COLLISION_KIND_MASK_REFLECTOR) { + weapon.change_status(WEAPON_BRAVE_FLASH_STATUS_KIND_START2.into(), false.into()); + return 1.into(); + } + if GroundModule::is_touch(weapon.module_accessor, *GROUND_TOUCH_FLAG_ALL as u32) { + weapon.change_status(WEAPON_BRAVE_FLASH_STATUS_KIND_HIT2.into(), false.into()); + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *WEAPON_BRAVE_FLASH_STATUS_KIND_START2, start2_main); +} \ No newline at end of file diff --git a/fighters/brave/src/lib.rs b/fighters/brave/src/lib.rs index 5bd4fdcc89..c31aff5b8b 100644 --- a/fighters/brave/src/lib.rs +++ b/fighters/brave/src/lib.rs @@ -13,6 +13,7 @@ mod crash; mod deathball; mod explosion; mod fireball; +mod flash; mod lightning; mod spark; mod tornado; @@ -43,6 +44,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, consts::*, @@ -85,6 +87,7 @@ pub fn install() { deathball::install(); explosion::install(); fireball::install(); + flash::install(); lightning::install(); spark::install(); tornado::install(); diff --git a/fighters/brave/src/opff.rs b/fighters/brave/src/opff.rs index 22793b39be..7699884279 100644 --- a/fighters/brave/src/opff.rs +++ b/fighters/brave/src/opff.rs @@ -51,7 +51,7 @@ unsafe fn psych_up_crit(fighter: &mut L2CFighterCommon) { unsafe fn kaclang_jc(fighter: &mut L2CFighterCommon) { if fighter.is_status(*FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_STEEL) { if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) && !fighter.is_in_hitlag() { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, false); } } } diff --git a/fighters/brave/src/spark/acmd.rs b/fighters/brave/src/spark/acmd.rs index 22ba155c04..427995aaea 100644 --- a/fighters/brave/src/spark/acmd.rs +++ b/fighters/brave/src/spark/acmd.rs @@ -11,6 +11,19 @@ unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specials32(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_L); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 44, 123, 0, 24, 8.0, 0.0, 12.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 58, 70, 0, 24, 18.0, 0.0, 12.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 58, 40, 0, 100, 6.0, 0.0, 22.0, 0.0, Some(0.0), Some(75.0), Some(0.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosionm"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_specials1", game_specials1, Priority::Low); + agent.acmd("game_specials32", game_specials32, Priority::Low); } \ No newline at end of file diff --git a/fighters/brave/src/status/landing.rs b/fighters/brave/src/status/landing.rs new file mode 100644 index 0000000000..bd6ddef0aa --- /dev/null +++ b/fighters/brave/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/brave/src/status/mod.rs b/fighters/brave/src/status/mod.rs index 02d2fcb5d8..4443006150 100644 --- a/fighters/brave/src/status/mod.rs +++ b/fighters/brave/src/status/mod.rs @@ -3,6 +3,38 @@ use super::*; mod special_hi; mod special_lw; mod special_n; +mod landing; + +/// Re-enables the ability to use aerial specials when connecting to ground or cliff +unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) + || fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_LANDING, + *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { + // Re-enable upB + VarModule::off_flag(fighter.battle_object, vars::brave::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::off_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); + } + + return true.into(); +} + +unsafe extern "C" fn should_use_special_hi_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_AIR) && VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL) { + false.into() + } else { + true.into() + } +} + +extern "C" fn on_start(fighter: &mut L2CFighterCommon) { + // set the callbacks on fighter init + fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); + fighter.global_table[globals::USE_SPECIAL_HI_CALLBACK].assign(&L2CValue::Ptr(should_use_special_hi_callback as *const () as _)); + + VarModule::off_flag(fighter.battle_object, vars::brave::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::off_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); +} unsafe extern "C" fn entry_main(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::off_flag(fighter.battle_object, vars::brave::instance::PERSIST_RNG); @@ -15,14 +47,24 @@ unsafe extern "C" fn dead_main(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::off_flag(fighter.battle_object, vars::brave::instance::PERSIST_RNG); VarModule::off_flag(fighter.battle_object, vars::brave::instance::SPECIAL_MENU); VarModule::off_flag(fighter.battle_object, vars::brave::instance::PSYCHE_UP_ACTIVE); + VarModule::off_flag(fighter.battle_object, vars::brave::instance::SPECIAL_HI_ENABLE_FREEFALL); return smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DEAD)(fighter) } +unsafe extern "C" fn rebirth_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::off_flag(fighter.battle_object, vars::brave::instance::SPECIAL_HI_ENABLE_FREEFALL); + return smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_REBIRTH)(fighter) +} + pub fn install(agent: &mut Agent) { + agent.on_start(on_start); + agent.status(Main, *FIGHTER_STATUS_KIND_ENTRY, entry_main); agent.status(Main, *FIGHTER_STATUS_KIND_DEAD, dead_main); + agent.status(Main, *FIGHTER_STATUS_KIND_REBIRTH, rebirth_main); special_hi::install(agent); special_lw::install(agent); special_n::install(agent); + landing::install(agent); } \ No newline at end of file diff --git a/fighters/brave/src/status/special_hi.rs b/fighters/brave/src/status/special_hi.rs index c5fca37019..c17a0af8a9 100644 --- a/fighters/brave/src/status/special_hi.rs +++ b/fighters/brave/src/status/special_hi.rs @@ -1,5 +1,7 @@ use super::*; +// FIGHTER_STATUS_KIND_SPECIAL_HI + unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, @@ -29,6 +31,8 @@ unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } +// FIGHTER_BRAVE_STATUS_KIND_SPECIAL_HI_HOLD + unsafe extern "C" fn special_hi_hold_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, @@ -58,6 +62,8 @@ unsafe extern "C" fn special_hi_hold_pre(fighter: &mut L2CFighterCommon) -> L2CV return 0.into(); } +// FIGHTER_BRAVE_STATUS_KIND_SPECIAL_HI_JUMP + unsafe extern "C" fn special_hi_jump_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, @@ -87,8 +93,21 @@ unsafe extern "C" fn special_hi_jump_pre(fighter: &mut L2CFighterCommon) -> L2CV return 0.into(); } +unsafe extern "C" fn special_hi_jump_end(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(End, fighter, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_HI_JUMP)(fighter); + + if fighter.is_motion_one_of(&[Hash40::new("special_hi1"), Hash40::new("special_air_hi1")]) { + VarModule::on_flag(fighter.battle_object, vars::brave::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); + } + + ret +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); agent.status(Pre, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_HI_HOLD, special_hi_hold_pre); agent.status(Pre, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_pre); + agent.status(End, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_end); } \ No newline at end of file diff --git a/fighters/brave/src/status/special_lw.rs b/fighters/brave/src/status/special_lw.rs index 1158061fd1..804a013d73 100644 --- a/fighters/brave/src/status/special_lw.rs +++ b/fighters/brave/src/status/special_lw.rs @@ -32,6 +32,7 @@ unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::off_flag(fighter.battle_object, vars::brave::instance::SPECIAL_LW_CSTICK_BUFFER); VarModule::set_float(fighter.battle_object, vars::brave::instance::SPECIAL_LW_CSTICK_BUFFER_DIR, 0.0); + VarModule::set_int(fighter.battle_object, vars::brave::instance::MENU_ICON_EFFECT_HANDLE, -1); let brave = fighter.global_table[0x4].get_ptr() as *mut Fighter; if fighter.get_int(*FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_SPECIAL_LW_WINDOW_STATE) == *FIGHTER_BRAVE_COMMAND_WINDOW_STATE_CLOSE { FighterSpecializer_Brave::special_lw_close_window(brave, true, false, false); @@ -74,6 +75,8 @@ unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2C } if !fighter.is_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_DECIDE) { special_lw_set_index(fighter); + let handle = VarModule::get_int(fighter.battle_object, vars::brave::instance::MENU_ICON_EFFECT_HANDLE); + set_icon_wobble(fighter, handle); if ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_GUARD) { fighter.on_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_GUARD_CANCEL); } @@ -87,10 +90,10 @@ unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2C } // FUN_7100027810 -unsafe extern "C" fn special_lw_set_index(fighter: &mut L2CFighterCommon) { +unsafe extern "C" fn special_lw_set_index(fighter: &mut L2CFighterCommon) -> bool { if FighterControlModuleImpl::get_stick_button_trigger(fighter.module_accessor, *FIGHTER_CONTROLLER_STICK_BUTTON_UP) == 0 && FighterControlModuleImpl::get_stick_button_trigger(fighter.module_accessor, *FIGHTER_CONTROLLER_STICK_BUTTON_DOWN) == 0 { - return; + return false; } if FighterControlModuleImpl::get_stick_button_trigger(fighter.module_accessor, *FIGHTER_CONTROLLER_STICK_BUTTON_UP) == 1 { fighter.dec_int(*FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_SPECIAL_LW_SELECT_INDEX); @@ -131,6 +134,45 @@ unsafe extern "C" fn special_lw_set_index(fighter: &mut L2CFighterCommon) { let brave = fighter.global_table[0x4].get_ptr() as *mut Fighter; let select_index = fighter.get_int(*FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_SPECIAL_LW_SELECT_INDEX); FighterSpecializer_Brave::special_lw_select_index(brave, select_index); + let command = FighterSpecializer_Brave::get_special_lw_command_from_index(brave, select_index); + set_command_overhead_effect(fighter, command); + + return true; +} + +unsafe extern "C" fn set_command_overhead_effect(fighter: &mut L2CFighterCommon, command: i32) { + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("brave_command_attack"), false, false); + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("brave_command_magic"), false, false); + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("brave_command_support"), false, false); + let base_hash = "brave_command_"; + let eff_hash = match command { + 0 => format!("{}{}", base_hash, "support"), // Heal + 1 => format!("{}{}", base_hash, "attack"), // Sizz + 2 => format!("{}{}", base_hash, "attack"), // Sizzle + 3 => format!("{}{}", base_hash, "attack"), // Bang + 4 => format!("{}{}", base_hash, "attack"), // Kaboom + 5 => format!("{}{}", base_hash, "magic"), // Whack + 6 => format!("{}{}", base_hash, "magic"), // Thwack + 7 => format!("{}{}", base_hash, "magic"), // Magic Burst + 8 => format!("{}{}", base_hash, "magic"), // Kamikazee + 9 => format!("{}{}", base_hash, "magic"), // Kaclang + 10 => format!("{}{}", base_hash, "support"), // Acceleratle + 11 => format!("{}{}", base_hash, "support"), // Oomph + 12 => format!("{}{}", base_hash, "support"), // Bounce + 13 => format!("{}{}", base_hash, "magic"), // Snooze + 14 => format!("{}{}", base_hash, "support"), // Hocus Pocus + 15 => format!("{}{}", base_hash, "nozoom"), // Zoom (unused) + 16 => format!("{}{}", base_hash, "attack"), // Flame Slash + 17 => format!("{}{}", base_hash, "attack"), // Kacrackle Slash + 18 => format!("{}{}", base_hash, "magic"), // Metal Slash + 19 => format!("{}{}", base_hash, "attack"), // Hatchet Man + 20 => format!("{}{}", base_hash, "support"), // Psyche Up + _ => format!("{}{}", base_hash, "attack") + }; + let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new(eff_hash.as_str()), Hash40::new("top"), &Vector3f::new(0.0, 20.0, 2.0), &Vector3f::zero(), 0.35, false, 0, 0, 0, 0, 0, false, false); + EffectModule::set_rate(fighter.module_accessor, handle as u32, 0.000001); + EffectModule::set_alpha(fighter.module_accessor, handle as u32, 2.0); + VarModule::set_int(fighter.battle_object, vars::brave::instance::MENU_ICON_EFFECT_HANDLE, handle as i32); } unsafe extern "C" fn special_lw_start_pre(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -186,6 +228,164 @@ unsafe extern "C" fn special_lw_start_pre(fighter: &mut L2CFighterCommon) -> L2C ret } +unsafe extern "C" fn special_lw_select_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_int(0, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_INPUT_COUNT); + fighter.set_int(-1, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_NEXT_STATUS); + fighter.change_motion_by_situation("special_lw_select", "special_air_lw_select", 0.0, 1.0, false, 0.0, false, false); + WorkModule::set_int64(fighter.module_accessor, hash40("special_lw_select") as i64, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION); + WorkModule::set_int64(fighter.module_accessor, hash40("special_air_lw_select") as i64, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION_AIR); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_GUARD); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_ESCAPE); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_JUMP); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_ESCAPE); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_JUMP_AERIAL); + + fighter.main_shift(special_lw_select_main_loop) +} + +unsafe extern "C" fn special_lw_select_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_AUTO_CANCEL) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.set_int(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_NEXT_STATUS); + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_CANCEL.into(), false.into()); + } + else { + fighter.set_int(*FIGHTER_STATUS_KIND_FALL, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_NEXT_STATUS); + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_CANCEL.into(), false.into()); + } + return 1.into(); + } + if fighter.is_pad_flag(PadFlag::AttackTrigger) || fighter.is_pad_flag(PadFlag::SpecialTrigger) + || fighter.is_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_DECIDE) { + let brave = fighter.global_table[0x4].get_ptr() as *mut Fighter; + if !fighter.is_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_DECIDE) { + FighterSpecializer_Brave::special_lw_cursor_decide(brave); + } + let select_index = fighter.get_int(*FIGHTER_BRAVE_INSTANCE_WORK_ID_INT_SPECIAL_LW_SELECT_INDEX); + let command = FighterSpecializer_Brave::get_special_lw_command_from_index(brave, select_index); + let sp_cost = FighterSpecializer_Brave::get_special_lw_command_sp_cost(fighter.module_accessor, FighterBraveSpecialLwCommand{ _address: command as u8 }, true); + if brave_special_check_sp_set_flag(fighter, sp_cost, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_SUCCESS_SP) { + FighterSpecializer_Brave::special_lw_decide_command(brave, FighterBraveSpecialLwCommand{ _address: command as u8 }, select_index); + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_START.into(), true.into()); + } + else { + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_FAILURE.into(), true.into()); + } + return 1.into(); + } + if fighter.is_pad_flag(PadFlag::GuardTrigger) + || fighter.is_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_GUARD_CANCEL) { + fighter.off_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_GUARD_CANCEL); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.set_int(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_NEXT_STATUS); + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_CANCEL.into(), false.into()); + } + else { + if !fighter.is_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_ESCAPE_AIR) { + fighter.set_int(*FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_NEXT_STATUS); + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_CANCEL.into(), false.into()); + } + } + + return 1.into(); + } + if fighter.is_cat_flag(Cat1::JumpButton) + || fighter.is_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_JUMP_CANCEL) { + fighter.off_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_FLAG_JUMP_CANCEL); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT_BUTTON) { + fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_SQUAT, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_NEXT_STATUS); + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_CANCEL.into(), false.into()); + return 1.into(); + } + } + else { + if fighter.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT) < fighter.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT_MAX) { + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON) { + fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_AERIAL, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_NEXT_STATUS); + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_CANCEL.into(), false.into()); + return 1.into(); + } + } + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + WorkModule::set_int64(fighter.module_accessor, hash40("special_lw_select") as i64, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw_landing"), 0.0, 1.0, false, 0.0, false, false); + } + else { + let motion = WorkModule::get_int64(fighter.module_accessor, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION_AIR); + MotionModule::change_motion(fighter.module_accessor, Hash40::new_raw(motion), 0.0, 1.0, true, 6.0, false, false); + } + } + fighter.sub_exec_special_start_common_kinetic_setting(Hash40::new("param_special_n").into()); + if special_lw_set_index(fighter) { + if fighter.is_motion_one_of(&[Hash40::new("special_lw_select"), Hash40::new("special_air_lw_select")]) { + if fighter.get_int(*FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_INPUT_COUNT) <= 0 { + if WorkModule::get_int64(fighter.module_accessor, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION) == hash40("special_lw_select") { + fighter.change_motion_by_situation("special_lw_select2", "special_air_lw_select2", 0.0, 1.0, false, 0.0, false, false); + WorkModule::set_int64(fighter.module_accessor, hash40("special_lw_select2") as i64, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION); + WorkModule::set_int64(fighter.module_accessor, hash40("special_air_lw_select2") as i64, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION_AIR); + } + } + } + } + let handle = VarModule::get_int(fighter.battle_object, vars::brave::instance::MENU_ICON_EFFECT_HANDLE); + set_icon_wobble(fighter, handle); + if MotionModule::is_end(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw_select"), 0.0, 1.0, false, 0.0, false, false); + WorkModule::set_int64(fighter.module_accessor, hash40("special_lw_select") as i64, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw_select"), 0.0, 1.0, false, 0.0, false, false); + WorkModule::set_int64(fighter.module_accessor, hash40("special_air_lw_select") as i64, *FIGHTER_BRAVE_STATUS_SPECIAL_LW_HOLD_INT_SELECT_MOTION_AIR); + } + } + + return 0.into(); +} + +unsafe extern "C" fn brave_special_check_sp_set_flag(fighter: &mut L2CFighterCommon, sp_cost: i32, success: i32) -> bool { + let sp = fighter.get_float(*FIGHTER_BRAVE_INSTANCE_WORK_ID_FLOAT_SP); + let max_sp = fighter.get_float(*FIGHTER_BRAVE_INSTANCE_WORK_ID_FLOAT_MAX_SP); + if sp_cost as f32 <= sp { + fighter.on_flag(success); + return true; + } + fighter.off_flag(success); + return false; +} + +unsafe extern "C" fn set_icon_wobble(fighter: &mut L2CFighterCommon, handle: i32) { + if handle == -1 { return; } + let frame = fighter.status_frame(); + let facing = fighter.lr(); + // oscillate up and down slightly + let offset = ((frame as f32 * 0.125) / std::f32::consts::PI).cos(); + EffectModule::set_pos(fighter.module_accessor, handle as u32, &Vector3f::new(5.0 * facing, 20.0 + offset, 2.0)); +} + +unsafe extern "C" fn special_lw_exit(fighter: &mut L2CFighterCommon) -> L2CValue { + let interrupt = StatusModule::status_kind_next(fighter.module_accessor); + if interrupt == *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_SELECT { + return 0.into(); + } + + let handle = VarModule::get_int(fighter.battle_object, vars::brave::instance::MENU_ICON_EFFECT_HANDLE); + if interrupt == *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_START + || interrupt == *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_STEEL_START { + EffectModule::set_rate(fighter.module_accessor, handle as u32, 1.0); + } + else { + EffectModule::kill(fighter.module_accessor, handle as u32, true, true); + } + VarModule::set_int(fighter.battle_object, vars::brave::instance::MENU_ICON_EFFECT_HANDLE, -1); + + return 0.into(); +} + unsafe extern "C" fn special_lw_start_main(fighter: &mut L2CFighterCommon) -> L2CValue { let ret = smashline::original_status(Main, fighter, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_START)(fighter); // persist rng @@ -301,11 +501,15 @@ unsafe extern "C" fn special_lw_failure_pre(fighter: &mut L2CFighterCommon) -> L pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_main); + agent.status(Exit, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_exit); agent.status(Pre, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_START, special_lw_start_pre); agent.status(Main, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_START, special_lw_start_main); agent.status(End, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_START, special_lw_start_end); + agent.status(Main, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_SELECT, special_lw_select_main); + agent.status(Exit, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_SELECT, special_lw_exit); + agent.status(Pre, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_STEEL_START, special_lw_steel_start_pre); agent.status(Main, *FIGHTER_BRAVE_STATUS_KIND_SPECIAL_LW_STEEL_START, special_lw_steel_start_main); diff --git a/fighters/brave/src/status/special_n.rs b/fighters/brave/src/status/special_n.rs index aa08359258..ff988ecb9a 100644 --- a/fighters/brave/src/status/special_n.rs +++ b/fighters/brave/src/status/special_n.rs @@ -12,8 +12,8 @@ unsafe extern "C" fn special_n_hold_main(fighter: &mut L2CFighterCommon) -> L2CV if hold_frame >= hold_frame_m { fighter.on_flag(*FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_START_M); } - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_GUARD); - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_JUMP); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_GUARD); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_JUMP); ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8); fighter.main_shift(special_n_hold_main_loop) @@ -41,7 +41,7 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> } if fighter.sub_check_jump_in_charging().get_bool() { fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_SQUAT, *FIGHTER_BRAVE_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); - fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_N_CANCEL.into(), false.into()); + fighter.change_status(FIGHTER_BRAVE_STATUS_KIND_SPECIAL_N_CANCEL.into(), true.into()); return 1.into(); } } diff --git a/fighters/brave/src/tornado/acmd.rs b/fighters/brave/src/tornado/acmd.rs index d0ff117267..7c305bb653 100644 --- a/fighters/brave/src/tornado/acmd.rs +++ b/fighters/brave/src/tornado/acmd.rs @@ -4,8 +4,11 @@ unsafe extern "C" fn game_specialhi1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("tornado1"), 7.0, 108, 100, 160, 0, 6.0, 0.0, 2.5, 4.0, Some(0.0), Some(2.5), Some(-4.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("tornado1"), 7.0, 108, 55, 0, 85, 6.0, 0.0, 2.5, 4.0, Some(0.0), Some(2.5), Some(-4.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("tornado1"), 7.0, 108, 55, 0, 85, 4.0, 0.0, 0.5, 4.0, Some(0.0), Some(0.5), Some(-4.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AttackModule::clear_all(boma); } } @@ -15,6 +18,10 @@ unsafe extern "C" fn effect_specialhi1(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("brave_tornado1"), Hash40::new("tornado1"), 0, 0, 0, 0, 0, 0, 0.75, true); } + frame(lua_state, 13.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("brave_tornado1"), false, false); + } } unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { diff --git a/fighters/buddy/Cargo.toml b/fighters/buddy/Cargo.toml index a3cc5bfab5..6987d61b0f 100644 --- a/fighters/buddy/Cargo.toml +++ b/fighters/buddy/Cargo.toml @@ -8,6 +8,8 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/buddy/src/acmd/aerials.rs b/fighters/buddy/src/acmd/aerials.rs index 87edcd57c9..a68eab54ed 100644 --- a/fighters/buddy/src/acmd/aerials.rs +++ b/fighters/buddy/src/acmd/aerials.rs @@ -9,41 +9,45 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 361, 73, 0, 48, 5.0, 0.0, 8.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 0, 0, Hash40::new("handr"), 10.0, 361, 73, 0, 48, 3.6, -0.5, 0.0, 0.0, None,None,None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("waist"), 10.0, 47, 66, 0, 48, 3.6, -2.0, 4.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 47, 66, 0, 48, 5.0, 0.0, 8.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handr"), 10.0, 47, 66, 0, 48, 3.6, -0.5, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 32, 73, 0, 48, 5.0, 0.0, 9.0, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 52, 66, 0, 48, 5.0, 0.0, 9.0, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 12.0); if is_excute(agent) { - AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 0, Hash40::new("handr"), 7.0, 50, 76, 0, 48, 3.6, -0.5, 0.0, 0.0, None,None,None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 1, 0.1); + ATTACK(agent, 0, 0, Hash40::new("waist"), 7.0, 47, 66, 0, 48, 3.6, -2.0, 4.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handr"), 7.0, 47, 66, 0, 48, 3.6, -0.5, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 76, 0, 48, 5.0, 0.0, 13.0, -14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 52, 66, 0, 48, 5.0, 0.0, 13.0, -14.0, Some(0.0), Some(13.0), Some(-14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 16.0); - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 76, 0, 48, 5.0, 0.0, 13.0, -16.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + if is_excute(agent) { + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 52, 66, 0, 48, 5.0, 0.0, 13.0, -15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 76, 0, 48, 5.0, 0.0, 13.0, -12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 52, 66, 0, 48, 5.0, 0.0, 13.0, -11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 20.0); if is_excute(agent) { - AttackModule::clear_all(boma); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 1, 0.1); } frame(lua_state, 25.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 92, 26, 0, 78, 4.75, 0.0, 7.5, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 52, 66, 0, 48, 4.75, 0.0, 7.5, 12.0, Some(0.0), Some(7.5), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 26.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 92, 26, 0, 78, 4.75, 0.0, 7.5, 14.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 52, 66, 0, 48, 4.75, 0.0, 8.0, 13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } wait(lua_state, 3.0); if is_excute(agent) { @@ -171,8 +175,8 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 70, 180, 0, 1, 4.8, 0.0, 4.4, -5.6, Some(0.0), Some(2.4), Some(-13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 70, 180, 0, 1, 4.8, 0.0, 4.4, -5.6, Some(0.0), Some(11.4), Some(-5.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 70, 180, 0, 1, 5.0, 0.0, 6.4, -5.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 70, 180, 0, 1, 4.0, 0.0, 4.4, -5.6, Some(0.0), Some(2.4), Some(-13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } frame(lua_state, 10.0); FT_MOTION_RATE_RANGE(agent, 10.0, 12.0, 3.0); @@ -182,7 +186,7 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 12.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 60, 180, 0, 1, 4.4, 0.0, 4.4, -5.6, Some(0.0), Some(11.4), Some(-5.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 60, 180, 0, 1, 4.4, 0.0, 4.8, -5.6, Some(0.0), Some(11.0), Some(-5.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 60, 180, 0, 1, 5.8, 0.0, 7.9, -7.6, Some(0.0), Some(7.9), Some(-13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } frame(lua_state, 14.0); @@ -193,8 +197,8 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 50, 177, 0, 22, 4.4, 0.0, 4.4, -5.6, Some(0.0), Some(11.4), Some(-5.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 50, 177, 0, 22, 4.0, 0.0, 11.4, -5.6, Some(0.0), Some(14.0), Some(-13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 50, 177, 0, 22, 5.5, 0.0, 8.4, -3.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 50, 177, 0, 22, 4.0, 0.0, 11.4, -4.1, Some(0.0), Some(14.0), Some(-13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } frame(lua_state, 18.0); FT_MOTION_RATE_RANGE(agent, 18.0, 37.0, 17.0); @@ -242,11 +246,11 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { HIT_NO(agent, 12, *HIT_STATUS_NORMAL); HIT_NO(agent, 13, *HIT_STATUS_NORMAL); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 70, 101, 0, 50, 3.75, 0.0, 10.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("k_wingr3"), 8.0, 70, 101, 0, 50, 4.0, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("k_wingl3"), 8.0, 70, 101, 0, 50, 4.0, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("k_wingr3"), 8.0, 70, 101, 0, 50, 5.0, 6.5, -3.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("k_wingl3"), 8.0, 70, 101, 0, 50, 5.0, 6.5, -3.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 65, 94, 0, 50, 3.75, 0.0, 10.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("k_wingr3"), 8.0, 65, 94, 0, 50, 4.0, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("k_wingl3"), 8.0, 65, 94, 0, 50, 4.0, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("k_wingr3"), 8.0, 65, 94, 0, 50, 5.0, 6.5, -3.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("k_wingl3"), 8.0, 65, 94, 0, 50, 5.0, 6.5, -3.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BUDDY_WING, *ATTACK_REGION_PUNCH); } frame(lua_state, 10.0); if is_excute(agent) { @@ -339,13 +343,13 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); JostleModule::set_status(boma, true); /* Ground-only */ - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 270, 40, 0, 54, 5.0, 0.0, 1.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 270, 40, 0, 54, 5.0, 0.0, 2.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); /* Air-only */ - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 270, 50, 0, 23, 5.0, 0.0, 1.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 270, 50, 0, 23, 5.0, 0.0, 2.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 76, 63, 0, 67, 5.5, 0.0, 1.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 76, 63, 0, 67, 5.5, 0.0, 2.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); AttackModule::clear(boma, 1, false); } frame(lua_state, 46.0); diff --git a/fighters/buddy/src/acmd/ground.rs b/fighters/buddy/src/acmd/ground.rs index 6bc219cfcd..591d6bd79c 100644 --- a/fighters/buddy/src/acmd/ground.rs +++ b/fighters/buddy/src/acmd/ground.rs @@ -10,11 +10,14 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 80, 45, 0, 20, 4.0, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 24, 0, 30, 3.0, 0.0, 5.0, 5.0, Some(0.0), Some(5.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 7.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 9.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } @@ -29,17 +32,18 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 75, 100, 30, 0, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 24, 0, 30, 3.0, 0.0, 5.0, 5.0, Some(0.0), Some(5.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 9.0); + frame(lua_state, 11.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } - frame(lua_state, 12.0); + frame(lua_state, 14.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } diff --git a/fighters/buddy/src/acmd/other.rs b/fighters/buddy/src/acmd/other.rs index 9bd317f7dc..985501ae45 100644 --- a/fighters/buddy/src/acmd/other.rs +++ b/fighters/buddy/src/acmd/other.rs @@ -82,16 +82,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -102,10 +98,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { diff --git a/fighters/buddy/src/acmd/smashes.rs b/fighters/buddy/src/acmd/smashes.rs index 27b45d25ed..174eda23ed 100644 --- a/fighters/buddy/src/acmd/smashes.rs +++ b/fighters/buddy/src/acmd/smashes.rs @@ -75,8 +75,8 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 1, 1, Hash40::new("legl"), 13.0, 86, 99, 0, 42, 4.4, 2.6, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 1, Hash40::new("legr"), 13.0, 86, 99, 0, 42, 4.4, 1.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 1, Hash40::new("legl"), 13.0, 86, 99, 0, 42, 4.4, 2.6, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 1, Hash40::new("legr"), 13.0, 86, 99, 0, 42, 4.4, 0.3, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 3, 1, Hash40::new("footr"), 17.0, 86, 91, 0, 40, 4.6, 2.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 3.0); @@ -111,7 +111,7 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), -1, 5, 1, -90, 0, 0, 1.2, true); - EFFECT_FOLLOW_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("footr"), 0, -2, 0, 0, 0, 0, 1.4, true, 1.0); + EFFECT_FOLLOW_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("footr"), 2, 0, 0, 0, 0, 0, 1.2, true, 1.0); } frame(lua_state, 28.0); if is_excute(agent) { diff --git a/fighters/buddy/src/acmd/specials.rs b/fighters/buddy/src/acmd/specials.rs index 0661707a35..005f942e56 100644 --- a/fighters/buddy/src/acmd/specials.rs +++ b/fighters/buddy/src/acmd/specials.rs @@ -2,15 +2,6 @@ use smash::app::sv_animcmd::EFFECT_WORK; use super::*; -unsafe fn will_bayonet(agent: &mut L2CAgentBase) -> bool { - let boma = agent.boma(); - let is_csticking = ControlModule::get_command_flag_cat(boma, 0) & *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_S4 != 0; - if (is_csticking) && agent.kind() != *FIGHTER_KIND_KIRBY { - return true; - } - return false; -} - unsafe extern "C" fn game_specialnfire(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -84,51 +75,136 @@ unsafe extern "C" fn expression_specialnfire(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_specialnupperfire(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialnattack(agent: &mut L2CAgentBase) { + let mut is_hi = false; + let mut is_lw = false; + let mut is_s = false; let lua_state = agent.lua_state_agent; let boma = agent.boma(); - for _ in 0..4 { - if is_excute(agent) && will_bayonet(agent){ - VarModule::on_flag(boma.object(), vars::buddy::instance::SPECIAL_N_BAYONET_ACTIVE); - agent.change_status_req(*FIGHTER_STATUS_KIND_ATTACK_S3, true); - VarModule::set_int(boma.object(), vars::buddy::instance::SPECIAL_N_BAYONET_EGGS_FIRED,*FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_N_BAKYUN_BULLET_SHOOT_COUNT); - break; + if is_excute(agent) { + let motion = MotionModule::motion_kind(boma); + is_hi = motion == hash40("special_n_attack_hi"); + is_lw = motion == hash40("special_n_attack_lw"); + is_s = !is_hi && !is_lw; + } + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.75); + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + if is_hi { + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 50, 67, 0, 46, 3.2, 0.0, 12.4, 6.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 50, 71, 0, 46, 2.6, 0.0, 16.2, 17.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 50, 67, 0, 46, 3.6, 0.0, 14.2, 12.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + } + else if is_s { + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 45, 67, 0, 46, 3.2, 0.0, 7.2, 7.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 45, 71, 0, 46, 2.6, 0.0, 7.2, 18.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 67, 0, 46, 3.6, 0.0, 7.2, 13.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + } + else { + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 40, 67, 0, 46, 3.2, 0.0, 4.2, 6.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 40, 71, 0, 46, 2.6, 0.0, 1.2, 17.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 40, 67, 0, 46, 3.6, 0.0, 2.8, 12.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } - wait(lua_state, 1.0); } - if !VarModule::is_flag(boma.object(), vars::buddy::instance::SPECIAL_N_BAYONET_ACTIVE) { - frame(lua_state, 4.0); - if is_excute(agent) { - WorkModule::on_flag(boma, /*Flag*/ *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_GENERATE_BULLET); + frame(lua_state, 12.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 21.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_END); + } +} +unsafe extern "C" fn effect_specialnattack(agent: &mut L2CAgentBase) { + let mut is_hi = false; + let mut is_lw = false; + let mut is_s = false; + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + let motion = MotionModule::motion_kind(boma); + is_hi = motion == hash40("special_n_attack_hi"); + is_lw = motion == hash40("special_n_attack_lw"); + is_s = !is_hi && !is_lw; + } + frame(lua_state, 7.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 9.0); + if is_excute(agent) { + if is_hi { + EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 11, 9.5, -26, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 10, 6.5, -26, 0, 0, 0.75, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.6); + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), -0.5, 15, 18, 0, 0, 0, 0.9, true); } - frame(lua_state, 5.0); - if is_excute(agent) { - WorkModule::on_flag(boma, /*Flag*/ *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_START_PRECEDE_CHECK); + else if is_s { + EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 6.5, 9.5, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 6.5, 7, 0, 0, 0, 0.75, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.6); + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), -0.5, 7, 19, 0, 0, 0, 0.9, true); + } + else { + EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 3.5, 9.5, 15, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 3.5, 6, 15, 0, 0, 0.75, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.6); + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 0, 0.8, 17.5, 0, 0, 0, 0.9, true); } } } -unsafe extern "C" fn game_specialnfire2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_specialnattack(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - for _ in 0..4 { - if is_excute(agent) && will_bayonet(agent){ - VarModule::on_flag(boma.object(), vars::buddy::instance::SPECIAL_N_BAYONET_ACTIVE); - - agent.change_status_req(*FIGHTER_STATUS_KIND_ATTACK_S3, true); - return; + frame(lua_state, 2.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s01")); + } + frame(lua_state, 8.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s02")); + } + if is_excute(agent) { + if sv_math::rand(hash40("fighter"), 2) == 0 { + PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s01")); + frame(lua_state, 11.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s02")); + } } - wait(lua_state, 1.0); } - frame(lua_state, 4.0); + frame(lua_state, 20.0); + if is_excute(agent) { + PLAY_STATUS(agent, Hash40::new("se_buddy_attackhard_s03")); + } +} + +unsafe extern "C" fn expression_specialnattack(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + } + frame(lua_state, 7.0); if is_excute(agent) { - WorkModule::on_flag(boma, /*Flag*/ *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_GENERATE_BULLET); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 5.0); + frame(lua_state, 9.0); if is_excute(agent) { - WorkModule::on_flag(boma, /*Flag*/ *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_START_PRECEDE_CHECK); + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); } } +unsafe extern "C" fn game_specialnattackend(agent: &mut L2CAgentBase) { + FT_MOTION_RATE(agent, 0.75); + wait(agent.lua_state_agent, 36.0); + FT_MOTION_RATE(agent, 0.25); + frame(agent.lua_state_agent, 40.0); + FT_MOTION_RATE(agent, 1.0); +} unsafe extern "C" fn game_specialsdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; @@ -138,8 +214,8 @@ unsafe extern "C" fn game_specialsdash(agent: &mut L2CAgentBase) { //WorkModule::on_flag(boma, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_SUPER_ARMOR); damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 12.0); JostleModule::set_status(boma, false); - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 43, 72, 0, 66, 3.8, 0.0, 6.2, 1.8, Some(0.0), Some(6.2), Some(3.2), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 11, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 18.0, 43, 72, 0, 66, 4.2, 0.0, 9.2, 3.8, Some(0.0), Some(9.2), Some(5.4), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 11, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 43, 72, 0, 66, 3.8, 0.0, 6.2, 1.8, Some(0.0), Some(6.2), Some(3.2), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 18.0, 43, 72, 0, 66, 4.2, 0.0, 9.2, 3.8, Some(0.0), Some(9.2), Some(5.4), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); //AttackModule::set_captured_same_time_attack(boma, 0, true); //AttackModule::set_captured_same_time_attack(boma, 1, true); //AttackModule::set_captured_same_time_attack_damage_mul(boma, 0, 0.25); @@ -315,13 +391,17 @@ unsafe extern "C" fn effect_specialairsdash(agent: &mut L2CAgentBase) { if is_excute(agent) { FLASH(agent, 1, 1, 0.6, 0.3); EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } } frame(lua_state, 3.0); if is_excute(agent) { //buddy_meter(agent,boma); EffectModule::enable_sync_init_pos_last(boma); - LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } } frame(lua_state, 6.0); if is_excute(agent) { @@ -412,8 +492,7 @@ unsafe extern "C" fn game_specialairsend(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialairswall(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 7.0); + let boma = agent.boma(); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); } @@ -483,6 +562,14 @@ unsafe extern "C" fn sound_specialairswall(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialsjump(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE(agent,2.0); +} + + unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -517,11 +604,13 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_specialnfire", effect_specialnfire, Priority::Low); agent.acmd("sound_specialnfire", sound_specialnfire, Priority::Low); agent.acmd("expression_specialnfire", expression_specialnfire, Priority::Low); - agent.acmd("game_specialnupperfire", game_specialnupperfire, Priority::Low); - agent.acmd("game_specialnfire2", game_specialnfire2, Priority::Low); - + agent.acmd("game_specialnattack", game_specialnattack, Priority::Low); + agent.acmd("effect_specialnattack", effect_specialnattack, Priority::Low); + agent.acmd("sound_specialnattack", sound_specialnattack, Priority::Low); + agent.acmd("expression_specialnattack", expression_specialnattack, Priority::Low); + agent.acmd("game_specialnattackend", game_specialnattackend, Priority::Low); + agent.acmd("game_specialsdash", game_specialsdash, Priority::Low); - agent.acmd("game_specialairsstart", game_specialairsstart, Priority::Low); agent.acmd("effect_specialairsstart", effect_specialairsstart, Priority::Low); agent.acmd("sound_specialairsstart", sound_specialairsstart, Priority::Low); @@ -533,6 +622,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialairswall", game_specialairswall, Priority::Low); agent.acmd("effect_specialairswall", effect_specialairswall, Priority::Low); agent.acmd("sound_specialairswall", sound_specialairswall, Priority::Low); + agent.acmd("game_specialsjump", game_specialsjump, Priority::Low); + agent.acmd("game_specialhistart", game_specialhistart, Priority::Low); agent.acmd("game_specialhi", game_specialhi, Priority::Low); diff --git a/fighters/buddy/src/acmd/throws.rs b/fighters/buddy/src/acmd/throws.rs index 2bdc2ca07d..2acb61a3b6 100644 --- a/fighters/buddy/src/acmd/throws.rs +++ b/fighters/buddy/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 6.6, 4.2, Some(0.0), Some(6.6), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -29,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(11.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 6.6, 4.2, Some(0.0), Some(6.6), Some(11.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-14.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 6.6, -4.2, Some(0.0), Some(6.6), Some(-14.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/buddy/src/acmd/tilts.rs b/fighters/buddy/src/acmd/tilts.rs index f49505986b..5a40f01bd5 100644 --- a/fighters/buddy/src/acmd/tilts.rs +++ b/fighters/buddy/src/acmd/tilts.rs @@ -3,78 +3,92 @@ use super::*; unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 7.0); if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, false, 0); - ArticleModule::change_motion(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("attack_s3_s"), false, 0.0); - } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 45, 67, 0, 46, 3.2, 0.0, 7.2, 13.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 45, 71, 0, 46, 2.6, 0.0, 7.2, 18.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 67, 0, 46, 3.6, 0.0, 7.2, 7.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("k_bust"), 10.0, 361, 68, 0, 45, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("k_head"), 12.0, 361, 68, 0, 45, 3.0, 2.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } frame(lua_state, 12.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 50.0); - if is_excute(agent) { - ArticleModule::remove_exist(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - } } -unsafe extern "C" fn game_attacks3hi(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 6.0); if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, false, 0); - ArticleModule::change_motion(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("attack_s3_hi"), false, 0.0); + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 50, 67, 0, 46, 3.2, 0.0, 14.2, 12.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 50, 71, 0, 46, 2.6, 0.0, 16.2, 17.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 50, 67, 0, 46, 3.6, 0.0, 12.4, 6.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 8, 7, 180, 235, 90, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 2.0); + let color_vec = match WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR) { + 0 => Vector3f::new(0.8, 0.3, 0.0), + 1 => Vector3f::new(0.7, 0.35, 0.1), + 2 => Vector3f::new(0.8, 0.2, 0.5), + 3 => Vector3f::new(0.5, 0.2, 0.35), + 4 => Vector3f::new(0.35, 0.35, 0.35), + 5 => Vector3f::new(0.4, 0.3, 0.1), + 6 => Vector3f::new(1.0, 0.2, 0.2), + 7 => Vector3f::new(0.1, 0.05, 0.1), + _ => Vector3f::new(0.8, 0.3, 0.0) + }; + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_SCALE_W(agent, 0.75, 0.8, 0.8); } - frame(lua_state, 12.0); + frame(lua_state, 9.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("k_head"), 4.5, -0.5, 0.5, 0, 0, 0, 0.65, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 50.0); + frame(lua_state, 11.0); if is_excute(agent) { - ArticleModule::remove_exist(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + EFFECT_OFF_KIND(agent, Hash40::new("sys_attack_arc_d"), false, false); } } -unsafe extern "C" fn game_attacks3lw(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 2.0); if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, false, 0); - ArticleModule::change_motion(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("attack_s3_lw"), false, 0.0); + PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s01")); } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 40, 67, 0, 46, 3.2, 0.0, 2.8, 12.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 40, 71, 0, 46, 2.6, 0.0, 1.2, 17.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 40, 67, 0, 46, 3.6, 0.0, 4.2, 6.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s02")); } - frame(lua_state, 12.0); + frame(lua_state, 6.0); if is_excute(agent) { - AttackModule::clear_all(boma); + let play_vc = app::sv_math::rand(hash40("fighter"), 3); + if play_vc == 0 {PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s02"));} } - frame(lua_state, 50.0); + frame(lua_state, 19.0); if is_excute(agent) { - ArticleModule::remove_exist(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s03")); + } + frame(lua_state, 28.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_buddy_special_n04_01")); + } +} + +unsafe extern "C" fn expression_attacks3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + } + frame(lua_state, 5.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 7.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); } } @@ -230,8 +244,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attacks3", game_attacks3, Priority::Low); - agent.acmd("game_attacks3hi", game_attacks3hi, Priority::Low); - agent.acmd("game_attacks3lw", game_attacks3lw, Priority::Low); + agent.acmd("effect_attacks3", effect_attacks3, Priority::Low); + agent.acmd("sound_attacks3", sound_attacks3, Priority::Low); + agent.acmd("expression_attacks3", expression_attacks3, Priority::Low); agent.acmd("game_attackhi3", game_attackhi3, Priority::Low); agent.acmd("effect_attackhi3", effect_attackhi3, Priority::Low); diff --git a/fighters/buddy/src/lib.rs b/fighters/buddy/src/lib.rs index ede6b45794..f3242d7cd4 100644 --- a/fighters/buddy/src/lib.rs +++ b/fighters/buddy/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/buddy/src/opff.rs b/fighters/buddy/src/opff.rs index 0424b2def8..ac2c72cbc2 100644 --- a/fighters/buddy/src/opff.rs +++ b/fighters/buddy/src/opff.rs @@ -1,9 +1,9 @@ use super::*; use globals::*; -const HUD_DISPLAY_TIME_MAX: i32 = 90; +pub const HUD_DISPLAY_TIME_MAX: i32 = 90; const FEATHERS_RED_COOLDOWN_GROUND_RATE: f32 = 1.25; -const FEATHERS_RED_COOLDOWN_MAX: f32 = 450.0; +pub const FEATHERS_RED_COOLDOWN_MAX: f32 = 450.0; const BEAKBOMB_END_FRAME: i32 = 25; // Dash timer is shared between ground and air in vl.prc utils::import_noreturn!(common::opff::fighter_common_opff); @@ -15,14 +15,6 @@ unsafe fn blue_eggs_land_cancels(fighter: &mut L2CFighterCommon) { } } -// Banjo Grenade Airdodge Cancel -unsafe fn grenade_ac(fighter: &mut L2CFighterCommon) { - if fighter.is_status_one_of(&[*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_LW_SHOOT, *FIGHTER_STATUS_KIND_SPECIAL_LW]) - && fighter.motion_frame() > 16.0 { - fighter.check_airdodge_cancel(); - } -} - // Banjo Dair bounce unsafe fn dair_bounce(fighter: &mut L2CFighterCommon) { if fighter.is_motion(Hash40::new("attack_air_lw")) @@ -40,7 +32,7 @@ unsafe fn dash_attack_jump_cancels(fighter: &mut L2CFighterCommon) { fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL, true); } else if MotionModule::frame(fighter.module_accessor) >= 27.0 { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, true); } } } @@ -65,8 +57,8 @@ unsafe fn beakbomb_update(fighter: &mut L2CFighterCommon) { if fighter.is_status(*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH) { beakbomb_control(fighter); //beakbomb_checkForHit(fighter,boma); - beakbomb_checkForGround(fighter); - beakbomb_checkForCancel(fighter); + beakbomb_checkforground(fighter); + beakbomb_checkforcancel(fighter); GroundModule::set_attach_ground(fighter.module_accessor, false); VarModule::add_int(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_FRAME, 1); } @@ -123,7 +115,7 @@ unsafe fn beakbomb_control(fighter: &mut L2CFighterCommon) { } // Check if landed on the ground -unsafe fn beakbomb_checkForGround(fighter: &mut L2CFighterCommon) { +unsafe fn beakbomb_checkforground(fighter: &mut L2CFighterCommon) { if !fighter.is_situation(*SITUATION_KIND_GROUND) { return; } let fail_safeFrames = 5; @@ -142,7 +134,7 @@ unsafe fn beakbomb_checkForGround(fighter: &mut L2CFighterCommon) { } } -unsafe fn beakbomb_checkForCancel(fighter: &mut L2CFighterCommon) { +unsafe fn beakbomb_checkforcancel(fighter: &mut L2CFighterCommon) { if !fighter.is_status(*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH) || AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) || !fighter.is_situation(*SITUATION_KIND_AIR) { return; } @@ -154,6 +146,7 @@ unsafe fn beakbomb_checkForCancel(fighter: &mut L2CFighterCommon) { // Recoil for bouncing off walls/shields unsafe fn beakbomb_wall(fighter: &mut L2CFighterCommon) { + /* if fighter.is_motion(Hash40::new("special_air_s_wall")) && fighter.motion_frame() < 7.0 && fighter.motion_frame() > 0.0 { @@ -166,14 +159,45 @@ unsafe fn beakbomb_wall(fighter: &mut L2CFighterCommon) { WorkModule::off_flag(fighter.module_accessor, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); SET_SPEED_EX(fighter, x_bounce, y_bounce, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_ACTIVE); - } + } + */ } unsafe fn breegull_bayonet(fighter: &mut L2CFighterCommon) { - if VarModule::is_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_ACTIVE) { + //special_n_shoot_fire + //special_air_n_shoot_fire + let motion = MotionModule::motion_kind(fighter.module_accessor); + let motion_partial = MotionModule::motion_kind_partial(fighter.module_accessor,*FIGHTER_MOTION_PART_SET_KIND_UPPER_BODY); + if fighter.is_status_one_of(&[ + *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT, + *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_WALK_F, + *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_WALK_B, + *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_TURN, + *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_LANDING + ]) && fighter.is_situation(*SITUATION_KIND_GROUND) { + + if motion_partial == hash40("special_n_shoot_upper_fire") { + let frame_partial = MotionModule::frame_partial(fighter.module_accessor, *FIGHTER_MOTION_PART_SET_KIND_UPPER_BODY); + let disable_frame = 3.0; //frame before egg fires + let disable_bayonet = (!CancelModule::is_enable_cancel(fighter.module_accessor) && frame_partial >= disable_frame); + VarModule::set_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE,disable_bayonet); + } + else { + VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE); + } + let is_csticking = ControlModule::get_command_flag_cat(fighter.module_accessor, 0) & *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_S4 != 0; + if (is_csticking && !VarModule::is_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE)) { + //println!("Bayonet"); + //VarModule::on_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE); + //VarModule::set_int(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_EGGS_FIRED,*FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_N_BAKYUN_BULLET_SHOOT_COUNT); + fighter.change_status(statuses::buddy::SPECIAL_N_BAYONET.into(), false.into()); + } + } + /* + if VarModule::is_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE) { if fighter.is_status(*FIGHTER_STATUS_KIND_ATTACK_S3) { if fighter.motion_frame() < 21.0 { return; } - fighter.change_status(statuses::buddy::SPECIAL_N_BAYONET_END.into(), false.into()); + fighter.change_status(statuses::buddy::SPECIAL_N_BAYONET.into(), false.into()); let entry = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as usize; let currentEggs = BAYONET_EGGS[entry]; // VarModule::get_int(fighter.battle_object, vars::buddy::instance::BAYONET_EGGS); @@ -182,7 +206,7 @@ unsafe fn breegull_bayonet(fighter: &mut L2CFighterCommon) { *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_N_BAKYUN_BULLET_SHOOT_COUNT ); - VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_ACTIVE); + VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE); } } else if fighter.is_status_one_of(&[ @@ -197,6 +221,7 @@ unsafe fn breegull_bayonet(fighter: &mut L2CFighterCommon) { // VarModule::set_int(fighter.battle_object, vars::buddy::instance::BAYONET_EGGS, currentEggs); BAYONET_EGGS[entry] = currentEggs; } + */ } unsafe fn buddy_meter_controller(fighter: &mut L2CFighterCommon) { @@ -222,15 +247,11 @@ unsafe fn buddy_meter_controller(fighter: &mut L2CFighterCommon) { } } // Refund cooldown if immediately caught ledge - if fighter.motion_frame() <= 3.0 && in_Air { - if fighter.is_status(*FIGHTER_STATUS_KIND_CLIFF_CATCH) - && VarModule::get_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN) > FEATHERS_RED_COOLDOWN_MAX - 5.0 { - VarModule::set_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN, 1.0); - } - else if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_SPECIAL_S, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH]) { - VarModule::set_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN, FEATHERS_RED_COOLDOWN_MAX); - } - } + if fighter.is_status(*FIGHTER_STATUS_KIND_CLIFF_CATCH) + && fighter.motion_frame() <= 3.0 + && VarModule::get_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN) > FEATHERS_RED_COOLDOWN_MAX - 5.0 { + VarModule::set_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN, 1.0); + } buddy_meter_display(fighter, in_Air); } @@ -240,7 +261,7 @@ unsafe fn buddy_meter_display(fighter: &mut L2CFighterCommon, RedFeather: bool) if fighter.is_status_one_of(&[ *FIGHTER_STATUS_KIND_SPECIAL_S, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH, - *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_WALL, + //*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_WALL, //*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL, *FIGHTER_STATUS_KIND_REBIRTH ]) @@ -256,7 +277,7 @@ unsafe fn buddy_meter_display(fighter: &mut L2CFighterCommon, RedFeather: bool) } } -unsafe fn buddy_meter_update_HUD(fighter: &mut L2CFighterCommon, RedFeather: bool) { +pub unsafe fn buddy_meter_update_HUD(fighter: &mut L2CFighterCommon, RedFeather: bool) { EffectModule::kill_kind(fighter.module_accessor, Hash40::new("buddy_special_s_count"), false, true); let FEATHERS_GOLD_COUNT = WorkModule::get_int(fighter.module_accessor, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_S_REMAIN); @@ -302,7 +323,7 @@ unsafe fn reset_vars(fighter: &mut L2CFighterCommon) { if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_ENTRY, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_REBIRTH]) && StatusModule::is_changing(fighter.module_accessor) { VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_ACTIVE); - VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_ACTIVE); + VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE); VarModule::set_int(fighter.battle_object, vars::buddy::instance::HUD_DISPLAY_TIME, 60); VarModule::set_int(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_FRAME, 0); @@ -328,6 +349,7 @@ unsafe fn up_special_freefall(fighter: &mut L2CFighterCommon) { if fighter.is_prev_status(*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_HI_JUMP) { if StatusModule::is_changing(fighter.module_accessor) { VarModule::on_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); } } if fighter.is_status(*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_HI_JUMP) { @@ -375,7 +397,6 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut L2CFighterCommon) { blue_eggs_land_cancels(fighter); dair_bounce(fighter); - grenade_ac(fighter); dash_attack_jump_cancels(fighter); indicator_breegull_fatigue(fighter); beakbomb_update(fighter); diff --git a/fighters/buddy/src/status/bayonet_end.rs b/fighters/buddy/src/status/bayonet_end.rs deleted file mode 100644 index e7fcf60b03..0000000000 --- a/fighters/buddy/src/status/bayonet_end.rs +++ /dev/null @@ -1,82 +0,0 @@ -use super::*; - -// BUDDY_BAYONET_END - -/// pre status for bayonet -/// handles initialization -pub unsafe extern "C" fn bayonet_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { - StatusModule::init_settings( - fighter.module_accessor, - app::SituationKind(*SITUATION_KIND_GROUND), - *FIGHTER_KINETIC_TYPE_MOTION_BIND, - *GROUND_CORRECT_KIND_GROUND as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), - true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, - 0 - ); - - FighterStatusModuleImpl::set_fighter_status_data( - fighter.module_accessor, - false, - *FIGHTER_TREADED_KIND_NO_REAC, - false, - false, - false, - 0, - 0, - 0, - 0 - ); - - 0.into() -} - -/// main status loop for bayonet_end -unsafe extern "C" fn bayonet_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - // exit if the animation is not done yet - if !MotionModule::is_end(fighter.module_accessor) { - return 0.into(); - } - - // if the animation is over, transition to shoot - fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT.into(), false.into()); - 1.into() -} - -pub unsafe extern "C" fn bayonet_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { - // change summon anim depending on LR - let frame = 26.0; - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n_shoot_start"), frame, 1.0, false, 0.0, false, false); - ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("special_n_start"), false, frame); - - fighter.main_shift(bayonet_end_main_loop) -} - -pub unsafe extern "C" fn bayonet_end_end(fighter: &mut L2CFighterCommon) -> L2CValue { - // re-enable energies and remove the screenwide effect - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - - let next_status = StatusModule::status_kind_next(fighter.module_accessor); - let is_still_blasting = [*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT,*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_WALK_F,*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_WALK_B, - *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_TURN,*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_JUMP_SQUAT,*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_LANDING, - *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_JUMP,*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_JUMP_AERIAL,*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_AIR, - *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_FALL,*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_AIR_TURN,*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_END].contains(&next_status); - - if !is_still_blasting { - ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, ArticleOperationTarget(0)); - ItemModule::set_change_status_event(fighter.module_accessor, true); - WorkModule::set_int(fighter.module_accessor, 0,*FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_N_BAKYUN_BULLET_SHOOT_COUNT); - } - - 0.into() -} - -pub fn install(agent: &mut Agent) { - agent.status(Pre, statuses::buddy::SPECIAL_N_BAYONET_END, bayonet_end_pre); - agent.status(Main, statuses::buddy::SPECIAL_N_BAYONET_END, bayonet_end_main); - agent.status(End, statuses::buddy::SPECIAL_N_BAYONET_END, bayonet_end_end); -} \ No newline at end of file diff --git a/fighters/buddy/src/status/landing.rs b/fighters/buddy/src/status/landing.rs new file mode 100644 index 0000000000..3e25f12868 --- /dev/null +++ b/fighters/buddy/src/status/landing.rs @@ -0,0 +1,32 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) + || fighter.global_table[PREV_STATUS_KIND] == FIGHTER_BUDDY_STATUS_KIND_SPECIAL_HI_JUMP { + let lag = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_hi"), hash40("landing_frame")); + VarModule::set_float(fighter.battle_object, vars::common::instance::LAND_CANCEL_LAG, lag as f32); + WorkModule::set_float(fighter.module_accessor, 0.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) + || fighter.global_table[PREV_STATUS_KIND] == FIGHTER_BUDDY_STATUS_KIND_SPECIAL_HI_JUMP { + let lag = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_hi"), hash40("landing_frame")); + VarModule::set_float(fighter.battle_object, vars::common::instance::LAND_CANCEL_LAG, lag as f32); + WorkModule::set_float(fighter.module_accessor, 0.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/buddy/src/status/mod.rs b/fighters/buddy/src/status/mod.rs index 6c641dc76c..cdfab40ba8 100644 --- a/fighters/buddy/src/status/mod.rs +++ b/fighters/buddy/src/status/mod.rs @@ -3,9 +3,10 @@ use globals::*; // status script import mod run; +mod special_n; mod special_s; -mod bayonet_end; mod special_hi; +mod landing; /// Re-enables the ability to use aerial specials when connecting to ground or cliff unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -21,7 +22,7 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_ACTIVE); - VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_ACTIVE); + VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE); VarModule::set_int(fighter.battle_object, vars::buddy::instance::HUD_DISPLAY_TIME, 60); VarModule::set_int(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_FRAME, 0); @@ -46,7 +47,8 @@ pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_WIN, win_main); run::install(agent); + special_n::install(agent); special_s::install(agent); - bayonet_end::install(agent); special_hi::install(agent); + landing::install(agent); } \ No newline at end of file diff --git a/fighters/buddy/src/status/special_n.rs b/fighters/buddy/src/status/special_n.rs new file mode 100644 index 0000000000..bf6fab2779 --- /dev/null +++ b/fighters/buddy/src/status/special_n.rs @@ -0,0 +1,97 @@ +use super::*; + +// BUDDY_BAYONET + +/// pre status for bayonet +/// handles initialization +pub unsafe extern "C" fn bayonet_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_GROUND), + *FIGHTER_KINETIC_TYPE_MOTION, + *GROUND_CORRECT_KIND_GROUND_CLIFF_STOP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_BUDDY_STATUS_WORK_KEEP_FLAG_SPECIAL_N_FLAG, + *FIGHTER_BUDDY_STATUS_WORK_KEEP_FLAG_SPECIAL_N_INT, + *FIGHTER_BUDDY_STATUS_WORK_KEEP_FLAG_SPECIAL_N_FLOAT, + (*FS_SUCCEEDS_KEEP_SLOPE | *FS_SUCCEEDS_KEEP_VISIBILITY) as i32 + ); + + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + *FIGHTER_STATUS_ATTR_DISABLE_JUMP_BOARD_EFFECT as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + 0.into() +} + +pub unsafe extern "C" fn bayonet_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let stick_y = fighter.global_table[STICK_Y].get_f32(); + let attack_hi3_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("attack_hi3_stick_y")); + let attack_lw3_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("attack_lw3_stick_y")); + + let mut motion = hash40("special_n_attack_s"); + if (stick_y >= attack_hi3_stick_y) { + motion = hash40("special_n_attack_hi"); + } + else if (stick_y <= attack_lw3_stick_y) { + motion = hash40("special_n_attack_lw"); + } + MotionModule::remove_motion_partial(fighter.module_accessor, *FIGHTER_MOTION_PART_SET_KIND_UPPER_BODY, false); + MotionModule::change_motion(fighter.module_accessor, Hash40::new_raw(motion), 0.0, 1.0, false, 0.0, false, false); + + if !ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER) { + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, false, 0); + } + ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("attack_s3_s"), false, 0.0); + + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_START_PRECEDE_CHECK); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_TURN); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_END); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_SHOOT); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_SHOOT_TURN); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_RESERVED_SHOOT_TURN); + + fighter.main_shift(bayonet_main_loop) +} + +/// main status loop for bayonet +unsafe extern "C" fn bayonet_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT.into(), false.into()); + return 0.into(); + } + + /* + //Go into fall if sliding off or ground below disappears + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { + fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT_FALL.into(), false.into()); + return 1.into(); + } */ + 0.into() +} + +pub unsafe extern "C" fn bayonet_end(fighter: &mut L2CFighterCommon) -> L2CValue { + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_SHOOT); + return smashline::original_status(End, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT)(fighter); +} + +pub unsafe extern "C" fn bayonet_exit(fighter: &mut L2CFighterCommon) -> L2CValue { + return smashline::original_status(Exit, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_N_SHOOT)(fighter); +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, statuses::buddy::SPECIAL_N_BAYONET, bayonet_pre); + agent.status(Main, statuses::buddy::SPECIAL_N_BAYONET, bayonet_main); + agent.status(End, statuses::buddy::SPECIAL_N_BAYONET, bayonet_end); + agent.status(Exit, statuses::buddy::SPECIAL_N_BAYONET, bayonet_exit); +} \ No newline at end of file diff --git a/fighters/buddy/src/status/special_s.rs b/fighters/buddy/src/status/special_s.rs index 532804ef7f..12696aba5a 100644 --- a/fighters/buddy/src/status/special_s.rs +++ b/fighters/buddy/src/status/special_s.rs @@ -10,92 +10,64 @@ pub unsafe extern "C" fn special_s_pre(fighter: &mut L2CFighterCommon) -> L2CVal PLAY_SE(fighter, Hash40::new("se_buddy_special_s04_02")); return 1.into(); } + return smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_SPECIAL_S)(fighter); } - - if (fighter.is_situation(*SITUATION_KIND_AIR) ) + if (VarModule::get_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN)>0.0) { - - StatusModule::init_settings( - fighter.module_accessor, - app::SituationKind(*SITUATION_KIND_AIR), - *FIGHTER_KINETIC_TYPE_UNIQ, - *GROUND_CORRECT_KIND_KEEP as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), - true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, - 0 - ); + fighter.set_status_kind_interrupt(*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL); + PLAY_SE(fighter, Hash40::new("se_buddy_special_s04_02")); + return 1.into(); + } - FighterStatusModuleImpl::set_fighter_status_data( - fighter.module_accessor, - false, - *FIGHTER_TREADED_KIND_NO_REAC, - false, - false, - false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK - | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, - *FIGHTER_STATUS_ATTR_START_TURN as u32, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, - 0 - ); + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); - WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_FAIL); - //GroundModule::set_correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - //GroundModule::set_attach_ground(fighter.module_accessor, false); - if (VarModule::get_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN)>0.0) - { - //fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL.into(), false.into()); - fighter.set_status_kind_interrupt(*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL); - PLAY_SE(fighter, Hash40::new("se_buddy_special_s04_02")); - return 1.into(); - } - else{ - VarModule::on_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_S_FAIL_ENABLE); - } - return 0.into(); - } - return smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_SPECIAL_S)(fighter); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK + | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + + VarModule::on_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_S_FAIL_ENABLE); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_FAIL); + return 0.into(); } unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue { - let feathers_g = WorkModule::get_int(fighter.module_accessor,*FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_S_REMAIN); - //Bypass if transitioning into Air Fail - if fighter.is_situation(*SITUATION_KIND_AIR) { - if VarModule::get_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN) > 0.0 { - return 1.into(); - } - } - else { - fighter.sub_set_special_start_common_kinetic_setting(hash40("param_special_s").into()); - if feathers_g <= 0 { - WorkModule::on_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_FAIL); - fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL.into(), false.into()); - } + VarModule::set_int(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_BOUNCE_TYPE, vars::buddy::instance::BOUNCE_TYPE_NORMAL); + let original = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_S)(fighter); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + return original; } - fighter.sub_change_motion_by_situation(Hash40::new("special_s").into(), Hash40::new("special_air_s").into(), false.into()); - fighter.sub_set_ground_correct_by_situation(false.into()); + let has_red_feather = VarModule::get_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN)<=0.0; + WorkModule::set_flag(fighter.module_accessor, !has_red_feather,*FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_FAIL); + WorkModule::set_flag(fighter.module_accessor, has_red_feather,vars::buddy::instance::SPECIAL_S_BEAKBOMB_ACTIVE); WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_SUPER_ARMOR); WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_SUPER_ARMOR_EQUIP); - fighter.sub_shift_status_main(L2CValue::Ptr(special_s_main_loop as *const () as _)) - -} -unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.sub_transition_group_check_air_cliff().get_bool() { - return 0.into(); + if has_red_feather { + VarModule::set_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN, super::super::opff::FEATHERS_RED_COOLDOWN_MAX); } - fighter.sub_exec_special_start_common_kinetic_setting(hash40("param_special_s").into()); - special_s_armor(fighter); - - if MotionModule::is_end(fighter.module_accessor) { - fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH.into(), false.into()); - return 0.into(); - } - 0.into() + original } unsafe extern "C" fn special_s_armor(fighter: &mut L2CFighterCommon) { @@ -116,54 +88,73 @@ unsafe extern "C" fn special_s_armor(fighter: &mut L2CFighterCommon) { pub unsafe extern "C" fn special_s_dash_pre(fighter: &mut L2CFighterCommon) -> L2CValue{ if (fighter.is_situation(*SITUATION_KIND_GROUND) && fighter.is_prev_situation(*SITUATION_KIND_AIR)) { - fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL.into(), false.into()); - return true.into(); + fighter.set_status_kind_interrupt(*FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL); + return 1.into(); } - else if (fighter.is_situation(*SITUATION_KIND_AIR) ) - { - StatusModule::init_settings( - fighter.module_accessor, - app::SituationKind(*SITUATION_KIND_AIR), - *FIGHTER_KINETIC_TYPE_UNIQ, - *GROUND_CORRECT_KIND_AIR as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), - true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, - 0 - ); - - FighterStatusModuleImpl::set_fighter_status_data( - fighter.module_accessor, - false, - *FIGHTER_TREADED_KIND_NO_REAC, - false, - false, - false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW |*FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, - 0, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, - 0 - ); - return 0.into(); + else if (fighter.is_situation(*SITUATION_KIND_GROUND)) { + return smashline::original_status(Pre, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH)(fighter); } - return smashline::original_status(Pre, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH)(fighter); + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW |*FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + 0.into() } unsafe extern "C" fn special_s_dash_main(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - return smashline::original_status(Main, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH)(fighter); - } //Prevents losing a gold feather - WorkModule::add_int(fighter.module_accessor, 1, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_S_REMAIN); - + if fighter.is_situation(*SITUATION_KIND_AIR) { + WorkModule::add_int(fighter.module_accessor, 1, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_S_REMAIN); + } + VarModule::set_int(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_BOUNCE_TYPE,0); return smashline::original_status(Main, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH)(fighter); } +unsafe extern "C" fn special_s_dash_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_AIR) { + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_HIT_FIGHTER) + && !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) { + // VarModule::set_float(fighter.battle_object, vars::buddy::instance::SPECIAL_S_RED_FEATHER_COOLDOWN, 0.0); + // super::super::opff::buddy_meter_update_HUD(fighter, true); + // VarModule::set_int(fighter.battle_object, vars::buddy::instance::HUD_DISPLAY_TIME, 45); + // app::FighterUtil::flash_eye_info(fighter.module_accessor); + + VarModule::set_int(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_BOUNCE_TYPE, vars::buddy::instance::BOUNCE_TYPE_ATTACK); + fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_WALL.into(), false.into()); + } + } + + // Skip to end on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + fighter.change_status(FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + return 1.into(); + } + + return smashline::original_status(Exec, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH)(fighter); +} // FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL -pub unsafe extern "C" fn special_s_fail_pre(fighter: &mut L2CFighterCommon) -> L2CValue{ +pub unsafe extern "C" fn special_s_fail_init(fighter: &mut L2CFighterCommon) -> L2CValue { if (fighter.is_situation(*SITUATION_KIND_AIR)) { if VarModule::is_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_S_FAIL_ENABLE) @@ -186,35 +177,7 @@ pub unsafe extern "C" fn special_s_fail_pre(fighter: &mut L2CFighterCommon) -> L ground_brake, 0.0 ); - } - - StatusModule::init_settings( - fighter.module_accessor, - app::SituationKind(*SITUATION_KIND_NONE), - *FIGHTER_KINETIC_TYPE_UNIQ, - *GROUND_CORRECT_KIND_KEEP as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), - true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, - 0 - ); - - FighterStatusModuleImpl::set_fighter_status_data( - fighter.module_accessor, - false, - *FIGHTER_TREADED_KIND_NO_REAC, - false, - false, - false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, - *FIGHTER_STATUS_ATTR_START_TURN as u32, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, - 0 - ); - 0.into() } @@ -250,6 +213,24 @@ unsafe extern "C" fn special_s_end_pre(fighter: &mut L2CFighterCommon) -> L2CVal 0.into() } +unsafe extern "C" fn special_s_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + // Reduce speed on shield + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 || prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0 { + let shield_hit_end_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + shield_hit_end_speed_x * lr, + 0.0 + ); + } + + smashline::original_status(Main, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_END)(fighter) +} + // FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_WALL unsafe extern "C" fn special_s_wall_pre(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -282,16 +263,144 @@ unsafe extern "C" fn special_s_wall_pre(fighter: &mut L2CFighterCommon) -> L2CVa 0.into() } +unsafe extern "C" fn special_s_wall_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let original = smashline::original_status(Main, fighter, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_WALL)(fighter); + + let bounce_type = VarModule::get_int(fighter.battle_object, vars::buddy::instance::SPECIAL_S_BEAKBOMB_BOUNCE_TYPE); + if bounce_type == vars::buddy::instance::BOUNCE_TYPE_NORMAL || fighter.is_situation(*SITUATION_KIND_GROUND){ + return original; + } + + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_jump"), 0.0, 1.0, false, 0.0, false, false); + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_LANDING_HEAVY); + + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + 2.25 + ); + + let speed_x = PostureModule::lr(fighter.module_accessor) *-1.0; + let stable_x = PostureModule::lr(fighter.module_accessor) *-0.25; + let air_accel_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_mul"), 0); + let air_accel_x_add = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_add"), 0); + let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); + let air_brake_x = WorkModule::get_param_float(fighter.module_accessor, hash40("air_brake_x"), 0); + let accel_x_mul = 0.5; + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ); + sv_kinetic_energy!( + mul_x_accel_mul, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + accel_x_mul + ); + sv_kinetic_energy!( + mul_x_accel_add, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + accel_x_mul + ); + sv_kinetic_energy!( + set_stable_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + air_speed_x_stable, + 0.0 + ); + + KineticModule::enable_energy(fighter.module_accessor,*FIGHTER_KINETIC_ENERGY_ID_STOP); + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + ENERGY_STOP_RESET_TYPE_AIR_BRAKE, + speed_x, + 0.0, + 0.0, + 0.0, + 0.0 + ); + sv_kinetic_energy!( + set_brake, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + air_brake_x*2.0 + ); + sv_kinetic_energy!( + set_stable_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + stable_x + ); + + + fighter.sub_shift_status_main(L2CValue::Ptr(special_s_wall_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_s_wall_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 0.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(FIGHTER_STATUS_KIND_WAIT.into(), FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 1.into(); + } + let air_start = true;//MotionModule::motion_kind(fighter.module_accessor) == hash40("special_air_s_wall"); + if !air_start { + if fighter.is_situation(*SITUATION_KIND_AIR){ + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + } + return 0.into(); + } + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_S_FLAG_LANDING_HEAVY) { + WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING); + if fighter.is_situation(*SITUATION_KIND_GROUND) && fighter.is_prev_situation(*SITUATION_KIND_AIR) { + //if FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING enabled + fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); + } + //WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING); + } + if !StatusModule::is_changing(fighter.module_accessor) + && StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.sub_change_motion_by_situation(hash40("special_s_wall").into(), hash40("special_air_s_wall").into(), false.into()); + fighter.sub_change_kinetic_type_by_situation(FIGHTER_KINETIC_TYPE_GROUND_STOP.into(), FIGHTER_KINETIC_TYPE_AIR_STOP.into()); + fighter.sub_set_ground_correct_by_situation(true.into()); + } + + 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); - agent.status(Pre, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH, special_s_dash_pre); + //agent.status(Pre, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH, special_s_dash_pre); agent.status(Main, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH, special_s_dash_main); + agent.status(Exec, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_DASH, special_s_dash_exec); - agent.status(Pre, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL, special_s_fail_pre); + agent.status(Init, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_FAIL, special_s_fail_init); agent.status(Pre, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_END, special_s_end_pre); + agent.status(Main, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_END, special_s_end_main); agent.status(Pre, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_WALL, special_s_wall_pre); + agent.status(Main, *FIGHTER_BUDDY_STATUS_KIND_SPECIAL_S_WALL, special_s_wall_main); } \ No newline at end of file diff --git a/fighters/captain/Cargo.toml b/fighters/captain/Cargo.toml index 27ba503c1f..b8f83f13e0 100644 --- a/fighters/captain/Cargo.toml +++ b/fighters/captain/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/captain/src/acmd/aerials.rs b/fighters/captain/src/acmd/aerials.rs index ac1b42b593..f99bae7889 100644 --- a/fighters/captain/src/acmd/aerials.rs +++ b/fighters/captain/src/acmd/aerials.rs @@ -230,7 +230,7 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; frame(lua_state, 3.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("toer"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("toer"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 15.0); if is_excute(agent) { diff --git a/fighters/captain/src/acmd/other.rs b/fighters/captain/src/acmd/other.rs index b2696ba694..6bb6151d37 100644 --- a/fighters/captain/src/acmd/other.rs +++ b/fighters/captain/src/acmd/other.rs @@ -76,16 +76,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -96,10 +92,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { diff --git a/fighters/captain/src/acmd/specials.rs b/fighters/captain/src/acmd/specials.rs index c77b8329ba..d084a62c49 100644 --- a/fighters/captain/src/acmd/specials.rs +++ b/fighters/captain/src/acmd/specials.rs @@ -12,13 +12,13 @@ unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_CAPTAIN_STATUS_WORK_ID_FLAG_FALCON_PUNCH_GENERATE_BIRD); - ATTACK(agent, 0, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 25.0, 361, 59, 0, 93, 5.5, -2.5, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.5, 4.2, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 25.0, 361, 59, 0, 93, 5.5, -2.5, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.5, 4.2, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { - ATTACK(agent, 0, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 2.5, -3.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.0, 1.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 4.0, 5.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 2.5, -3.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.0, 1.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 4.0, 5.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } } frame(lua_state, 58.0); @@ -40,13 +40,13 @@ unsafe extern "C" fn game_specialnturn(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_CAPTAIN_STATUS_WORK_ID_FLAG_FALCON_PUNCH_GENERATE_BIRD); - ATTACK(agent, 0, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 5.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 17, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 28.0, 361, 65, 0, 85, 5.5, -2.5, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 17, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 5.5, 4.2, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 17, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 5.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 12, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 28.0, 361, 65, 0, 85, 5.5, -2.5, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 12, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 5.5, 4.2, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 12, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { - ATTACK(agent, 0, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 2.5, -3.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 17, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 5.0, 1.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 17, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 4.0, 5.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 17, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 2.5, -3.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 12, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 5.0, 1.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 12, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 28.0, 361, 65, 0, 85, 4.0, 5.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 12, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } } frame(lua_state, 53.0); @@ -77,13 +77,13 @@ unsafe extern "C" fn game_specialairn(agent: &mut L2CAgentBase) { if is_excute(agent) { KineticModule::add_speed(boma, &Vector3f::new(0.9, 2.4, 0.0)); WorkModule::on_flag(boma, *FIGHTER_CAPTAIN_STATUS_WORK_ID_FLAG_FALCON_PUNCH_GENERATE_BIRD); - ATTACK(agent, 0, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 5.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 22.0, 361, 59, 0, 93, 5.5, -2.5, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 5.5, 4.2, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 5.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 22.0, 361, 59, 0, 93, 5.5, -2.5, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 5.5, 4.2, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { - ATTACK(agent, 0, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 2.5, -3.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 5.0, 1.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 4.0, 5.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 2.5, -3.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 5.0, 1.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 22.0, 361, 59, 0, 93, 4.0, 5.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } } frame(lua_state, 57.0); @@ -115,13 +115,13 @@ unsafe extern "C" fn game_specialairnturn(agent: &mut L2CAgentBase) { if is_excute(agent) { KineticModule::add_speed(boma, &Vector3f::new(0.9, 2.4, 0.0)); WorkModule::on_flag(boma, *FIGHTER_CAPTAIN_STATUS_WORK_ID_FLAG_FALCON_PUNCH_GENERATE_BIRD); - ATTACK(agent, 0, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 25.0, 361, 59, 0, 93, 5.5, -2.5, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.5, 4.2, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 25.0, 361, 59, 0, 93, 5.5, -2.5, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.5, 4.2, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { - ATTACK(agent, 0, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 2.5, -3.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.0, 1.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 4.0, 5.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 2.5, -3.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 5.0, 1.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 25.0, 361, 59, 0, 93, 4.0, 5.0, 0.0, 2.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } } frame(lua_state, 53.0); diff --git a/fighters/captain/src/acmd/throws.rs b/fighters/captain/src/acmd/throws.rs index db533a5c9b..61ba7ac883 100644 --- a/fighters/captain/src/acmd/throws.rs +++ b/fighters/captain/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, 0.0, Some(0.0), Some(8.5), Some(7.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, 4.0, Some(0.0), Some(8.5), Some(7.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -29,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, 0.0, Some(0.0), Some(8.5), Some(11.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, 4.0, Some(0.0), Some(8.5), Some(11.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, -4.0, Some(0.0), Some(8.5), Some(-16.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, -5.0, Some(0.0), Some(8.5), Some(-16.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -64,7 +64,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 82, 135, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 83, 135, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 12.0); diff --git a/fighters/captain/src/lib.rs b/fighters/captain/src/lib.rs index faddf98c80..78ccc050bf 100644 --- a/fighters/captain/src/lib.rs +++ b/fighters/captain/src/lib.rs @@ -31,6 +31,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, consts::*, diff --git a/fighters/captain/src/status/special_lw.rs b/fighters/captain/src/status/special_lw.rs index c33f82520d..09e7c93dc6 100644 --- a/fighters/captain/src/status/special_lw.rs +++ b/fighters/captain/src/status/special_lw.rs @@ -61,7 +61,8 @@ unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2C return 0.into(); } if fighter.get_int(*FIGHTER_CAPTAIN_STATUS_WORK_ID_INT_FALCON_KICK_START_SITUATION) == *SITUATION_KIND_GROUND { - if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) { + // Skip to end on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { fighter.change_status(FIGHTER_CAPTAIN_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); return 0.into(); } @@ -103,7 +104,25 @@ unsafe extern "C" fn special_lw_end_init(fighter: &mut L2CFighterCommon) -> L2CV && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { return 0.into(); } - smashline::original_status(Init, fighter, *FIGHTER_CAPTAIN_STATUS_KIND_SPECIAL_LW_END)(fighter) + let ret = smashline::original_status(Init, fighter, *FIGHTER_CAPTAIN_STATUS_KIND_SPECIAL_LW_END)(fighter); + + // Reduce speed on shield + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if start_situation == *SITUATION_KIND_GROUND + && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND + && prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 || prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0 { + let shield_hit_end_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lw.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + shield_hit_end_speed_x * lr, + 0.0 + ); + } + + ret } unsafe extern "C" fn special_lw_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { diff --git a/fighters/chrom/Cargo.toml b/fighters/chrom/Cargo.toml index c50ab1b3d6..b15dfe15fe 100644 --- a/fighters/chrom/Cargo.toml +++ b/fighters/chrom/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/chrom/src/acmd/aerials.rs b/fighters/chrom/src/acmd/aerials.rs index 5be997e7a0..e587e784a7 100644 --- a/fighters/chrom/src/acmd/aerials.rs +++ b/fighters/chrom/src/acmd/aerials.rs @@ -9,15 +9,16 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clavicler"), 4.0, 78, 50, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 4.0, 78, 50, 0, 45, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 4.0, 78, 50, 0, 45, 3.5, 2.0, 0.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("clavicler"), 4.0, 78, 30, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 4.0, 78, 30, 0, 45, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 4.0, 78, 30, 0, 45, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 8.0); FT_MOTION_RATE_RANGE(agent, 8.0, 11.0, 2.0); frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 1.0); + FT_MOTION_RATE_RANGE(agent, 11.0, 12.0, 2.0); frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -27,8 +28,8 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 17.0, 18.25, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("clavicler"), 7.0, 62, 100, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 62, 100, 0, 50, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 7.0, 62, 100, 0, 50, 3.5, 2.0, 0.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 62, 100, 0, 50, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 7.0, 62, 100, 0, 50, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 18.25); FT_MOTION_RATE_RANGE(agent, 18.25, 19.0, 1.0); @@ -92,7 +93,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clavicler"), 11.0, 361, 80, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("clavicler"), 11.0, 361, 80, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 11.0, 361, 80, 0, 45, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword2"), 11.0, 361, 80, 0, 45, 3.5, -2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } @@ -100,16 +101,17 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clavicler"), 9.0, 60, 80, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 60, 80, 0, 45, 3.5, -2.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 60, 80, 0, 45, 3.5, -2.0, 0.0, 6.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("clavicler"), 9.0, 361, 80, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 361, 80, 0, 20, 3.5, -2.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 361, 80, 0, 20, 3.5, -2.0, 0.0, 6.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } - frame(lua_state, 19.0); + frame(lua_state, 18.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 23.0); FT_MOTION_RATE_RANGE(agent, 23.0, 35.0, 15.0); + frame(lua_state, 27.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -124,7 +126,7 @@ unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { if is_excute(agent) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_chrom_sword_hdr"), Hash40::new("tex_chrom_sword2"), 6, Hash40::new("sword1"), 0, 0, 1.65, Hash40::new("sword1"), -0.0, -0.0, 12.4, true, Hash40::new("chrom_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.2, 0.2); } - frame(lua_state, 18.0); + frame(lua_state, 17.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 3); } @@ -172,20 +174,21 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 7.8); FT_MOTION_RATE_RANGE(agent, 7.8, 11.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clavicler"), 15.0, 42, 95, 0, 34, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 15.0, 42, 95, 0, 34, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 15.0, 42, 95, 0, 34, 3.5, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 15.0, 42, 95, 0, 34, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 15.0, 42, 95, 0, 34, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 15.0, 42, 95, 0, 34, 3.5, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 9.675); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clavicler"), 12.0, 42, 95, 0, 34, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 12.0, 42, 95, 0, 34, 3.5, 2.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 42, 95, 0, 34, 3.5, 2.0, 0.0, 6.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("clavicler"), 13.0, 56, 95, 0, 38, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 13.0, 56, 95, 0, 38, 3.5, 2.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 56, 95, 0, 38, 3.5, 2.0, 0.0, 6.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 11.0); FT_MOTION_RATE_RANGE(agent, 11.0, 16.0, 2.0); frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 17.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -237,22 +240,22 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clavicler"), 9.0, 65, 90, 0, 60, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 65, 90, 0, 60, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 65, 90, 0, 60, 3.5, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("clavicler"), 9.0, 68, 90, 0, 60, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 68, 90, 0, 60, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 68, 90, 0, 60, 3.5, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clavicler"), 7.0, 65, 110, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 65, 110, 0, 45, 3.5, 2.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 7.0, 65, 110, 0, 45, 3.5, 2.0, 0.0, 6.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("clavicler"), 7.0, 68, 110, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 68, 110, 0, 45, 3.5, 2.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 7.0, 68, 110, 0, 45, 3.5, 2.0, 0.0, 6.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clavicler"), 7.0, 80, 110, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 80, 110, 0, 45, 3.5, 2.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 7.0, 80, 110, 0, 45, 3.5, 2.0, 0.0, 6.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("clavicler"), 7.0, 83, 110, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 83, 110, 0, 45, 3.5, 2.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 7.0, 83, 110, 0, 45, 3.5, 2.0, 0.0, 6.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 13.0); if is_excute(agent) { diff --git a/fighters/chrom/src/acmd/ground.rs b/fighters/chrom/src/acmd/ground.rs index 321cdee57e..1a235d3492 100644 --- a/fighters/chrom/src/acmd/ground.rs +++ b/fighters/chrom/src/acmd/ground.rs @@ -6,21 +6,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 5.0); - // ground - early hit only hits ground to avoid infinite looping - ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 81, 35, 0, 75, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword1"), 7.0, 81, 35, 0, 75, 3.5, 2.0, 0.0, 1.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 7.0, 81, 35, 0, 75, 3.5, 2.0, 0.0, 7.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - - // air - ATTACK(agent, 3, 0, Hash40::new("armr"), 7.0, 64, 60, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword1"), 7.0, 64, 60, 0, 50, 3.5, 2.0, 0.0, 1.75, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("sword1"), 7.0, 64, 60, 0, 50, 3.5, 2.0, 0.0, 7.75, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - } - frame(lua_state, 6.0); - if is_excute(agent) { - AttackModule::clear(boma, 0, false); - AttackModule::clear(boma, 1, false); - AttackModule::clear(boma, 2, false); + ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 64, 60, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword1"), 7.0, 64, 60, 0, 50, 3.5, 2.0, 0.0, 1.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 7.0, 64, 60, 0, 50, 3.5, 2.0, 0.0, 7.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 9.0); if is_excute(agent) { @@ -51,13 +39,19 @@ unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 6.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.25); + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 361, 93, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword1"), 13.0, 361, 93, 0, 45, 3.5, 2.0, 0.0, 1.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 13.0, 361, 93, 0, 45, 3.5, 2.0, 0.0, 7.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 45, 100, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword1"), 13.0, 45, 100, 0, 30, 3.5, 2.0, 0.0, 1.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 13.0, 45, 100, 0, 30, 3.5, 2.0, 0.0, 7.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } - frame(lua_state, 17.0); + frame(lua_state, 16.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } diff --git a/fighters/chrom/src/acmd/other.rs b/fighters/chrom/src/acmd/other.rs index 5f8de0200b..a884bf8f5a 100644 --- a/fighters/chrom/src/acmd/other.rs +++ b/fighters/chrom/src/acmd/other.rs @@ -89,16 +89,12 @@ unsafe extern "C" fn game_appeallwl(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -109,10 +105,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/chrom/src/acmd/smashes.rs b/fighters/chrom/src/acmd/smashes.rs index 03252a4e13..8679a130ee 100644 --- a/fighters/chrom/src/acmd/smashes.rs +++ b/fighters/chrom/src/acmd/smashes.rs @@ -89,9 +89,9 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 14.0, 80, 85, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 80, 85, 0, 70, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 80, 85, 0, 70, 3.5, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 14.0, 80, 87, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 80, 87, 0, 70, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 80, 87, 0, 70, 3.5, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 11.0); if is_excute(agent) { @@ -108,6 +108,15 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); sv_kinetic_energy!(reset_energy, agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + let air_speed_x_stable = agent.get_param_float("air_speed_x_stable", ""); + let jump_stable_speed_x_mul = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_attack_hi4.jump_stable_speed_x_mul"); + sv_kinetic_energy!( + set_stable_speed, + agent, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + air_speed_x_stable * jump_stable_speed_x_mul, + 0.0 + ); } } @@ -182,9 +191,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 6.1); FT_MOTION_RATE_RANGE(agent, 6.1, 8.5, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 14.0, 40, 90, 0, 42, 3.5, -1.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword1"), 14.0, 40, 90, 0, 42, 3.5, 2.0, 0.0, 1.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 14.0, 40, 90, 0, 42, 3.5, 2.0, 0.0, 7.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 14.0, 40, 90, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 14.0, 40, 90, 0, 40, 3.0, -1.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 14.0, 40, 90, 0, 40, 3.5, 2.0, 0.0, 1.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword1"), 14.0, 40, 90, 0, 40, 3.5, 2.0, 0.0, 7.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 8.5); @@ -199,9 +209,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 40, 90, 0, 42, 3.5, -1.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword1"), 12.0, 40, 90, 0, 42, 3.5, 2.0, 0.0, 1.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 12.0, 40, 90, 0, 42, 3.5, 2.0, 0.0, 7.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 12.0, 40, 90, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 12.0, 40, 90, 0, 40, 3.0, -1.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 12.0, 40, 90, 0, 40, 3.5, 2.0, 0.0, 1.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword1"), 12.0, 40, 90, 0, 40, 3.5, 2.0, 0.0, 7.75, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 23.0); diff --git a/fighters/chrom/src/acmd/specials/special_hi.rs b/fighters/chrom/src/acmd/specials/special_hi.rs index c99cbe2203..a70e0e64e7 100644 --- a/fighters/chrom/src/acmd/specials/special_hi.rs +++ b/fighters/chrom/src/acmd/specials/special_hi.rs @@ -65,7 +65,9 @@ pub unsafe extern "C" fn effect_specialhi1(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false); + } EFFECT_FOLLOW(agent, Hash40::new("chrom_tenku_line"), Hash40::new("top"), 0, 8, 0, 0, 0, 0, 1, true); LAST_EFFECT_SET_ALPHA(agent, 0.95); EffectModule::enable_sync_init_pos_last(boma); @@ -136,6 +138,14 @@ pub unsafe extern "C" fn effect_specialhi3start(agent: &mut L2CAgentBase) { } } +pub unsafe extern "C" fn game_specialhi3start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + } +} + pub unsafe extern "C" fn sound_specialhi3start(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -149,17 +159,20 @@ pub unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + // doesn't hit ground. this hitbox is exclusively to catch aerial opponents that got hit by the rising hitbox ATTACK(agent, 0, 0, Hash40::new("rot"), 1.1, 366, 100, 50, 0, 10.0, 0.0, 2.0, 2.25, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("rot"), 1.1, 20, 50, 125, 50, 10.0, 0.0, 2.0, 2.25, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); AttackModule::set_no_finish_camera_ex(boma, 0, true, false); - AttackModule::set_no_finish_camera_ex(boma, 1, true, false); } frame(lua_state, 5.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); - AttackModule::set_size(boma, 0, 8.0); - AttackModule::set_size(boma, 1, 8.0); + ATTACK(agent, 0, 0, Hash40::new("rot"), 1.1, 366, 100, 50, 0, 8.0, 0.0, 2.0, 2.25, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("rot"), 1.1, 20, 50, 125, 50, 8.0, 0.0, 2.0, 2.25, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + AttackModule::set_no_damage_fly_smoke_all(boma, true, false); + AttackModule::set_no_finish_camera_ex(boma, 0, true, false); + AttackModule::set_no_finish_camera_ex(boma, 1, true, false); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); } } @@ -288,7 +301,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_specialhi2", acmd_stub, Priority::Low); agent.acmd("expression_specialhi2", acmd_stub, Priority::Low); - agent.acmd("game_specialhi3start", acmd_stub, Priority::Low); + agent.acmd("game_specialhi3start", game_specialhi3start, Priority::Low); agent.acmd("sound_specialhi3start", sound_specialhi3start, Priority::Low); agent.acmd("effect_specialhi3start", effect_specialhi3start, Priority::Low); agent.acmd("expression_specialhi3start", acmd_stub, Priority::Low); diff --git a/fighters/chrom/src/acmd/specials/special_lw.rs b/fighters/chrom/src/acmd/specials/special_lw.rs index 75f55b3238..5707bc3fcd 100644 --- a/fighters/chrom/src/acmd/specials/special_lw.rs +++ b/fighters/chrom/src/acmd/specials/special_lw.rs @@ -143,11 +143,11 @@ unsafe extern "C" fn game_speciallwhit(agent: &mut L2CAgentBase) { frame(lua_state, 4.5); FT_MOTION_RATE_RANGE(agent, 4.5, 5.0, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 14.0, 55, 80, 0, 70, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 55, 80, 0, 70, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 55, 80, 0, 70, 5.0, 0.0, 0.0, 5.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 14.0, 40, 80, 0, 75, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 40, 80, 0, 75, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 40, 80, 0, 75, 5.0, 0.0, 0.0, 5.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); // big fallback hitbox - ATTACK(agent, 3, 0, Hash40::new("top"), 14.0, 55, 80, 0, 70, 8.5, 0.0, 8.0, 12.5, Some(0.0), Some(8.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 14.0, 40, 80, 0, 75, 8.5, 0.0, 8.0, 12.5, Some(0.0), Some(8.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 5.0); FT_MOTION_RATE(agent, 1.0); diff --git a/fighters/chrom/src/acmd/specials/special_s/special_s3.rs b/fighters/chrom/src/acmd/specials/special_s/special_s3.rs index 14967505a9..4db72d7990 100644 --- a/fighters/chrom/src/acmd/specials/special_s/special_s3.rs +++ b/fighters/chrom/src/acmd/specials/special_s/special_s3.rs @@ -17,9 +17,9 @@ unsafe extern "C" fn game_specials3s(agent: &mut L2CAgentBase) { frame(lua_state, 4.0); if is_excute(agent) { ADD_SPEED_NO_LIMIT(agent, 1.2, 0); - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 45, 31, 0, 58, 5.5, 0.0, 9.0, 7.0, Some(0.0), Some(9.0), Some(7.0), 1.0, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 50, 31, 0, 58, 6.5, 0.0, 9.0, 11.0, Some(0.0), Some(11.0), Some(11.0), 1.0, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 55, 31, 0, 58, 5.5, 0.0, 9.0, 16.0, Some(0.0), Some(11.5), Some(16.0), 1.0, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 53, 31, 0, 50, 5.0, 0.0, 7.5, 6.0, Some(0.0), Some(9.5), Some(6.0), 1.0, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 58, 31, 0, 50, 5.5, 0.0, 8.0, 11.0, Some(0.0), Some(11.5), Some(11.0), 1.0, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 63, 31, 0, 50, 5.5, 0.0, 9.0, 16.0, Some(0.0), Some(11.5), Some(16.0), 1.0, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } for _ in 0..3 { wait(lua_state, 1.0); @@ -36,7 +36,7 @@ unsafe extern "C" fn game_specials3s(agent: &mut L2CAgentBase) { KineticModule::mul_speed(boma, &Vector3f::new(0.8, 1.0, 1.0), *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); } } - wait(lua_state, 4.0); + wait(lua_state, 1.0); if is_excute(agent) { if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) && !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_PARRY) { @@ -142,7 +142,8 @@ unsafe extern "C" fn effect_specials3lw(agent: &mut L2CAgentBase) { } frame(lua_state, 4.5); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("chrom_mc_3lw_hdr"), Hash40::new("top"), -0.0, 0, 0, 0, 0, 0, 1, true); EffectModule::set_disable_render_offset_last(boma); + EFFECT_FOLLOW(agent, Hash40::new("chrom_mc_3lw_hdr"), Hash40::new("top"), -0.0, 0, 0, 0, 0, 0, 1, true); + EffectModule::set_disable_render_offset_last(boma); LAST_EFFECT_SET_RATE(agent, 0.8); } frame(lua_state, 5.0); diff --git a/fighters/chrom/src/acmd/specials/special_s/special_s4.rs b/fighters/chrom/src/acmd/specials/special_s/special_s4.rs index c08d97ff70..bce775698f 100644 --- a/fighters/chrom/src/acmd/specials/special_s/special_s4.rs +++ b/fighters/chrom/src/acmd/specials/special_s/special_s4.rs @@ -11,25 +11,19 @@ unsafe extern "C" fn game_specials4hi(agent: &mut L2CAgentBase) { frame(lua_state, 4.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ADD_SPEED_NO_LIMIT(agent, 0.5, 0); + ADD_SPEED_NO_LIMIT(agent, 1.2, 0); } frame(lua_state, 6.0); if is_excute(agent) { - // GROUND - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 84, 34, 0, 91, 4.0, 0.0, 6.0, 11.0, Some(0.0), Some(24.0), Some(11.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 84, 34, 0, 91, 4.0, 0.0, 10.0, 16.0, Some(0.0), Some(24.0), Some(16.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 11.0, 84, 34, 0, 91, 4.0, 0.0, 24.0, 11.0, Some(0.0), Some(28.0), Some(4.5), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 11.0, 84, 34, 0, 91, 4.0, 0.0, 24.0, 16.0, Some(0.0), Some(30.5), Some(7.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - // AIR - has worse angle to discourage looping - ATTACK(agent, 4, 0, Hash40::new("top"), 11.0, 81, 34, 0, 91, 4.0, 0.0, 6.0, 11.0, Some(0.0), Some(24.0), Some(11.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("top"), 11.0, 81, 34, 0, 91, 4.0, 0.0, 10.0, 16.0, Some(0.0), Some(24.0), Some(16.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 6, 0, Hash40::new("top"), 11.0, 81, 34, 0, 91, 4.0, 0.0, 24.0, 11.0, Some(0.0), Some(28.0), Some(4.5), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 7, 0, Hash40::new("top"), 11.0, 81, 34, 0, 91, 4.0, 0.0, 24.0, 16.0, Some(0.0), Some(30.5), Some(7.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 84, 34, 0, 91, 4.0, 0.0, 6.0, 11.0, Some(0.0), Some(24.0), Some(11.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 84, 34, 0, 91, 4.0, 0.0, 10.0, 16.0, Some(0.0), Some(24.0), Some(16.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 11.0, 84, 34, 0, 91, 4.0, 0.0, 24.0, 11.0, Some(0.0), Some(28.0), Some(4.5), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 11.0, 84, 34, 0, 91, 4.0, 0.0, 24.0, 16.0, Some(0.0), Some(30.5), Some(7.0), 1.2, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } for _ in 0..5 { wait(lua_state, 1.0); if is_excute(agent) { - KineticModule::mul_speed(boma, &Vector3f::new(0.9, 1.0, 1.0), *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + KineticModule::mul_speed(boma, &Vector3f::new(0.85, 1.0, 1.0), *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); } } frame(lua_state, 12.0); @@ -136,11 +130,11 @@ unsafe extern "C" fn game_specials4s(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - ADD_SPEED_NO_LIMIT(agent, 4.0, 0); - ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 55, 74, 0, 60, 5.0, 0.0, 9.0, 5.0, None, None, None, 1.35, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 55, 74, 0, 60, 7.0, 0.0, 9.0, 7.5, None, None, None, 1.35, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 16.0, 55, 74, 0, 60, 8.0, 0.0, 9.0, 11.7, None, None, None, 1.35, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 16.0, 55, 74, 0, 60, 7.0, 0.0, 9.0, 15.5, None, None, None, 1.35, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ADD_SPEED_NO_LIMIT(agent, 3.0, 0); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 55, 74, 0, 60, 5.0, 0.0, 9.0, 5.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 55, 74, 0, 60, 7.0, 0.0, 9.0, 7.5, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 16.0, 55, 74, 0, 60, 8.0, 0.0, 9.0, 11.7, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 16.0, 55, 74, 0, 60, 7.0, 0.0, 9.0, 15.5, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); } for _ in 0..4 { wait(lua_state, 1.0); diff --git a/fighters/chrom/src/acmd/throws.rs b/fighters/chrom/src/acmd/throws.rs index 2ee2e6ab4d..972047b636 100644 --- a/fighters/chrom/src/acmd/throws.rs +++ b/fighters/chrom/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(12.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 7.0, Some(0.0), Some(8.0), Some(12.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -53,7 +53,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -4.0, Some(0.0), Some(7.0), Some(-12.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -5.0, Some(0.0), Some(7.0), Some(-12.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/chrom/src/acmd/tilts.rs b/fighters/chrom/src/acmd/tilts.rs index 1dbbcc3060..1096ab6c0d 100644 --- a/fighters/chrom/src/acmd/tilts.rs +++ b/fighters/chrom/src/acmd/tilts.rs @@ -144,17 +144,24 @@ unsafe extern "C" fn expression_attackhi3(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 6.0); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 70, 49, 0, 44, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 70, 49, 0, 44, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 7.0, 70, 49, 0, 44, 3.5, 0.0, 0.0, 6.0, None, None, None, 1.25, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.0, 48, 40, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0, 48, 40, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 11.0, 84, 40, 0, 80, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 11.0, 88, 40, 0, 80, 3.5, 0.0, 0.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 10.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 0.8); } unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { diff --git a/fighters/chrom/src/lib.rs b/fighters/chrom/src/lib.rs index cd2502d225..db1a728e3a 100644 --- a/fighters/chrom/src/lib.rs +++ b/fighters/chrom/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, consts::*, diff --git a/fighters/chrom/src/status/special_hi.rs b/fighters/chrom/src/status/special_hi.rs index e86db97723..b25541fb87 100644 --- a/fighters/chrom/src/status/special_hi.rs +++ b/fighters/chrom/src/status/special_hi.rs @@ -2,55 +2,46 @@ use super::*; pub unsafe extern "C" fn special_hi_common_init(fighter: &mut L2CFighterCommon, status_kind: i32) { GroundModule::select_cliff_hangdata(fighter.module_accessor,*FIGHTER_CLIFF_HANG_DATA_DEFAULT as u32); //hmmm - let mut param_accel_x_mul = 0.0;//hash40("air_accel_x_mul") - let mut param_speed_x_max_mul = 0.0;//hash40("air_accel_x_add") - if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) { - param_accel_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.rise_accel_x_mul"); - param_speed_x_max_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.rise_speed_x_max_mul"); - } - else if fighter.is_status(statuses::chrom::SPECIAL_HI_FLIP) { - param_accel_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.flip_accel_x_mul"); - param_speed_x_max_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.flip_speed_x_max_mul"); - } - else { - param_accel_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.dive_accel_x_mul"); - param_speed_x_max_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.dive_speed_x_max_mul"); - } - let accel_x_mul = param_accel_x_mul; - let speed_x_max_mul = param_speed_x_max_mul; - let air_accel_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_mul"), 0); - let air_accel_x_add = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_add"), 0); - let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); - - if !KineticModule::is_enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL) { - let mut speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + + if !fighter.is_status(statuses::chrom::SPECIAL_HI_DIVE) { + let mut param_accel_x_mul = 0.0;//hash40("air_accel_x_mul") + let mut param_speed_x_max_mul = 0.0;//hash40("air_accel_x_add") if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) { - let lr = PostureModule::lr(fighter.module_accessor); - let rise_speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.rise_speed_x_mul"); - speed_x = ControlModule::get_stick_x(fighter.module_accessor) * lr * rise_speed_x_mul; + param_accel_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.rise_accel_x_mul"); + param_speed_x_max_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.rise_speed_x_max_mul"); } - else if fighter.is_status(statuses::chrom::SPECIAL_HI_DIVE) /*&& USE_MOTION_ANGLE*/ { - let lr = PostureModule::lr(fighter.module_accessor); - let control_x = WorkModule::get_float(fighter.module_accessor, *FIGHTER_ROY_STATUS_SPECIAL_HI_WORK_FLOAT_STICK_CONTROL_ANGLE); - speed_x = air_speed_x_stable.abs() * control_x * 0.75 * lr; - speed_x = if (lr > 0.0) { speed_x.max(0.0) } else { speed_x.min(0.0) }; + else if fighter.is_status(statuses::chrom::SPECIAL_HI_FLIP) { + param_accel_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.flip_accel_x_mul"); + param_speed_x_max_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.flip_speed_x_max_mul"); } + let accel_x_mul = param_accel_x_mul; + let speed_x_max_mul = param_speed_x_max_mul; + let air_accel_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_mul"), 0); + let air_accel_x_add = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_add"), 0); + let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); + + if !KineticModule::is_enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL) { + let mut speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) { + let lr = PostureModule::lr(fighter.module_accessor); + let rise_speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.rise_speed_x_mul"); + speed_x = ControlModule::get_stick_x(fighter.module_accessor) * lr * rise_speed_x_mul; + } - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - sv_kinetic_energy!( - reset_energy, - fighter, - FIGHTER_KINETIC_ENERGY_ID_CONTROL, - ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, - speed_x, - 0.0, 0.0, 0.0, 0.0 - ); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, + speed_x, + 0.0, 0.0, 0.0, 0.0 + ); + } + sv_kinetic_energy!(controller_set_accel_x_mul, fighter, air_accel_x_mul * accel_x_mul); + sv_kinetic_energy!(controller_set_accel_x_add, fighter, air_accel_x_add * accel_x_mul); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * speed_x_max_mul, 0.0); } - sv_kinetic_energy!(controller_set_accel_x_mul, fighter, air_accel_x_mul * accel_x_mul); - sv_kinetic_energy!(controller_set_accel_x_add, fighter, air_accel_x_add * accel_x_mul); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * speed_x_max_mul, 0.0); - WorkModule::set_float(fighter.module_accessor, accel_x_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_MUL_FALL_X_ACCEL); - WorkModule::set_float(fighter.module_accessor, speed_x_max_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_SPECIAL_HI, *FIGHTER_STATUS_KIND_FALL_SPECIAL]) { return; @@ -267,12 +258,18 @@ pub unsafe extern "C" fn special_hi_exit(fighter: &mut L2CFighterCommon) -> L2CV } pub unsafe extern "C" fn special_hi_2_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + let cliff_check_kind = if fighter.is_status(statuses::chrom::SPECIAL_HI_DIVE) { + *GROUND_CLIFF_CHECK_KIND_NONE + } else { + *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES + }; + StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_AIR), *FIGHTER_KINETIC_TYPE_UNIQ, *GROUND_CORRECT_KIND_AIR as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES), + app::GroundCliffCheckKind(cliff_check_kind), true, *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, @@ -332,7 +329,7 @@ pub unsafe extern "C" fn special_hi_2_main_loop(fighter: &mut L2CFighterCommon) // } // HI_DIVE check - if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + if ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi_3_start"), 0.0, 1.0, false, 0.0, false, false); VarModule::off_flag(fighter.battle_object, vars::chrom::status::SPECIAL_HI_DIVE_ENABLE); VarModule::on_flag(fighter.battle_object, vars::chrom::status::SPECIAL_HI_DIVE_START); diff --git a/fighters/chrom/src/status/special_lw.rs b/fighters/chrom/src/status/special_lw.rs index 0bc8b82b5a..c4b18d41c3 100644 --- a/fighters/chrom/src/status/special_lw.rs +++ b/fighters/chrom/src/status/special_lw.rs @@ -208,6 +208,12 @@ unsafe extern "C" fn special_lw_hit_main_loop(fighter: &mut L2CFighterCommon) -> return false.into(); } + // Reduce speed on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + let shield_hit_speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lw.shield_hit_speed_x_mul"); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, shield_hit_speed_x_mul); + } + if fighter.sub_transition_group_check_air_cliff().get_bool() { return true.into() } diff --git a/fighters/chrom/src/status/special_s.rs b/fighters/chrom/src/status/special_s.rs index ad1086eca3..4a2646df34 100644 --- a/fighters/chrom/src/status/special_s.rs +++ b/fighters/chrom/src/status/special_s.rs @@ -67,11 +67,30 @@ unsafe extern "C" fn special_s3_check_attack(fighter: &mut L2CFighterCommon, par let object_id = (¶m_3["object_id_"]).get_u32(); let opponent_boma = sv_battle_object::module_accessor(object_id); let opponent_object = utils::util::get_battle_object_from_accessor(opponent_boma); - VarModule::on_flag(opponent_object, vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::on_flag(opponent_object, vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); } return false.into(); } +pub unsafe extern "C" fn special_s4_end(fighter: &mut L2CFighterCommon) -> L2CValue { + // Allows the dash to transition into run instead of walk forward + let lr = PostureModule::lr(fighter.module_accessor); + let run_stick_x = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("run_stick_x")); + let next_status = fighter.global_table[STATUS_KIND].get_i32(); + if fighter.is_situation(*SITUATION_KIND_GROUND) + && fighter.is_motion(Hash40::new("special_s4_lw")) + && fighter.left_stick_x() * lr >= run_stick_x + && [ + *FIGHTER_STATUS_KIND_WALK, + *FIGHTER_STATUS_KIND_DASH, + ].contains(&next_status) { + let dash_speed = WorkModule::get_param_float(fighter.module_accessor, hash40("dash_speed"), 0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, dash_speed * lr); + fighter.change_status(FIGHTER_STATUS_KIND_RUN.into(), false.into()); + } + smashline::original_status(End, fighter, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S4)(fighter) +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S2, special_s_pre); agent.status(Init, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S2, special_s_init); @@ -85,4 +104,5 @@ pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S4, special_s_pre); agent.status(Init, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S4, special_s_init); agent.status(Exec, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S4, special_s_exec); + agent.status(End, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S4, special_s4_end); } \ No newline at end of file diff --git a/fighters/cloud/Cargo.toml b/fighters/cloud/Cargo.toml index cb434de08d..b98f039669 100644 --- a/fighters/cloud/Cargo.toml +++ b/fighters/cloud/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/cloud/src/acmd/aerials.rs b/fighters/cloud/src/acmd/aerials.rs index cb51632947..18c1c9162d 100644 --- a/fighters/cloud/src/acmd/aerials.rs +++ b/fighters/cloud/src/acmd/aerials.rs @@ -13,10 +13,10 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); FT_MOTION_RATE_RANGE(agent, 6.0, 21.0, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 361, 70, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 60, 70, 0, 40, 4.0, 0.0, 4.5, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 60, 70, 0, 40, 4.0, 0.0, 9.0, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 9.0, 361, 70, 0, 40, 4.0, 0.0, 13.5, -1.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 361, 70, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 60, 70, 0, 40, 4.0, 0.0, 4.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 60, 70, 0, 40, 4.0, 0.0, 9.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 9.0, 361, 70, 0, 40, 4.0, 0.0, 13.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 21.0); FT_MOTION_RATE(agent, 1.0); @@ -64,20 +64,20 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 17.4); FT_MOTION_RATE_RANGE(agent, 17.4, 19.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("handr"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 4.5, -1.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 9.0, -1.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("haver"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 13.5, -1.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("handr"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 4.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 9.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("haver"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 13.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 17.9); if is_excute(agent) { // spike hitbox is enabled after the first active frame - ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("handr"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("handr"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 14.0, 270, 66, 0, 20, 4.0, 0.0, 4.5, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("haver"), 14.0, 270, 66, 0, 20, 4.0, 0.0, 9.0, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("haver"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 13.5, -1.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("haver"), 13.0, 45, 95, 0, 30, 4.0, 0.0, 13.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 19.0); FT_MOTION_RATE(agent, 1.0); @@ -149,10 +149,10 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 10.5); FT_MOTION_RATE_RANGE(agent, 10.5, 15.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("claviclec"), 11.0, 361, 111, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("claviclec"), 11.0, 361, 111, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("haver"), 13.0, 361, 111, 0, 20, 4.0, 0.0, 4.5, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 13.0, 361, 111, 0, 20, 4.0, 0.0, 9.0, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 11.0, 361, 111, 0, 20, 4.0, 0.0, 13.5, -1.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 11.0, 361, 111, 0, 20, 4.0, 0.0, 13.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); @@ -203,15 +203,15 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 11.0, 72, 80, 0, 45, 4.0, 0.0, 4.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 72, 80, 0, 45, 4.0, 0.0, 9.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 72, 80, 0, 45, 4.0, 0.0, 13.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 11.0, 75, 80, 0, 45, 4.0, 0.0, 4.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 75, 80, 0, 45, 4.0, 0.0, 9.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 75, 80, 0, 45, 4.0, 0.0, 13.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 75, 80, 0, 45, 3.0, 0.0, 3.5, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 75, 80, 0, 45, 3.0, 0.0, 9.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 75, 80, 0, 45, 3.0, 0.0, 14.5, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 78, 80, 0, 45, 3.0, 0.0, 3.5, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 78, 80, 0, 45, 3.0, 0.0, 9.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 78, 80, 0, 45, 3.0, 0.0, 14.5, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 21.0); if is_excute(agent) { diff --git a/fighters/cloud/src/acmd/ground.rs b/fighters/cloud/src/acmd/ground.rs index a006f3c9bc..bdfbe1107f 100644 --- a/fighters/cloud/src/acmd/ground.rs +++ b/fighters/cloud/src/acmd/ground.rs @@ -47,7 +47,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 55, 25, 0, 35, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("kneer"), 3.0, 55, 25, 0, 35, 2.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 3, 0, Hash40::new("kneer"), 3.0, 55, 25, 0, 30, 2.5, 6.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 2.0, 361, 25, 0, 35, 3.0, 0.0, 4.5, 3.0, Some(0.0), Some(4.5), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_down_only(boma, 4, true); } @@ -55,7 +55,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 9.0); + frame(lua_state, 10.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } diff --git a/fighters/cloud/src/acmd/other.rs b/fighters/cloud/src/acmd/other.rs index e2966e9be6..50a827bc3b 100644 --- a/fighters/cloud/src/acmd/other.rs +++ b/fighters/cloud/src/acmd/other.rs @@ -83,15 +83,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -101,10 +97,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { diff --git a/fighters/cloud/src/acmd/smashes.rs b/fighters/cloud/src/acmd/smashes.rs index 7fc75e05e2..35279e91b4 100644 --- a/fighters/cloud/src/acmd/smashes.rs +++ b/fighters/cloud/src/acmd/smashes.rs @@ -137,7 +137,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 14.2, 15.6, 1.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("claviclec"), 11.0, 83, 106, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("claviclec"), 11.0, 83, 106, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("haver"), 13.0, 83, 106, 0, 50, 4.0, 0.0, 4.5, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 13.0, 83, 106, 0, 50, 4.0, 0.0, 9.0, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("haver"), 13.0, 83, 106, 0, 50, 4.0, 0.0, 13.5, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); diff --git a/fighters/cloud/src/acmd/specials/specialhi.rs b/fighters/cloud/src/acmd/specials/specialhi.rs index 60570afab1..e148fb3cf6 100644 --- a/fighters/cloud/src/acmd/specials/specialhi.rs +++ b/fighters/cloud/src/acmd/specials/specialhi.rs @@ -17,10 +17,10 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 0, 0, Hash40::new("clavicler"),11.5, 80, 70, 0, 80, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 13.0, 80, 70, 0, 80, 4.0, 0.0, 4.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 13.0, 80, 70, 0, 80, 4.0, 0.0, 9.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 11.5, 80, 70, 0, 80, 4.0, 0.0, 13.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("clavicler"),11.0, 80, 70, 0, 80, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 80, 70, 0, 80, 4.0, 0.0, 4.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 80, 70, 0, 80, 4.0, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 11.0, 80, 70, 0, 80, 4.0, 0.0, 13.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 8.0); if is_excute(agent) { diff --git a/fighters/cloud/src/acmd/specials/specialn.rs b/fighters/cloud/src/acmd/specials/specialn.rs index 66642207be..de304a7706 100644 --- a/fighters/cloud/src/acmd/specials/specialn.rs +++ b/fighters/cloud/src/acmd/specials/specialn.rs @@ -3,19 +3,15 @@ use super::*; unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 10.0); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::cloud::status::SPECIAL_N_HOLD); - } - frame(lua_state, 8.0); - if is_excute(agent) { + agent.on_flag(*FIGHTER_CLOUD_STATUS_WORK_ID_SPECIAL_N_FLAG_SPECIAL_FALL); if VarModule::is_flag(agent.battle_object, vars::cloud::status::SPECIAL_N_HOLD) { - MotionModule::set_rate(boma, 0.25); + MotionModule::set_rate(boma, 0.375); + } + else { + MotionModule::set_rate(boma, 1.5); } - } - frame(lua_state, 12.0); - if is_excute(agent) { - agent.on_flag(*FIGHTER_CLOUD_STATUS_WORK_ID_SPECIAL_N_FLAG_SPECIAL_FALL); - MotionModule::set_rate(boma, 2.0); } frame(lua_state, 16.0); if is_excute(agent) { @@ -85,19 +81,15 @@ unsafe extern "C" fn effect_specialairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialn_lb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 10.0); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::cloud::status::SPECIAL_N_HOLD); - } - frame(lua_state, 8.0); - if is_excute(agent) { + agent.on_flag(*FIGHTER_CLOUD_STATUS_WORK_ID_SPECIAL_N_FLAG_SPECIAL_FALL); if VarModule::is_flag(agent.battle_object, vars::cloud::status::SPECIAL_N_HOLD) { - MotionModule::set_rate(boma, 0.25); + MotionModule::set_rate(boma, 0.375); + } + else { + MotionModule::set_rate(boma, 1.5); } - } - frame(lua_state, 12.0); - if is_excute(agent) { - agent.on_flag(*FIGHTER_CLOUD_STATUS_WORK_ID_SPECIAL_N_FLAG_SPECIAL_FALL); - MotionModule::set_rate(boma, 2.0); } frame(lua_state, 16.0); if is_excute(agent) { diff --git a/fighters/cloud/src/acmd/specials/specials.rs b/fighters/cloud/src/acmd/specials/specials.rs index c366e1721d..d0381b6039 100644 --- a/fighters/cloud/src/acmd/specials/specials.rs +++ b/fighters/cloud/src/acmd/specials/specials.rs @@ -17,8 +17,8 @@ unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { agent.on_flag(*FIGHTER_CLOUD_STATUS_SPECIAL_S_FLAG_DETACH_EFFECT); - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 80, 100, 66, 0, 7.5, 0.0, 11.0, 17.5, Some(0.0), Some(15.0), Some(17.5), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 80, 100, 66, 0, 7.5, 0.0, 11.0, 17.5, Some(0.0), Some(11.0), Some(12.5), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 80, 100, 45, 0, 7.5, 0.0, 11.0, 17.5, Some(0.0), Some(15.0), Some(17.5), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 80, 100, 45, 0, 7.5, 0.0, 11.0, 17.5, Some(0.0), Some(11.0), Some(12.5), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_finish_camera_ex(boma, 0, true, false); AttackModule::set_no_finish_camera_ex(boma, 1, true, false); agent.on_flag(*FIGHTER_CLOUD_STATUS_SPECIAL_S_FLAG_INPUT_CHECK); @@ -249,7 +249,6 @@ unsafe extern "C" fn game_specials3(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 2.0); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::cloud::status::SPECIAL_S_STALL); ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 366, 100, 80, 0, 7.5, 0.0, 11.0, 17.5, Some(0.0), Some(15.0), Some(17.5), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 366, 100, 80, 0, 7.5, 0.0, 11.0, 17.5, Some(0.0), Some(11.0), Some(12.5), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_finish_camera_ex(boma, 0, true, false); @@ -281,11 +280,6 @@ unsafe extern "C" fn game_specials3(agent: &mut L2CAgentBase) { frame(lua_state, 27.0); if is_excute(agent) { AttackModule::clear_all(boma); - VarModule::off_flag(agent.battle_object, vars::cloud::status::SPECIAL_S_STALL); - } - frame(lua_state, 40.0); - if is_excute(agent) { - agent.off_flag(*FIGHTER_CLOUD_STATUS_SPECIAL_S_FLAG_SPECIAL_FALL); } } @@ -654,7 +648,6 @@ unsafe extern "C" fn game_specials3_lb(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 0.75); frame(lua_state, 3.0); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::cloud::status::SPECIAL_S_STALL); ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 366, 100, 80, 0, 7.5, 0.0, 11.0, 17.5, Some(0.0), Some(15.0), Some(17.5), 0.5, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 366, 100, 80, 0, 7.5, 0.0, 11.0, 17.5, Some(0.0), Some(11.0), Some(12.5), 0.5, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_finish_camera_ex(boma, 0, true, false); @@ -686,12 +679,10 @@ unsafe extern "C" fn game_specials3_lb(agent: &mut L2CAgentBase) { frame(lua_state, 29.0); if is_excute(agent) { AttackModule::clear_all(boma); - VarModule::off_flag(agent.battle_object, vars::cloud::status::SPECIAL_S_STALL); } frame(lua_state, 40.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x25813802b6)); - agent.off_flag(*FIGHTER_CLOUD_STATUS_SPECIAL_S_FLAG_SPECIAL_FALL); } } diff --git a/fighters/cloud/src/acmd/throws.rs b/fighters/cloud/src/acmd/throws.rs index 3318c94a4c..3f6dc3b30b 100644 --- a/fighters/cloud/src/acmd/throws.rs +++ b/fighters/cloud/src/acmd/throws.rs @@ -5,15 +5,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 3.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 8.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 7.1, 0.0, Some(0.0), Some(7.1), Some(8.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 7.1, 4.8, Some(0.0), Some(7.1), Some(8.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -33,7 +32,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(9.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 6.6, 5.5, Some(0.0), Some(6.6), Some(9.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -53,7 +52,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-14.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 6.6, -6.0, Some(0.0), Some(6.6), Some(-14.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/cloud/src/acmd/tilts.rs b/fighters/cloud/src/acmd/tilts.rs index 6e9d3d1a4b..e83ab14544 100644 --- a/fighters/cloud/src/acmd/tilts.rs +++ b/fighters/cloud/src/acmd/tilts.rs @@ -8,10 +8,10 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 8.5); FT_MOTION_RATE_RANGE(agent, 8.5, 10.5, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 111, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 111, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 361, 111, 0, 20, 4.0, 0.0, 4.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 361, 111, 0, 20, 4.0, 0.0, 9.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 10.0, 361, 111, 0, 20, 4.0, 0.0, 13.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 10.0, 361, 111, 0, 20, 4.0, 0.0, 13.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 10.5); FT_MOTION_RATE_RANGE(agent, 10.5, 11.0, 1.0); @@ -67,10 +67,10 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 80, 100, 0, 46, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 80, 100, 0, 46, 4.5, 0.0, 4.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 80, 100, 0, 46, 4.5, 0.0, 8.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 8.0, 80, 100, 0, 46, 4.5, 0.0, 13.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 80, 100, 0, 46, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 80, 100, 0, 46, 4.5, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 80, 100, 0, 46, 4.5, 0.0, 8.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 8.0, 80, 100, 0, 46, 4.5, 0.0, 13.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CLOUD_HIT, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } frame(lua_state, 9.0); diff --git a/fighters/cloud/src/lib.rs b/fighters/cloud/src/lib.rs index a47f903b5e..6182647dbe 100644 --- a/fighters/cloud/src/lib.rs +++ b/fighters/cloud/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, consts::*, diff --git a/fighters/cloud/src/opff.rs b/fighters/cloud/src/opff.rs index 2c71b8e636..4c32983ae2 100644 --- a/fighters/cloud/src/opff.rs +++ b/fighters/cloud/src/opff.rs @@ -5,11 +5,10 @@ use smash::app::smashball::*; utils::import_noreturn!(common::opff::fighter_common_opff); unsafe fn special_n_hold(fighter: &mut L2CFighterCommon) { - if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_N) - && VarModule::is_flag(fighter.battle_object, vars::cloud::status::SPECIAL_N_HOLD) - && !fighter.is_button_on(Buttons::SpecialAll) - && fighter.motion_frame() < 8.0 { - VarModule::off_flag(fighter.battle_object, vars::cloud::status::SPECIAL_N_HOLD); + if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_N) { + if fighter.check_hold_input(0, 8, Buttons::SpecialAll) { + VarModule::on_flag(fighter.battle_object, vars::cloud::status::SPECIAL_N_HOLD); + } } } diff --git a/fighters/cloud/src/status/mod.rs b/fighters/cloud/src/status/mod.rs index 566262c2f5..3c93c05239 100644 --- a/fighters/cloud/src/status/mod.rs +++ b/fighters/cloud/src/status/mod.rs @@ -6,22 +6,84 @@ mod special_lw; mod special_s; mod special_hi; -// prevents limit charge from being used while the limit charge graphic is still above cloud -// effectively this is a limit charge cooldown. the length is limit_gauge_frame in vl.prcxml +// Restricts Limit Charge to once-per-airtime unsafe extern "C" fn should_use_special_lw_callback(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.get_int(*FIGHTER_CLOUD_INSTANCE_WORK_ID_INT_LIMIT_GAUGE_REMOVE_FRAME) > 0 - && !fighter.is_flag(*FIGHTER_CLOUD_INSTANCE_WORK_ID_FLAG_LIMIT_BREAK) { + if !fighter.is_flag(*FIGHTER_CLOUD_INSTANCE_WORK_ID_FLAG_LIMIT_BREAK) + && VarModule::is_flag(fighter.battle_object, vars::cloud::instance::DISABLE_SPECIAL_LW) { return false.into(); } + return true.into(); } unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { - // Reset shine stall flag on landing or ledgegrab + // Reset Cross Slash stall flag on landing or ledgegrab if [*SITUATION_KIND_GROUND, *SITUATION_KIND_CLIFF].contains(&fighter.global_table[SITUATION_KIND].get_i32()) || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { VarModule::off_flag(fighter.battle_object, vars::cloud::instance::SPECIAL_S_DISABLE_STALL); } + + // Re-enable Limit Charge on landing, ledgegrab, or when hit + if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) + || fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_DAMAGE, + *FIGHTER_STATUS_KIND_DAMAGE_AIR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_LR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_U, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_D, + *FIGHTER_STATUS_KIND_DAMAGE_FALL, + *FIGHTER_STATUS_KIND_DEAD, + *FIGHTER_STATUS_KIND_CAPTURE_PULLED, + *FIGHTER_STATUS_KIND_CAPTURE_PULLED_OCTOPUS, + *FIGHTER_STATUS_KIND_CAPTURE_PULLED_PICKEL, + *FIGHTER_STATUS_KIND_CAPTURE_PULLED_YOSHI, + *FIGHTER_STATUS_KIND_CAPTURE_PULLED_FISHINGROD, + *FIGHTER_STATUS_KIND_CAPTURE_WAIT, + *FIGHTER_STATUS_KIND_CAPTURE_WAIT_OCTOPUS, + *FIGHTER_STATUS_KIND_CAPTURE_WAIT_YOSHI, + *FIGHTER_STATUS_KIND_CATCHED_REFLET, + *FIGHTER_STATUS_KIND_CATCHED_RIDLEY, + *FIGHTER_STATUS_KIND_SHOULDERED_DONKEY, + *FIGHTER_STATUS_KIND_SWALLOWED, + *FIGHTER_STATUS_KIND_CAPTURE_DAMAGE, + *FIGHTER_STATUS_KIND_CAPTURE_DAMAGE_YOSHI, + *FIGHTER_STATUS_KIND_CAPTURE_CUT, + *FIGHTER_STATUS_KIND_CAPTURE_JUMP, + *FIGHTER_STATUS_KIND_CAPTURE_YOSHI, + *FIGHTER_STATUS_KIND_CLUNG_CAPTAIN, + *FIGHTER_STATUS_KIND_CLUNG_DAMAGE_DIDDY, + *FIGHTER_STATUS_KIND_CLUNG_DIDDY, + *FIGHTER_STATUS_KIND_CLUNG_GANON, + *FIGHTER_STATUS_KIND_CLUNG_THROWN_BLANK_DIDDY, + *FIGHTER_STATUS_KIND_CLUNG_THROWN_DIDDY, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_ATTACH_ROPE, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_FAILURE, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_LARIAT, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_RETURN, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_SHOULDER, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_THROWN, + *FIGHTER_STATUS_KIND_KOOPA_DIVED, + *FIGHTER_STATUS_KIND_DEMON_DIVED, + *FIGHTER_STATUS_KIND_MEWTWO_THROWN, + *FIGHTER_STATUS_KIND_MIIFIGHTER_COUNTER_THROWN, + *FIGHTER_STATUS_KIND_BITTEN_WARIO_START, + *FIGHTER_STATUS_KIND_CAPTURE_JACK_WIRE, + *FIGHTER_STATUS_KIND_CAPTURE_MASTER_SWORD, + *FIGHTER_STATUS_KIND_REBIRTH, + *FIGHTER_STATUS_KIND_DEAD, + *FIGHTER_STATUS_KIND_LANDING, + *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, + *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP + ]) + || (fighter.is_status(*FIGHTER_CLOUD_STATUS_KIND_SPECIAL_LW_END) && fighter.is_flag(*FIGHTER_CLOUD_INSTANCE_WORK_ID_FLAG_LIMIT_BREAK)) + { + VarModule::off_flag(fighter.battle_object, vars::cloud::instance::DISABLE_SPECIAL_LW); + } + true.into() } diff --git a/fighters/cloud/src/status/special_lw.rs b/fighters/cloud/src/status/special_lw.rs index b078ba11e5..c4e512b8ea 100644 --- a/fighters/cloud/src/status/special_lw.rs +++ b/fighters/cloud/src/status/special_lw.rs @@ -1,5 +1,7 @@ use super::*; +// FIGHTER_STATUS_KIND_SPECIAL_LW + unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.is_flag(*FIGHTER_CLOUD_INSTANCE_WORK_ID_FLAG_LIMIT_BREAK) { StatusModule::init_settings( @@ -57,6 +59,17 @@ unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } +// FIGHTER_CLOUD_STATUS_KIND_SPECIAL_LW_CHARGE + +unsafe extern "C" fn special_lw_charge_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { + VarModule::on_flag(fighter.battle_object, vars::cloud::instance::DISABLE_SPECIAL_LW); + } + + smashline::original_status(Main, fighter, *FIGHTER_CLOUD_STATUS_KIND_SPECIAL_LW_CHARGE)(fighter) +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); + agent.status(Main, *FIGHTER_CLOUD_STATUS_KIND_SPECIAL_LW_CHARGE, special_lw_charge_main); } \ No newline at end of file diff --git a/fighters/cloud/src/status/special_s.rs b/fighters/cloud/src/status/special_s.rs index 214c4ea2d6..99770d4837 100644 --- a/fighters/cloud/src/status/special_s.rs +++ b/fighters/cloud/src/status/special_s.rs @@ -30,6 +30,7 @@ unsafe extern "C" fn special_s3_end(fighter: &mut L2CFighterCommon) -> L2CValue unsafe extern "C" fn special_s_exec(fighter: &mut L2CFighterCommon) -> L2CValue { let ret = smashline::original_status(Exec, fighter, *FIGHTER_CLOUD_STATUS_KIND_SPECIAL_S3)(fighter); + // no gravity while using this stall flag if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND && VarModule::is_flag(fighter.battle_object, vars::cloud::status::SPECIAL_S_STALL) @@ -37,6 +38,7 @@ unsafe extern "C" fn special_s_exec(fighter: &mut L2CFighterCommon) -> L2CValue fighter.on_flag(*FIGHTER_CLOUD_STATUS_SPECIAL_S_FLAG_SPECIAL_FALL); sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); } + ret } @@ -53,7 +55,5 @@ pub fn install(agent: &mut Agent) { agent.status(Exec, *FIGHTER_CLOUD_STATUS_KIND_SPECIAL_S2, special_s_exec); agent.status(End, *FIGHTER_CLOUD_STATUS_KIND_SPECIAL_S2, special_s2_end); - agent.status(CheckAttack, *FIGHTER_CLOUD_STATUS_KIND_SPECIAL_S3, special_s_check_attack); - agent.status(Exec, *FIGHTER_CLOUD_STATUS_KIND_SPECIAL_S3, special_s_exec); agent.status(End, *FIGHTER_CLOUD_STATUS_KIND_SPECIAL_S3, special_s3_end); } \ No newline at end of file diff --git a/fighters/common/Cargo.toml b/fighters/common/Cargo.toml index 911cabbaa8..f16fc6365f 100644 --- a/fighters/common/Cargo.toml +++ b/fighters/common/Cargo.toml @@ -7,11 +7,14 @@ edition = "2018" [dependencies] skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script.git", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script.git", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline.git" } utils = { package = "dynamic", path = "../../dynamic" } -ninput = { git = "https://github.com/blu-dev/ninput" } +ninput = { git = "https://github.com/HDR-Development/ninput" } interpolation = "0.2.0" # for f32::lerp -smash_rs = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } -rand = { git = "https://github.com/skyline-rs/rand" } \ No newline at end of file +smash_rs = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +rand = { git = "https://github.com/skyline-rs/rand" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +chrono = "0.4" diff --git a/fighters/common/src/djc.rs b/fighters/common/src/djc.rs index 1ce8c269c4..460896fac0 100644 --- a/fighters/common/src/djc.rs +++ b/fighters/common/src/djc.rs @@ -54,7 +54,12 @@ pub unsafe extern "C" fn sub_attack_air_inherit_jump_aerial_motion_uniq_process_ fighter.sub_attack_air_kind(); if motion_kind == smash::hash40("jump_aerial_f") || motion_kind == smash::hash40("jump_aerial_b") { if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_IGNORE_2ND_MOTION) { - MotionModule::add_motion_2nd(fighter.module_accessor, Hash40::new_raw(motion_kind), frame, 1.0, false, 1.0); + let rate = if fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_NESS { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_jump_aerial.start_motion_rate") + } else { + 1.0 + }; + MotionModule::add_motion_2nd(fighter.module_accessor, Hash40::new_raw(motion_kind), frame, rate, false, 1.0); MotionModule::set_weight(fighter.module_accessor, 1.0, true); if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) || frame < 2.0 { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_JUMP_AERIAL_MOTION_2ND); @@ -94,6 +99,20 @@ pub unsafe extern "C" fn sub_attack_air_inherit_jump_aerial_motion_uniq_process_ WorkModule::on_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_JUMP_NO_LIMIT_ONCE); KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); } + + if fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_NESS + && KineticModule::get_kinetic_type(fighter.module_accessor) == *FIGHTER_KINETIC_TYPE_JUMP_AERIAL_MOTION_2ND { + let frame = MotionModule::frame_2nd(fighter.module_accessor); + + if frame >= 15.0 { + MotionModule::set_rate_2nd(fighter.module_accessor, 1.0); + } + if frame >= 29.0 { + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_JUMP_NO_LIMIT_ONCE); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + } + } + call_original!(fighter) } diff --git a/fighters/common/src/function_hooks/attack.rs b/fighters/common/src/function_hooks/attack.rs index 1f6323bca8..f421394b46 100644 --- a/fighters/common/src/function_hooks/attack.rs +++ b/fighters/common/src/function_hooks/attack.rs @@ -50,40 +50,79 @@ unsafe fn attack_module_set_attack(module: u64, id: i32, group: i32, data: &mut } } - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::ElementMode) { - let rand = sv_math::rand(hash40("fighter"), 21); - match rand { - 0 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_aura"); data.sound_attr = CollisionSoundAttr::Fire; }, - 1 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_bury"); data.sound_attr = CollisionSoundAttr::Heavy; }, - 2 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_bind_extra"); data.sound_attr = CollisionSoundAttr::Elec; }, - 3 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_cutup"); data.sound_attr = CollisionSoundAttr::CutUp; }, - 4 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_coin"); data.sound_attr = CollisionSoundAttr::Coin; }, - 5 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_normal_poison"); data.sound_attr = CollisionSoundAttr::Fire; }, - 6 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_elec"); data.sound_attr = CollisionSoundAttr::Elec; }, - 7 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_fire"); data.sound_attr = CollisionSoundAttr::Fire; }, - 8 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_flower"); data.sound_attr = CollisionSoundAttr::Kick; }, - 9 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_ice"); data.sound_attr = CollisionSoundAttr::Freeze; }, - 10 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_magic"); data.sound_attr = CollisionSoundAttr::Magic; }, - 11 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_normal"); data.sound_attr = CollisionSoundAttr::Punch; }, - 12 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_paralyze"); data.sound_attr = CollisionSoundAttr::Elec; }, - 13 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_purple"); data.sound_attr = CollisionSoundAttr::Fire; }, - 14 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_sleep"); data.sound_attr = CollisionSoundAttr::Magic; }, - 15 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_slip"); data.sound_attr = CollisionSoundAttr::Slap; }, - 16 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_sting"); data.sound_attr = CollisionSoundAttr::CutUp; }, - 17 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_turn"); data.sound_attr = CollisionSoundAttr::Harisen; }, - _ => {} // (slightly larger) chance for the attack to not be randomized - } + if utils::game_modes::check_custom_mode(CustomMode::RandomAngleMode) + && data.vector >= 0 + && data.vector <= 361 { + // replace sakurai angle, so that we can randomize it + if (data.vector == 361) { + data.vector = 45; + } - let ret = call_original!(module, id, group, data); - if rand == 5 { - AttackModule::set_poison_param(boma, 0, 361, 45, 1.0, false); - } - return ret; - } - }, - _ => {} + // seed inputs + let input_angle = data.vector as u32; + let battle_object_id = (*boma).battle_object_id; + let status_kind = (*boma).status() as u32; + + // seed generation + let angle_seed = { + // magic bullshit go + let mut h = input_angle; + h ^= battle_object_id.wrapping_add(0x9e3779b9).wrapping_add(h << 6).wrapping_add(h >> 2); + h ^= status_kind.wrapping_add(0x9e3779b9).wrapping_add(h << 6).wrapping_add(h >> 2); + h ^= MATCH_SCOPED_RANDOM_U32.wrapping_add(0x9e3779b9).wrapping_add(h << 6).wrapping_add(h >> 2); + h + }; + + // psuedorandom angle offset from -90 to 90 + // when applied, results in a random angle in the same hemisphere as the original + // and the result persists for the same attack of the same fighter throught a match + let offset = ((angle_seed).wrapping_mul(2654435761) % 181) as i32 - 90; + data.vector = (data.vector + offset).rem_euclid(361); + + let spike_kb_mul = 1.5; + let was_spike_before = input_angle < 30 || input_angle > 150; + let is_spike_after = data.vector < 30 || data.vector > 150; + // reduce the knockback of moves that have become spikes but were not previously + if !was_spike_before && is_spike_after { + data.r_eff = (data.r_eff as f32 / spike_kb_mul).round() as i32; + data.r_add = (data.r_add as f32 / spike_kb_mul).round() as i32; + } + // increase the knockback of moves that are no longer spikes but were previously + else if was_spike_before && !is_spike_after { + data.r_eff = (data.r_eff as f32 * spike_kb_mul).round() as i32; + data.r_add = (data.r_add as f32 * spike_kb_mul).round() as i32; + } + } + + if utils::game_modes::check_custom_mode(CustomMode::ElementMode) { + let rand = sv_math::rand(hash40("fighter"), 21); + match rand { + 0 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_aura"); data.sound_attr = CollisionSoundAttr::Fire; }, + 1 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_bury"); data.sound_attr = CollisionSoundAttr::Heavy; }, + 2 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_bind_extra"); data.sound_attr = CollisionSoundAttr::Elec; }, + 3 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_cutup"); data.sound_attr = CollisionSoundAttr::CutUp; }, + 4 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_coin"); data.sound_attr = CollisionSoundAttr::Coin; }, + 5 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_normal_poison"); data.sound_attr = CollisionSoundAttr::Fire; }, + 6 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_elec"); data.sound_attr = CollisionSoundAttr::Elec; }, + 7 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_fire"); data.sound_attr = CollisionSoundAttr::Fire; }, + 8 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_flower"); data.sound_attr = CollisionSoundAttr::Kick; }, + 9 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_ice"); data.sound_attr = CollisionSoundAttr::Freeze; }, + 10 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_magic"); data.sound_attr = CollisionSoundAttr::Magic; }, + 11 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_normal"); data.sound_attr = CollisionSoundAttr::Punch; }, + 12 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_paralyze"); data.sound_attr = CollisionSoundAttr::Elec; }, + 13 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_purple"); data.sound_attr = CollisionSoundAttr::Fire; }, + 14 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_sleep"); data.sound_attr = CollisionSoundAttr::Magic; }, + 15 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_slip"); data.sound_attr = CollisionSoundAttr::Slap; }, + 16 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_sting"); data.sound_attr = CollisionSoundAttr::CutUp; }, + 17 => { data.attr = smash_rs::phx::Hash40::new("collision_attr_turn"); data.sound_attr = CollisionSoundAttr::Harisen; }, + _ => {} // (slightly larger) chance for the attack to not be randomized + } + + let ret = call_original!(module, id, group, data); + if rand == 5 { + AttackModule::set_poison_param(boma, 0, 361, 45, 1.0, false); + } + return ret; } call_original!(module, id, group, data); @@ -100,34 +139,24 @@ unsafe fn attack_module_set_attack(module: u64, id: i32, group: i32, data: &mut #[skyline::hook(offset = 0x403c3c, inline)] unsafe fn get_damage_frame_mul(ctx: &mut skyline::hooks::InlineCtx) { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - let damage_frame_mul: f32 = if modes.contains(&CustomMode::Smash64Mode) { - 0.533 - } - else { - 0.42 - }; - ctx.registers_f[0].set_s(damage_frame_mul) - }, - _ => {} + let damage_frame_mul: f32 = if utils::game_modes::check_custom_mode(CustomMode::Smash64Mode) { + 0.533 } + else { + 0.42 // TODO: find a way to parameterize this or otherwise notify that it's hardcoded + }; + ctx.registers_f[0].set_s(damage_frame_mul) } #[skyline::hook(offset = 0x406bf4, inline)] unsafe fn get_hitstop_frame_add(ctx: &mut skyline::hooks::InlineCtx) { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - let hitstop_frame_add: f32 = if modes.contains(&CustomMode::Smash64Mode) { - 5.0 - } - else { - 4.0 - }; - ctx.registers_f[0].set_s(hitstop_frame_add) - }, - _ => {} + let hitstop_frame_add: f32 = if utils::game_modes::check_custom_mode(CustomMode::Smash64Mode) { + 5.0 } + else { + 4.0 // TODO: find a way to parameterize this or otherwise notify that it's hardcoded + }; + ctx.registers_f[0].set_s(hitstop_frame_add) } // Only applies 0.67 crouch cancel hitlag multiplier to receiver @@ -168,16 +197,11 @@ unsafe fn post_calc_reaction(ctx: &mut skyline::hooks::InlineCtx) { let angle = (*attack_data).vector; let meteor_vector_min = WorkModule::get_param_int(receiver_boma, hash40("battle_object"), hash40("meteor_vector_min")); let meteor_vector_max = WorkModule::get_param_int(receiver_boma, hash40("battle_object"), hash40("meteor_vector_max")); - let spike_tumble_threshold = ParamModule::get_float(receiver_boma.object(), ParamType::Common, "spike_tumble_threshold"); - let damage_frame_mul = WorkModule::get_param_float(receiver_boma, hash40("battle_object"), hash40("damage_frame_mul")); let grounded_spike_knockback_mul = ParamModule::get_float(receiver_boma.object(), ParamType::Common, "grounded_spike_knockback_mul"); - let spike_tumble_threshold_kb = spike_tumble_threshold / damage_frame_mul; - if receiver_boma.is_situation(*SITUATION_KIND_GROUND) && angle >= meteor_vector_min - && angle <= meteor_vector_max - && kb >= spike_tumble_threshold_kb { + && angle <= meteor_vector_max { kb *= grounded_spike_knockback_mul; } @@ -280,13 +304,13 @@ unsafe fn set_parry_hitlag(ctx: &mut skyline::hooks::InlineCtx) { // set parry AttackModule inflict flag #[skyline::hook(offset = 0x03df93c, inline)] unsafe fn x03df93c(ctx: &mut skyline::hooks::InlineCtx) { - let opponent_battle_object_id = *(ctx.registers[22].x() as *const u32).add(0x24 / 4); - let opponent_battle_object = utils::util::get_battle_object_from_id(opponent_battle_object_id); - let opponent_boma = (&mut *(*opponent_battle_object).module_accessor); + let defender_battle_object_id = *(ctx.registers[22].x() as *const u32).add(0x24 / 4); + let defender_battle_object = utils::util::get_battle_object_from_id(defender_battle_object_id); + let defender_boma = (&mut *(*defender_battle_object).module_accessor); - if opponent_boma.is_status(*FIGHTER_STATUS_KIND_GUARD_OFF) - && VarModule::is_flag(opponent_battle_object, vars::common::instance::IS_PARRY_FOR_GUARD_OFF) - && opponent_boma.get_int(*FIGHTER_STATUS_GUARD_ON_WORK_INT_JUST_FRAME) > 0 { + if defender_boma.is_status(*FIGHTER_STATUS_KIND_GUARD_OFF) + && VarModule::is_flag(defender_battle_object, vars::common::instance::IS_PARRY_FOR_GUARD_OFF) + && defender_boma.get_int(*FIGHTER_STATUS_GUARD_ON_WORK_INT_JUST_FRAME) > 0 { ctx.registers[8].set_w(ctx.registers[8].w() | *COLLISION_KIND_MASK_PARRY as u32); let attack_module = ctx.registers[19].x(); let attacker_boma = &mut *(*(attack_module as *mut *mut BattleObjectModuleAccessor).add(1)); @@ -297,6 +321,11 @@ unsafe fn x03df93c(ctx: &mut skyline::hooks::InlineCtx) { HitModule::set_xlu_frame_global(attacker_boma, 0, 0); HitModule::set_invincible_frame_global(attacker_boma, 0, false, 0); // sub_rebirth_uniq_process_exit } + + // invuln on parry success for RoA mode + if utils::game_modes::check_custom_mode(game_modes::CustomMode::RivalsOfAetherMode) { + HitModule::set_xlu_frame_global(defender_boma, 60, 0); + } } } @@ -312,6 +341,37 @@ unsafe fn notify_log_event_collision_hit(fighter_manager: u64, attacker_object_i ItemModule::drop_item(receiver_boma, 90.0, 0.0, 0); } + if app::smashball::is_training_mode() { + if ControlModule::check_button_on(attacker_boma, *CONTROL_PAD_BUTTON_APPEAL_HI) + || ControlModule::check_button_on(attacker_boma, *CONTROL_PAD_BUTTON_APPEAL_LW) + || ControlModule::check_button_on(attacker_boma, *CONTROL_PAD_BUTTON_APPEAL_S_L) + || ControlModule::check_button_on(attacker_boma, *CONTROL_PAD_BUTTON_APPEAL_S_R) { + if VarModule::has_var_module(receiver_boma.object()) { + let fighter = utils::util::get_fighter_common_from_accessor(attacker_boma); + let prev = VarModule::is_flag(receiver_boma.object(), vars::common::instance::ENABLE_FRAME_DATA_DEBUG); + println!("prev: {}", prev); + if prev == true { + println!("15 -> 18"); + // 15 -> 18 + fighter.clear_lua_stack(); + lua_args!(fighter, Hash40::new("sys_hit_dead"), Hash40::new("top"), 0, 10, 0, 0, 0, 0, 1, true); + smash::app::sv_animcmd::EFFECT_FOLLOW(fighter.lua_state_agent); + fighter.pop_lua_stack(1); + } + else { + println!("18 -> 15"); + // 18 -> 15 + fighter.clear_lua_stack(); + lua_args!(fighter, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 10, 0, 0, 0, 0, 1, true); + smash::app::sv_animcmd::EFFECT_FOLLOW(fighter.lua_state_agent); + fighter.pop_lua_stack(1); + } + println!("setting to {}", !prev); + VarModule::set_flag(receiver_boma.object(), vars::common::instance::ENABLE_FRAME_DATA_DEBUG, !prev); + } + } + } + original!()(fighter_manager, attacker_object_id, receiver_object_id, move_type, arg5, move_type_again) } @@ -342,7 +402,13 @@ unsafe fn post_spike_check(ctx: &mut skyline::hooks::InlineCtx) { if is_spike { let mut kb = ctx.registers_f[11].s(); - let spike_tumble_threshold = ParamModule::get_float((*boma).object(), ParamType::Common, "spike_tumble_threshold"); + let mut spike_tumble_threshold = ParamModule::get_float((*boma).object(), ParamType::Common, "spike_tumble_threshold"); + // Ensures grounded spikes do not trigger tumble earlier + // despite their knockback multiplier + if (*boma).is_situation(*SITUATION_KIND_GROUND) { + let grounded_spike_knockback_mul = ParamModule::get_float((*boma).object(), ParamType::Common, "grounded_spike_knockback_mul"); + spike_tumble_threshold *= grounded_spike_knockback_mul; + } if kb >= spike_tumble_threshold { // Set damage level to 3 (tumble) @@ -352,8 +418,27 @@ unsafe fn post_spike_check(ctx: &mut skyline::hooks::InlineCtx) { ctx.registers_f[11].set_s(kb) } - // Forces tumble for knockdown throws - if VarModule::is_flag((*boma).object(), vars::common::instance::IS_KNOCKDOWN_THROW) { + // Forces tumble for throws + let fighter = util::get_fighter_common_from_accessor(&mut (*boma)); + if VarModule::is_flag((*boma).object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE) + || [ // THROWN statuses + *FIGHTER_STATUS_KIND_BITTEN_WARIO_END, + *FIGHTER_STATUS_KIND_CATCHED_AIR_END_GANON, + *FIGHTER_STATUS_KIND_CLUNG_THROWN_BLANK_DIDDY, + *FIGHTER_STATUS_KIND_CLUNG_THROWN_DIDDY, + *FIGHTER_STATUS_KIND_DEMON_DIVED, + *FIGHTER_STATUS_KIND_DRAGGED_RIDLEY, + *FIGHTER_STATUS_KIND_MEWTWO_THROWN, + *FIGHTER_STATUS_KIND_MIIFIGHTER_COUNTER_THROWN, + *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_THROWN, + *FIGHTER_STATUS_KIND_SHOULDERED_DONKEY_THROWN, + *FIGHTER_STATUS_KIND_SWALLOWED_THROWN, + *FIGHTER_STATUS_KIND_SWALLOWED_THROWN_STAR, + // *FIGHTER_STATUS_KIND_SWING_GAOGAEN_FAILURE, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_LARIAT, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_SHOULDER, + *FIGHTER_STATUS_KIND_THROWN, + ].contains(&(fighter.global_table[STATUS_KIND].get_i32())) { // Set damage level to 3 (tumble) ctx.registers[24].set_w(3); } @@ -443,8 +528,26 @@ unsafe fn calc_non_knockback_damage_mul(attacker_boma: &mut BattleObjectModuleAc }; // dbg!(aura_mul); + // damage multiplier for pikmin + let pikmin_mul = if attacker_boma.is_weapon() && attacker_boma.kind() == *WEAPON_KIND_PIKMIN_PIKMIN { + let variation = WorkModule::get_int(attacker_boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); + let param = format!("param_pikmin_particular.{}.damage_mul", variation); + let battle_object = attacker_boma.get_owner_boma().object(); // olimar's battle object + ParamModule::get_float(battle_object, ParamType::Agent, ¶m) + } else { + 1.0 + }; + // dbg!(pikmin_mul); + + // damage multiplier for nana + let nana_mul = if attacker_boma.is_fighter() && attacker_boma.kind() == *FIGHTER_KIND_NANA { + 0.75 + } else { + 1.0 + }; + // final multiplier - return pattern_mul * aura_mul; + return pattern_mul * aura_mul * pikmin_mul * nana_mul; } pub fn install() { diff --git a/fighters/common/src/function_hooks/camera.rs b/fighters/common/src/function_hooks/camera.rs index 6dbf40ffc1..af027a2f0c 100644 --- a/fighters/common/src/function_hooks/camera.rs +++ b/fighters/common/src/function_hooks/camera.rs @@ -12,6 +12,12 @@ pub struct NormalCameraParams { pub normal_camera_vertical_angle: f32, pub normal_camera_fov: f32, pub target_interpolation_rate: f32, + pub unk_0x19bdd14296: f32, + pub others: [f32; 2], + pub camera_offset_y_min_distance: f32, + pub camera_offset_y_min: f32, + pub camera_offset_y_max_distance: f32, + pub camera_offset_y_max: f32, // others... } @@ -58,6 +64,19 @@ pub enum QuakeKind { Invalid, } +pub static DEFAULT_TARGET_INTERPOLATION_RATE: f32 = 0.775; + +#[derive(Copy, Clone)] +pub struct ReducedCameraTrackingSpeed { + pub target_interpolation_rate: f32, + pub normalize_increment: f32, +} + +pub static mut REDUCED_CAMERA_TRACKING_SPEED: [ReducedCameraTrackingSpeed; 8] = [ + ReducedCameraTrackingSpeed{target_interpolation_rate: DEFAULT_TARGET_INTERPOLATION_RATE, normalize_increment: 0.0}; + 8 +]; + // Doubles camera speed #[skyline::hook(offset = 0x4fdc10)] unsafe fn normal_camera(ptr: u64, float: f32) { @@ -68,12 +87,13 @@ unsafe fn normal_camera(ptr: u64, float: f32) { #[skyline::hook(offset = 0x2621490)] pub fn parse_stprm_active_camera_params(param_obj: u64, params: &mut NormalCameraParams) { call_original!(param_obj, params); - params.normal_camera_min_distance = params.normal_camera_min_distance.max(140.0); - params.normal_camera_min_distance_2 = params.normal_camera_min_distance_2.max(140.0); + let fov = params.normal_camera_fov.to_degrees(); + params.normal_camera_min_distance = (0.2 * fov.powf(2.0)) - (17.0 * fov) + 450.0; + params.normal_camera_min_distance_2 = (0.2 * fov.powf(2.0)) - (17.0 * fov) + 450.0; params.swing_rate_x = 0.0; params.swing_rate_y = 0.0; params.normal_camera_vertical_angle = params.normal_camera_vertical_angle.max(-5.0_f32.to_radians()); - params.target_interpolation_rate = 0.9; + params.target_interpolation_rate = DEFAULT_TARGET_INTERPOLATION_RATE; } // The following function hook handles Unrestricted Camera @@ -98,8 +118,62 @@ pub fn parse_stprm_pause_camera_params(param_obj: u64, params: &mut PauseCameraP params.pause_camera_gyro_limit_angle_left = 0.0; } +#[skyline::hook(offset = 0x4fddcc, inline)] +unsafe fn normal_camera_get_active_camera_params(ctx: &mut skyline::hooks::InlineCtx) { + let ptr = ctx.registers[19].x(); + let normal_camera_params = *((ptr + 0x1e0) as *const u64); + let current_tir = *((normal_camera_params + 0x38) as *mut f32); + + let target_interpolation_rate: f32 = if REDUCED_CAMERA_TRACKING_SPEED.iter().any(|&x| x.target_interpolation_rate < DEFAULT_TARGET_INTERPOLATION_RATE) { + let (idx, min) = REDUCED_CAMERA_TRACKING_SPEED + .iter() + .copied() + .enumerate() + .fold((0, REDUCED_CAMERA_TRACKING_SPEED[0]), |acc, x| { + let (best_idx, best) = acc; + let (i, val) = x; + + if val.target_interpolation_rate < best.target_interpolation_rate { + (i, val) + } else { + (best_idx, best) + } + }); + let normalize_increment = min.normalize_increment; + let new_tir = (min.target_interpolation_rate + normalize_increment).min(DEFAULT_TARGET_INTERPOLATION_RATE); + REDUCED_CAMERA_TRACKING_SPEED[idx].target_interpolation_rate = new_tir; + new_tir + } else { + (current_tir + 0.01).min(DEFAULT_TARGET_INTERPOLATION_RATE) + }; + + *((normal_camera_params + 0x38) as *mut f32) = target_interpolation_rate; +} + +// Runs immediately before CameraModule::req_quake is called +// within the routine that determines on-hit screenshake strength +#[skyline::hook(offset = 0x6c2590, inline)] +unsafe fn damage_fly_req_quake(ctx: &mut skyline::hooks::InlineCtx) { + let boma = &mut *(ctx.registers[19].x() as *mut BattleObjectModuleAccessor); + let kb = DamageModule::reaction(boma, 0); + + // Ignore global screenshake reduction on hits above 170 knockback units + if kb > 170.0 { + VarModule::on_flag(boma.object(), vars::common::instance::IGNORE_REDUCED_SCREENSHAKE); + } +} + #[skyline::hook(offset = 0x3ebe20)] unsafe fn camera_module__req_quake(camera_module: *const u64, quake_kind: i32) { + let boma = *(camera_module as *mut *mut BattleObjectModuleAccessor).add(1); + + if VarModule::has_var_module((*boma).object()) + && VarModule::is_flag((*boma).object(), vars::common::instance::IGNORE_REDUCED_SCREENSHAKE) { + VarModule::off_flag((*boma).object(), vars::common::instance::IGNORE_REDUCED_SCREENSHAKE); + // Use vanilla's screenshake strength for this instance + return call_original!(camera_module, quake_kind); + } + use QuakeKind::*; let mut quake_kind = std::mem::transmute(quake_kind.clone()); let quake_kind = match quake_kind { @@ -117,6 +191,8 @@ pub fn install() { normal_camera, parse_stprm_active_camera_params, parse_stprm_pause_camera_params, - camera_module__req_quake + normal_camera_get_active_camera_params, + damage_fly_req_quake, + camera_module__req_quake, ); } \ No newline at end of file diff --git a/fighters/common/src/function_hooks/djcancel.rs b/fighters/common/src/function_hooks/djcancel.rs index 16e2fbef60..c64235ba72 100644 --- a/fighters/common/src/function_hooks/djcancel.rs +++ b/fighters/common/src/function_hooks/djcancel.rs @@ -19,6 +19,12 @@ unsafe fn change_kinetic_hook(boma: &mut BattleObjectModuleAccessor, kinetic_typ { kinetic_type_new = *FIGHTER_KINETIC_TYPE_FALL; } + + if boma.kind() == *FIGHTER_KIND_LUCAS { + if kinetic_type == *FIGHTER_KINETIC_TYPE_LUCAS_AIR_STOP_SPECIAL_N { + kinetic_type_new = *FIGHTER_KINETIC_TYPE_AIR_STOP; + } + } } original!()(boma, kinetic_type_new) } diff --git a/fighters/common/src/function_hooks/effect.rs b/fighters/common/src/function_hooks/effect.rs index b4f0f2f43e..7e830f28a9 100644 --- a/fighters/common/src/function_hooks/effect.rs +++ b/fighters/common/src/function_hooks/effect.rs @@ -216,6 +216,7 @@ unsafe fn CUT_IN_CENTER_hook(lua_state: u64) { if effect_name.hash == hash40("sys_bg_finishhit") { // determines which effect will play based on the team color of the last attack // println!("effect being set to team color {}", LAST_ATTACK_TEAM_COLOR); + // TODO: check attacker player tag to display custom effects for developers hash = match LAST_ATTACK_TEAM_COLOR { 0 => hash40("sys_bg_finishhit_r"), 1 => hash40("sys_bg_finishhit_b"), @@ -408,6 +409,7 @@ unsafe fn module_access_effect_hook(lua_state: u64) { if effect_name.hash == hash40("sys_hit_dead") { // determines which effect will play based on the team color of the last attack // println!("effect being set to team color {}", LAST_ATTACK_TEAM_COLOR); + // TODO: check attacker player tag to display custom effects for developers hash = match LAST_ATTACK_TEAM_COLOR { 0 => hash40("sys_hit_dead_r"), 1 => hash40("sys_hit_dead_b"), diff --git a/fighters/common/src/function_hooks/energy/damage.rs b/fighters/common/src/function_hooks/energy/damage.rs index f7e3864a56..fe22a52832 100644 --- a/fighters/common/src/function_hooks/energy/damage.rs +++ b/fighters/common/src/function_hooks/energy/damage.rs @@ -121,6 +121,15 @@ unsafe fn trajectory_manager_hook( *knockback_info.add(blue_line) = launch_speed_min.x; *knockback_info.add(blue_line + 1) = launch_speed_min.y; + // force validity flags to true to make sure the line draws correctly + // this may have unintended consequences...? + let red_line_is_valid_ptr = (knockback_info.add(red_line + 6)) as *mut u8; + *red_line_is_valid_ptr = 1; + let green_line_is_valid_ptr = (knockback_info.add(green_line + 6)) as *mut u8; + *green_line_is_valid_ptr = 1; + let blue_line_is_valid_ptr = (knockback_info.add(red_line + 6)) as *mut u8; + *blue_line_is_valid_ptr = 1; + let hitstun = *knockback_info.add(0x48 / 4) as u64; let mut buffer_0: [u64; 2] = [0; 2]; diff --git a/fighters/common/src/function_hooks/energy/mod.rs b/fighters/common/src/function_hooks/energy/mod.rs index 46b42284ad..16ef03ddba 100644 --- a/fighters/common/src/function_hooks/energy/mod.rs +++ b/fighters/common/src/function_hooks/energy/mod.rs @@ -2,9 +2,9 @@ use super::*; mod control; -mod damage; mod motion; mod stop; +mod damage; #[repr(C)] pub struct KineticEnergyVTable { @@ -29,7 +29,7 @@ pub struct KineticEnergyVTable { pub struct PaddedVec2 { pub x: f32, pub y: f32, - pub padding: u64, + pub padding: u64 } impl PaddedVec2 { @@ -37,7 +37,7 @@ impl PaddedVec2 { Self { x, y, - padding: 0, + padding: 0 } } @@ -45,7 +45,7 @@ impl PaddedVec2 { Self { x: 0.0, y: 0.0, - padding: 0, + padding: 0 } } diff --git a/fighters/common/src/function_hooks/energy/motion.rs b/fighters/common/src/function_hooks/energy/motion.rs index 30eb1153c6..215275a40f 100644 --- a/fighters/common/src/function_hooks/energy/motion.rs +++ b/fighters/common/src/function_hooks/energy/motion.rs @@ -1,6 +1,6 @@ use super::*; -use crate::consts::globals::*; use crate::consts::*; +use crate::consts::globals::*; use std::ops::{Deref, DerefMut}; #[derive(Debug, Copy, Clone, PartialEq, Eq)] @@ -19,7 +19,7 @@ pub enum EnergyMotionResetType { CliffTrans, CliffTransGround, LadderMove, - LadderTrans, + LadderTrans } impl EnergyMotionResetType { @@ -116,7 +116,7 @@ impl FighterKineticEnergyMotion { Vector3f { x: vec.x(), y: vec.y(), - z: vec.z(), + z: vec.z() } } } @@ -128,7 +128,7 @@ impl FighterKineticEnergyMotion { Vector3f { x: vec.x(), y: vec.y(), - z: vec.z(), + z: vec.z() } } } @@ -199,14 +199,22 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt // // A bug that I encountered when reimplementing was setting this for the grounded states as well, which caused things like jumpsquat // and landing to immediately stop all momentum - energy.set_values_and_process(PaddedVec2::new(-energy.speed.x, -energy.speed.y), PaddedVec2::zeros(), PaddedVec2::zeros(), boma); + energy.set_values_and_process( + PaddedVec2::new(-energy.speed.x, -energy.speed.y), + PaddedVec2::zeros(), + PaddedVec2::zeros(), + boma + ); return; } // Set our grounded speed limit if we are on the ground // This is applied in situations like landing (which includes wavetech in HDR) if reset_type.is_ground() { - energy.speed_limit = PaddedVec2::new(WorkModule::get_param_float(boma, smash::hash40("common"), smash::hash40("ground_speed_limit")), 0.0); + energy.speed_limit = PaddedVec2::new( + WorkModule::get_param_float(boma, smash::hash40("common"), smash::hash40("ground_speed_limit")), + 0.0 + ); } // @@ -214,8 +222,7 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt // Double traction while above max walk speed if StatusModule::status_kind(boma) <= 0x1DB // only affects common statuses && boma.is_situation(*SITUATION_KIND_GROUND) - && !boma.is_prev_situation(*SITUATION_KIND_AIR) - { + && !boma.is_prev_situation(*SITUATION_KIND_AIR) { let mut damage_energy = KineticModule::get_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_DAMAGE) as *mut app::KineticEnergy; let damage_speed_x = app::lua_bind::KineticEnergy::get_speed_x(damage_energy); // If our speed is being influenced by knockback, we handle double traction elsewhere @@ -239,7 +246,12 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt // For ground, this is `ground_brake`, for example. That's the only thing applied here. // If you wanted to, say apply double traction in this situation you could double the energy.brake temporarily and restore it afterwards // as done in the control kinetic energy for some situations - energy.set_values_and_process(PaddedVec2::zeros(), PaddedVec2::zeros(), PaddedVec2::zeros(), boma); + energy.set_values_and_process( + PaddedVec2::zeros(), + PaddedVec2::zeros(), + PaddedVec2::zeros(), + boma + ); energy.speed_brake = backup_brake; @@ -253,22 +265,35 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt let mut is_stop_added = false; - if !energy.update_flag && boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_ATTACK_HI4_START, *FIGHTER_STATUS_KIND_ATTACK_HI4_HOLD, *FIGHTER_STATUS_KIND_ATTACK_HI4, *FIGHTER_STATUS_KIND_ATTACK_S4_START, *FIGHTER_STATUS_KIND_ATTACK_S4_HOLD, *FIGHTER_STATUS_KIND_ATTACK_S4, *FIGHTER_STATUS_KIND_ATTACK_LW4_START, *FIGHTER_STATUS_KIND_ATTACK_LW4_HOLD, *FIGHTER_STATUS_KIND_ATTACK_LW4, *FIGHTER_STATUS_KIND_ATTACK, *FIGHTER_STATUS_KIND_ATTACK_HI3, *FIGHTER_STATUS_KIND_ATTACK_S3, *FIGHTER_STATUS_KIND_ATTACK_LW3]) { - let mut stop_energy = KineticModule::get_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; - let prev_speed = KineticModule::get_sum_speed3f(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - let reset_speed_2f = Vector2f { - x: prev_speed.x, - y: prev_speed.y, - }; - let reset_speed_3f = Vector3f { - x: 0.0, - y: 0.0, - z: 0.0, - }; - lua_bind::KineticEnergy::reset_energy(stop_energy, *ENERGY_STOP_RESET_TYPE_GROUND, &reset_speed_2f, &reset_speed_3f, boma); - lua_bind::KineticEnergy::enable(stop_energy); - - is_stop_added = true; + if !energy.update_flag { + if boma.is_motion(Hash40::new("attack_12")) { + let fighter = util::get_fighter_common_from_accessor(boma); + sv_kinetic_energy!(clear_speed_ex, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP); + } + else if boma.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_ATTACK_HI4_START, + *FIGHTER_STATUS_KIND_ATTACK_HI4_HOLD, + *FIGHTER_STATUS_KIND_ATTACK_HI4, + *FIGHTER_STATUS_KIND_ATTACK_S4_START, + *FIGHTER_STATUS_KIND_ATTACK_S4_HOLD, + *FIGHTER_STATUS_KIND_ATTACK_S4, + *FIGHTER_STATUS_KIND_ATTACK_LW4_START, + *FIGHTER_STATUS_KIND_ATTACK_LW4_HOLD, + *FIGHTER_STATUS_KIND_ATTACK_LW4, + *FIGHTER_STATUS_KIND_ATTACK, + *FIGHTER_STATUS_KIND_ATTACK_HI3, + *FIGHTER_STATUS_KIND_ATTACK_S3, + *FIGHTER_STATUS_KIND_ATTACK_LW3]) + { + let mut stop_energy = KineticModule::get_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let prev_speed = KineticModule::get_sum_speed3f(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let reset_speed_2f = Vector2f { x: prev_speed.x, y: prev_speed.y }; + let reset_speed_3f = Vector3f { x: 0.0, y: 0.0, z: 0.0 }; + lua_bind::KineticEnergy::reset_energy(stop_energy, *ENERGY_STOP_RESET_TYPE_GROUND, &reset_speed_2f, &reset_speed_3f, boma); + lua_bind::KineticEnergy::enable(stop_energy); + + is_stop_added = true; + } } // begin block for calculating move speed based on animation @@ -327,19 +352,19 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt energy.active_flag = true; energy.speed_limit = PaddedVec2::new(-1.0, 0.0); move_speed - } + }, GroundTransIgnoreNorm => { energy.speed_limit = PaddedVec2::new(-1.0, 0.0); move_speed - } + }, // I'm still not quit sure what this "active_flag" is, but it's unset for these moves and reset for other moves? // Enabling it for this and the previous reset_types doesn't appear to have any different behavior off a few quick tests GroundTrans => { energy.speed_limit = PaddedVec2::new(-1.0, 0.0); energy::KineticEnergy::adjust_speed_for_ground_normal(&move_speed, boma) - } + }, // Haven't quite figured out where this gets used yet, and the work const has a few hits so I'm just not quite sure GroundTransLoopGekikara => { @@ -348,18 +373,24 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt let some_rate = WorkModule::get_float(boma, 0x1000009); let motion_rate = MotionModule::rate(boma); if some_rate != 0.0 && motion_rate / some_rate != 0.0 { - PaddedVec2::new(move_speed.x * some_rate / motion_rate, move_speed.y * some_rate / motion_rate) + PaddedVec2::new( + move_speed.x * some_rate / motion_rate, + move_speed.y * some_rate / motion_rate + ) } else { PaddedVec2::zeros() } - } + }, // When you are in the air your speed doesn't have any special calculations AirTrans | AirTrans2nd => move_speed, // This multiplies by the angle set with (afaik) app::sv_kinetic_energy::set_angle // Set angle whole is used regardless of the energy reset type - AirTransAngle => PaddedVec2::new(move_speed.x * energy.angle.cos() - move_speed.y * energy.angle.sin(), move_speed.y * energy.angle.cos() + move_speed.x * energy.angle.sin()), + AirTransAngle => PaddedVec2::new( + move_speed.x * energy.angle.cos() - move_speed.y * energy.angle.sin(), + move_speed.y * energy.angle.cos() + move_speed.x * energy.angle.sin() + ), // Here we zero out the X speed and literally only use the Y speed. Epic! AirTransY => PaddedVec2::new(0.0, move_speed.y), @@ -384,8 +415,11 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt } energy.angle }; - PaddedVec2::new(move_speed.x * angle.cos() - move_speed.y * energy.angle.sin(), move_speed.y * angle.cos() + move_speed.x * energy.angle.sin()) - } + PaddedVec2::new( + move_speed.x * angle.cos() - move_speed.y * energy.angle.sin(), + move_speed.y * angle.cos() + move_speed.x * energy.angle.sin() + ) + }, // Cliff functions require using a dedicated function, probably to figure out where the fighter needs to move // to in order to complete the cliff catch @@ -399,7 +433,7 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt x: vec.x(), y: vec.y(), z: vec.z(), - w: vec.w(), + w: vec.w() }; if reset_type == CliffTransGround { energy.active_flag = true; @@ -412,7 +446,7 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt } else { PaddedVec2::new(vec.x(), vec.y()) } - } + }, // LadderMove appears to be for when you are actually moving up/down the later LadderMove => { @@ -429,7 +463,7 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt }; PaddedVec2::new(0.0, speed_y) - } + }, // As opposed to LadderMove, LadderTrans is likely for when you are getting on/off the ladder // @@ -439,21 +473,23 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt energy.active_flag = true; let ladder_end_y = WorkModule::get_float(boma, *FIGHTER_STATUS_LADDER_WORK_FLOAT_LADDER_END_Y); let ladder_end_start_y = WorkModule::get_float(boma, *FIGHTER_STATUS_LADDER_WORK_FLOAT_LADDER_END_START_Y); - let mut vec = Vector3f { - x: 0.0, - y: 0.0, - z: 0.0, - }; + let mut vec = Vector3f { x: 0.0, y: 0.0, z: 0.0 }; MotionModule::trans_tra(boma, &mut vec, true, true); let speed_y = (ladder_end_y + vec.y) - ladder_end_start_y; WorkModule::add_float(boma, speed_y, *FIGHTER_STATUS_LADDER_WORK_FLOAT_LADDER_END_START_Y); PaddedVec2::new(0.0, speed_y) - } // _ => {} + } + // _ => {} }; // It is unclear to me why this specific case is handled so explicitly, but it is if reset_type.is_ground() && energy.update_flag && speed.x == 0.0 && energy.prev_speed.x == 0.0 { - energy.set_values_and_process(PaddedVec2::zeros(), PaddedVec2::zeros(), speed, boma); + energy.set_values_and_process( + PaddedVec2::zeros(), + PaddedVec2::zeros(), + speed, + boma + ); return; } @@ -473,9 +509,16 @@ unsafe fn motion_update(energy: &mut FighterKineticEnergyMotion, boma: &mut Batt // Since acceleration is just the difference in speed between two frames, just subtract where we want to be // and where we were/are - energy.set_values_and_process(PaddedVec2::new(speed.x - speed_to_change_from.x, speed.y - speed_to_change_from.y), PaddedVec2::new(-1.0, -1.0), speed, boma); + energy.set_values_and_process( + PaddedVec2::new(speed.x - speed_to_change_from.x, speed.y - speed_to_change_from.y), + PaddedVec2::new(-1.0, -1.0), + speed, + boma + ); } pub fn install() { - skyline::install_hooks!(motion_update); + skyline::install_hooks!( + motion_update + ); } diff --git a/fighters/common/src/function_hooks/energy/stop.rs b/fighters/common/src/function_hooks/energy/stop.rs index 8473360a9b..64302af08e 100644 --- a/fighters/common/src/function_hooks/energy/stop.rs +++ b/fighters/common/src/function_hooks/energy/stop.rs @@ -1,6 +1,6 @@ use super::*; -use crate::consts::globals::*; use crate::consts::*; +use crate::consts::globals::*; use std::ops::{Deref, DerefMut}; #[repr(C)] @@ -22,7 +22,8 @@ pub struct FighterKineticEnergyStop { _xBA: bool, _xBB: bool, _xBC: u32, - _xC0: PaddedVec2, // ... + _xC0: PaddedVec2 + // ... } impl Deref for FighterKineticEnergyStop { @@ -95,8 +96,7 @@ unsafe fn update_stop(energy: &mut FighterKineticEnergyStop, boma: &mut BattleOb // Double traction while above max walk speed if StatusModule::status_kind(boma) <= 0x1DB // only affects common statuses && boma.is_situation(*SITUATION_KIND_GROUND) - && !boma.is_prev_situation(*SITUATION_KIND_AIR) - { + && !boma.is_prev_situation(*SITUATION_KIND_AIR) { let mut damage_energy = KineticModule::get_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_DAMAGE) as *mut app::KineticEnergy; let damage_speed_x = app::lua_bind::KineticEnergy::get_speed_x(damage_energy); // If our speed is being influenced by knockback, we handle double traction elsewhere @@ -124,7 +124,12 @@ unsafe fn update_stop(energy: &mut FighterKineticEnergyStop, boma: &mut BattleOb #[skyline::hook(offset = 0x6d8560)] pub unsafe extern "Rust" fn setup_stop(energy: &mut FighterKineticEnergyStop, reset_type: EnergyStopResetType, initial_speed: &PaddedVec2, unk: u64, boma: &mut BattleObjectModuleAccessor) { - if (boma.is_fighter() && (boma.kind() == *FIGHTER_KIND_MEWTWO && boma.is_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2)) || (boma.kind() == *FIGHTER_KIND_PALUTENA && boma.is_status(*FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_2)) || (boma.kind() == *FIGHTER_KIND_SHEIK && boma.is_status(*FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_MOVE)) || (boma.kind() == *FIGHTER_KIND_ZELDA && boma.is_status(*FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_2))) { + if ( boma.is_fighter() + && (boma.kind() == *FIGHTER_KIND_MEWTWO && boma.is_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2)) + || (boma.kind() == *FIGHTER_KIND_PALUTENA && boma.is_status(*FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_2)) + || (boma.kind() == *FIGHTER_KIND_SHEIK && boma.is_status(*FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_MOVE)) + || (boma.kind() == *FIGHTER_KIND_ZELDA && boma.is_status(*FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_2)) ) + { VarModule::set_float(boma.object(), vars::common::status::TELEPORT_INITIAL_SPEED_X, initial_speed.x); VarModule::set_float(boma.object(), vars::common::status::TELEPORT_INITIAL_SPEED_Y, initial_speed.y); } @@ -132,5 +137,8 @@ pub unsafe extern "Rust" fn setup_stop(energy: &mut FighterKineticEnergyStop, re } pub fn install() { - skyline::install_hooks!(update_stop, setup_stop); + skyline::install_hooks!( + update_stop, + setup_stop + ); } diff --git a/fighters/common/src/function_hooks/get_param.rs b/fighters/common/src/function_hooks/get_param.rs index 6b56e249c1..85cb8b68ae 100644 --- a/fighters/common/src/function_hooks/get_param.rs +++ b/fighters/common/src/function_hooks/get_param.rs @@ -39,10 +39,9 @@ pub unsafe fn get_param_int_hook(x0: u64, x1: u64, x2 :u64) -> i32 { let mut boma = *((x0 as *mut u64).offset(1)) as *mut BattleObjectModuleAccessor; let boma_reference = &mut *boma; let fighter_kind = boma_reference.kind(); - let id = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as usize; + // For fighters if boma_reference.is_fighter() { - match utils::game_modes::get_custom_mode() { Some(modes) => { if modes.contains(&CustomMode::Smash64Mode) { @@ -50,6 +49,17 @@ pub unsafe fn get_param_int_hook(x0: u64, x1: u64, x2 :u64) -> i32 { return 4; } } + else if modes.contains(&CustomMode::RivalsOfAetherMode) { + // no SDI for RoA mode + if x1 == hash40("common") && x2 == hash40("hit_stop_delay_flick_max_count") { + return 0; + } + + // universal 5F jumpsquat for RoA mode + if x1 == hash40("jump_squat_frame") { + return 5; + } + } }, _ => {} } @@ -58,38 +68,12 @@ pub unsafe fn get_param_int_hook(x0: u64, x1: u64, x2 :u64) -> i32 { return 1000; } - if x2 == hash40("continue_just_shield_count") { - - } - - if fighter_kind == *FIGHTER_KIND_RYU { - if VarModule::is_flag(boma_reference.object(), vars::shotos::instance::EX_SPECIAL_USED) && x1 == hash40("param_special_s") && (x2 == hash40("loop_num_w") || x2 == hash40("loop_num_m") || x2 == hash40("loop_num_s") || x2 == hash40("loop_num_w") || x2 == hash40("air_loop_num_m") || x2 == hash40("air_air_loop_num_s")) { - return 3; - } - } - - else if fighter_kind == *FIGHTER_KIND_PACKUN { - if boma_reference.is_motion(Hash40::new("special_hi")) - && !boma_reference.is_prev_situation(*SITUATION_KIND_AIR) - && x1 == hash40("param_special_hi") - && x2 == hash40("start_no_landing_frame") { - return 999; - } - } - - else if fighter_kind == *FIGHTER_KIND_KROOL { - if x1 == hash40("param_special_n") - && x2 == hash40("special_n_suction_frame_min") - && VarModule::is_flag(boma_reference.object(), vars::krool::instance::SPECIAL_N_GRAB) { - return 30; - } - } - + // if x2 == hash40("continue_just_shield_count") { + // } } + // For articles else if boma_reference.is_weapon() { - - // For articles let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if fighter_kind == *WEAPON_KIND_PACKUN_SPIKEBALL { @@ -100,13 +84,6 @@ pub unsafe fn get_param_int_hook(x0: u64, x1: u64, x2 :u64) -> i32 { } } } - // else if VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - // if x1 == hash40("param_spikeball") { - // if x2 == hash40("out_range_y") { - // return 45; - // } - // } - // } } else if fighter_kind == *WEAPON_KIND_LUCARIO_AURABALL { @@ -128,8 +105,8 @@ pub unsafe fn get_param_float_hook(x0 /*boma*/: u64, x1 /*param_type*/: u64, x2 let mut boma = *((x0 as *mut u64).offset(1)) as *mut BattleObjectModuleAccessor; let boma_reference = &mut *boma; let fighter_kind = boma_reference.kind(); - let id = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as usize; + // For fighters if boma_reference.is_fighter() { match utils::game_modes::get_custom_mode() { @@ -187,36 +164,46 @@ pub unsafe fn get_param_float_hook(x0 /*boma*/: u64, x1 /*param_type*/: u64, x2 return 4.0; } } + else if modes.contains(&CustomMode::RivalsOfAetherMode) { + + // RoA mode universal 13F airdodge landing lag + if x1 == hash40("param_motion") && x2 == hash40("landing_frame_escape_air_slide_max") { + return 13.0; + } + + // RoA mode universal 4F heavy landing lag + if x1 == hash40("landing_frame") { + VarModule::set_float(boma_reference.object(), vars::common::instance::LANDING_LAG_FOR_RIVALS_MODE, 4.0); + return 4.0; + } + + // RoA mode whifflag on aerials + if [ + hash40("landing_attack_air_frame_n"), + hash40("landing_attack_air_frame_f"), + hash40("landing_attack_air_frame_b"), + hash40("landing_attack_air_frame_hi"), + hash40("landing_attack_air_frame_lw"), + ].contains(&x1) { + let landing_lag = 2.0 + original!()(x0, x1, x2); // base landing lag is original landing lag + 2 + let prev_inflict_status = VarModule::get_int(boma_reference.object(), vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_HIT != 0 { + // on hit, landing lag is reduced by one third and can go no lower than 4F + let reduced_landing_lag = (landing_lag * 0.6667).floor().max(4.0); + VarModule::set_float(boma_reference.object(), vars::common::instance::LANDING_LAG_FOR_RIVALS_MODE, reduced_landing_lag); + return reduced_landing_lag; + } + VarModule::set_float(boma_reference.object(), vars::common::instance::LANDING_LAG_FOR_RIVALS_MODE, landing_lag); + return landing_lag; + } + } }, _ => {} } - /*if x1 == hash40("air_speed_x_stable") { - if StatusModule::status_kind(boma) == *FIGHTER_STATUS_KIND_JUMP_SQUAT { - if StatusModule::prev_status_kind(boma, 0) == *FIGHTER_STATUS_KIND_RUN { - return original!()(x0, hash40("jump_speed_x_max"), 0); - } - } - }*/ - /* - if x1 == hash40("critical_frame") { - return 0.0; - } - if x1 == hash40("critical_zoom_rate") { - return 0.0; - } - */ - - // handle reduction of the tumble threshold for DK when in barrel carry - if x2 == hash40("damage_level3") - && boma_reference.kind() == *FIGHTER_KIND_DONKEY - { - let status = boma_reference.status(); - - // if you are in any of the FIGHTER_DONKEY_STATUS_KIND_SUPER_LIFT_* statuses, - // reduce the dumble threshold. - if status >= 481 && status <= 489 { - return original!()(x0, x1, x2) * 0.5; + if x2 == hash40("damage_fly_correction_max") { + if VarModule::is_flag(boma_reference.object(), vars::common::instance::ENABLE_FRAME_DATA_DEBUG) { + return 15.0; } } @@ -226,6 +213,28 @@ pub unsafe fn get_param_float_hook(x0 /*boma*/: u64, x1 /*param_type*/: u64, x2 return original!()(x0, hash40("landing_frame"), 0) + 2.0; } + else if fighter_kind == *FIGHTER_KIND_DIDDY { + if x1 == hash40("param_special_hi") { + if x2 == hash40("special_hi_jet_ang_f_max") { + if WorkModule::get_int(boma, *FIGHTER_DIDDY_STATUS_SPECIAL_HI_WORK_INT_SITUATION) == *SITUATION_KIND_GROUND { + return 5.0; + } + } + } + } + + else if fighter_kind == *FIGHTER_KIND_DONKEY { + // handle reduction of the tumble threshold for DK when in barrel carry + if x2 == hash40("damage_level3") { + let status = boma_reference.status(); + // if you are in any of the FIGHTER_DONKEY_STATUS_KIND_SUPER_LIFT_* statuses, + // reduce the dumble threshold. + if (481..=489).contains(&boma_reference.status()) { + return original!()(x0, x1, x2) * 0.5; + } + } + } + // Ken aerial hadouken modified offsets for aerial version else if fighter_kind == *FIGHTER_KIND_KEN { if VarModule::is_flag(boma_reference.object(), vars::shotos::instance::SPECIAL_N_HADOKEN_AIR) { @@ -238,35 +247,50 @@ pub unsafe fn get_param_float_hook(x0 /*boma*/: u64, x1 /*param_type*/: u64, x2 } } } - - else if fighter_kind == *FIGHTER_KIND_MIISWORDSMAN { - //if MotionModule::motion_kind(&mut *boma) == hash40("special_hi1") || MotionModule::motion_kind(&mut *boma) == hash40("special_hi1_start"){ - if StatusModule::situation_kind(&mut *boma) == *SITUATION_KIND_GROUND{ - //println!("Stone"); - if x1 == hash40("param_special_hi") && x2 == hash40("hi1_jump_speed_mul") { - //println!("Scabbard"); - return 0.65; + + else if fighter_kind == *FIGHTER_KIND_LUCARIO { + if x1 == hash40("param_special_hi") + && x2 == hash40("rush_speed") { + let rate = VarModule::get_float(boma_reference.object(), vars::lucario::instance::SPECIAL_HI_MOTION_RATE); + if rate > 0.0 { + let original = original!()(x0, x1, x2); + return original * rate; + } + } + } + + // Ironball uses a custom kinetic type and I can't find the offset where these values are set + else if fighter_kind == *FIGHTER_KIND_MIIFIGHTER + || (fighter_kind == *FIGHTER_KIND_KIRBY && WorkModule::get_int(boma, *FIGHTER_KIRBY_INSTANCE_WORK_ID_INT_COPY_CHARA) == 0x48) { + if x1 == hash40("param_special_n") { + if x2 == hash40("n1_throw_angle") { + return VarModule::get_float(boma_reference.object(), vars::miifighter::status::SPECIAL_N1_ANGLE); + } + if x2 == hash40("n1_start_speed_x") { + return VarModule::get_float(boma_reference.object(), vars::miifighter::status::SPECIAL_N1_SPEED); } } - if x1 == hash40("param_special_hi"){ - //if heavy_attack[hdr::get_player_number(owner_module_accessor)]{ + } + + else if fighter_kind == *FIGHTER_KIND_MIISWORDSMAN { + // not found within the special_hi status scripts + if x1 == hash40("param_special_hi") { if VarModule::is_flag(boma_reference.object(), vars::common::instance::IS_HEAVY_ATTACK){ if x2 == hash40("hi2_rush_speed") { return 3.0; } } } - else if x1 == hash40("param_private") { - if x2 == hash40("final_wave_speed") { - if VarModule::is_flag(boma_reference.object(), vars::miiswordsman::status::SPECIAL_N1_WAVE) { - return 2.0; - } - } - else if x2 == hash40("final_wave_scale_max") { - if VarModule::is_flag(boma_reference.object(), vars::miiswordsman::status::SPECIAL_N1_WAVE) { - return 0.5; - } - } + } + + else if fighter_kind == *FIGHTER_KIND_MIIGUNNER { + // not found within the special_hi status scripts + if x1 == hash40("param_special_hi") && x2 == hash40("hi1_first_jump_y_speed") { + let charge = VarModule::get_float(boma_reference.object(), vars::miigunner::status::ATTACK_CHARGE); + let base_y_speed = ParamModule::get_float(boma_reference.object(), ParamType::Agent, "param_special_hi1.base_y_speed"); + let charge_y_speed_mul = ParamModule::get_float(boma_reference.object(), ParamType::Agent, "param_special_hi1.charge_y_speed_mul"); + let charge_y_speed_div = ParamModule::get_float(boma_reference.object(), ParamType::Agent, "param_special_hi1.charge_y_speed_div"); + return base_y_speed + (charge_y_speed_mul * charge) / charge_y_speed_div; } } @@ -278,107 +302,11 @@ pub unsafe fn get_param_float_hook(x0 /*boma*/: u64, x1 /*param_type*/: u64, x2 } } - else if fighter_kind == *FIGHTER_KIND_MIIGUNNER { - if x1 == hash40("param_special_hi") && x2 == hash40("hi1_first_jump_y_speed") { - return 3.5 + (2.7 * VarModule::get_float(boma_reference.object(), vars::miigunner::status::ATTACK_CHARGE)) / 29.0; - } - } - - else if fighter_kind == *FIGHTER_KIND_SHEIK { - if x1 == hash40("param_special_s") { - if x2 == hash40("throw_angle") { - return 30.0 + ControlModule::get_stick_y(boma) * 20.0; - } - if x2 == hash40("throw_speed") { - return 3.5 - ControlModule::get_stick_y(boma) * 0.5; - } - } - } - - else if fighter_kind == *FIGHTER_KIND_DAISY { - if x1 == hash40("param_special_s") { - if x2 == hash40("special_s_jump_dec_accel_y") - && VarModule::is_flag(boma_reference.object(), vars::daisy::instance::SPECIAL_S_GROUND_START) { - return 0.05; - } - } - } - - // else if fighter_kind == *FIGHTER_KIND_PICKEL { - // if [*FIGHTER_PICKEL_STATUS_KIND_SPECIAL_N3_WAIT, *FIGHTER_PICKEL_STATUS_KIND_SPECIAL_N3_FALL, *FIGHTER_PICKEL_STATUS_KIND_SPECIAL_N3_FALL_AERIAL].contains(&StatusModule::status_kind(boma)) { - // if ControlModule::get_stick_x(boma) * PostureModule::lr(boma) > 0.5 { - // if x1 == hash40("param_special_n") && x2 == hash40("generate_pickelobject_offset_x") { - // return 10.5; - // } - // } - // if ControlModule::get_stick_y(boma) > 0.5 { - // if x1 == hash40("param_special_n") && x2 == hash40("generate_pickelobject_offset_y") { - // return 22.5; - // } - // } - // else if ControlModule::get_stick_y(boma) < -0.5 { - // if x1 == hash40("param_special_n") && x2 == hash40("generate_pickelobject_offset_y") { - // return -7.5; - // } - // } - // else { - // if ControlModule::get_stick_x(boma) * PostureModule::lr(boma) > 0.5 { - // if x1 == hash40("param_special_n") && x2 == hash40("generate_pickelobject_offset_y") { - // return 3.5; - // } - // } - // } - // } - // if [*FIGHTER_PICKEL_STATUS_KIND_SPECIAL_N3_WALK, *FIGHTER_PICKEL_STATUS_KIND_SPECIAL_N3_WALK_BACK].contains(&StatusModule::status_kind(boma)) { - // if ControlModule::get_stick_x(boma) * PostureModule::lr(boma) > 0.5 { - // if x1 == hash40("param_special_n") && x2 == hash40("generate_pickelobject_offset_x") { - // return 9.5; - // } - // } - // if ControlModule::get_stick_y(boma) > 0.5 { - // if x1 == hash40("param_special_n") && x2 == hash40("generate_pickelobject_offset_y") { - // return 22.5; - // } - // } - // else if ControlModule::get_stick_y(boma) < 0.0 { - // if x1 == hash40("param_special_n") && x2 == hash40("generate_pickelobject_offset_y") { - // return -7.5; - // } - // } - // else { - // if ControlModule::get_stick_x(boma) * PostureModule::lr(boma) > 0.5 { - // if x1 == hash40("param_special_n") && x2 == hash40("generate_pickelobject_offset_y") { - // return 3.5; - // } - // } - // } - // } - // } - else if fighter_kind == *FIGHTER_KIND_DIDDY { - if x1 == hash40("param_special_hi") { - if x2 == hash40("special_hi_jet_ang_f_max") { - if WorkModule::get_int(boma, *FIGHTER_DIDDY_STATUS_SPECIAL_HI_WORK_INT_SITUATION) == *SITUATION_KIND_GROUND { - return 5.0; - } - } - } - } - - else if fighter_kind == *FIGHTER_KIND_LUCARIO { - if x1 == hash40("param_special_hi") - && x2 == hash40("rush_speed") { - let rate = VarModule::get_float(boma_reference.object(), vars::lucario::instance::SPECIAL_HI_MOTION_RATE); - if rate > 0.0 { - let original = original!()(x0, x1, x2); - return original * rate; - } - } - } - } + + // For articles else if boma_reference.is_weapon() { - // For articles let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if fighter_kind == *WEAPON_KIND_SNAKE_TRENCHMORTAR_BULLET { @@ -388,66 +316,23 @@ pub unsafe fn get_param_float_hook(x0 /*boma*/: u64, x1 /*param_type*/: u64, x2 } else if fighter_kind == *WEAPON_KIND_DEDEDE_GORDO { - if x1 == hash40("param_gordo") && x2 == hash40("shot_start_angle"){ + if x1 == hash40("param_gordo") && x2 == hash40("shot_start_angle") { return 20.0 * ControlModule::get_stick_y(owner_module_accessor); } } - // Frieza death ball on M2 aerial Shadow Ball - /* - if fighter_kind == *WEAPON_KIND_MEWTWO_SHADOWBALL { - if x1 == hash40("param_shadowball") && x2 == hash40("angle") { - //println!("Owner module accessor entry ID: {}", WorkModule::get_int(owner_module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID)); - if StatusModule::situation_kind(owner_module_accessor) == *SITUATION_KIND_AIR { - //println!("Mewtwo is airborne"); - return -45.0; - } - } - } - */ - else if fighter_kind == *WEAPON_KIND_PICKEL_FISHINGROD{ - if x1 == hash40("param_fishingrod"){ - if x2 == hash40("shoot_angle"){ - if ControlModule::get_stick_y(owner_module_accessor) < 0.0{ + else if fighter_kind == *WEAPON_KIND_PICKEL_FISHINGROD { + if x1 == hash40("param_fishingrod") { + if x2 == hash40("shoot_angle") { + if ControlModule::get_stick_y(owner_module_accessor) < 0.0 { return 48.0 + (ControlModule::get_stick_y(owner_module_accessor) * 30.0); } - else{ + else { return 48.0; } } } } - else if fighter_kind == *WEAPON_KIND_MIISWORDSMAN_TORNADOSHOT { - if x1 == hash40("param_tornadoshot"){ - if x2 == hash40("life") { - //if heavy_attack[hdr::get_player_number(owner_module_accessor)]{ - if VarModule::is_flag(owner_module_accessor.object(), vars::common::instance::IS_HEAVY_ATTACK){ - return 70.0; - } - } - else if x2 == hash40("speed_x") { - //if heavy_attack[hdr::get_player_number(owner_module_accessor)]{ - if VarModule::is_flag(owner_module_accessor.object(), vars::common::instance::IS_HEAVY_ATTACK){ - return 1.5; - } - } - else if x2 == hash40("accel_x") { - //if heavy_attack[hdr::get_player_number(owner_module_accessor)]{ - if VarModule::is_flag(owner_module_accessor.object(), vars::common::instance::IS_HEAVY_ATTACK){ - return -0.025; - } - } - } - } - - // else if fighter_kind == *WEAPON_KIND_MIIGUNNER_GRENADELAUNCHER { - // if x1 == hash40("param_grenadelauncher") { - // if x2 == hash40("angle") { - // let charge = VarModule::get_float(owner_module_accessor.object(), vars::miigunner::instance::SPECIAL_N3_CHARGE); - // return 34.0 + charge; - // } - // } - // } else if fighter_kind == *WEAPON_KIND_PACKUN_SPIKEBALL { if VarModule::is_flag(boma_reference.object(), vars::packun_spikeball::instance::ENABLE_EXPLODE) { @@ -484,12 +369,6 @@ pub unsafe fn get_param_float_hook(x0 /*boma*/: u64, x1 /*param_type*/: u64, x2 else if fighter_kind == *WEAPON_KIND_LUCARIO_AURABALL { if x1 == hash40("param_auraball") { if VarModule::is_flag(boma_reference.object(), vars::lucario::instance::IS_POWERED_UP) { - // if x2 == hash40("attack_mul") { - // return 1.0; - // } - // if x2 == hash40("angle") { - // return VarModule::get_float(boma_reference.object(), vars::lucario::status::SPECIAL_N_ANGLE); - // } if x2 == hash40("min_speed") { return 0.7; } @@ -499,20 +378,6 @@ pub unsafe fn get_param_float_hook(x0 /*boma*/: u64, x1 /*param_type*/: u64, x2 } } } - - else if fighter_kind == *WEAPON_KIND_RICHTER_AXE { - if x1 == hash40("param_axe") { - if (&[ - hash40("throw_angle"), - hash40("throw_angle_stick_front"), - hash40("throw_angle_stick_back") - ]).contains(&x2) - && owner_module_accessor.is_situation(*SITUATION_KIND_AIR) { - return -42.0; - } - } - } - } original!()(x0, x1, x2) diff --git a/fighters/common/src/function_hooks/iceclimber.rs b/fighters/common/src/function_hooks/iceclimber.rs index 4aff4871fb..9de96a50d1 100644 --- a/fighters/common/src/function_hooks/iceclimber.rs +++ b/fighters/common/src/function_hooks/iceclimber.rs @@ -1,82 +1,20 @@ use super::*; -pub mod FighterSpecializer_Popo { - extern "C" { - #[link_name = "\u{1}_ZN3app23FighterSpecializer_Popo23get_partner_motion_kindERNS_7FighterE"] - pub fn get_partner_motion_kind( - fighter: *mut smash::app::Fighter, - ) -> u64; - } - extern "C" { - #[link_name = "\u{1}_ZN3app23FighterSpecializer_Popo28get_main_fighter_status_kindERNS_7FighterE"] - pub fn get_main_fighter_status_kind( - fighter: *mut smash::app::Fighter, - ) -> u64; - } - extern "C" { - #[link_name = "\u{1}_ZN3app23FighterSpecializer_Popo31enable_partner_catch_transitionERNS_7FighterE"] - pub fn enable_partner_catch_transition( - fighter: *mut smash::app::Fighter, - ); - } -} - -// #[skyline::hook(replace = FighterSpecializer_Popo::get_partner_motion_kind)] -// pub unsafe extern "C" fn get_partner_motion_kind(fighter: *mut smash::app::Fighter) -> u64 { -// let ret = call_original!(fighter); -// let boma = (&mut (*fighter).battle_object).module_accessor; -// dbg!(MotionModule::motion_kind(boma)); -// if [ -// hash40("catch"), -// hash40("catch_dash"), -// hash40("catch_turn"), -// hash40("catch_pull"), -// hash40("catch_wait"), -// hash40("catch_attack"), -// hash40("catch_cut"), -// ].contains(&ret) { -// return hash40("wait"); -// } -// return ret; -// } - -// #[skyline::hook(replace = FighterSpecializer_Popo::get_main_fighter_status_kind)] -// pub unsafe extern "C" fn get_main_fighter_status_kind(fighter: *mut smash::app::Fighter) -> u64 { -// let ret = call_original!(fighter); -// let boma = (&mut (*fighter).battle_object).module_accessor; -// dbg!(StatusModule::status_kind(boma)); -// if [ -// *FIGHTER_STATUS_KIND_CATCH as u64, -// *FIGHTER_STATUS_KIND_CATCH_DASH as u64, -// *FIGHTER_STATUS_KIND_CATCH_TURN as u64, -// *FIGHTER_STATUS_KIND_CATCH_PULL as u64, -// *FIGHTER_STATUS_KIND_CATCH_WAIT as u64, -// *FIGHTER_STATUS_KIND_CATCH_ATTACK as u64, -// *FIGHTER_STATUS_KIND_CATCH_CUT as u64, -// ].contains(&ret) { -// return *FIGHTER_STATUS_KIND_WAIT as u64; -// } -// return ret; -// } - -// #[skyline::hook(replace = FighterSpecializer_Popo::enable_partner_catch_transition)] -// pub unsafe extern "C" fn enable_partner_catch_transition(fighter: *mut smash::app::Fighter) { -// let boma = (&mut (*fighter).battle_object).module_accessor; -// dbg!(StatusModule::status_kind(boma)); -// return; -// } - -#[skyline::hook(offset = 0xfb63e0, inline)] -unsafe fn cheer_cancel(ctx: &mut skyline::hooks::InlineCtx) { - ctx.registers[24].set_w(0x11d); -} - pub fn install() { unsafe { - // skyline::patching::Patch::in_text(0xfb63e8).data(0x17FFFF8B); // cheer cancel - skyline::install_hooks!( - // enable_partner_catch_transition, - cheer_cancel - ); + // Patches out disabling grabs + skyline::patching::Patch::in_text(0xfba284).nop(); + skyline::patching::Patch::in_text(0xfb9780).nop(); + skyline::patching::Patch::in_text(0xfb9794).nop(); + skyline::patching::Patch::in_text(0xfb97a8).nop(); + + // No more cheering or crying. + skyline::patching::Patch::in_text(0xfb63e8).data(0x17FFFFE2_u32); + skyline::patching::Patch::in_text(0xfba298).data(0x1400060C_u32); + skyline::patching::Patch::in_text(0xfba52c).nop(); + skyline::patching::Patch::in_text(0xfba850).data(0x1400049E_u32); + + // fixes nana not inputting grab when popo is actionable + skyline::patching::Patch::in_text(0x2f7dcc).data(0x140000E1_u32); } } \ No newline at end of file diff --git a/fighters/common/src/function_hooks/knockback.rs b/fighters/common/src/function_hooks/knockback.rs index f963274e8e..3d82d118b0 100644 --- a/fighters/common/src/function_hooks/knockback.rs +++ b/fighters/common/src/function_hooks/knockback.rs @@ -1,6 +1,7 @@ use super::*; use super::knockback_util::*; use utils::ext::*; +use utils::game_modes::*; pub fn install() { skyline::install_hooks!( @@ -40,6 +41,11 @@ unsafe fn calculate_knockback(ctx: &skyline::hooks::InlineCtx) { // stores the attacker's team color here, since this runs before the spark effects are called // process_knockback occurs after the sparks, so we can't put it there set_attacker_team_color(attacker); + + // Track last attacker entry ID on the defender for War Mode stock steal + if check_custom_mode(CustomMode::WarMode) { + set_last_attacker_entry_id(&mut *our_boma, attacker); + } } } @@ -48,7 +54,7 @@ unsafe fn process_knockback(ctx: &skyline::hooks::InlineCtx) { if let Some((defender, attacker)) = IS_CALCULATING { let boma = ctx.registers[20].x() as *mut smash::app::BattleObjectModuleAccessor; if (*boma).battle_object_id == defender { - process_item_on_collision(defender, attacker); + process_item_on_collision(defender, attacker, ctx.registers[19].x() as *const f32); calculate_finishing_hit(defender, attacker, ctx.registers[19].x() as *const f32); } } @@ -81,11 +87,61 @@ pub unsafe extern "C" fn set_attacker_team_color(attacker:u32) { // if LAST_ATTACK_TEAM_COLOR == 9 { LAST_ATTACK_TEAM_COLOR = 0 }; } -pub unsafe extern "C" fn process_item_on_collision(defender: u32, attacker: u32) { +/// When a defending fighter is hit by an attack, get the attacker's entry ID and store it in the defender's var module +/// This code is currently only used for tracking the kill reward for War Mode +unsafe fn set_last_attacker_entry_id(defender_boma: &mut BattleObjectModuleAccessor, attacker: u32) { + if !defender_boma.is_fighter() || !VarModule::has_var_module(defender_boma.object()) { + return; + } + + let attacker_obj = util::get_battle_object_from_id(attacker); + if attacker_obj.is_null() { return; } + let mut attacker_boma = &mut *(*attacker_obj).module_accessor; + + // Check weapons + if attacker_boma.is_weapon() { + let owner_id = WorkModule::get_int(attacker_boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; + let owner = util::get_battle_object_from_id(owner_id); + if owner.is_null() { return; } + attacker_boma = &mut *(*owner).module_accessor; + if attacker_boma.is_weapon() { + let owner_id = WorkModule::get_int(attacker_boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; + let owner = util::get_battle_object_from_id(owner_id); + if owner.is_null() { return; } + attacker_boma = &mut *(*owner).module_accessor; + } + } + + // Check items + if attacker_boma.is_item() { + let owner_id = if LinkModule::is_link(attacker_boma, *ITEM_LINK_NO_HAVE) { + LinkModule::get_parent_id(attacker_boma, *ITEM_LINK_NO_HAVE, true) as u32 + } else if LinkModule::is_link(attacker_boma, *ITEM_LINK_NO_CREATEOWNER) { + LinkModule::get_parent_id(attacker_boma, *ITEM_LINK_NO_CREATEOWNER, true) as u32 + } else if LinkModule::is_link(attacker_boma, *ITEM_LINK_NO_TEAMOWNER) { + LinkModule::get_parent_id(attacker_boma, *ITEM_LINK_NO_TEAMOWNER, true) as u32 + } else { + return; + }; + let owner = utils::util::get_battle_object_from_id(owner_id); + if owner.is_null() { return; } + attacker_boma = &mut *(*owner).module_accessor; + } + + if !attacker_boma.is_fighter() { return; } + + let attacker_entry_id = WorkModule::get_int(attacker_boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID); + VarModule::set_int(defender_boma.object(), vars::common::instance::LAST_ATTACKER_ENTRY_ID, attacker_entry_id); +} + +pub unsafe extern "C" fn process_item_on_collision(defender: u32, attacker: u32, knockback_info: *const f32) { let defender_boma = &mut *(*util::get_battle_object_from_id(defender)).module_accessor; let attacker_boma = &mut *(*util::get_battle_object_from_id(attacker)).module_accessor; if defender_boma.is_item() { if defender_boma.kind() == *ITEM_KIND_DAISYDAIKON { + let damage = *knockback_info.add(22); + let carrot_dmg = WorkModule::get_int64(defender_boma, *ITEM_DAISYDAIKON_INSTANCE_WORK_INT_ATTACK_POWER) as f32; + WorkModule::set_int64(defender_boma, (carrot_dmg + damage) as i64, *ITEM_DAISYDAIKON_INSTANCE_WORK_INT_ATTACK_POWER); if attacker_boma.is_fighter() { let attacker_team_no = TeamModule::hit_team_no(attacker_boma) as i32; TeamModule::set_team(defender_boma, attacker_team_no, false); @@ -143,36 +199,25 @@ pub unsafe extern "C" fn calculate_finishing_hit(defender: u32, attacker: u32, k *(knockback_info.add(0x4c / 4) as *mut u32) = 60; let defender_boma = &mut *(*util::get_battle_object_from_id(defender)).module_accessor; let attacker_boma = &mut *(*util::get_battle_object_from_id(attacker)).module_accessor; - // let before = std::time::Instant::now(); - // println!(""); - if VarModule::has_var_module(defender_boma.object()) {VarModule::off_flag(defender_boma.object(), vars::common::instance::IS_KILLING_BLOW);} + if VarModule::has_var_module(defender_boma.object()) {VarModule::off_flag(defender_boma.object(), vars::common::instance::IS_KILLING_BLOW);} if !is_potential_finishing_hit(defender_boma, attacker_boma) { - // let elapsed = std::time::Instant::now().duration_since(before); - // println!("is_potential_finishing_hit calculation time: {:?}", elapsed); return; } - - // let elapsed = std::time::Instant::now().duration_since(before); - // println!("is_potential_finishing_hit calculation time: {:?}", elapsed); - // let before = std::time::Instant::now(); if !is_valid_finishing_hit(knockback_info, defender_boma, attacker_boma) { - // let elapsed = std::time::Instant::now().duration_since(before); - // println!("is_valid_finishing_hit calculation time: {:?}", elapsed); return; } - // let elapsed = std::time::Instant::now().duration_since(before); - // println!("is_valid_finishing_hit calculation time: {:?}", elapsed); if VarModule::has_var_module(defender_boma.object()) {VarModule::on_flag(defender_boma.object(), vars::common::instance::IS_KILLING_BLOW);} call_finishing_hit_effects(defender_boma, attacker_boma); } unsafe extern "C" fn is_potential_finishing_hit(defender_boma: &mut BattleObjectModuleAccessor, attacker_boma: &mut BattleObjectModuleAccessor) -> bool { - if !defender_boma.is_fighter() { + if !defender_boma.is_fighter() || defender_boma.kind() == *FIGHTER_KIND_NANA { // println!("kill screen defender is not fighter"); - return false; + return false; } + if !attacker_boma.is_fighter() && !attacker_boma.is_weapon() { // println!("kill screen attacker is not fighter or weapon"); return false; @@ -219,24 +264,7 @@ pub unsafe extern "C" fn is_teammate_alive(defender_boma: &mut BattleObjectModul } pub unsafe extern "C" fn is_final_killing_hit(defender_boma: &mut BattleObjectModuleAccessor, attacker_boma: &mut BattleObjectModuleAccessor) -> bool { - // special case for training mode if util::is_training_mode() { - if VarModule::is_flag(defender_boma.object(), vars::common::instance::ENABLE_FRAME_DATA_DEBUG) { - return true; - } - - let mut is_training_toggle = false; - if attacker_boma.is_weapon() { - let owner_id = WorkModule::get_int(attacker_boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; - let owner = util::get_battle_object_from_id(owner_id); - let owner_boma = &mut *(*owner).module_accessor; - if VarModule::is_flag(owner_boma.object(), vars::common::instance::ENABLE_FRAME_DATA_DEBUG) { - return true; - } - } else if VarModule::is_flag(attacker_boma.object(), vars::common::instance::ENABLE_FRAME_DATA_DEBUG) { - return true; - } - // println!("kill screen training mode is not enabled"); return false; } diff --git a/fighters/common/src/function_hooks/knockback_util.rs b/fighters/common/src/function_hooks/knockback_util.rs index 33c3a03009..baf707a2ed 100644 --- a/fighters/common/src/function_hooks/knockback_util.rs +++ b/fighters/common/src/function_hooks/knockback_util.rs @@ -13,7 +13,7 @@ struct Rect { // right: f32, // top: f32, // bottom: f32, - vec: [f32; 4], + vec: [f32; 4] } impl Rect { @@ -102,18 +102,21 @@ pub unsafe fn rotate_vector2f( ); } -// number of DI angles checked -const NUM_ANGLES_CHECKED: i32 = 12; -const NUM_ANGLES_CHECKED_FINAL: i32 = 12; -// maximum number of survivable DI angles in a finishing hit -const SURVIVABLE_ANGLES_ALLOWED: i32 = 0; -const SURVIVABLE_ANGLES_ALLOWED_FINAL: i32 = 1; // how many units into the blastzone a fighter will be declared dead const DEAD_AREA_LENIENCY: f32 = 7.5; const DEAD_AREA_LENIENCY_FINAL: f32 = 2.5; impl KnockbackCalcContext { - pub unsafe fn new(defender_boma: *mut BattleObjectModuleAccessor, knockback: f32, hitstun: f32, damage: f32, sdi_mul: f32, launch_radians: f32, launch_speed: Vector2f, is_tumble: bool) -> Self { + pub unsafe fn new( + defender_boma: *mut BattleObjectModuleAccessor, + knockback: f32, + hitstun: f32, + damage: f32, + sdi_mul: f32, + launch_radians: f32, + launch_speed: Vector2f, + is_tumble: bool, + ) -> Self { let fly_top_angle_lw = WorkModule::get_param_float(defender_boma, hash40("battle_object"), hash40("fly_top_angle_lw")); let fly_top_angle_hi = WorkModule::get_param_float(defender_boma, hash40("battle_object"), hash40("fly_top_angle_hi")); let ecb_bottom = *GroundModule::get_rhombus(defender_boma, true).add(1); @@ -185,14 +188,11 @@ impl KnockbackCalcContext { let defender_boma = self.defender_boma; // check left wall tech - let ecb_offset = self.ecb_left.x - self.ecb_bottom.x; - if GroundModule::ray_check( + if -1.0 * self.launch_speed.x <= self.base_asdi * self.sdi_mul + && GroundModule::ray_check( defender_boma, - &self.pos, - &Vector2f { - x: -1.0 * self.sdi_distance + ecb_offset, - y: 0.0, - }, + &Vector2f::new(self.ecb_left.x, self.ecb_left.y), + &Vector2f::new(-1.0 * self.sdi_distance, 0.0), true, ) == 1 { @@ -201,14 +201,11 @@ impl KnockbackCalcContext { } // check right wall tech - let ecb_offset = self.ecb_right.x - self.ecb_bottom.x; - if GroundModule::ray_check( + if self.launch_speed.x <= self.base_asdi * self.sdi_mul + && GroundModule::ray_check( defender_boma, - &self.pos, - &Vector2f { - x: self.sdi_distance + ecb_offset, - y: 0.0, - }, + &Vector2f::new(self.ecb_right.x, self.ecb_right.y), + &Vector2f::new(self.sdi_distance, 0.0), true, ) == 1 { @@ -217,34 +214,57 @@ impl KnockbackCalcContext { } // check floor tech - if self.pos.y - self.pos_prev.y < self.base_asdi * self.sdi_mul - && GroundModule::ray_check( - defender_boma, - &self.pos, - &Vector2f { - x: 0.0, - y: self.sdi_distance, - }, - true, - ) == 1 + if self.launch_speed.y <= self.base_asdi * self.sdi_mul + && GroundModule::ray_check( + defender_boma, + &Vector2f::new(self.ecb_bottom.x, self.ecb_bottom.y), + &Vector2f::new(0.0, -1.0 * self.sdi_distance), + true, + ) == 1 { self.is_tech_possible = true; return; } + } pub unsafe fn collision_check(&mut self) { + // calculate the offsets including ecb size and possible SDI distance + let ecb_width = f32::abs(self.ecb_right.x - self.ecb_left.x); + let ecb_height = f32::abs(f32::midpoint(self.ecb_left.y, self.ecb_right.y) - self.ecb_bottom.y); + let x_offset = self.sdi_distance + (0.5 * ecb_width); + let y_offset = self.sdi_distance; + + // calculate necessary ray checks + let max_left_prev = Vector2f::new(self.pos_prev.x - x_offset, self.pos_prev.y + ecb_height); + let max_left_curr = Vector2f::new(self.pos.x - x_offset, self.pos.y + ecb_height); + let max_right_prev = Vector2f::new(self.pos_prev.x + x_offset, self.pos_prev.y + ecb_height); + let max_right_curr = Vector2f::new(self.pos.x + x_offset, self.pos.y + ecb_height); + let max_down_prev = Vector2f::new(self.pos_prev.x, self.pos_prev.y - y_offset); + let max_down_curr = Vector2f::new(self.pos.x, self.pos.y - y_offset); + let ray_checks = [ + (self.pos_prev, self.pos), + (max_left_prev, max_left_curr), + (max_right_prev, max_right_curr), + (max_down_prev, max_down_curr), + ]; + + // perform a ray check between each point to draw a clear bounding box let defender_boma = self.defender_boma; - let diff = Vector2f::new(self.pos.x - self.pos_prev.x, self.pos.y - self.pos_prev.y); - if GroundModule::ray_check( - defender_boma, - &self.pos_prev, - &diff, - diff.y <= 0.0, // only check for platforms if going downwards - ) == 1 - { - self.is_tech_possible = true; - return; + for ray_check in ray_checks { + let prev = ray_check.0; + let curr = ray_check.1; + let diff = Vector2f::new(curr.x - prev.x, curr.y - prev.y); + if GroundModule::ray_check( + defender_boma, + &prev, + &diff, + diff.y <= 0.0, // only check for platforms if going downwards + ) == 1 + { + self.is_tech_possible = true; + return; + } } } @@ -296,52 +316,57 @@ impl KnockbackCalcContext { pub unsafe fn is_finishing_hit(&mut self, is_final: bool) -> bool { let defender_boma = self.defender_boma; - let (num_angles_checked, survivable_angles_allowed, dead_area_leniency_x, dead_area_leniency_y) = if is_final { - (NUM_ANGLES_CHECKED_FINAL, SURVIVABLE_ANGLES_ALLOWED_FINAL, DEAD_AREA_LENIENCY_FINAL, DEAD_AREA_LENIENCY_FINAL) + + // get blastzones, and grow them to build in a minumum kill threshold + let sdi_distance = self.sdi_distance; + let dead_area_leniency = if is_final { + DEAD_AREA_LENIENCY_FINAL + self.sdi_distance } else { - let x = DEAD_AREA_LENIENCY.max(self.sdi_distance); - let y = if StatusModule::situation_kind(defender_boma) != *SITUATION_KIND_GROUND { - DEAD_AREA_LENIENCY.max(self.sdi_distance) - } else { - DEAD_AREA_LENIENCY - }; - (NUM_ANGLES_CHECKED, SURVIVABLE_ANGLES_ALLOWED, x, y) + DEAD_AREA_LENIENCY + self.sdi_distance }; let mut blastzones = get_dead_area(); - blastzones.grow(dead_area_leniency_x, dead_area_leniency_y); - let kb_angle = self.launch_speed.y.atan2(self.launch_speed.x).to_degrees(); - let di_angle = WorkModule::get_param_float(defender_boma, hash40("common"), hash40("damage_fly_correction_max")); - let min_di = kb_angle - di_angle; - let max_di = kb_angle + di_angle; - let step = (di_angle * 2.0) / (num_angles_checked as f32); - let mut survivable_angles = 0; - let original_context = self.clone(); - for idx in 0..num_angles_checked + 1 { - // calc and update the DI angle - let new_radians = (min_di + (idx as f32 * step)).to_radians(); + blastzones.grow(dead_area_leniency, dead_area_leniency); - // reset everything to scratch - *self = original_context.clone(); - self.reset_angle(new_radians); + // calculate the different angles we will be checking + let base_radians = self.launch_speed.y.atan2(self.launch_speed.x); + let di_radians = WorkModule::get_param_float(defender_boma, hash40("common"), hash40("damage_fly_correction_max")).to_radians(); + let angles = [ + // check max DI angles first, since theyre more likely to be surviveable + // and if any angle is surviveable, we skip the others angle checks + base_radians + (di_radians * 1.00), // max left + base_radians - (di_radians * 1.00), // max right + base_radians, + // check precise angles later + base_radians + (di_radians * 0.66), + base_radians + (di_radians * 0.33), + base_radians - (di_radians * 0.33), + base_radians - (di_radians * 0.66), + ]; - // check if it kills at this angle + // perform the trajectory check over each angle + let original_context = self.clone(); + for angle in angles.iter() { + // get the trajectory for this angle + *self = original_context.clone(); + self.reset_angle(*angle); let trajectory = self.get_trajectory(); + + // check if this trajectory kills let mut trajectory_kills = false; for (frame, pos) in trajectory.iter().enumerate() { if !blastzones.contains(pos.x, pos.y) { - // break early so we don't waste effort trajectory_kills = true; break; } } + + // if any single trajectory is survivable, no kill screen if !trajectory_kills { - survivable_angles += 1; - } - if survivable_angles > survivable_angles_allowed { - // return early so we don't waste effort return false; } } + + // on this line, all trajectories killed return true; } } diff --git a/fighters/common/src/function_hooks/lua_bind_hook/ground.rs b/fighters/common/src/function_hooks/lua_bind_hook/ground.rs index 519cee1291..7726bd145b 100644 --- a/fighters/common/src/function_hooks/lua_bind_hook/ground.rs +++ b/fighters/common/src/function_hooks/lua_bind_hook/ground.rs @@ -72,8 +72,6 @@ pub unsafe fn init_settings_edges(boma: &mut BattleObjectModuleAccessor, situati *FIGHTER_SZEROSUIT_STATUS_KIND_SPECIAL_LW_KICK, *FIGHTER_SZEROSUIT_STATUS_KIND_SPECIAL_LW_LANDING, *FIGHTER_SZEROSUIT_STATUS_KIND_SPECIAL_LW_KICK_LANDING].contains(&status_kind)) - || (fighter_kind == *FIGHTER_KIND_BAYONETTA && [*FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D, - *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D_LANDING].contains(&status_kind)) || (fighter_kind == *FIGHTER_KIND_DOLLY && [*FIGHTER_DOLLY_STATUS_KIND_SPECIAL_LW_ATTACK, *FIGHTER_DOLLY_STATUS_KIND_SPECIAL_LW_LANDING, *FIGHTER_DOLLY_STATUS_KIND_SPECIAL_B_LANDING, @@ -186,12 +184,6 @@ unsafe fn check_fighter_edge_slipoffs(boma: &mut BattleObjectModuleAccessor) -> if (fighter_kind == *FIGHTER_KIND_LUIGI && status_kind == *FIGHTER_STATUS_KIND_SPECIAL_N) { return true.into(); } if (fighter_kind == *FIGHTER_KIND_KIRBY && status_kind == *FIGHTER_KIRBY_STATUS_KIND_LUIGI_SPECIAL_N) { return true.into(); } - // PEACH - if (fighter_kind == *FIGHTER_KIND_PEACH && status_kind == *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END) { return true.into(); } - - // DAISY - if (fighter_kind == *FIGHTER_KIND_DAISY && status_kind == *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END) { return true.into(); } - // SEPHIROTH if (fighter_kind == *FIGHTER_KIND_EDGE && status_kind == *FIGHTER_EDGE_STATUS_KIND_SPECIAL_HI_RUSH) { return true.into(); } @@ -287,7 +279,7 @@ unsafe fn can_entry_cliff_hook(boma: &mut BattleObjectModuleAccessor) -> u64 { let status_kind = StatusModule::status_kind(boma); let fighter_kind = boma.kind(); - let rising: f32 = KineticModule::get_sum_speed_y(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); // Rising while jumping/airdodging + let rising: bool = KineticModule::get_sum_speed_y(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) >= 0.0; // Rising while jumping/airdodging let tether_zair = boma.is_fighter() && [*FIGHTER_KIND_LUCAS, *FIGHTER_KIND_YOUNGLINK, *FIGHTER_KIND_TOONLINK, *FIGHTER_KIND_SAMUS, *FIGHTER_KIND_SAMUSD, *FIGHTER_KIND_SZEROSUIT].contains(&fighter_kind) @@ -302,7 +294,9 @@ unsafe fn can_entry_cliff_hook(boma: &mut BattleObjectModuleAccessor) -> u64 { || (fighter_kind == *FIGHTER_KIND_PFUSHIGISOU && status_kind == *FIGHTER_STATUS_KIND_SPECIAL_HI) ); let tether_aerial = boma.is_fighter() - && ( (fighter_kind == *FIGHTER_KIND_SIMON && status_kind == *FIGHTER_STATUS_KIND_ATTACK_AIR) ); + && ( fighter_kind == *FIGHTER_KIND_SIMON && WorkModule::is_flag(boma, *FIGHTER_SIMON_INSTANCE_WORK_ID_FLAG_ATTACK_AIR_LASSO_FLAG_CHECK) ); + + let lasso_check = WorkModule::is_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); // Ledgehog code let cliff_id = GroundModule::get_cliff_id_uint32(boma); @@ -313,9 +307,9 @@ unsafe fn can_entry_cliff_hook(boma: &mut BattleObjectModuleAccessor) -> u64 { if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) == WorkModule::get_int(&mut *(*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) { continue; } - - if VarModule::get_int(object, vars::common::instance::LEDGE_ID) == cliff_id as i32 { - if !((tether_zair || tether_special || tether_aerial) && WorkModule::is_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK)) { + + if VarModule::get_int(object, vars::common::instance::OCCUPIED_LEDGE_ID) == cliff_id as i32 { + if !((tether_zair || tether_special || tether_aerial) && lasso_check) { return 0; } } @@ -326,12 +320,12 @@ unsafe fn can_entry_cliff_hook(boma: &mut BattleObjectModuleAccessor) -> u64 { if !run_vanilla_check(boma) { // Disable grabbing ledge while rising during an airborne state if situation_kind == *SITUATION_KIND_AIR { - if rising >= 0.0 && !((tether_zair || tether_special || tether_aerial) && WorkModule::is_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK)) { + if !tether_aerial && (rising && !((tether_zair || tether_special) && lasso_check)) { return 0; } } } - + // Unable to grab ledge during runfall/walkfall (the first few frames after you run off an edge) if boma.is_motion_one_of(&[Hash40::new("run_fall_l"), Hash40::new("run_fall_r"), Hash40::new("walk_fall_l"), Hash40::new("walk_fall_r")]) { return 0; diff --git a/fighters/common/src/function_hooks/lua_bind_hook/status.rs b/fighters/common/src/function_hooks/lua_bind_hook/status.rs index 39959c245b..64c572e112 100644 --- a/fighters/common/src/function_hooks/lua_bind_hook/status.rs +++ b/fighters/common/src/function_hooks/lua_bind_hook/status.rs @@ -72,7 +72,8 @@ unsafe fn init_settings_hook(boma: &mut BattleObjectModuleAccessor, mut situatio *FIGHTER_STATUS_KIND_CLIFF_WAIT] ) { let cliff_id = GroundModule::get_cliff_id_uint32(boma); - VarModule::set_int(boma.object(), vars::common::instance::LEDGE_ID, cliff_id as i32); + VarModule::set_int(boma.object(), vars::common::instance::OCCUPIED_LEDGE_ID, cliff_id as i32); + VarModule::set_int(boma.object(), vars::common::instance::OCCUPIED_LEDGE_ID_FOR_TETHERS, cliff_id as i32); } // heavy item pickup should keep momentum and be affected by gravity in the air @@ -194,7 +195,7 @@ unsafe fn change_status_request_hook(boma: &mut BattleObjectModuleAccessor, stat continue; } - if VarModule::get_int(object, vars::common::instance::LEDGE_ID) == cliff_id as i32 { + if VarModule::get_int(object, vars::common::instance::OCCUPIED_LEDGE_ID_FOR_TETHERS) == cliff_id as i32 { next_status = *FIGHTER_STATUS_KIND_CLIFF_ROBBED; } } @@ -227,27 +228,23 @@ unsafe fn change_status_request_from_script_hook(boma: &mut BattleObjectModuleAc let mut clear_buffer = arg3; if boma.is_fighter() { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::Smash64Mode) { - if [*FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_STATUS_KIND_PASSIVE_CEIL, *FIGHTER_STATUS_KIND_PASSIVE_WALL, *FIGHTER_STATUS_KIND_PASSIVE_WALL_JUMP].contains(&next_status) { - return 0; - } - } - }, - _ => {} + if utils::game_modes::check_custom_mode(CustomMode::Smash64Mode) { + if [ + *FIGHTER_STATUS_KIND_ESCAPE_AIR, + *FIGHTER_STATUS_KIND_PASSIVE_CEIL, + *FIGHTER_STATUS_KIND_PASSIVE_WALL, + *FIGHTER_STATUS_KIND_PASSIVE_WALL_JUMP + ].contains(&next_status) { + return 0; + } } // Allow buffered wavedashes when Shield is pressed at any time within Jump input's buffer window if next_status == *FIGHTER_STATUS_KIND_JUMP_SQUAT { if boma.is_cat_flag(Cat1::AirEscape) && !boma.is_cat_flag(Cat1::AttackN) { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if !modes.contains(&CustomMode::Smash64Mode) { - VarModule::on_flag(boma.object(), vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); - } - }, - _ => { VarModule::on_flag(boma.object(), vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); } + // not for smash64 mode though + if !utils::game_modes::check_custom_mode(CustomMode::Smash64Mode) { + VarModule::on_flag(boma.object(), vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); } } } @@ -299,8 +296,9 @@ unsafe fn change_status_request_from_script_hook(boma: &mut BattleObjectModuleAc if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) == WorkModule::get_int(&mut *(*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) { continue; } - - if VarModule::get_int(object, vars::common::instance::LEDGE_ID) == cliff_id as i32 { + if VarModule::get_int(object, vars::common::instance::OCCUPIED_LEDGE_ID_FOR_TETHERS) == cliff_id as i32 { + // Prevent trumps while moving downward from sending the opponent downward + KineticModule::clear_speed_all(boma); next_status = *FIGHTER_STATUS_KIND_CLIFF_ROBBED; } } @@ -321,13 +319,6 @@ unsafe fn change_status_request_from_script_hook(boma: &mut BattleObjectModuleAc } if boma.kind() == *FIGHTER_KIND_TRAIL { - if StatusModule::status_kind(boma) == *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_SEARCH - && next_status == *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_TURN - && ((!VarModule::is_flag(boma.object(), vars::trail::status::SPECIAL_S_INPUT_CHECK) - && !(ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL_RAW))) - || VarModule::is_flag(boma.object(), vars::trail::status::SPECIAL_S_STOP)) { - next_status = *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END; - } // prevent sora from immediately acting out of the down smash bounce if boma.is_status(*FIGHTER_STATUS_KIND_CLIFF_JUMP2) && !boma.is_prev_status(*FIGHTER_STATUS_KIND_CLIFF_JUMP1) @@ -336,34 +327,40 @@ unsafe fn change_status_request_from_script_hook(boma: &mut BattleObjectModuleAc } } - if boma.kind() == *FIGHTER_KIND_KOOPAJR - && StatusModule::status_kind(boma) == *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_DASH - && StatusModule::situation_kind(boma) == *SITUATION_KIND_GROUND - && next_status == *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_JUMP { - next_status = *FIGHTER_STATUS_KIND_JUMP_SQUAT; - } + if boma.kind() == *FIGHTER_KIND_KOOPAJR { + if StatusModule::status_kind(boma) == *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_DASH + && StatusModule::situation_kind(boma) == *SITUATION_KIND_GROUND + && next_status == *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_JUMP { + next_status = *FIGHTER_STATUS_KIND_JUMP_SQUAT; + } - if boma.kind() == *FIGHTER_KIND_REFLET - && StatusModule::status_kind(boma) == *FIGHTER_STATUS_KIND_SPECIAL_HI - && next_status == *FIGHTER_STATUS_KIND_FALL_SPECIAL - && !VarModule::is_flag(boma.object(), vars::reflet::instance::SPECIAL_HI_ENABLE_FREEFALL) { - next_status = *FIGHTER_STATUS_KIND_FALL; + // Prevent jumping out of Clown Kart Dash when out of jumps + if boma.is_status_one_of(&[*FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_DASH, *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_SPIN_TURN]) + && next_status == *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_JUMP + && boma.get_num_used_jumps() >= boma.get_jump_count_max() { + return 0; + } } - if boma.kind() == *FIGHTER_KIND_MEWTWO - && StatusModule::status_kind(boma) == *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3 - && next_status == *FIGHTER_STATUS_KIND_FALL_SPECIAL - && VarModule::is_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL) - && !VarModule::is_flag(boma.object(), vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL) { - next_status = *FIGHTER_STATUS_KIND_FALL; + // Prevent jumping out of Splat Roller when out of jumps + if boma.kind() == *FIGHTER_KIND_INKLING + && boma.is_status_one_of(&[*FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_RUN, *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_WALK]) + && next_status == *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_JUMP_END + && boma.get_num_used_jumps() >= boma.get_jump_count_max() { + WorkModule::off_flag(boma, *FIGHTER_INKLING_STATUS_SPECIAL_S_FLAG_JUMP_END); + return 0; } - if boma.kind() == *FIGHTER_KIND_PALUTENA - && StatusModule::status_kind(boma) == *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_3 - && next_status == *FIGHTER_STATUS_KIND_FALL_SPECIAL - && VarModule::is_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL) - && !VarModule::is_flag(boma.object(), vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL) { - next_status = *FIGHTER_STATUS_KIND_FALL; + if boma.kind() == *FIGHTER_KIND_REFLET { + if StatusModule::status_kind(boma) == *FIGHTER_STATUS_KIND_SPECIAL_HI + && next_status == *FIGHTER_STATUS_KIND_FALL_SPECIAL + && !VarModule::is_flag(boma.object(), vars::reflet::instance::SPECIAL_HI_ENABLE_FREEFALL) { + next_status = *FIGHTER_STATUS_KIND_FALL; + } + if boma.is_status_one_of(&[*FIGHTER_REFLET_STATUS_KIND_SPECIAL_LW_CAPTURE, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_LW_END]) + && next_status == *FIGHTER_STATUS_KIND_FALL_SPECIAL { + next_status = *FIGHTER_STATUS_KIND_FALL; + } } if boma.kind() == *FIGHTER_KIND_KOOPAJR { diff --git a/fighters/common/src/function_hooks/mod.rs b/fighters/common/src/function_hooks/mod.rs index 645e590bf7..0bbb2064ec 100644 --- a/fighters/common/src/function_hooks/mod.rs +++ b/fighters/common/src/function_hooks/mod.rs @@ -97,7 +97,7 @@ const EXCEPTION_WEAPON_KINDS: [smash::lib::LuaConst ; 15] = [ WEAPON_KIND_SZEROSUIT_WHIP2, WEAPON_KIND_SAMUS_GBEAM, WEAPON_KIND_SAMUSD_GBEAM, - WEAPON_KIND_SHIZUE_FISHINGLINE, + WEAPON_KIND_SHIZUE_FISHINGROD, WEAPON_KIND_TOONLINK_HOOKSHOT, WEAPON_KIND_YOUNGLINK_HOOKSHOT, WEAPON_KIND_JACK_DOYLE, @@ -146,7 +146,9 @@ unsafe fn skip_early_main_status(boma: *mut BattleObjectModuleAccessor, status_k || ((*boma).kind() == *FIGHTER_KIND_GEKKOUGA && [*FIGHTER_GEKKOUGA_STATUS_KIND_SPECIAL_S_ATTACK].contains(&status_kind)) || ((*boma).kind() == *FIGHTER_KIND_LITTLEMAC - && [*FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N_START].contains(&status_kind)) ) + && [*FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N_START].contains(&status_kind)) + || ((*boma).kind() == *FIGHTER_KIND_SHIZUE + && [*FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_HIT, *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_THROW].contains(&status_kind)) ) { return true; } @@ -719,6 +721,13 @@ unsafe fn status_module__change_status(status_module: *const u64, status_kind_ne if (*boma).is_fighter() { JostleModule::set_overlap_rate_mul(boma, 1.0); + + let inflict_status = AttackModule::get_inflict_status(boma); + VarModule::set_int( + (*boma).object(), + vars::common::instance::PREV_STATUS_INFLICT_STATUS, + inflict_status + ); } if (*boma).is_fighter() @@ -800,6 +809,48 @@ unsafe fn phantom_hit_check(ctx: &mut skyline::hooks::InlineCtx) { ctx.registers_f[9].set_s(phantom_threshold) } +// Runs within FighterMotionModuleImpl::get_cancel_frame +// inside the special block for "escape_air" motion kind +#[skyline::hook(offset = 0x6e1ff8, inline)] +unsafe fn get_escape_air_cancel_frame(ctx: &mut skyline::hooks::InlineCtx) { + let motion_module = ctx.registers[20].x(); + let boma = *(motion_module as *mut *mut BattleObjectModuleAccessor).add(1); + let cancel_frame = VarModule::get_int((*boma).object(), vars::common::status::ESCAPE_AIR_CANCEL_FRAME); + + *(ctx.registers[8].x() as *mut f32).add(0x60 / 4) = cancel_frame as f32; +} + +// Runs within FighterMotionModuleImpl::get_cancel_frame +// inside the special block for "escape_air_slide" motion kind +#[skyline::hook(offset = 0x6e1fa0, inline)] +unsafe fn get_escape_air_slide_cancel_frame(ctx: &mut skyline::hooks::InlineCtx) { + let motion_module = ctx.registers[20].x(); + let boma = *(motion_module as *mut *mut BattleObjectModuleAccessor).add(1); + let cancel_frame = VarModule::get_int((*boma).object(), vars::common::status::ESCAPE_AIR_CANCEL_FRAME); + + *(ctx.registers[8].x() as *mut f32).add(0x94 / 4) = cancel_frame as f32; +} + +// This runs where the out-of-jumps smoke effect is called +// AKA sys_falling_smoke +#[skyline::hook(offset = 0x6188ec, inline)] +unsafe fn req_sys_falling_smoke(ctx: &mut skyline::hooks::InlineCtx) { + let fighter = ctx.registers[19].x() as *mut Fighter; + let object = &mut (*fighter).battle_object as *mut BattleObject; + let entry_stand_scale = WorkModule::get_param_float((*object).module_accessor, hash40("entry_stand_scale"), 0); + let kind = (*object).kind as i32; + let smoke_scale: f32 = + if kind == *FIGHTER_KIND_POPO + || kind == *FIGHTER_KIND_NANA { + entry_stand_scale + } else { + entry_stand_scale * 1.5 + }; + + // Increase the scale of sys_falling_smoke + ctx.registers_f[0].set_s(smoke_scale); +} + pub fn install() { energy::install(); effect::install(); @@ -864,6 +915,9 @@ pub fn install() { status_module__change_status, change_elec_hitlag_for_attacker, set_uniform_buffer, - phantom_hit_check + phantom_hit_check, + get_escape_air_cancel_frame, + get_escape_air_slide_cancel_frame, + req_sys_falling_smoke ); } diff --git a/fighters/common/src/function_hooks/stage_hazards.rs b/fighters/common/src/function_hooks/stage_hazards.rs index 38da768ec2..0b0beef4ee 100644 --- a/fighters/common/src/function_hooks/stage_hazards.rs +++ b/fighters/common/src/function_hooks/stage_hazards.rs @@ -1,5 +1,6 @@ #![feature(proc_macro_hygiene)] +use chrono::Datelike; use skyline::{hook, install_hook}; extern "C" { @@ -92,6 +93,38 @@ unsafe fn lylat_set_form_hazards_off(ctx: &mut skyline::hooks::InlineCtx) { } } +#[skyline::hook(offset = 0x3098AFC, inline)] +unsafe fn yoshis_island_seasonal(ctx: &mut skyline::hooks::InlineCtx) { + let now = chrono::Utc::now(); + let month = now.month(); + let season = match month { + 12 | 1 | 2 => 0x4, // winter + 3 | 4 | 5 => 0x1, // spring + 6 | 7 | 8 => 0x2, // summer + 9 | 10 | 11 => 0x3, // autumn + _ => panic!("Yoshis Island - chrono::Utc::now().month() returned an invalid month value: {}", month), + }; + ctx.registers[9].set_w(season); +} + +// 0x1 - spring +// 0x2 - summer +// 0x3 - autumn +// 0x4 - winter +#[skyline::hook(offset = 0x3097AE8, inline)] +unsafe fn yoshis_island_seasonal_omega(ctx: &mut skyline::hooks::InlineCtx) { + let now = chrono::Utc::now(); + let month = now.month(); + let season = match month { + 12 | 1 | 2 => 0x4, // winter + 3 | 4 | 5 => 0x1, // spring + 6 | 7 | 8 => 0x2, // summer + 9 | 10 | 11 => 0x3, // autumn + _ => panic!("Yoshis Island - chrono::Utc::now().month() returned an invalid month value: {}", month), + }; + ctx.registers[9].set_w(season); +} + pub fn install() { // NOTE: The 0xc80 is from the 13.0.1 -> 13.0.2 port // NOTE: The 0x20 is from the 13.0.2 -> 13.0.3 port @@ -117,6 +150,8 @@ pub fn install() { handle_movement_grav_update, fix_hazards_for_online, lylat_no_rot, - // lylat_set_form_hazards_off + // lylat_set_form_hazards_off, + yoshis_island_seasonal, + yoshis_island_seasonal_omega, ); } diff --git a/fighters/common/src/function_hooks/transition.rs b/fighters/common/src/function_hooks/transition.rs index 0b98f115e8..c830c45033 100644 --- a/fighters/common/src/function_hooks/transition.rs +++ b/fighters/common/src/function_hooks/transition.rs @@ -15,6 +15,23 @@ unsafe fn is_enable_transition_term_hook(boma: &mut BattleObjectModuleAccessor, let status_kind = StatusModule::status_kind(boma); let id = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as usize; + // disabled transitions for RoA mode + if utils::game_modes::check_custom_mode(game_modes::CustomMode::RivalsOfAetherMode) + && [ + *FIGHTER_STATUS_TRANSITION_TERM_ID_CLIFF_CATCH, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CATCH, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CATCH_DASH, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CATCH_TURN, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CLIFF_ATTACK, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CLIFF_ESCAPE, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CLIFF_JUMP, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CLIFF_JUMP_BUTTON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CLIFF_SPEICAL, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE, + ].contains(&flag) { + return false; + } + // Disallow airdodge out of tumble until you reach your stable fall speed if flag == *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE_AIR && [*FIGHTER_STATUS_KIND_DAMAGE_FLY, *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR].contains(&status_kind) { @@ -59,21 +76,8 @@ unsafe fn is_enable_transition_term_hook(boma: &mut BattleObjectModuleAccessor, return false; } - if fighter_kind == *FIGHTER_KIND_PEACH { - if status_kind == *FIGHTER_STATUS_KIND_JUMP_AERIAL { - if flag == *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL || flag == *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON { - if KineticModule::get_sum_speed_y(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < 0.0 { - return false; - } - } - } - } - - // Disable Mii Swordfighter nspecial if the Tornado projectile is still active - if fighter_kind == *FIGHTER_KIND_MIISWORDSMAN { - if VarModule::get_int(boma.object(), vars::common::instance::GIMMICK_TIMER) > 0 && flag == *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N { - return false; - } + if flag == *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_AIR_LASSO && VarModule::is_flag(boma.object(), vars::common::instance::DISABLE_AIR_LASSO) { + return false; } if fighter_kind == *FIGHTER_KIND_NANA { diff --git a/fighters/common/src/function_hooks/vtables/bayonetta.rs b/fighters/common/src/function_hooks/vtables/bayonetta.rs new file mode 100644 index 0000000000..cb21d3db30 --- /dev/null +++ b/fighters/common/src/function_hooks/vtables/bayonetta.rs @@ -0,0 +1,32 @@ +use super::*; +use utils::ext::*; + +#[skyline::hook(offset = 0x831850)] +unsafe extern "C" fn bayonetta_set_bullet_arts_acmd(motion: u64, limb: i32, on_off: i32) -> u64 { + let ret = original!()(motion, limb, on_off); + let on = match on_off { + 1 => true, + 2 => false, + _ => unreachable!() + }; + let limb_str = match limb { + 0 => "arml", + 1 => "armr", + 2 => "legl", + 3 => "legr", + _ => unreachable!() + }; + // clear hitboxes + if !on { + return hash40("game_shootingoff_generic"); + } + // run script for limb + let acmd = format!("game_shootingon_generic_{}", limb_str); + return hash40(acmd.as_str()); +} + +pub fn install() { + skyline::install_hooks!( + bayonetta_set_bullet_arts_acmd, + ); +} \ No newline at end of file diff --git a/fighters/common/src/function_hooks/vtables/demon.rs b/fighters/common/src/function_hooks/vtables/demon.rs new file mode 100644 index 0000000000..fb7f764046 --- /dev/null +++ b/fighters/common/src/function_hooks/vtables/demon.rs @@ -0,0 +1,36 @@ +use super::*; +use utils::ext::*; + +#[skyline::hook(offset = 0x932f50)] +pub unsafe extern "C" fn demon_on_attack(vtable: u64, fighter: &mut Fighter, log: u64) { + let battle_object = &mut fighter.battle_object; + let module_accessor = battle_object.module_accessor; + let kind = WorkModule::get_int(module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND); + let status = StatusModule::status_kind(module_accessor); + if [ + *FIGHTER_DEMON_STATUS_KIND_ATTACK_STEP_2S, + ].contains(&status) + && VarModule::is_flag(battle_object, vars::demon::status::CHECK_STEP_CANCEL) { + let collision_log: &mut CollisionLog = std::mem::transmute(log); + if [ + *COLLISION_KIND_ATTACK as u8, + *COLLISION_KIND_HIT as u8, + *COLLISION_KIND_SHIELD as u8, + ].contains(&collision_log.collision_kind) { + VarModule::on_flag(battle_object, vars::demon::status::ENABLE_STEP_CANCEL); + } + } + original!()(vtable, fighter, log) +} + +#[skyline::hook(offset = 0x934310)] +pub unsafe extern "C" fn demon_some_event(_vtable: u64, _fighter: &mut Fighter, event: u64) -> u64 { + event +} + +pub fn install() { + skyline::install_hooks!( + demon_on_attack, + demon_some_event + ); +} \ No newline at end of file diff --git a/fighters/common/src/function_hooks/vtables/dolly_burst.rs b/fighters/common/src/function_hooks/vtables/dolly_burst.rs index 04bcd39ebb..848410aa19 100644 --- a/fighters/common/src/function_hooks/vtables/dolly_burst.rs +++ b/fighters/common/src/function_hooks/vtables/dolly_burst.rs @@ -11,7 +11,8 @@ unsafe extern "C" fn burst_check_status(ctx: &mut skyline::hooks::InlineCtx) { let battle_object: *mut BattleObject = utils::util::get_battle_object_from_id((*module_accessor).battle_object_id); BURST_BOMA_PTR = module_accessor as u64; let status = ctx.registers[0].w() as i32; - if status == *FIGHTER_DOLLY_STATUS_KIND_SUPER_SPECIAL && VarModule::is_flag(battle_object, vars::dolly::status::SUPER_SPECIAL_TRIPLE) { + if status == *FIGHTER_DOLLY_STATUS_KIND_SUPER_SPECIAL + && VarModule::is_flag(battle_object, vars::dolly::status::SUPER_SPECIAL_TRIPLE) { ctx.registers[0].set_w(0); } } @@ -22,13 +23,14 @@ unsafe extern "C" fn burst_set_motion(ctx: &mut skyline::hooks::InlineCtx) { let battle_object: *mut BattleObject = utils::util::get_battle_object_from_id((*module_accessor).battle_object_id); let mut motion = ctx.registers[8].x(); // println!("motion: {:#x}", motion); - if StatusModule::status_kind(module_accessor) == *FIGHTER_DOLLY_STATUS_KIND_SUPER_SPECIAL && VarModule::is_flag(battle_object, vars::dolly::status::SUPER_SPECIAL_TRIPLE) { + if StatusModule::status_kind(module_accessor) == *FIGHTER_DOLLY_STATUS_KIND_SUPER_SPECIAL + && VarModule::is_flag(battle_object, vars::dolly::status::SUPER_SPECIAL_TRIPLE) { let num = VarModule::get_int(battle_object, vars::dolly::status::SUPER_SPECIAL_TRIPLE_COUNT); motion = match num { 1 => hash40("super_special_triple_1"), 2 => hash40("super_special_triple_2"), 3 => hash40("super_special_triple_3"), - _ => hash40("super_special"), + _ => hash40("super_special") }; } ctx.registers[8].set_x(motion); @@ -46,16 +48,15 @@ unsafe extern "C" fn burst_init(_vtable: u64, weapon: *mut app::Weapon, somethin // println!("is_air: {}", is_air); WorkModule::set_flag(module_accessor, is_air, *WEAPON_DOLLY_BURST_INSTANCE_WORK_ID_FLAG_AIR); - if [hash40("final2"), hash40("final3"), hash40("super_special_triple_2"), hash40("super_special_triple_3")].contains(&motion) { + if [ + hash40("final2"), + hash40("final3"), + hash40("super_special_triple_2"), + hash40("super_special_triple_3") + ].contains(&motion) { let pos = &mut *(something as *mut smash_rs::cpp::simd::Vector2).add(0x98 / 0x8); // println!("pos: {}, {}", pos.x(), pos.y()); - GroundModule::set_shape_safe_pos( - module_accessor, - &Vector2f { - x: pos.x(), - y: pos.y(), - }, - ); + GroundModule::set_shape_safe_pos(module_accessor, &Vector2f{x: pos.x(), y: pos.y()}); } let atack_mul = *(something as *const f32).add(0xa8 / 0x4); @@ -77,11 +78,17 @@ unsafe extern "C" fn burst_on_hit(_vtable: u64, weapon: *mut app::Weapon) -> u64 let event = if motion == hash40("final") { 0x1e7886b711 - } else if motion == hash40("final2") { + } + else if motion == hash40("final2") { 0x1f701d1848 - } else if motion == hash40("final3") { + } + else if motion == hash40("final3") { 0x1f071a28de - } else if [hash40("super_special"), hash40("super_special_triple_3")].contains(&motion) { + } + else if [ + hash40("super_special"), + hash40("super_special_triple_3") + ].contains(&motion) { if WorkModule::is_flag(module_accessor, 0x20000006) { // WEAPON_DOLLY_BURST_INSTANCE_WORK_ID_FLAG_HIT_SUPER_SPECIAL return 0; @@ -93,7 +100,8 @@ unsafe extern "C" fn burst_on_hit(_vtable: u64, weapon: *mut app::Weapon) -> u64 WorkModule::on_flag(module_accessor, 0x20000006); 0x265df8a12e - } else { + } + else { 0 }; @@ -103,5 +111,10 @@ unsafe extern "C" fn burst_on_hit(_vtable: u64, weapon: *mut app::Weapon) -> u64 } pub fn install() { - skyline::install_hooks!(burst_check_status, burst_set_motion, burst_init, burst_on_hit); + skyline::install_hooks!( + burst_check_status, + burst_set_motion, + burst_init, + burst_on_hit + ); } diff --git a/fighters/common/src/function_hooks/vtables/littlemac.rs b/fighters/common/src/function_hooks/vtables/littlemac.rs index 22a710fdd7..33c1582245 100644 --- a/fighters/common/src/function_hooks/vtables/littlemac.rs +++ b/fighters/common/src/function_hooks/vtables/littlemac.rs @@ -14,7 +14,7 @@ pub unsafe extern "C" fn hook_ko_meter_gain(vtable: u64, battle_object: *mut Bat if meter != 100.0 { let size = if meter < 40.0 { 0.5 } else { 0.7 }; EffectModule::req_on_joint(boma, Hash40::new("sys_hit_normal_l"), Hash40::new("handr"), &Vector3f::zero(), &Vector3f::zero(), 0.8, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0); - return 1 + return 1; } } @@ -71,10 +71,14 @@ pub unsafe extern "C" fn hook_ko_meter_gain(vtable: u64, battle_object: *mut Bat *FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_HI_START, *FIGHTER_STATUS_KIND_ATTACK]) { if !VarModule::is_flag(boma.object(), vars::littlemac::status::LIMIT_METER_GAIN) { + // turn on so the subsequent hits gain less meter VarModule::on_flag(boma.object(), vars::littlemac::status::LIMIT_METER_GAIN); } else { - meter_gain *= if boma.is_status(*FIGHTER_STATUS_KIND_ATTACK_100) { 0.1 } + meter_gain *= if boma.is_status(*FIGHTER_STATUS_KIND_ATTACK_100) { + if opponent_boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_GUARD_ON, *FIGHTER_STATUS_KIND_GUARD]) + { 0.0 } else { 0.05 } + } else if boma.is_status_one_of(&[ *FIGHTER_STATUS_KIND_SPECIAL_HI, *FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_HI_JUMP, diff --git a/fighters/common/src/function_hooks/vtables/mod.rs b/fighters/common/src/function_hooks/vtables/mod.rs index 5a24674ad0..987da4bdb1 100644 --- a/fighters/common/src/function_hooks/vtables/mod.rs +++ b/fighters/common/src/function_hooks/vtables/mod.rs @@ -1,6 +1,8 @@ use super::*; +mod bayonetta; mod brave; +mod demon; mod donkey; mod duckhunt; mod edge; @@ -16,6 +18,8 @@ mod pickel; mod ptrainer; mod reflet; mod rockman; +mod shotos; +mod shulk; mod miigunner_grenadelauncher; mod ryu_shinkuhadoken; @@ -24,7 +28,9 @@ mod dolly_burst; mod weapon; pub fn install() { + bayonetta::install(); brave::install(); + demon::install(); donkey::install(); duckhunt::install(); edge::install(); @@ -40,10 +46,12 @@ pub fn install() { ptrainer::install(); reflet::install(); rockman::install(); + shotos::install(); + shulk::install(); miigunner_grenadelauncher::install(); ryu_shinkuhadoken::install(); dolly_burst::install(); weapon::install(); -} \ No newline at end of file +} diff --git a/fighters/common/src/function_hooks/vtables/rockman.rs b/fighters/common/src/function_hooks/vtables/rockman.rs index 9bc2f7d2de..66dc8fca1d 100644 --- a/fighters/common/src/function_hooks/vtables/rockman.rs +++ b/fighters/common/src/function_hooks/vtables/rockman.rs @@ -5,6 +5,8 @@ pub const CHARGE_SHOT_CLEAR_INPUT_FRAME : i32 = 6; pub const CHARGE_SHOT_DELAY_CHARGE_FRAME : i32 = 50; pub const CHARGE_SHOT_MAX_FRAME : i32 = 180; pub const CHARGE_SHOT_RELEASE_FRAME : i32 = 6; +pub const CHARGE_SHOT_HOLD_DAMAGE_RATE: i32 = 120; +pub const CHARGE_SHOT_HOLD_DAMAGE: f32 = 1.0; #[skyline::hook(offset = 0x107e970)] pub unsafe extern "C" fn rockman_vtable_func(vtable: u64, fighter: &mut smash::app::Fighter) { @@ -73,11 +75,12 @@ pub unsafe extern "C" fn rockman_vtable_func(vtable: u64, fighter: &mut smash::a } } if VarModule::is_flag(object, vars::rockman::instance::SPECIAL_N_CHARGE_SHOT_CHARGING) { + VarModule::inc_int(object, vars::rockman::instance::SPECIAL_N_CHARGE_SHOT_FRAME); let charge_frame = VarModule::get_int(object, vars::rockman::instance::SPECIAL_N_CHARGE_SHOT_FRAME); - if charge_frame < CHARGE_SHOT_MAX_FRAME + 1 { - VarModule::inc_int(object, vars::rockman::instance::SPECIAL_N_CHARGE_SHOT_FRAME); + if charge_frame > CHARGE_SHOT_MAX_FRAME + && charge_frame % CHARGE_SHOT_HOLD_DAMAGE_RATE == 0 { + DamageModule::add_damage(module_accessor, CHARGE_SHOT_HOLD_DAMAGE, 0); } - let charge_frame = VarModule::get_int(object, vars::rockman::instance::SPECIAL_N_CHARGE_SHOT_FRAME); if charge_frame == CHARGE_SHOT_MAX_FRAME { FighterUtil::flash_eye_info(module_accessor); EffectModule::req_follow( @@ -136,7 +139,14 @@ unsafe fn rockman_valid_charging_state(module_accessor: *mut BattleObjectModuleA let status = StatusModule::status_kind(module_accessor); // explicitly disabled statuses if [ - *FIGHTER_STATUS_KIND_REBIRTH + *FIGHTER_STATUS_KIND_ESCAPE, + *FIGHTER_STATUS_KIND_ESCAPE_B, + *FIGHTER_STATUS_KIND_ESCAPE_F, + *FIGHTER_STATUS_KIND_GUARD, + *FIGHTER_STATUS_KIND_GUARD_DAMAGE, + *FIGHTER_STATUS_KIND_GUARD_OFF, + *FIGHTER_STATUS_KIND_GUARD_ON, + *FIGHTER_STATUS_KIND_REBIRTH, ].contains(&status) { return false; } diff --git a/fighters/common/src/function_hooks/vtables/shotos.rs b/fighters/common/src/function_hooks/vtables/shotos.rs new file mode 100644 index 0000000000..353367bd3e --- /dev/null +++ b/fighters/common/src/function_hooks/vtables/shotos.rs @@ -0,0 +1,70 @@ +use super::*; + +#[skyline::hook(offset = 0x69ad00)] +unsafe extern "C" fn update_1_on_1_common(module_accessor: *mut BattleObjectModuleAccessor, param_2: u32, param_3: u32, mut param_4: f32) { + let control_module = *(module_accessor as *mut *mut u64).add(0x48 / 8); + let dir = WorkModule::get_float(module_accessor, *FIGHTER_SPECIAL_COMMAND_USER_INSTANCE_WORK_ID_FLOAT_OPPONENT_LR_1ON1); + let kind = WorkModule::get_int(module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND); + let mut final_dir = param_4; + let mut skip_reverse = false; + if param_3 & 1 == 0 { + let lr = PostureModule::lr(module_accessor); + if param_2 & 0xfffffffe == 0x7e { + if param_4 != 0.0 { + if lr != param_4 { + final_dir = 0.0; + param_4 = 0.0; + } + } + skip_reverse = true; + } + else if lr != param_4 && *(control_module as *mut u8).add(0x641) != 0 { + final_dir = 0.0; + skip_reverse = true; + } + else if -dir != param_4 { + skip_reverse = true; + } + } + else { + let mut lr = PostureModule::lr(module_accessor); + let mut lr_check = lr; + if param_4 != 0.0 { + lr_check = param_4; + } + if dir != 0.0 { + lr = dir; + } + if lr_check != -lr { + skip_reverse = true; + } + else { + let command = *(control_module as *mut f32).add(0x654 / 0x4); + ControlModule::set_back_command(module_accessor, -command); + *(control_module as *mut u8).add(0x641) = 0; + } + } + if !skip_reverse && kind != *FIGHTER_KIND_DEMON { + ControlModule::reverse_special_command(module_accessor); + } + WorkModule::set_float(module_accessor, final_dir, *FIGHTER_SPECIAL_COMMAND_USER_INSTANCE_WORK_ID_FLOAT_OPPONENT_LR_1ON1); + if kind != *FIGHTER_KIND_DEMON { + *(control_module as *mut f32).add(0x650 / 0x4) = final_dir; + } +} + +pub fn install() { + // The following disables the reversed stick values when autoturn runs + // Kazuya + let _ = skyline::patching::Patch::in_text(0x934a6c).nop(); + let _ = skyline::patching::Patch::in_text(0x21d7d1c).nop(); + + // Disables Reverse Special Command calls + // Kazuya + let _ = skyline::patching::Patch::in_text(0x934a4c).nop(); + let _ = skyline::patching::Patch::in_text(0x21d7cfc).nop(); + + skyline::install_hooks!( + update_1_on_1_common + ); +} \ No newline at end of file diff --git a/fighters/common/src/function_hooks/vtables/shulk.rs b/fighters/common/src/function_hooks/vtables/shulk.rs new file mode 100644 index 0000000000..f1c83d9f35 --- /dev/null +++ b/fighters/common/src/function_hooks/vtables/shulk.rs @@ -0,0 +1,55 @@ +use super::*; + +extern "C" { + #[link_name = "shulk_check_valid_arts_statuses_inner"] + fn shulk_check_valid_arts_statuses_inner(fighter: &mut Fighter) -> bool; +} + +// disables art wheel during hitstun, and enables it during jab, tilts and aerials + +#[skyline::hook(offset = 0x116a3d0)] +pub unsafe extern "C" fn shulk_check_valid_arts_statuses(fighter: &mut Fighter) -> bool { + shulk_check_valid_arts_statuses_inner(fighter) +} + +macro_rules! decl_hooks_shulk_change_arts { + ($install_fn:ident => $func:expr; $($name:ident($offset:expr));*) => { + $( + #[skyline::hook(offset = $offset, inline)] + unsafe extern "C" fn $name(ctx: &mut skyline::hooks::InlineCtx) { + $func(ctx); + } + )* + fn $install_fn() { + skyline::install_hooks!( + $( + $name, + )* + ); + } + } +} + +unsafe extern "C" fn disable_arts_on_beat(ctx: &mut skyline::hooks::InlineCtx) { + let fighter = ctx.registers[21].x() as *mut Fighter; + let object = &mut (*fighter).battle_object; + if VarModule::is_flag(object, vars::shulk::status::MONADO_BEAT) { + reset_arts(fighter, 1); + } +} + +#[skyline::from_offset(0x116a420)] +unsafe extern "C" fn reset_arts(fighter: *mut Fighter, param_2: u64); + +decl_hooks_shulk_change_arts! { + install_disable_arts_on_beat_hooks => disable_arts_on_beat; + shulk_arts_change_status_1(0x1167bbc); + shulk_arts_change_status_2(0x1168d94) +} + +pub fn install() { + skyline::install_hooks!( + shulk_check_valid_arts_statuses, + ); + install_disable_arts_on_beat_hooks(); +} diff --git a/fighters/common/src/function_hooks/vtables/weapon.rs b/fighters/common/src/function_hooks/vtables/weapon.rs index 68e1292ed0..66ebb07063 100644 --- a/fighters/common/src/function_hooks/vtables/weapon.rs +++ b/fighters/common/src/function_hooks/vtables/weapon.rs @@ -15,7 +15,15 @@ unsafe extern "C" fn force_reflect_full_lifetime(ctx: &mut skyline::hooks::Inlin ctx.registers[8].set_x(0); } +pub unsafe extern "C" fn tornadoshot_can_pocket(_vtable: u64, weapon: &mut smash::app::Weapon) -> bool { + let module_accessor = weapon.battle_object.module_accessor; + let status = StatusModule::status_kind(module_accessor); + status == 0 +} + pub fn install() { + let _ = skyline::patching::Patch::in_text(0x51ed978).data(tornadoshot_can_pocket as *const () as u64); + skyline::install_hooks!( weapon_attack_callback, force_reflect_full_lifetime diff --git a/fighters/common/src/general_statuses/airdodge.rs b/fighters/common/src/general_statuses/airdodge.rs index 443d5e128f..247559770e 100644 --- a/fighters/common/src/general_statuses/airdodge.rs +++ b/fighters/common/src/general_statuses/airdodge.rs @@ -159,6 +159,17 @@ pub unsafe fn status_end_EscapeAir(fighter: &mut L2CFighterCommon) -> L2CValue { unsafe fn sub_escape_air_common(fighter: &mut L2CFighterCommon) { ControlModule::reset_trigger(fighter.module_accessor); WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_STATUS_ESCAPE_WORK_INT_FRAME); + + // Calculates/sets ledgegrab enable frame + // Ledgegrab frame varies per character, based on gravity and fallspeed + let enable_cliff_catch_frame = fighter.get_escape_air_cliff_catch_frame(); + VarModule::set_int(fighter.battle_object, vars::common::status::ESCAPE_AIR_CLIFF_CATCH_FRAME, enable_cliff_catch_frame); + + // Calculates/sets FAF + // FAF varies per character, based on gravity and fallspeed + let enable_cancel_frame = fighter.get_escape_air_cancel_frame(); + VarModule::set_int(fighter.battle_object, vars::common::status::ESCAPE_AIR_CANCEL_FRAME, enable_cancel_frame); + WorkModule::unable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_LANDING); WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_THROW); WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_AIR_LASSO); @@ -236,11 +247,7 @@ unsafe extern "C" fn sub_escape_air_uniq(fighter: &mut L2CFighterCommon, arg: L2 let frame = MotionModule::frame(fighter.module_accessor); let end_frame = MotionModule::end_frame(fighter.module_accessor); if 0.0 <= start_frame && start_frame <= frame { - let mut cancel_frame = if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE) { - WorkModule::get_param_float(fighter.module_accessor, hash40("param_motion"), hash40("escape_air_slide_cancel_frame")) - } else { - WorkModule::get_param_float(fighter.module_accessor, hash40("param_motion"), hash40("escape_air_cancel_frame")) - }; + let mut cancel_frame = VarModule::get_int(fighter.battle_object, vars::common::status::ESCAPE_AIR_CANCEL_FRAME) as f32; if cancel_frame < 0.0 { cancel_frame = end_frame; } @@ -265,6 +272,12 @@ unsafe extern "C" fn sub_escape_air_uniq(fighter: &mut L2CFighterCommon, arg: L2 } fighter.sub_fall_common_uniq(arg); } + + // Handles enabling ledgegrab + let enable_cliff_catch_frame = VarModule::get_int(fighter.battle_object, vars::common::status::ESCAPE_AIR_CLIFF_CATCH_FRAME); + if frame == enable_cliff_catch_frame { + fighter.sub_fighter_cliff_check(L2CValue::I32(*GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES)); + } } 0.into() } @@ -273,7 +286,7 @@ unsafe extern "C" fn sub_escape_air_uniq(fighter: &mut L2CFighterCommon, arg: L2 unsafe extern "C" fn sub_escape_air_common_main(fighter: &mut L2CFighterCommon) -> L2CValue { let id = VarModule::get_int(fighter.battle_object, vars::common::instance::COSTUME_SLOT_NUMBER) as usize; let curr_frame = fighter.global_table[CURRENT_FRAME].get_i32(); - let cancel_frame = WorkModule::get_param_float(fighter.module_accessor, hash40("param_motion"), hash40("escape_air_cancel_frame")) - 1.0; // subtract 1 because curr_frame is 0 indexed + let cancel_frame = (VarModule::get_int(fighter.battle_object, vars::common::status::ESCAPE_AIR_CANCEL_FRAME) - 1) as f32; // subtract 1 because curr_frame is 0 indexed if fighter.sub_transition_group_check_air_cliff().get_bool() { return L2CValue::Bool(true); @@ -361,10 +374,6 @@ unsafe extern "C" fn sub_escape_air_common_strans_main(fighter: &mut L2CFighterC L2CValue::I32(*FIGHTER_STATUS_KIND_ITEM_THROW), L2CValue::Bool(false) ); - let staling_mul = (1.0 - 0.1 * (VarModule::get_int(fighter.object(), vars::common::instance::AGT_USED_COUNTER) as f32)).max(0.0); - KineticModule::mul_speed(fighter.module_accessor, &Vector3f{x: staling_mul, y: staling_mul, z: staling_mul}, *FIGHTER_KINETIC_ENERGY_ID_STOP); - WorkModule::off_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_ESCAPE_AIR); - VarModule::inc_int(fighter.object(), vars::common::instance::AGT_USED_COUNTER); return 1.into(); } } diff --git a/fighters/common/src/general_statuses/attack/attackair.rs b/fighters/common/src/general_statuses/attack/attackair.rs index 5307296d76..bb41ee0f2e 100644 --- a/fighters/common/src/general_statuses/attack/attackair.rs +++ b/fighters/common/src/general_statuses/attack/attackair.rs @@ -86,7 +86,7 @@ unsafe extern "C" fn status_attackair_main_common(fighter: &mut L2CFighterCommon } if !CancelModule::is_enable_cancel(fighter.module_accessor) && VarModule::is_flag(fighter.battle_object, vars::common::instance::OMNI_FLOAT) - && !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_FLOAT) + && !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_FLOATING) && ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) { let mut dive_cont_value = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("dive_cont_value")); let mut dive_flick_frame_value = WorkModule::get_param_int(fighter.module_accessor, hash40("common"), hash40("dive_flick_frame_value")); diff --git a/fighters/common/src/general_statuses/cliff.rs b/fighters/common/src/general_statuses/cliff.rs index 01e3c689fa..0e89b21b9b 100644 --- a/fighters/common/src/general_statuses/cliff.rs +++ b/fighters/common/src/general_statuses/cliff.rs @@ -28,7 +28,8 @@ fn nro_hook(info: &skyline::nro::NroInfo) { status_end_CliffJump2, status_end_CliffJump3, sub_cliff_uniq_process_exit_Common, - get_cliff_wait_hit_xlu_frame + get_cliff_wait_hit_xlu_frame, + sub_transition_group_check_air_cliff ); } } @@ -44,7 +45,8 @@ unsafe fn status_CliffCatchMove(fighter: &mut L2CFighterCommon) -> L2CValue { #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffCatchMove)] unsafe fn status_end_CliffCatchMove(fighter: &mut L2CFighterCommon) -> L2CValue { if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_CLIFF_CATCH { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID_FOR_TETHERS, -1); HitModule::set_xlu_frame_global(fighter.module_accessor, 0, 0); } call_original!(fighter) @@ -53,7 +55,8 @@ unsafe fn status_end_CliffCatchMove(fighter: &mut L2CFighterCommon) -> L2CValue #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffCatch)] unsafe fn status_end_CliffCatch(fighter: &mut L2CFighterCommon) -> L2CValue { if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_CLIFF_WAIT { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID_FOR_TETHERS, -1); } call_original!(fighter) } @@ -182,8 +185,9 @@ unsafe fn status_end_CliffWait(fighter: &mut L2CFighterCommon) -> L2CValue { *FIGHTER_STATUS_KIND_CLIFF_CLIMB, *FIGHTER_STATUS_KIND_CLIFF_ESCAPE, *FIGHTER_STATUS_KIND_CLIFF_JUMP1].contains(&StatusModule::status_kind_next(fighter.module_accessor)) { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); } + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID_FOR_TETHERS, -1); call_original!(fighter) } @@ -213,7 +217,7 @@ unsafe fn status_CliffAttack_Main(fighter: &mut L2CFighterCommon) -> L2CValue { #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffAttack)] unsafe fn status_end_CliffAttack(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); call_original!(fighter) } @@ -243,7 +247,7 @@ unsafe fn status_CliffClimb_Main(fighter: &mut L2CFighterCommon) -> L2CValue { #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffClimb)] unsafe fn status_end_CliffClimb(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); call_original!(fighter) } @@ -273,7 +277,7 @@ unsafe fn status_CliffEscape_Main(fighter: &mut L2CFighterCommon) -> L2CValue { #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffEscape)] unsafe fn status_end_CliffEscape(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); call_original!(fighter) } @@ -301,7 +305,7 @@ unsafe fn status_CliffJump1(fighter: &mut L2CFighterCommon) -> L2CValue { #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffJump1)] unsafe fn status_end_CliffJump1(fighter: &mut L2CFighterCommon) -> L2CValue { if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_CLIFF_JUMP2 { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); } InputModule::disable_persist(fighter.battle_object); call_original!(fighter) @@ -327,14 +331,14 @@ unsafe fn status_CliffJump2_Main(fighter: &mut L2CFighterCommon) -> L2CValue { #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffJump2)] unsafe fn status_end_CliffJump2(fighter: &mut L2CFighterCommon) -> L2CValue { if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_CLIFF_JUMP3 { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); } call_original!(fighter) } #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffJump3)] unsafe fn status_end_CliffJump3(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(fighter.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); call_original!(fighter) } @@ -373,4 +377,18 @@ unsafe fn get_cliff_wait_hit_xlu_frame(fighter: &mut L2CFighterCommon) -> L2CVal let cliff_xlu_frame = call_original!(fighter).get_i32(); VarModule::set_int(fighter.battle_object, vars::common::instance::CLIFF_XLU_FRAME, cliff_xlu_frame); call_original!(fighter) -} \ No newline at end of file +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_sub_transition_group_check_air_cliff)] +unsafe fn sub_transition_group_check_air_cliff(fighter: &mut L2CFighterCommon) -> L2CValue { + // in RoA mode, players can wall jump in all ledge-grabbable statuses + if utils::game_modes::check_custom_mode(game_modes::CustomMode::RivalsOfAetherMode) { + VarModule::on_flag(fighter.battle_object, vars::common::status::ENABLE_SPECIAL_WALLJUMP); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + if speed_y < 0.0 { + fighter.sub_transition_group_check_air_wall_jump(); + } + return false.into(); // they also cannot grab ledge + } + call_original!(fighter) +} diff --git a/fighters/common/src/general_statuses/cliffrobbed.rs b/fighters/common/src/general_statuses/cliffrobbed.rs new file mode 100644 index 0000000000..0b6f1e41ab --- /dev/null +++ b/fighters/common/src/general_statuses/cliffrobbed.rs @@ -0,0 +1,159 @@ +use super::*; +use globals::*; + +// This file contains code for ledge trumps + +pub fn install() { + skyline::nro::add_hook(nro_hook); +} + +fn nro_hook(info: &skyline::nro::NroInfo) { + if info.name == "common" { + skyline::install_hooks!( + status_CliffRobbed, + sub_cliff_robbed_uniq + ); + } +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_CliffRobbed)] +unsafe fn status_CliffRobbed(fighter: &mut L2CFighterCommon) -> L2CValue { + WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_INSTANCE_WORK_ID_INT_FRAME_CLIFF_ROBBED); + + let motion = if fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_KOOPAG { + Hash40::new("fall") + } else { + Hash40::new("damage_air_2") + }; + + let cliff_robbed_no_control_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("common"), hash40("cliff_robbed_no_control_frame")); + + let rate = fighter.sub_get_adjust_rate_from_cancel_frame(L2CValue::Hash40(motion), L2CValue::I32(cliff_robbed_no_control_frame)).get_f32(); + + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, rate, false, 0.0, false, false); + + // + + KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_CONTROL, fighter.module_accessor); + + let cliff_robbed_speed = ParamModule::get_float(fighter.battle_object, ParamType::Common, "cliff_robbed_speed"); + let cliff_robbed_angle = ParamModule::get_float(fighter.battle_object, ParamType::Common, "cliff_robbed_angle"); + let mut cliff_robbed_true_angle = if PostureModule::lr(fighter.module_accessor) == -1.0 { + (180.0 - cliff_robbed_angle).to_radians() + } else { + cliff_robbed_angle.to_radians() + }; + let air_accel_y = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_y"), 0); + let stick_x = fighter.global_table[STICK_X].get_f32(); + let stick_y = fighter.global_table[STICK_Y].get_f32(); + + // Derives initial x/y launch speed from base (parameterized) ledge trump values + let mut cliff_robbed_speed_x = cliff_robbed_true_angle.cos() * cliff_robbed_speed; + let mut cliff_robbed_speed_y = cliff_robbed_true_angle.sin() * cliff_robbed_speed; + + if stick_x != 0.0 + || stick_y != 0.0 { + // Performs "DI" on your ledge trump launch angle + // This logic is copied from normal DI calculations + let cliff_robbed_correction_max = ParamModule::get_float(fighter.battle_object, ParamType::Common, "cliff_robbed_correction_max"); + let max_di_radians = cliff_robbed_correction_max.to_radians(); + + let stick_calc = (cliff_robbed_speed_y * stick_x) - (cliff_robbed_speed_x * stick_y); + let mut ratio = stick_calc.abs() / cliff_robbed_speed; + let stick_calc_2 = (cliff_robbed_speed_x * stick_y) - (cliff_robbed_speed_y * stick_x); + if stick_calc_2 < 0.0 { + ratio *= -1.0; + } + + // Determines your new launch angle + cliff_robbed_true_angle += (max_di_radians * ratio); + + // Derives new initial x/y launch speed from your updated launch angle + cliff_robbed_speed_x = cliff_robbed_true_angle.cos() * cliff_robbed_speed; + cliff_robbed_speed_y = cliff_robbed_true_angle.sin() * cliff_robbed_speed; + } + + // Applies a vertical speed boost to characters with higher gravity + // This normalizes the launch distance somewhat + // Note: 0.11 is HDR's median gravity value + let gravity_modifier = (air_accel_y - 0.11) * 17.5; + cliff_robbed_speed_y += gravity_modifier; + + KineticModule::clear_speed_all(fighter.module_accessor); + + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_DAMAGE, + ENERGY_STOP_RESET_TYPE_DAMAGE_AIR, + cliff_robbed_speed_x, + cliff_robbed_speed_y, + 0.0, + 0.0, + 0.0 + ); + + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_DAMAGE); + + // + + let cliff_release_disable_wall_jump_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("common"), hash40("cliff_release_disable_wall_jump_frame")); + WorkModule::set_int(fighter.module_accessor, cliff_release_disable_wall_jump_frame, *FIGHTER_INSTANCE_WORK_ID_INT_DISABLE_WALL_JUMP_FRAME); + + // ShakeModule::req( + // fighter.module_accessor, + // Hash40::new("damage_air"), + // 5, + // false, + // &Vector2f{x: 0.0, y: 1.0}, + // 1.0, + // 0.0, + // false, + // false + // ); + + if !StopModule::is_stop(fighter.module_accessor) { + fighter.sub_cliff_robbed_uniq(false.into()); + } + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(L2CFighterCommon_bind_address_call_sub_cliff_robbed_uniq as *const () as _)); + + fighter.sub_shift_status_main(L2CValue::Ptr(L2CFighterCommon_bind_address_call_status_CliffRobbed_Main as *const () as _)) +} + +#[skyline::hook(replace = L2CFighterCommon_sub_cliff_robbed_uniq)] +unsafe extern "C" fn sub_cliff_robbed_uniq(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { + if !param_1.get_bool() { + let cliff_robbed_frame = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_FRAME_CLIFF_ROBBED); + let cliff_robbed_no_control_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("common"), hash40("cliff_robbed_no_control_frame")); + + if cliff_robbed_frame == cliff_robbed_no_control_frame { + // + + // Enable drift/fastfall once past your cliff_robbed_no_control_frame + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ); + + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + + // + + fighter.sub_air_check_fall_common_pre(); + } + } + else { + WorkModule::inc_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_FRAME_CLIFF_ROBBED); + } + + fighter.sub_fall_common_uniq(param_1); + + 0.into() +} \ No newline at end of file diff --git a/fighters/common/src/general_statuses/damage.rs b/fighters/common/src/general_statuses/damage.rs index 099b2823b7..a0d60334cd 100644 --- a/fighters/common/src/general_statuses/damage.rs +++ b/fighters/common/src/general_statuses/damage.rs @@ -3,6 +3,7 @@ use super::*; use globals::*; use interpolation::Lerp; use utils::game_modes::CustomMode; +use crate::function_hooks::camera::{REDUCED_CAMERA_TRACKING_SPEED, DEFAULT_TARGET_INTERPOLATION_RATE, ReducedCameraTrackingSpeed}; pub fn install() { skyline::nro::add_hook(nro_hook); @@ -28,7 +29,9 @@ fn nro_hook(info: &skyline::nro::NroInfo) { ftStatusUniqProcessDamageAir_init, status_DamageAir_Main, sub_damage_uniq_process_exit, - sub_thrown_uniq_process_init + sub_thrown_uniq_process_init, + sub_FighterStatusDamage_correctDamageVectorExecStop, + sub_damage_uniq_process_init ); } } @@ -177,13 +180,8 @@ pub unsafe fn FighterStatusUniqProcessDamage_leave_stop_hook(fighter: &mut L2CFi } unsafe extern "C" fn check_asdi(fighter: &mut L2CFighterCommon) { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::Smash64Mode) { - return; - } - }, - _ => {} + if utils::game_modes::check_custom_mode(CustomMode::Smash64Mode) { + return; } if fighter.global_table[STATUS_KIND] != FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_LR // prevents ASDI on wall bounces && fighter.global_table[STATUS_KIND] != FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_U // prevents ASDI on ceiling bounces @@ -490,6 +488,7 @@ unsafe fn sub_DamageFlyCommon_hook(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.sub_DamageFlyChkUniq().get_bool() { return true.into(); } + if fighter.global_table[CURRENT_FRAME].get_i32() > 1 && !VarModule::is_flag(fighter.battle_object, vars::common::status::DAMAGE_FLY_RESET_TRIGGER) { ControlModule::reset_trigger(fighter.module_accessor); VarModule::on_flag(fighter.battle_object, vars::common::status::DAMAGE_FLY_RESET_TRIGGER); @@ -750,6 +749,11 @@ unsafe fn status_DamageAir_Main(fighter: &mut L2CFighterCommon) -> L2CValue { unsafe fn sub_damage_uniq_process_exit(fighter: &mut L2CFighterCommon) -> L2CValue { InputModule::reset_command_life_count_max(fighter.battle_object); + if fighter.kind() != *FIGHTER_KIND_NANA { + let id = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as usize; + REDUCED_CAMERA_TRACKING_SPEED[id] = ReducedCameraTrackingSpeed{target_interpolation_rate: DEFAULT_TARGET_INTERPOLATION_RATE, normalize_increment: 0.0}; + } + original!()(fighter) } @@ -758,4 +762,33 @@ unsafe fn sub_thrown_uniq_process_init(fighter: &mut L2CFighterCommon) -> L2CVal ControlModule::reset_trigger(fighter.module_accessor); original!()(fighter) +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_sub_FighterStatusDamage_correctDamageVectorExecStop)] +pub unsafe fn sub_FighterStatusDamage_correctDamageVectorExecStop(fighter: &mut L2CFighterCommon) { + if !FighterStopModuleImpl::is_damage_stop(fighter.module_accessor) + || !FighterControlModuleImpl::is_enable_hit_stop_delay_life(fighter.module_accessor) { + return; + } + + // Prevents C-stick from overriding your DI angle + // on hits + let stick_x = fighter.left_stick_x(); + let stick_y = fighter.left_stick_y(); + WorkModule::set_float(fighter.module_accessor, stick_x, *FIGHTER_STATUS_DAMAGE_WORK_FLOAT_VECOR_CORRECT_STICK_X); + WorkModule::set_float(fighter.module_accessor, stick_y, *FIGHTER_STATUS_DAMAGE_WORK_FLOAT_VECOR_CORRECT_STICK_Y); +} + +#[skyline::hook(replace = L2CFighterCommon_sub_damage_uniq_process_init)] +unsafe fn sub_damage_uniq_process_init(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = original!()(fighter); + + // Prevents C-stick from overriding your DI angle + // on throws + let stick_x = fighter.left_stick_x(); + let stick_y = fighter.left_stick_y(); + WorkModule::set_float(fighter.module_accessor, stick_x, *FIGHTER_STATUS_DAMAGE_WORK_FLOAT_VECOR_CORRECT_STICK_X); + WorkModule::set_float(fighter.module_accessor, stick_y, *FIGHTER_STATUS_DAMAGE_WORK_FLOAT_VECOR_CORRECT_STICK_Y); + + ret } \ No newline at end of file diff --git a/fighters/common/src/general_statuses/damageflyreflect.rs b/fighters/common/src/general_statuses/damageflyreflect.rs index ee72353b27..468a3d8b67 100644 --- a/fighters/common/src/general_statuses/damageflyreflect.rs +++ b/fighters/common/src/general_statuses/damageflyreflect.rs @@ -1,109 +1,34 @@ -// use super::*; -// use globals::*; - -// // This file contains code for ceiling/wall/ground bounces - -// pub fn install() { -// // Agent::new("fighter") -// // .status(End, *FIGHTER_STATUS_KIND_DAMAGE_FLY, damage_fly_end) -// // .status(End, *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_D, damage_fly_reflect_d_end) -// // .status(End, *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_JUMP_BOARD, damage_fly_reflect_jump_board_end) -// // .status(End, *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_LR, damage_fly_reflect_lr_end) -// // .status(End, *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, damage_fly_roll_end) -// // .status(End, *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR, damage_fly_meteor_end) -// // .install(); -// skyline::nro::add_hook(nro_hook); -// } - -// fn nro_hook(info: &skyline::nro::NroInfo) { -// if info.name == "common" { -// skyline::install_hooks!( -// sub_ftStatusUniqProcessDamageFly_initReflect, -// damage_fly_end, -// damage_fly_reflect_d_end, -// damage_fly_reflect_jump_board_end, -// damage_fly_reflect_lr_end, -// damage_fly_reflect_u_end, -// damage_fly_roll_end, -// ); -// } -// } - -// extern "C" { -// #[link_name = "_ZN7lua2cpp16L2CFighterCommon36status_end_DamageFlyReflectJumpBoardEv"] -// fn L2CFighterCommon_status_end_DamageFlyReflectJumpBoard(); - -// #[link_name = "_ZN7lua2cpp16L2CFighterCommon29status_end_DamageFlyReflectLREv"] -// fn L2CFigterCommon_status_end_DamageFlyReflectLR(); -// } - -// #[skyline::hook(replace = L2CFighterCommon_status_end_DamageFly)] -// pub unsafe fn damage_fly_end(fighter: &mut L2CFighterCommon) -> L2CValue { -// ControlModule::set_command_life_extend(fighter.module_accessor, 0); -// original!()(fighter) -// } - -// #[skyline::hook(replace = L2CFighterCommon_status_end_DamageFlyReflectD)] -// pub unsafe fn damage_fly_reflect_d_end(fighter: &mut L2CFighterCommon) -> L2CValue { -// ControlModule::set_command_life_extend(fighter.module_accessor, 0); -// original!()(fighter) -// } - -// #[skyline::hook(replace = L2CFighterCommon_status_end_DamageFlyReflectJumpBoard)] -// pub unsafe fn damage_fly_reflect_jump_board_end(fighter: &mut L2CFighterCommon) -> L2CValue { -// ControlModule::set_command_life_extend(fighter.module_accessor, 0); -// original!()(fighter) -// } - -// #[skyline::hook(replace = L2CFigterCommon_status_end_DamageFlyReflectLR)] -// pub unsafe fn damage_fly_reflect_lr_end(fighter: &mut L2CFighterCommon) -> L2CValue { -// ControlModule::set_command_life_extend(fighter.module_accessor, 0); -// original!()(fighter) -// } - -// #[skyline::hook(replace = L2CFighterCommon_status_end_DamageFlyReflectU)] -// pub unsafe fn damage_fly_reflect_u_end(fighter: &mut L2CFighterCommon) -> L2CValue { -// ControlModule::set_command_life_extend(fighter.module_accessor, 0); -// original!()(fighter) -// } - -// #[skyline::hook(replace = L2CFighterCommon_status_end_DamageFlyRoll)] -// pub unsafe fn damage_fly_roll_end(fighter: &mut L2CFighterCommon) -> L2CValue { -// ControlModule::set_command_life_extend(fighter.module_accessor, 0); -// original!()(fighter) -// } - -// pub unsafe extern "C" fn damage_fly_meteor_end(fighter: &mut L2CFighterCommon) -> L2CValue { -// ControlModule::set_command_life_extend(fighter.module_accessor, 0); -// 0.into() -// } - -// #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_sub_ftStatusUniqProcessDamageFly_initReflect)] -// unsafe fn sub_ftStatusUniqProcessDamageFly_initReflect(fighter: &mut L2CFighterCommon) { -// if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_U, *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_LR]) { -// let reaction_frame = WorkModule::get_float(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLOAT_DAMAGE_REACTION_FRAME); -// let reflect_reaction_frame_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("damage_fly_reflect_reaction_frame_mul")); -// WorkModule::set_float(fighter.module_accessor, reaction_frame * reflect_reaction_frame_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_DAMAGE_REACTION_FRAME); -// } -// fighter.start_damage_reflect_stop(); -// WorkModule::on_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_DAMAGE_FLY_AIR); -// WorkModule::set_int64(fighter.module_accessor, hash40("invalid") as i64, *FIGHTER_STATUS_DAMAGE_WORK_INT_DAMAGE_MOTION_KIND); -// let reflect_disable_escape_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("common"), hash40("damage_fly_reflect_disable_escape_frame")); -// WorkModule::set_int(fighter.module_accessor, reflect_disable_escape_frame, *FIGHTER_STATUS_WORK_ID_INT_RESERVE_DAMAGE_REFLECT_ESCAPE_DISABLE_FRAME); -// WorkModule::unable_transition_term_group_ex(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE_AIR); - -// fighter.clear_lua_stack(); -// lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_DAMAGE); -// let speed_x = app::sv_kinetic_energy::get_speed_x(fighter.lua_state_agent); - -// fighter.clear_lua_stack(); -// lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_DAMAGE); -// let speed_y = app::sv_kinetic_energy::get_speed_y(fighter.lua_state_agent); - -// let reflect_speed_threshold = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("damage_fly_reflect_speed")); -// if speed_x.abs() <= reflect_speed_threshold || speed_y.abs() <= reflect_speed_threshold { -// GroundModule::set_test_coll_stop_status(fighter.module_accessor, true); -// let length = fighter.sub_FighterStatusDamage_get_coll_stop_slidable_length().get_f32(); -// GroundModule::set_coll_stop_slidable_length(fighter.module_accessor, length); -// } -// } \ No newline at end of file +use super::*; +use globals::*; + +// This file contains code for ceiling/wall/ground bounces + +pub fn install() { + skyline::nro::add_hook(nro_hook); +} + +fn nro_hook(info: &skyline::nro::NroInfo) { + if info.name == "common" { + skyline::install_hooks!( + end_damage_reflect_stop + ); + } +} + +// Runs at the end of stage spike hitlag (wall splat) +#[skyline::hook(replace = L2CFighterCommon_end_damage_reflect_stop)] +pub unsafe fn end_damage_reflect_stop(fighter: &mut L2CFighterCommon) { + let damage_speed_x = fighter.get_speed_x(*FIGHTER_KINETIC_ENERGY_ID_DAMAGE); + let damage_speed_y = fighter.get_speed_y(*FIGHTER_KINETIC_ENERGY_ID_DAMAGE); + // damage_fly_reflect_reaction_frame_mul is also applied to hitstun on stage spikes, + // handled in a separate location + let damage_fly_reflect_reaction_frame_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("damage_fly_reflect_reaction_frame_mul")); + let new_speed = Vector2f::new( + damage_speed_x * damage_fly_reflect_reaction_frame_mul, + damage_speed_y * damage_fly_reflect_reaction_frame_mul, + ); + + fighter.set_speed(new_speed, *FIGHTER_KINETIC_ENERGY_ID_DAMAGE); + + original!()(fighter) +} \ No newline at end of file diff --git a/fighters/common/src/general_statuses/dash.rs b/fighters/common/src/general_statuses/dash.rs index 4f8c210580..2c7f857106 100644 --- a/fighters/common/src/general_statuses/dash.rs +++ b/fighters/common/src/general_statuses/dash.rs @@ -576,6 +576,19 @@ unsafe extern "C" fn status_dash_main_common(fighter: &mut L2CFighterCommon, arg interrupt!(fighter, FIGHTER_STATUS_KIND_TURN, true); } + // RoA mode babydash + if utils::game_modes::check_custom_mode(CustomMode::RivalsOfAetherMode) { + let is_backdash = StatusModule::prev_status_kind(fighter.module_accessor, 0) == *FIGHTER_STATUS_KIND_TURN + && StatusModule::prev_status_kind(fighter.module_accessor, 1) == *FIGHTER_STATUS_KIND_DASH; + + if fighter.global_table[CURRENT_FRAME].get_i32() == 2 // if you are on f3 of current dash + && !is_backdash // AND you are not in a backdash + && !fighter.is_stick_backward() // AND stick is not backwards + && stick_x.abs() < dash_stick_x { // AND stick_x < dash stick threshold + interrupt!(fighter, FIGHTER_STATUS_KIND_RUN_BRAKE, true); + } + } + ok!() } @@ -722,6 +735,17 @@ unsafe fn status_end_dash(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::off_flag(fighter.battle_object, vars::common::instance::CAN_PERFECT_PIVOT); } + // baby dashing for RoA mode + if utils::game_modes::check_custom_mode(CustomMode::RivalsOfAetherMode) { + if StatusModule::status_kind_next(fighter.module_accessor) == *FIGHTER_STATUS_KIND_RUN_BRAKE { + let lr = PostureModule::lr(fighter.module_accessor); + let baby_dash_speed = ParamModule::get_float(fighter.battle_object, ParamType::Shared, "baby_dash_speed"); + fighter.clear_lua_stack(); + lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, baby_dash_speed * lr); + app::sv_kinetic_energy::set_speed(fighter.lua_state_agent); + } + } + if VarModule::is_flag(fighter.battle_object, vars::common::status::APPLY_DASH_END_SPEED_MUL) { let applied_speed_clamped = initial_speed.clamp(-run_speed_max, run_speed_max); let dash_end_speed_mul = ParamModule::get_float(fighter.battle_object, ParamType::Common, "dash_end_speed_mul"); diff --git a/fighters/common/src/general_statuses/dead.rs b/fighters/common/src/general_statuses/dead.rs index 346e67d47d..a2117a1197 100644 --- a/fighters/common/src/general_statuses/dead.rs +++ b/fighters/common/src/general_statuses/dead.rs @@ -21,5 +21,42 @@ pub unsafe fn sub_dead_uniq_process_init_hook(fighter: &mut L2CFighterCommon) -> EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_steam1"), true, true); EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_steam2"), true, true); EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_steam3"), true, true); + + if utils::game_modes::check_custom_mode(CustomMode::WarMode) { + war_mode_award_stock(fighter); + } + original!()(fighter) -} \ No newline at end of file +} + +unsafe fn war_mode_award_stock(fighter: &mut L2CFighterCommon) { + let dead_boma = app::sv_system::battle_object_module_accessor(fighter.lua_state_agent); + + if !VarModule::has_var_module((*dead_boma).object()) { + return; + } + + let attacker_entry_id = VarModule::get_int((*dead_boma).object(), vars::common::instance::LAST_ATTACKER_ENTRY_ID); + if attacker_entry_id < 0 { + return; // self-destruct or no attacker tracked + } + + let dead_entry_id = WorkModule::get_int(dead_boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID); + if attacker_entry_id == dead_entry_id { + return; // don't award for self-KOs + } + + let fighter_manager = crate::singletons::FighterManager(); + let attacker_info = app::lua_bind::FighterManager::get_fighter_information( + fighter_manager, + app::FighterEntryID(attacker_entry_id) + ); + if attacker_info.is_null() { + return; + } + + // stock_count is at *(*(fighter_info + 8) + 0xd8) + let inner = *((attacker_info as u64 + 8) as *const u64); + let stock_ptr = (inner + 0xd8) as *mut u32; + *stock_ptr += 1; +} diff --git a/fighters/common/src/general_statuses/dived.rs b/fighters/common/src/general_statuses/dived.rs new file mode 100644 index 0000000000..4b9b1f0a6e --- /dev/null +++ b/fighters/common/src/general_statuses/dived.rs @@ -0,0 +1,33 @@ +// status imports +use super::*; +use globals::*; + +pub fn install() { + skyline::nro::add_hook(nro_hook); +} + +fn nro_hook(info: &skyline::nro::NroInfo) { + if info.name == "common" { + skyline::install_hooks!( + status_KoopaDived + ); + } +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_KoopaDived)] +pub unsafe fn status_KoopaDived(fighter: &mut L2CFighterCommon) -> L2CValue { + AreaModule::set_whole(fighter.module_accessor, false); + ItemModule::set_have_item_visibility(fighter.module_accessor, false, 0); + let motion_share = fighter.get_param_int("param_motion", "motion_share"); + if motion_share == *FIGHTER_MOTION_SHARE_TYPE_TARO || motion_share == *FIGHTER_MOTION_SHARE_TYPE_GIRL { + FighterMotionModuleImpl::add_body_type_hash(fighter.module_accessor, Hash40::new("koopa_dived"), *BODY_TYPE_MOTION_DX); + } + MotionModule::change_motion(fighter.module_accessor, Hash40::new("koopa_dived"), 0.0, 1.0, false, 0.0, false, false); + + // stub the linked camera movement if not doing Flying Slam + + let pos_y = PostureModule::pos_y(fighter.module_accessor); + fighter.set_float(pos_y, *FIGHTER_STATUS_KOOPA_DIVED_WORK_FLOAT_INIT_Y); + + fighter.sub_shift_status_main(L2CValue::Ptr(L2CFighterCommon_bind_address_call_status_ClungCaptain_Main as *const () as _)) +} \ No newline at end of file diff --git a/fighters/common/src/general_statuses/fallspecial.rs b/fighters/common/src/general_statuses/fallspecial.rs index 3ae379b45c..d066341cba 100644 --- a/fighters/common/src/general_statuses/fallspecial.rs +++ b/fighters/common/src/general_statuses/fallspecial.rs @@ -20,7 +20,7 @@ pub unsafe fn status_fall_special(fighter: &mut L2CFighterCommon) -> L2CValue { let front_cliff_hang_data = fighter.get_front_cliff_hangdata(); let p1_x = front_cliff_hang_data.x; - let fall_special_cliff_hangdata_p1x_reduction_dist = ParamModule::get_float(fighter.battle_object, ParamType::Common, "fall_special_cliff_hangdata_p1x_reduction_dist"); + let fall_special_cliff_hangdata_p1x_reduction_dist = ParamModule::get_float(fighter.battle_object, ParamType::Shared, "fall_special_cliff_hangdata_p1x_reduction_dist"); // Reduce forward ledgegrab range while in special fall fighter.set_front_cliff_hangdata(p1_x - fall_special_cliff_hangdata_p1x_reduction_dist, front_cliff_hang_data.y); diff --git a/fighters/common/src/general_statuses/float/main.rs b/fighters/common/src/general_statuses/float/main.rs index eeb18807fc..404098458c 100644 --- a/fighters/common/src/general_statuses/float/main.rs +++ b/fighters/common/src/general_statuses/float/main.rs @@ -4,16 +4,17 @@ use super::*; unsafe fn float_main_common(fighter: &mut L2CFighterCommon) -> L2CValue { sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + float_jump_leniency(fighter); float_drift_common(fighter); WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING_ATTACK_AIR); WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_LANDING); WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_SPECIAL); WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_AIR_LASSO); - let float_frame = VarModule::get_int(fighter.battle_object, vars::common::instance::FLOAT_DURATION); - VarModule::set_int(fighter.battle_object, vars::common::status::FLOAT_FRAME, float_frame); + let float_duration = VarModule::get_int(fighter.battle_object, vars::common::instance::FLOAT_DURATION); + VarModule::set_int(fighter.battle_object, vars::common::status::FLOAT_FRAME, float_duration); VarModule::set_int(fighter.battle_object, vars::common::status::FLOAT_ENABLE_UNIQ, 1); - VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_FLOAT); + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_FLOATING); if !VarModule::is_flag(fighter.battle_object, vars::common::status::FLOAT_INHERIT_AERIAL) { MotionModule::change_motion(fighter.module_accessor, Hash40::new("fuwafuwa_start"), 0.0, 1.0, false, 0.0, false, false); @@ -104,7 +105,12 @@ unsafe fn float_set_aerial(fighter: &mut L2CFighterCommon) { #[no_mangle] unsafe fn float_main_loop_common(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.global_table[CURRENT_FRAME].get_f32() == 3.0 + let is_mewtwo = fighter.global_table[FIGHTER_KIND].get_i32() == *FIGHTER_KIND_MEWTWO; + let buffer = ControlModule::get_command_life_count_max(fighter.module_accessor) as i32; + let float_duration = VarModule::get_int(fighter.battle_object, vars::common::instance::FLOAT_DURATION); + let float_frame = VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_FRAME); // dec at end of loop + + if (float_frame - float_duration).abs() == 4 && VarModule::is_flag(fighter.battle_object, vars::common::instance::OMNI_FLOAT) { let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); sv_kinetic_energy!( @@ -128,6 +134,12 @@ unsafe fn float_main_loop_common(fighter: &mut L2CFighterCommon) -> L2CValue { float_drift_common(fighter); } + // Mewtwo jump burn + if (float_frame - float_duration).abs() == buffer + && is_mewtwo { + fighter.inc_int(*FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + } + if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } @@ -163,7 +175,7 @@ unsafe fn float_main_loop_common(fighter: &mut L2CFighterCommon) -> L2CValue { } if VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_MTRANS) == 2 - && VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_FRAME) <= 0 { + && float_frame <= 0 { ControlModule::clear_command_one(fighter.module_accessor, *FIGHTER_PAD_COMMAND_CATEGORY1, *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_N); let cat1 = ControlModule::get_command_flag_cat(fighter.module_accessor, 0); fighter.global_table[CMD_CAT1].assign(&L2CValue::I32(cat1)); @@ -172,7 +184,7 @@ unsafe fn float_main_loop_common(fighter: &mut L2CFighterCommon) -> L2CValue { } if VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_MTRANS) == 1 - && VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_FRAME) <= 0 { + && float_frame <= 0 { fighter.change_status(FIGHTER_STATUS_KIND_ATTACK_AIR.into(), true.into()); return 0.into(); } @@ -180,7 +192,7 @@ unsafe fn float_main_loop_common(fighter: &mut L2CFighterCommon) -> L2CValue { // Unique Down Special stuff is usually here but we don't want it if VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_ENABLE_UNIQ) == 1 { - if VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_FRAME) > 0 { + if float_frame > 0 { VarModule::dec_int(fighter.battle_object, vars::common::status::FLOAT_FRAME); if VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_FRAME) == 0 { VarModule::set_int(fighter.battle_object, vars::common::status::FLOAT_ENABLE_UNIQ, 0); @@ -241,6 +253,19 @@ unsafe fn float_drift_common(fighter: &mut L2CFighterCommon) -> L2CValue { 0.into() } +#[no_mangle] +unsafe fn float_jump_leniency(fighter: &mut L2CFighterCommon) -> L2CValue { + let float_jump_aerial_refresh_frame = ParamModule::get_int(fighter.battle_object, ParamType::Common, "float_jump_aerial_refresh_frame"); + if fighter.global_table[PREV_STATUS_KIND].get_i32() == *FIGHTER_STATUS_KIND_JUMP_AERIAL + && fighter.global_table[PREV_STATUS_FRAME].get_i32() <= float_jump_aerial_refresh_frame { + fighter.dec_int(*FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + fighter.clear_lua_stack(); + lua_args!(fighter, Hash40::new("sys_jump_aerial"), true, true); + smash::app::sv_animcmd::EFFECT_OFF_KIND(fighter.lua_state_agent); + } + 0.into() +} + unsafe fn float_ray_check(fighter: &mut L2CFighterCommon) { let pos_x = PostureModule::pos_x(fighter.module_accessor); let pos_y = PostureModule::pos_y(fighter.module_accessor); diff --git a/fighters/common/src/general_statuses/float/mod.rs b/fighters/common/src/general_statuses/float/mod.rs index 72d30bd182..ff012214a2 100644 --- a/fighters/common/src/general_statuses/float/mod.rs +++ b/fighters/common/src/general_statuses/float/mod.rs @@ -6,50 +6,61 @@ mod end; #[no_mangle] unsafe fn float_check_air_jump(fighter: &mut L2CFighterCommon, float_status: L2CValue) -> L2CValue { - let is_aerial = fighter.global_table[PAD_FLAG].get_i32() & *FIGHTER_PAD_FLAG_ATTACK_TRIGGER != 0; + if VarModule::is_flag(fighter.battle_object, vars::common::instance::DISABLE_FLOAT) + || VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_FLOATING) { + return 0.into(); + } - if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON) { - if !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_FLOAT) { - let mut allow_float = false; - if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) { - let stick_y = fighter.left_stick_y(); - let squat_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("squat_stick_y")); - if stick_y <= squat_stick_y { - allow_float = !is_aerial; - } - } + if !WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON) + && !WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL) { + return 0.into(); + } - if allow_float { - fighter.change_status(float_status, true.into()); - return 1.into(); - } - } + if fighter.global_table[PAD_FLAG].get_i32() & *FIGHTER_PAD_FLAG_ATTACK_TRIGGER != 0 { + return 0.into(); } - 0.into() -} -#[no_mangle] -unsafe fn float_check_air_jump_aerial(fighter: &mut L2CFighterCommon, float_status: L2CValue) -> L2CValue { - let is_aerial = fighter.global_table[PAD_FLAG].get_i32() & *FIGHTER_PAD_FLAG_ATTACK_TRIGGER != 0; + if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) { + return 0.into(); + } - if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON) { - if !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_FLOAT) { - let mut allow_float = false; - if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) { - if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < 0.0 { - allow_float = !is_aerial; - } - } + let buffer = ControlModule::get_command_life_count_max(fighter.module_accessor) as usize; + let stick_y = fighter.left_stick_y(); + let squat_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("squat_stick_y")); - if allow_float { - fighter.change_status(float_status, true.into()); - return 1.into(); - } - } + if stick_y > squat_stick_y + && (InputModule::get_trigger_count(fighter.battle_object, Buttons::Jump) <= buffer + || KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) > 0.0) { + return 0.into() } + fighter.change_status(float_status, true.into()); + 1.into() +} + +#[no_mangle] +unsafe fn float_check_air_jump_aerial(fighter: &mut L2CFighterCommon, float_status: L2CValue) -> L2CValue { + float_check_air_jump(fighter, float_status); + //let is_aerial = fighter.global_table[PAD_FLAG].get_i32() & *FIGHTER_PAD_FLAG_ATTACK_TRIGGER != 0; +// + //if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON) { + // if !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_FLOATING) { + // let mut allow_float = false; + // if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) { + // if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < 0.0 { + // allow_float = !is_aerial; + // } + // } +// + // if allow_float { + // fighter.change_status(float_status, true.into()); + // return 1.into(); + // } + // } + //} + // if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL) { - // if !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_FLOAT) { + // if !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_FLOATING) { // let mut allow_float = false; // let stick_y = fighter.left_stick_y(); // let jump_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("jump_stick_y")); diff --git a/fighters/common/src/general_statuses/jumpsquat.rs b/fighters/common/src/general_statuses/jumpsquat.rs index ddfb48ba69..43b325e03b 100644 --- a/fighters/common/src/general_statuses/jumpsquat.rs +++ b/fighters/common/src/general_statuses/jumpsquat.rs @@ -82,13 +82,9 @@ unsafe fn status_JumpSquat(fighter: &mut L2CFighterCommon) -> L2CValue { let lr_update = fighter.sub_status_JumpSquat_check_stick_lr_update(); fighter.status_JumpSquat_common(lr_update); if fighter.is_cat_flag(CatHdr::Wavedash) { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if !modes.contains(&CustomMode::Smash64Mode) { - VarModule::on_flag(fighter.battle_object, vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); - } - }, - _ => { VarModule::on_flag(fighter.battle_object, vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); } + // disabled for smash64 mode + if !utils::game_modes::check_custom_mode(CustomMode::Smash64Mode) { + VarModule::on_flag(fighter.battle_object, vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); } } fighter.sub_shift_status_main(L2CValue::Ptr(status_JumpSquat_Main as *const () as _)) @@ -278,13 +274,9 @@ unsafe fn uniq_process_JumpSquat_exec_status_param(fighter: &mut L2CFighterCommo && cat1 & *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_N == 0 { if !(fighter.kind() == *FIGHTER_KIND_PICKEL && fighter.is_prev_status_one_of(&[*FIGHTER_PICKEL_STATUS_KIND_SPECIAL_N1_JUMP_SQUAT, *FIGHTER_PICKEL_STATUS_KIND_SPECIAL_N3_JUMP_SQUAT])) { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if !modes.contains(&CustomMode::Smash64Mode) { - VarModule::on_flag(fighter.battle_object, vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); - } - }, - _ => { VarModule::on_flag(fighter.battle_object, vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); } + // disabled for smash64 mode + if !utils::game_modes::check_custom_mode(CustomMode::Smash64Mode) { + VarModule::on_flag(fighter.battle_object, vars::common::instance::ENABLE_AIR_ESCAPE_JUMPSQUAT); } } } diff --git a/fighters/common/src/general_statuses/lasso.rs b/fighters/common/src/general_statuses/lasso.rs index 63b8fc88b8..f33891aba4 100644 --- a/fighters/common/src/general_statuses/lasso.rs +++ b/fighters/common/src/general_statuses/lasso.rs @@ -9,16 +9,51 @@ pub fn install() { fn nro_hook(info: &skyline::nro::NroInfo) { if info.name == "common" { skyline::install_hooks!( + status_air_lasso_main, sub_air_lasso_hang_uniq ); } + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_air_lasso_main)] +pub unsafe fn status_air_lasso_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::common::instance::DISABLE_AIR_LASSO); + + original!()(fighter) +} } #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_sub_air_lasso_hang_uniq)] -pub unsafe fn sub_air_lasso_hang_uniq(fighter: &mut L2CFighterCommon, arg1: L2CValue) -> L2CValue { - let ret = original!()(fighter, arg1); - if fighter.status_frame() < ParamModule::get_int(fighter.battle_object, ParamType::Common, "lasso_hang_fall_disable_frame") { - fighter.off_flag(*FIGHTER_STATUS_AIR_LASSO_HANG_FLAG_FALL_ENABLE); +pub unsafe fn sub_air_lasso_hang_uniq(fighter: &mut L2CFighterCommon, arg: L2CValue) -> L2CValue { + if arg.get_bool() { + WorkModule::dec_int(fighter.module_accessor, *FIGHTER_STATUS_AIR_LASSO_HANG_WORK_INT_FRAME); + WorkModule::count_down_int(fighter.module_accessor, *FIGHTER_STATUS_AIR_LASSO_HANG_WORK_INT_BODY_ANGLE_INTP, 0); + } + else { + // Disable tether canceling for non-tether-upB characters + if fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_LUCAS + || fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_RICHTER + || fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_SAMUS + || fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_SAMUSD + || fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_SHIZUE + || fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_SIMON + || fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_SZEROSUIT + || fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_TOONLINK + || fighter.global_table[FIGHTER_KIND] == FIGHTER_KIND_YOUNGLINK { + return 0.into(); + } + + if fighter.global_table[CURRENT_FRAME].get_i32() < ParamModule::get_int(fighter.battle_object, ParamType::Common, "lasso_hang_fall_disable_frame") { + return 0.into(); + } + + let prev_stick_y = ControlModule::get_stick_prev_y(fighter.module_accessor); + let squat_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("squat_stick_y")); + if prev_stick_y <= squat_stick_y { + return 0.into(); + } + + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_STATUS_AIR_LASSO_HANG_FLAG_FALL_ENABLE); } - ret + + 0.into() } \ No newline at end of file diff --git a/fighters/common/src/general_statuses/mewtwo_thrown.rs b/fighters/common/src/general_statuses/mewtwo_thrown.rs new file mode 100644 index 0000000000..ba5780055c --- /dev/null +++ b/fighters/common/src/general_statuses/mewtwo_thrown.rs @@ -0,0 +1,29 @@ +use super::*; + +pub fn install() { + skyline::nro::add_hook(nro_hook); +} + +fn nro_hook(info: &skyline::nro::NroInfo) { + if info.name == "common" { + skyline::install_hooks!( + status_MewtwoThrown_check_damage, + ); + } +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_FighterStatusUniqProcessMewtwoThrown_check_damage)] +unsafe fn status_MewtwoThrown_check_damage(fighter: &mut L2CFighterCommon) -> L2CValue { + if !fighter.get_grabber_boma().is_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_S_THROW) { + return call_original!(fighter); + } + // make spin match grab duration manually + let frame = MotionModule::frame(fighter.module_accessor); + MotionModule::set_rate(fighter.module_accessor, (28.0-frame)/(51.0-frame)); + // allow pushing thru platforms + GroundModule::set_passable_check(fighter.module_accessor, true); + if CaptureModule::check_damage_thrown(fighter.module_accessor) != 0 { + return 1.into(); + } // bypass release set speed/status + 0.into() +} \ No newline at end of file diff --git a/fighters/common/src/general_statuses/mod.rs b/fighters/common/src/general_statuses/mod.rs index 31fd881733..bf569bd76b 100644 --- a/fighters/common/src/general_statuses/mod.rs +++ b/fighters/common/src/general_statuses/mod.rs @@ -3,6 +3,7 @@ use super::*; use globals::*; use interpolation::Lerp; use utils::game_modes::CustomMode; +use crate::function_hooks::camera::{REDUCED_CAMERA_TRACKING_SPEED, DEFAULT_TARGET_INTERPOLATION_RATE, ReducedCameraTrackingSpeed}; macro_rules! interrupt { () => { return L2CValue::I32(1); }; @@ -29,7 +30,7 @@ mod catch; mod damage; mod escape; mod dead; -// mod damageflyreflect; +mod damageflyreflect; mod down; mod float; mod slip; @@ -37,6 +38,9 @@ mod lasso; mod itemthrow; mod fallspecial; mod squat; +mod cliffrobbed; +mod mewtwo_thrown; +mod dived; // [LUA-REPLACE-REBASE] // [SHOULD-CHANGE] @@ -83,10 +87,10 @@ pub unsafe fn status_pre_DamageAir(fighter: &mut L2CFighterCommon) -> L2CValue { #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_sub_DamageFlyCommon_init)] pub unsafe fn damage_fly_common_init(fighter: &mut L2CFighterCommon) { - if VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_KNOCKDOWN_THROW) { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::FORCE_TUMBLE_NO_BOUNCE) { WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_DAMAGE_FLY_REFLECT_D); } - VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::off_flag(fighter.battle_object, vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); original!()(fighter) } @@ -133,6 +137,17 @@ fn nro_hook(info: &skyline::nro::NroInfo) { #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_LandingStiffness)] pub unsafe fn status_LandingStiffness(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.global_table[PREV_STATUS_KIND] == FIGHTER_STATUS_KIND_DAMAGE_AIR { + + // special conditions for RoA mode + if utils::game_modes::check_custom_mode(CustomMode::RivalsOfAetherMode) { + if !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_CC_NON_TUMBLE) { + // Reduce buffer out of non-CCd non-tumble hitstun landing + let damage_level3_precede = ParamModule::get_int(fighter.battle_object, ParamType::Common, "damage_level3_precede"); + InputModule::set_command_life_count_max(fighter.battle_object, damage_level3_precede as u32); + } + return original!()(fighter); + } + if VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_CC_NON_TUMBLE) { // halve hitstun on non-tumble landing if CC'd // if halved hitstun is less than your heavy landing lag value, use your heavy landing lag value @@ -447,6 +462,29 @@ unsafe fn sub_transition_group_check_ground_guard(fighter: &mut L2CFighterCommon } } + // special conditions for RoA mode + if utils::game_modes::check_custom_mode(CustomMode::RivalsOfAetherMode) { + // Cannot parry if using shield lock (for convenience) + let guard_hold = fighter.check_guard_hold().get_bool(); + if guard_hold { + return false.into(); + } + // Parry input + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_GUARD_ON) { + if fighter.sub_check_command_parry().get_bool() { + VarModule::on_flag(fighter.object(), vars::common::instance::IS_PARRY_FOR_GUARD_OFF); + fighter.change_status(FIGHTER_STATUS_KIND_GUARD_OFF.into(), false.into()); + return true.into(); + } + // C-Stick rolls + if fighter.sub_check_command_guard().get_bool() + && shield::misc::check_cstick_escape_oos(fighter, true).get_bool() { + return true.into(); + } + } + return false.into(); + } + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_GUARD_ON) { if fighter.sub_check_command_parry().get_bool() { VarModule::on_flag(fighter.object(), vars::common::instance::IS_PARRY_FOR_GUARD_OFF); @@ -798,17 +836,19 @@ unsafe extern "C" fn get_gravity_factor(fighter: &mut L2CFighterCommon) -> f32 { 0.8.lerp(&1.0, &scalar) } -// calculates launch angle factor -// "compares the length of the vector to the corner of the screen, to the length of the kb vector" -JOB -unsafe extern "C" fn get_angle_factor(angle_threshold: f32, angle: f32) -> f32 { - let angle_threshold = angle_threshold.to_radians(); - let angle = (90.0 - ((angle % 180.0).abs() - 90.0).abs()).to_radians(); - if angle <= angle_threshold { return 1.0; } - - // magic JOB math - let angle_factor = ((angle_threshold.cos().powf(2.0) / 640.0_f32.powf(2.0)) + (angle_threshold.sin().powf(2.0) / 360.0_f32.powf(2.0))).sqrt() - / ((angle.cos().powf(2.0) / 640.0_f32.powf(2.0)) + (angle.sin().powf(2.0) / 360.0_f32.powf(2.0))).sqrt(); - return angle_factor; +// Calculates launch angle ratio +// Needed to determine your launch-angle-dependent threshold at which +// knockback speedup begins +unsafe extern "C" fn get_angle_ratio(angle_threshold: f32, angle: f32) -> f32 { + let angle_relative = (90.0 - ((angle % 180.0).abs() - 90.0).abs()); + + let ratio = if angle_relative <= angle_threshold { + 0.0 + } else { + (angle_relative - angle_threshold) / (90.0 - angle_threshold) + }; + + return ratio } unsafe extern "C" fn check_damage_speed_up_fail(fighter: &mut L2CFighterCommon) -> bool { @@ -831,16 +871,16 @@ unsafe extern "C" fn fighterstatusdamage_init_damage_speed_up_by_speed( ) { let angle = angle.get_f32(); let angle_threshold = 29.358; - let speed_start_horizontal = 3.8; // the start of scaling at angles below the angle_threshold + let speed_start_horizontal = 3.1; // the start of scaling at angles below the angle_threshold let gravity_factor = get_gravity_factor(fighter); - let speed_start_vertical = 6.2 * gravity_factor; // the start of scaling at completely vertical angles - let speed_end = 7.2; // the end of scaling + let speed_start_vertical = 5.7 * gravity_factor; // the start of scaling at completely vertical angles + let speed_end_horizontal = 6.2; // the end of scaling at angles below the angle_threshold + let speed_end_vertical = speed_end_horizontal + (speed_start_vertical - speed_start_horizontal); // the end of scaling at completely vertical angles - // calculate true speed_start using angle - let angle_factor = get_angle_factor(angle_threshold, angle); // the actual angle factor - let ratio_base = get_angle_factor(angle_threshold, 90.0); // the max angle factor - let ratio = (1.0 - angle_factor) / (1.0 - ratio_base); - let speed_start = speed_start_horizontal.lerp(&speed_start_vertical, &ratio); + let angle_ratio = get_angle_ratio(angle_threshold, angle); + + let speed_start = speed_start_horizontal.lerp(&speed_start_vertical, &angle_ratio); + let speed_end = speed_end_horizontal.lerp(&speed_end_vertical, &angle_ratio); // exit if speed is too slow let speed = factor.get_f32(); @@ -853,7 +893,7 @@ unsafe extern "C" fn fighterstatusdamage_init_damage_speed_up_by_speed( // calculate speed_up_mul let min_mul = 1.25; - let max_mul = 1.6; + let max_mul = 1.65; let power = 1.0; let ratio = ((speed - speed_start) / (speed_end - speed_start)); let speed_up_mul = if speed <= speed_end { @@ -868,15 +908,56 @@ unsafe extern "C" fn fighterstatusdamage_init_damage_speed_up_by_speed( WorkModule::set_float(fighter.module_accessor, speed_up_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_DAMAGE_SPEED_UP_MAX_MAG); } +unsafe extern "C" fn fighterstatusdamage_init_damage_camera_tracking( + fighter: &mut L2CFighterCommon, + factor: L2CValue, // Labeled this way because if shot out of a tornado, the game will pass in your hitstun frames instead of speed. + angle: L2CValue +) { + if fighter.kind() == *FIGHTER_KIND_NANA { + return; + } + + let angle = angle.get_f32(); + let angle_threshold = 45.0; + let speed_start_horizontal = 3.0; // the start of camera tracking speed reduction at angles below the angle_threshold + let gravity_factor = get_gravity_factor(fighter); + let speed_start_vertical = 6.0 * gravity_factor; // the start of camera tracking speed reduction at completely vertical angles + let speed_end_horizontal = 6.25; // the end of camera tracking speed reduction at angles below the angle_threshold + let speed_end_vertical = speed_start_vertical + 7.0; // the end of camera tracking speed reduction at completely vertical angles + + let angle_ratio = get_angle_ratio(angle_threshold, angle); + + let speed_start = speed_start_horizontal.lerp(&speed_start_vertical, &angle_ratio); + let speed_end = speed_end_horizontal.lerp(&speed_end_vertical, &angle_ratio); + + // exit if speed is too slow + let speed = factor.get_f32(); + if check_damage_speed_up_fail(fighter) || speed <= speed_start { + return; + } + + // calculate target_interpolation_rate + let base = 0.69; + let reduced = 0.125; + let ratio = ((speed - speed_start) / (speed_end - speed_start)); + let target_interpolation_rate: f32 = if speed <= speed_end { + base.lerp(&reduced, &ratio) + } else { + reduced + }; + + //println!("speed: {} rate: {}", speed, target_interpolation_rate); + + let id = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as usize; + let reaction_frame_mul_speed_up = fighter.reaction_frame_mul_speed_up().get_f32(); + let dif = DEFAULT_TARGET_INTERPOLATION_RATE - target_interpolation_rate; + REDUCED_CAMERA_TRACKING_SPEED[id] = ReducedCameraTrackingSpeed{target_interpolation_rate: target_interpolation_rate, normalize_increment: (dif / reaction_frame_mul_speed_up) * 0.5}; +} + #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_FighterStatusDamage__correctDamageVector)] pub unsafe fn FighterStatusDamage__correctDamageVector(fighter: &mut L2CFighterCommon) -> L2CValue { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::Smash64Mode) { - return 0.into(); - } - }, - _ => {} + if utils::game_modes::check_custom_mode(CustomMode::Smash64Mode) { + return 0.into(); } let ret = call_original!(fighter); @@ -892,18 +973,15 @@ pub unsafe fn FighterStatusDamage__correctDamageVector(fighter: &mut L2CFighterC fighterstatusdamage_init_damage_speed_up_by_speed(fighter, speed_vector.into(), angle.into(), false.into()); + fighterstatusdamage_init_damage_camera_tracking(fighter, speed_vector.into(), angle.into()); + ret } #[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_FighterStatusDamage__correctDamageVectorEffect)] pub unsafe fn FighterStatusDamage__correctDamageVectorEffect(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::Smash64Mode) { - return 0.into(); - } - }, - _ => {} + if utils::game_modes::check_custom_mode(game_modes::CustomMode::Smash64Mode) { + return 0.into(); } if fighter.global_table[STATUS_KIND_INTERRUPT] != FIGHTER_STATUS_KIND_DAMAGE_AIR { return call_original!(fighter, param_1); @@ -1036,7 +1114,7 @@ unsafe fn sub_calc_landing_motion_rate(_fighter: &mut L2CFighterCommon, end_fram pub unsafe fn sub_landing_uniq_process_exit(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_CC_NON_TUMBLE); InputModule::reset_command_life_count_max(fighter.battle_object); - + original!()(fighter) } @@ -1061,13 +1139,16 @@ pub fn install() { damage::install(); escape::install(); dead::install(); - // damageflyreflect::install(); + damageflyreflect::install(); down::install(); slip::install(); lasso::install(); itemthrow::install(); fallspecial::install(); squat::install(); + cliffrobbed::install(); + mewtwo_thrown::install(); + dived::install(); skyline::nro::add_hook(nro_hook); } diff --git a/fighters/common/src/general_statuses/shield/furafura/mod.rs b/fighters/common/src/general_statuses/shield/furafura/mod.rs index a2e60e9475..967aa14d21 100644 --- a/fighters/common/src/general_statuses/shield/furafura/mod.rs +++ b/fighters/common/src/general_statuses/shield/furafura/mod.rs @@ -40,9 +40,24 @@ unsafe fn status_FuraFura_Main(fighter: &mut L2CFighterCommon) -> L2CValue { return false.into(); } +#[skyline::hook(replace = L2CFighterCommon_status_FuraFuraEnd)] +unsafe fn status_FuraFuraEnd_Main(fighter: &mut L2CFighterCommon) -> L2CValue { + let mut rate = 1.0; + // Separate Disable/Bind Wakeup Framedata + if StatusModule::prev_status_kind(fighter.module_accessor, 2) != *FIGHTER_STATUS_KIND_SHIELD_BREAK_FLY { + let disable_frame = ParamModule::get_float(fighter.battle_object, ParamType::Common, "bind_end_frame") - 1.0; // FAF not lag + let cancel_frame = FighterMotionModuleImpl::get_cancel_frame(fighter.module_accessor, Hash40::new("furafura_end"), true); + let end_frame = MotionModule::end_frame(fighter.module_accessor); + rate = if cancel_frame > 0.0 {cancel_frame/disable_frame} else {end_frame/disable_frame}; + } + MotionModule::change_motion(fighter.module_accessor, Hash40::new("furafura_end"), 0.0, rate, false, 0.0, false, false); + fighter.sub_shift_status_main(L2CValue::Ptr(L2CFighterCommon_bind_address_call_status_FuraFuraEnd_Main as *const () as _)) +} + pub fn install() { skyline::install_hooks!( status_FuraFura, - status_FuraFura_Main + status_FuraFura_Main, + status_FuraFuraEnd_Main ); } diff --git a/fighters/common/src/general_statuses/shield/guard_off/init.rs b/fighters/common/src/general_statuses/shield/guard_off/init.rs index f2a9af2dfe..c7d720d5ae 100644 --- a/fighters/common/src/general_statuses/shield/guard_off/init.rs +++ b/fighters/common/src/general_statuses/shield/guard_off/init.rs @@ -8,6 +8,7 @@ unsafe fn ftStatusUniqProcessGuardOff_initStatus(fighter: &mut L2CFighterCommon) ShieldModule::set_status(fighter.module_accessor, *FIGHTER_SHIELD_KIND_GUARD, app::ShieldStatus(*SHIELD_STATUS_NORMAL), 0); ShieldModule::set_shield_type(fighter.module_accessor, app::ShieldType(*SHIELD_TYPE_JUST_SHIELD), *FIGHTER_SHIELD_KIND_GUARD, 0); ReflectorModule::set_status(fighter.module_accessor, 0, app::ShieldStatus(*SHIELD_STATUS_NORMAL), *FIGHTER_REFLECTOR_GROUP_JUST_SHIELD); + ReflectorModule::set_attack_limit(fighter.module_accessor, 999.9, 0); super::super::fighter_status_guard::set_just_shield_scale(fighter); let hit_stop_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), 0x20d241cd64); ShieldModule::set_hit_stop_mul(fighter.module_accessor, hit_stop_mul); diff --git a/fighters/common/src/general_statuses/shield/guard_off/mod.rs b/fighters/common/src/general_statuses/shield/guard_off/mod.rs index 65c0bd8f64..2746ce3920 100644 --- a/fighters/common/src/general_statuses/shield/guard_off/mod.rs +++ b/fighters/common/src/general_statuses/shield/guard_off/mod.rs @@ -8,7 +8,7 @@ mod exec; mod exit; pub fn install() { - //pre::install(); + pre::install(); main::install(); //end::install(); diff --git a/fighters/common/src/general_statuses/shield/guard_off/pre.rs b/fighters/common/src/general_statuses/shield/guard_off/pre.rs index 22b2545182..15ab2f9e8b 100644 --- a/fighters/common/src/general_statuses/shield/guard_off/pre.rs +++ b/fighters/common/src/general_statuses/shield/guard_off/pre.rs @@ -4,10 +4,33 @@ use globals::*; #[skyline::hook(replace = L2CFighterCommon_status_pre_GuardOff)] unsafe fn status_pre_GuardOff(fighter: &mut L2CFighterCommon) -> L2CValue { + // enable rolls in RoA mode + if utils::game_modes::check_custom_mode(game_modes::CustomMode::RivalsOfAetherMode) { + let stick_x = if fighter.is_button_on(Buttons::CStickOn) { + fighter.right_stick_x() + } else { + fighter.left_stick_x() + }; + let stick_x = stick_x * PostureModule::lr(fighter.module_accessor); + let stick_y = fighter.stick_y(); + let stick_vertical = stick_y.abs() >= stick_x.abs() && stick_y < 0.0; + if !stick_vertical && stick_x >= 0.4 { + VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_PARRY_FOR_GUARD_OFF); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_ESCAPE_F); + return true.into(); + } + if !stick_vertical && stick_x <= -0.4 { + VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_PARRY_FOR_GUARD_OFF); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_ESCAPE_B); + return true.into(); + } + } + + // vanilla StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_GROUND), - *FIGHTER_KINETIC_TYPE_GUARD_ON, + *FIGHTER_KINETIC_TYPE_MOTION, *GROUND_CORRECT_KIND_GROUND_CLIFF_STOP as u32, app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), true, diff --git a/fighters/common/src/general_statuses/squat.rs b/fighters/common/src/general_statuses/squat.rs index cf492a8665..b291d85aa6 100644 --- a/fighters/common/src/general_statuses/squat.rs +++ b/fighters/common/src/general_statuses/squat.rs @@ -9,6 +9,11 @@ fn nro_hook(info: &skyline::nro::NroInfo) { if info.name == "common" { skyline::install_hooks!( fl_get_squat_walk_max_speed_hook, + status_Squat_Main, + status_end_Squat, + status_SquatWait_Main, + status_end_SquatWait, + status_squatrv_main ); } } @@ -27,4 +32,63 @@ pub unsafe fn fl_get_squat_walk_max_speed_hook(fighter: &mut L2CFighterCommon) - let unique_speed_max_mul = if fighter.kind() == *FIGHTER_KIND_KOOPA { 0.75 } else { 1.0 }; let speed_max = squat_walk_speed_max * squat_walk_speed_max_mul * unique_speed_max_mul; return speed_max.into(); +} + + +const RIVALS_CC_DAMAGE_ARMOR: f32 = 6.0; + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_Squat_Main)] +pub unsafe fn status_Squat_Main(fighter: &mut L2CFighterCommon) -> L2CValue { + // reworked CC armor in RoA mode + if utils::game_modes::check_custom_mode(game_modes::CustomMode::RivalsOfAetherMode) { + damage!(fighter, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, RIVALS_CC_DAMAGE_ARMOR); + } + original!()(fighter) +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_Squat)] +pub unsafe fn status_end_Squat(fighter: &mut L2CFighterCommon) -> L2CValue { + // reworked CC armor in RoA mode + if utils::game_modes::check_custom_mode(game_modes::CustomMode::RivalsOfAetherMode) { + damage!(fighter, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + } + original!()(fighter) +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_SquatWait_Main)] +pub unsafe fn status_SquatWait_Main(fighter: &mut L2CFighterCommon) -> L2CValue { + // reworked CC armor in RoA mode + if utils::game_modes::check_custom_mode(game_modes::CustomMode::RivalsOfAetherMode) { + damage!(fighter, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, RIVALS_CC_DAMAGE_ARMOR); + } + original!()(fighter) +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_SquatWait)] +pub unsafe fn status_end_SquatWait(fighter: &mut L2CFighterCommon) -> L2CValue { + // reworked CC armor in RoA mode + if utils::game_modes::check_custom_mode(game_modes::CustomMode::RivalsOfAetherMode) { + damage!(fighter, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + } + original!()(fighter) +} + +#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_SquatRv_Main)] +pub unsafe fn status_squatrv_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if !StatusModule::is_changing(fighter.module_accessor) { + // Dashback out of uncrouch + let lr = PostureModule::lr(fighter.module_accessor); + let dashback_stick_x = ParamModule::get_float(fighter.object(), ParamType::Common, "dashback_stick_x"); + let dash_flick_x = WorkModule::get_param_int(fighter.module_accessor, hash40("common"), hash40("dash_flick_x")); + let is_backdash_input = + fighter.prev_stick_x() * lr > dashback_stick_x + && fighter.global_table[STICK_X].get_f32() * lr <= dashback_stick_x + && fighter.global_table[FLICK_X].get_i32() <= dash_flick_x; + if is_backdash_input { + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_SMASH_TURN); + interrupt!(fighter, FIGHTER_STATUS_KIND_TURN, true); + } + } + + call_original!(fighter) } \ No newline at end of file diff --git a/fighters/common/src/lib.rs b/fighters/common/src/lib.rs index 9578aa66bf..93e19ea7a5 100644 --- a/fighters/common/src/lib.rs +++ b/fighters/common/src/lib.rs @@ -33,14 +33,19 @@ pub mod function_hooks; pub mod shoto_status; // pub mod tag; pub mod acmd; +pub mod player_tags; // for storing what team color the last attacker had. used in a couple different common files pub static mut LAST_ATTACK_TEAM_COLOR: i32 = 0; +// used as a match-scoped seed for psuedo-random algorithms e.g. angle shuffle mode +pub static mut MATCH_SCOPED_RANDOM_U32: u32 = 0; + extern "C" fn common_init(fighter: &mut L2CFighterCommon) { - VarModule::set_int(fighter.battle_object, vars::common::instance::LEDGE_ID, -1); - // VarModule::set_int(fighter.battle_object, vars::common::instance::PREVIOUS_FRAME_FRAMES_IN_AIR, -1); + VarModule::set_int(fighter.battle_object, vars::common::instance::OCCUPIED_LEDGE_ID, -1); + VarModule::set_int(fighter.battle_object, vars::common::instance::OCCUPIED_LEDGE_ID_FOR_TETHERS, -1); VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_INIT); + unsafe { MATCH_SCOPED_RANDOM_U32 = app::sv_math::rand(hash40("fighter"), skyline::libc::c_int::MAX) as u32; }; } pub fn install() { @@ -51,6 +56,7 @@ pub fn install() { function_hooks::install(); opff::install(); acmd::install(); + player_tags::install(); Agent::new("fighter") .on_start(common_init) diff --git a/fighters/common/src/misc.rs b/fighters/common/src/misc.rs index 00d7d6caed..ae8c659165 100644 --- a/fighters/common/src/misc.rs +++ b/fighters/common/src/misc.rs @@ -4,6 +4,7 @@ use smash::phx::*; use smash::hash40; use smash::lib::lua_const::*; use smash::lua2cpp::*; +use smash_script::macros::ToF32; use utils::consts::*; use utils::ext::*; use utils::*; @@ -19,119 +20,6 @@ unsafe fn steve_parry_stuff_fix(ctx: &mut skyline::hooks::InlineCtx) { } } -// #[skyline::hook(offset = 0x641814, inline)] -// unsafe fn shield_damage_analog(ctx: &skyline::hooks::InlineCtx) { -// let boma = -// *(ctx.registers[0].x() as *const u64).add(1) as *mut BattleObjectModuleAccessor; -// let current_shield = WorkModule::get_float(boma, 6); -// let attack_power = *(ctx.registers[19].x() as *const f32).add(0xf730 / 4); -// let analog = InputModule::get_analog_for_guard((*boma).object()); -// let damage_mul = WorkModule::get_param_float( -// boma, -// smash::hash40("common"), -// smash::hash40("shield_damage_mul"), -// ); -// let damage_mul = if analog > 0.0 && analog < 1.0 { -// damage_mul + 0.2 * (1.0 - analog) -// } else { -// damage_mul -// }; -// WorkModule::set_float(boma, current_shield - attack_power * damage_mul, 6); -// } - -// #[skyline::hook(offset = 0x6285f0, inline)] -// unsafe fn shield_pushback_analog(ctx: &skyline::hooks::InlineCtx) { -// let fighter = ctx.registers[19].x(); -// let boma = *(fighter as *const u64).add(4); -// let attack_module: u64 = *(boma as *const u64).add(0xa0 / 8); -// let transactor_count: u64 = *(attack_module as *const u64).add(0x20 / 8); -// let transactors: u64 = *(attack_module as *const u64).add(0x28 / 8); - -// let mul = WorkModule::get_param_float( -// boma as _, -// smash::hash40("common"), -// smash::hash40("shield_rebound_speed_mul"), -// ); - -// for x in 0..transactor_count { -// let transactor = transactors + 720 * x; -// let p_list = *(transactor as *const u64).add(608 / 8); -// if p_list == 0 { -// continue; -// } - -// let mut current = *(p_list as *const u64); -// while current != p_list && current != 0 { -// if *(current as *const u8).add(47) == 2 { -// let battle_object_id = *(current as *const u32).add(36 / 4); -// let object = utils::util::get_battle_object_from_id(battle_object_id); -// let analog = InputModule::get_analog_for_guard(object); -// let mul = if analog > 0.0 && analog < 1.0 { -// mul * analog * 0.1 -// } else { -// mul -// }; -// ctx.registers_f[0].set_s(mul); -// return; -// } - -// current = *(current as *const u64); -// } -// } -// ctx.registers_f[0].set_s(mul); -// } - -pub fn install() { - smashline::Agent::new("fighter") - .on_start(fighter_reset) - .on_line(Main, turbo_mode) - .on_line(Main, hitfall_mode) - .on_line(Main, airdash_mode) - .on_line(Main, magicseries_mode) - .install(); - // skyline::patching::Patch::in_text(0x6417f4).nop(); - // skyline::patching::Patch::in_text(0x6285d0).nop(); - skyline::install_hooks!( - steve_parry_stuff_fix, - //set_hit_team_hook, - //set_hit_team_second_hook, - //set_team_second_hook, - set_team_hook, - //set_team_owner_id_hook, - // shield_damage_analog, - // shield_pushback_analog - ); -} - -// #[skyline::hook(replace=TeamModule::set_hit_team)] -// unsafe fn set_hit_team_hook(boma: &mut BattleObjectModuleAccessor, arg2: i32) { -// original!()(boma, arg2); -// if (boma.kind() == *ITEM_KIND_BARREL) { -// //println!("set hit team called for barrel: {:x}", arg2); -// //println!("set hit team called"); -// //println!("barrel status: {:x}", boma.status()); -// let current_team = TeamModule::hit_team_no(boma); -// //println!("setting hit team from {} to {}", current_team, arg2); -// //println!(); -// //return; -// } -// } - -// #[skyline::hook(replace=TeamModule::set_hit_team_second)] -// unsafe fn set_hit_team_second_hook(boma: &mut BattleObjectModuleAccessor, arg2: i32) { -// original!()(boma, arg2); -// if (boma.is_item() -// && boma.kind() == *ITEM_KIND_BARREL) { -// //println!("set hit team second called for barrel: {:x}", arg2); -// //println!("set team second called"); -// //println!("barrel status: {:x}", boma.status()); -// let current_team = TeamModule::hit_team_second_no(boma); -// //println!("setting hit team second from {} to {}", current_team, arg2); -// //println!(); -// //return; -// } -// } - /// This resolves an issue where when someone moves into a barrel /// after throwing it upwards, they are able to be hit by their /// own barrel for 1 frame. This can also happen when throwing the @@ -154,31 +42,6 @@ unsafe fn set_team_hook(boma: &mut BattleObjectModuleAccessor, arg2: i32, arg3: } } -// #[skyline::hook(replace=TeamModule::set_team_second)] -// unsafe fn set_team_second_hook(boma: &mut BattleObjectModuleAccessor, arg2: i32) { -// original!()(boma, arg2); -// // if (boma.is_item() -// // && boma.kind() == *ITEM_KIND_BARREL) { -// // //println!("set team second called for barrel: {:x}", arg2); -// // return; -// // } -// } - -// #[skyline::hook(replace=TeamModule::set_team_owner_id)] -// unsafe fn set_team_owner_id_hook(boma: &mut BattleObjectModuleAccessor, arg2: i32) { -// original!()(boma, arg2); -// if (boma.is_item() -// && boma.kind() == *ITEM_KIND_BARREL) { -// //println!("set team owner id called for barrel: {:x}", arg2); -// println!("set team owner id called"); -// //println!("barrel status: {:x}", boma.status()); -// //let current_team = TeamModule::team_owner_id(boma); -// //println!("setting team owner id from {} to {}", current_team, arg2); -// //println!(); -// //return; -// } -// } - pub extern "C" fn fighter_reset(fighter: &mut L2CFighterCommon) { unsafe { let ratio = @@ -198,64 +61,307 @@ pub extern "C" fn fighter_reset(fighter: &mut L2CFighterCommon) { } } -pub extern "C" fn turbo_mode(fighter: &mut L2CFighterCommon) { - unsafe { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::TurboMode) { - if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { - // enable turbo behavior - CancelModule::enable_cancel(fighter.boma()); - //println!("enabled cancelling!"); +pub unsafe extern "C" fn turbo_mode(fighter: &mut L2CFighterCommon) { + if utils::game_modes::check_custom_mode(CustomMode::TurboMode) { + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { + // enable turbo behavior + CancelModule::enable_cancel(fighter.boma()); + //println!("enabled cancelling!"); - if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.sub_wait_ground_check_common(false.into()); - } else { - fighter.sub_air_check_fall_common(); - } - } - } - }, - _ => {} + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.sub_wait_ground_check_common(false.into()); + } else { + fighter.sub_air_check_fall_common(); + } } + } } -pub extern "C" fn hitfall_mode(fighter: &mut L2CFighterCommon) { - unsafe { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::HitfallMode) { - fighter.check_hitfall(); - } - }, - _ => {} +pub unsafe extern "C" fn hitfall_mode(fighter: &mut L2CFighterCommon) { + match utils::game_modes::get_custom_mode() { + Some(modes) => { + if modes.contains(&CustomMode::HitfallMode) + || modes.contains(&CustomMode::RivalsOfAetherMode) { + fighter.check_hitfall(); + } + }, + _ => {} + } +} + +pub unsafe extern "C" fn airdash_mode(fighter: &mut L2CFighterCommon) { + if utils::game_modes::check_custom_mode(CustomMode::AirdashMode) { + fighter.check_airdash(); + } +} + +pub unsafe extern "C" fn magicseries_mode(fighter: &mut L2CFighterCommon) { + if utils::game_modes::check_custom_mode(CustomMode::MagicSeriesMode) { + fighter.check_magicseries(); + } +} + +pub unsafe extern "C" fn rivals_mode(fighter: &mut L2CFighterCommon) { + if utils::game_modes::check_custom_mode(CustomMode::RivalsOfAetherMode) { + rivals_drift_di(fighter); + rivals_waveland(fighter); + rivals_jab_tilt(fighter); + rivals_landing_lag_jc(fighter); + rivals_parry_stun(fighter); + } +} + +unsafe fn rivals_drift_di(fighter: &mut L2CFighterCommon) { + if fighter.is_situation(*SITUATION_KIND_AIR) + && !StopModule::is_stop(fighter.module_accessor) + && fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_DAMAGE_FLY, + *FIGHTER_STATUS_KIND_DAMAGE_AIR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_D, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_LR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_U, + ]) { + let damage_speed_x = fighter.get_speed_x(*FIGHTER_KINETIC_ENERGY_ID_DAMAGE); + let damage_speed_y = fighter.get_speed_y(*FIGHTER_KINETIC_ENERGY_ID_DAMAGE); + + let mut initial_speed_x = VarModule::get_float( + fighter.object(), + vars::common::status::INITIAL_KNOCKBACK_VEL_X, + ); + let mut initial_speed_y = VarModule::get_float( + fighter.object(), + vars::common::status::INITIAL_KNOCKBACK_VEL_Y, + ); + + // if these floats are both exactly zero, its because + // status change reset them to zero. Thus, we should set them. + if initial_speed_x == 0.0 && initial_speed_y == 0.0 { + VarModule::set_float( + fighter.object(), + vars::common::status::INITIAL_KNOCKBACK_VEL_X, + damage_speed_x, + ); + VarModule::set_float( + fighter.object(), + vars::common::status::INITIAL_KNOCKBACK_VEL_Y, + damage_speed_y, + ); + + initial_speed_x = VarModule::get_float( + fighter.object(), + vars::common::status::INITIAL_KNOCKBACK_VEL_X, + ); + initial_speed_y = VarModule::get_float( + fighter.object(), + vars::common::status::INITIAL_KNOCKBACK_VEL_Y, + ); } + + let mut speed_mul = 0.005; + let speed_mul_add_max = 0.0025; + let speed_lerp_max = 3.0; + + let ratio = 1.0 - (initial_speed_x.abs() / speed_lerp_max).clamp(0.0, 1.0); + speed_mul = (speed_mul + speed_mul_add_max) * ratio; + + let drift_value = fighter.left_stick_x() * speed_mul; + + fighter.set_speed( + Vector2f::new(damage_speed_x + drift_value, damage_speed_y), + *FIGHTER_KINETIC_ENERGY_ID_DAMAGE, + ); } } -pub extern "C" fn airdash_mode(fighter: &mut L2CFighterCommon) { - unsafe { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::AirdashMode) { - fighter.check_airdash(); - } - }, - _ => {} +// immediately actionable waveland in rivals mode +unsafe fn rivals_waveland(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_STATUS_KIND_LANDING) + && fighter.is_prev_status_one_of(&[ + *FIGHTER_STATUS_KIND_ESCAPE_AIR, + *FIGHTER_STATUS_KIND_ESCAPE_AIR_SLIDE + ]) { + let landing_frame = WorkModule::get_param_float(fighter.module_accessor, hash40("param_motion"), hash40("landing_frame_escape_air_slide_max")); + if fighter.status_frame().to_f32() < landing_frame { + let terms_to_enable = [ + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_COMMAND1, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_HI3, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_HI4_START, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_LW3, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_LW4_START, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_S3, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_S4_START, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_PICKUP_HEAVY, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_PICKUP_LIGHT, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_SHOOT, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_SHOOT_S3, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_SHOOT_S4, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_SWING, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_SWING_3, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_SWING_4, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_THROW, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_THROW_FORCE, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT_BUTTON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_HI, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_HI_COMMAND, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_LW, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_LW_COMMAND, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N2_COMMAND, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N_COMMAND, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_S, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_S_COMMAND, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SUPER_SPECIAL2, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SUPER_SPECIAL, + *FIGHTER_STATUS_TRANSITION_TERM_ID_FINAL, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N, + ]; + fighter.enable_transition_term_many(&terms_to_enable); + if fighter.sub_transition_group_check_ground_item().get_bool() + || fighter.sub_transition_group_check_ground_special().get_bool() + || fighter.sub_transition_group_check_ground_attack().get_bool() + || fighter.sub_transition_group_check_ground_jump().get_bool() { + return; + } } } } -pub extern "C" fn magicseries_mode(fighter: &mut L2CFighterCommon) { - unsafe { - match utils::game_modes::get_custom_mode() { - Some(modes) => { - if modes.contains(&CustomMode::MagicSeriesMode) { - fighter.check_magicseries(); - } - }, - _ => {} +// cancel jabs directly into tilts +unsafe fn rivals_jab_tilt(fighter: &mut L2CFighterCommon) { + if !CancelModule::is_enable_cancel(fighter.module_accessor) + && !fighter.is_in_hitlag() + && StatusModule::status_kind(fighter.module_accessor) == *FIGHTER_STATUS_KIND_ATTACK + && fighter.is_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO) { + if fighter.is_cat_flag(Cat1::AttackS3) && !fighter.is_cat_flag(Cat1::AttackS4) { + StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_ATTACK_S3, false); + } + if fighter.is_cat_flag(Cat1::AttackHi3) && !fighter.is_cat_flag(Cat1::AttackHi4) { + StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_ATTACK_HI3, false); + } + if fighter.is_cat_flag(Cat1::AttackLw3) && !fighter.is_cat_flag(Cat1::AttackLw4) { + StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_ATTACK_LW3, false); + } + } +} + +// cancel last few frames of landing animation into jumpsquat +unsafe fn rivals_landing_lag_jc(fighter: &mut L2CFighterCommon) { + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if fighter.is_status(*FIGHTER_STATUS_KIND_LANDING) + || (fighter.is_status(*FIGHTER_STATUS_KIND_LANDING_ATTACK_AIR) && prev_inflict_status & *COLLISION_KIND_MASK_HIT != 0) { + let landing_lag = VarModule::get_float(fighter.battle_object, vars::common::instance::LANDING_LAG_FOR_RIVALS_MODE); + let jump_squat = fighter.get_param_int("jump_squat_frame", "") as f32; + let status_frame = fighter.status_frame() as f32; + if status_frame + jump_squat > landing_lag { + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_JUMP); + fighter.check_jump_cancel(false, false, false); } } } + +// get stunned when parried +unsafe fn rivals_parry_stun(fighter: &mut L2CFighterCommon) { + + if fighter.is_status_one_of(&[ + // parry stun statuses + *FIGHTER_STATUS_KIND_FURAFURA_END, + *FIGHTER_STATUS_KIND_FALL_SPECIAL, + + // jab + *FIGHTER_STATUS_KIND_ATTACK, + + // damage statuses + *FIGHTER_STATUS_KIND_DAMAGE, + *FIGHTER_STATUS_KIND_DAMAGE_AIR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_LR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_U, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_D, + *FIGHTER_STATUS_KIND_DOWN_DAMAGE, + *FIGHTER_STATUS_KIND_SAVING_DAMAGE, + *FIGHTER_STATUS_KIND_SAVING_DAMAGE_AIR, + *FIGHTER_STATUS_KIND_SAVING_DAMAGE_FLY, + *FIGHTER_STATUS_KIND_LANDING, + *FIGHTER_STATUS_KIND_SLIP_DAMAGE, + *FIGHTER_STATUS_KIND_STABBED_DAMAGE, + *FIGHTER_STATUS_KIND_CAPTURE_PULLED, + *FIGHTER_STATUS_KIND_CAPTURE_WAIT, + *FIGHTER_STATUS_KIND_CAPTURE_DAMAGE, + *FIGHTER_STATUS_KIND_THROWN, + *FIGHTER_STATUS_KIND_MEWTWO_THROWN, + *FIGHTER_STATUS_KIND_CLUNG_THROWN_DIDDY, + *FIGHTER_STATUS_KIND_SWING_GAOGAEN_THROWN, + *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_THROWN, + *FIGHTER_STATUS_KIND_SHOULDERED_DONKEY_THROWN, + *FIGHTER_STATUS_KIND_MIIFIGHTER_COUNTER_THROWN, + *FIGHTER_STATUS_KIND_CATCHED_GANON, + *FIGHTER_STATUS_KIND_CATCHED_AIR_GANON, + *FIGHTER_STATUS_KIND_CATCHED_AIR_FALL_GANON, + *FIGHTER_STATUS_KIND_CATCHED_AIR_END_GANON, + *FIGHTER_STATUS_KIND_CATCHED_REFLET, + *FIGHTER_STATUS_KIND_CATCHED_RIDLEY, + *FIGHTER_STATUS_KIND_CAPTURE_JACK_WIRE, + *FIGHTER_STATUS_KIND_CAPTURE_MASTER_SWORD, + *FIGHTER_STATUS_KIND_DOWN + ]) { + return; + } + + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + let was_previously_parried = StatusModule::is_changing(fighter.module_accessor) && prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0; + let is_currently_parried = CancelModule::is_enable_cancel(fighter.module_accessor) && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY); + + if was_previously_parried || is_currently_parried { + WorkModule::set_flag( + fighter.module_accessor, + MotionModule::is_anim_resource(fighter.module_accessor, Hash40::new("down_spot_u")), + *FIGHTER_STATUS_DOWN_FLAG_UP + ); + fighter.set_float(30.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_FURAFURA_END, *FIGHTER_STATUS_KIND_FALL_SPECIAL, false); + return; + } +} + +pub unsafe extern "C" fn rampage_mode(fighter: &mut L2CFighterCommon) { + if !utils::game_modes::check_custom_mode(CustomMode::RampageMode) { + return; + } + + let scale_min = 1.0; + let scale_max = 5.0; + let dmg_min = 0.0; + let dmg_max = 400.0; + let dmg = VarModule::get_float(fighter.battle_object, vars::common::instance::DAMAGE_DEALT_THIS_STOCK); + let ratio = ((dmg - dmg_min) / (dmg_max - dmg_min)); + let scale = util::nlerp(scale_min, scale_max, 2.0, ratio); + PostureModule::set_scale(fighter.module_accessor, scale, false); +} + +pub fn install() { + smashline::Agent::new("fighter") + .on_start(fighter_reset) + .on_line(Main, turbo_mode) + .on_line(Main, hitfall_mode) + .on_line(Main, airdash_mode) + .on_line(Main, magicseries_mode) + .on_line(Main, rivals_mode) + .on_line(Main, rampage_mode) + .install(); + skyline::install_hooks!( + steve_parry_stuff_fix, + set_team_hook, + ); +} diff --git a/fighters/common/src/opff/floats.rs b/fighters/common/src/opff/floats.rs index f84fdf0813..0361320083 100644 --- a/fighters/common/src/opff/floats.rs +++ b/fighters/common/src/opff/floats.rs @@ -3,6 +3,7 @@ use super::*; pub unsafe fn run(fighter: &mut L2CFighterCommon, situation_kind: i32) { if situation_kind == *SITUATION_KIND_GROUND || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { - VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_FLOAT); + VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_FLOATING); + VarModule::off_flag(fighter.battle_object, vars::common::instance::DISABLE_FLOAT); } } diff --git a/fighters/common/src/opff/ledges.rs b/fighters/common/src/opff/ledges.rs index 8e1f033023..539b30b5cf 100644 --- a/fighters/common/src/opff/ledges.rs +++ b/fighters/common/src/opff/ledges.rs @@ -38,12 +38,12 @@ unsafe fn occupy_ledge(boma: &mut BattleObjectModuleAccessor, status_kind: i32, if cancel_frame > 0.0 { if MotionModule::frame(boma) > (cancel_frame * 0.9) { - VarModule::set_int(boma.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(boma.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); } } else { if MotionModule::frame(boma) > (MotionModule::end_frame(boma) * 0.9) { - VarModule::set_int(boma.object(), vars::common::instance::LEDGE_ID, -1); + VarModule::set_int(boma.object(), vars::common::instance::OCCUPIED_LEDGE_ID, -1); } } } @@ -71,7 +71,7 @@ unsafe fn tether_trump_landing(boma: &mut BattleObjectModuleAccessor, status_kin // Increased landing lag (special fall landing) if landing right after being tether hogged if /*prev_status_kind == *FIGHTER_STATUS_KIND_CLIFF_ROBBED &&*/ VarModule::is_flag(boma.object(), vars::common::instance::TETHER_HOGGED) && situation_kind == *SITUATION_KIND_GROUND { VarModule::off_flag(boma.object(), vars::common::instance::TETHER_HOGGED); - let landing_lag = ParamModule::get_int(boma.object(), ParamType::Common, "tether_trump_landing_lag"); + let landing_lag = ParamModule::get_int(boma.object(), ParamType::Common, "cliff_robbed_landing_frame"); WorkModule::set_float(boma, landing_lag as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, false); } diff --git a/fighters/common/src/opff/mod.rs b/fighters/common/src/opff/mod.rs index 3463b9dfc6..53ebdd5f34 100644 --- a/fighters/common/src/opff/mod.rs +++ b/fighters/common/src/opff/mod.rs @@ -2,6 +2,7 @@ use super::*; use smash::lib::{lua_const::*, L2CValue, L2CAgent}; use smash::lua2cpp::L2CFighterCommon; use smash::lua2cpp::L2CFighterBase; +use std::sync::atomic::Ordering; pub mod ledges; pub mod physics; @@ -51,6 +52,8 @@ pub unsafe fn fighter_common_opff(fighter: &mut L2CFighterCommon) { } } +use utils::util::MATCH_EXITING; + static mut IS_SALTY_INPUT: bool = false; /// Performs salty runback check based off of the button input @@ -67,6 +70,7 @@ unsafe fn salty_check(fighter: &mut L2CFighterCommon) -> bool { utils::game_modes::signal_new_game(); true } else if fighter.is_button_on(Buttons::SpecialRaw) && !fighter.is_button_on(!(Buttons::SpecialRaw | Buttons::StockShare)) { + MATCH_EXITING.store(true, Ordering::Relaxed); app::FighterUtil::flash_eye_info(fighter.module_accessor); if !fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_STANDBY]) { StatusModule::change_status_force(fighter.module_accessor, *FIGHTER_STATUS_KIND_DEAD, false); diff --git a/fighters/common/src/opff/other.rs b/fighters/common/src/opff/other.rs index 5fcc498fc0..1846d64508 100644 --- a/fighters/common/src/opff/other.rs +++ b/fighters/common/src/opff/other.rs @@ -193,13 +193,35 @@ pub unsafe fn faf_ac_debug(fighter: &mut L2CFighterCommon) { let boma = fighter.boma(); if fighter.is_status(*FIGHTER_STATUS_KIND_APPEAL) && fighter.status_frame() == 10 { if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_GUARD) && ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL_RAW) { + // println!("toggle detected"); + // let prev = VarModule::is_flag(fighter.battle_object, vars::common::instance::ENABLE_FRAME_DATA_DEBUG); + // println!("prev: {}", prev); + // if prev == true { + // // 15 -> 18 + // fighter.clear_lua_stack(); + // lua_args!(fighter, Hash40::new("sys_hit_dead"), Hash40::new("top"), 0, 10, 0, 0, 0, 0, 1, true); + // smash::app::sv_animcmd::EFFECT_FOLLOW(fighter.lua_state_agent); + // fighter.pop_lua_stack(1); + // } + // else { + // // 18 -> 15 + // fighter.clear_lua_stack(); + // lua_args!(fighter, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 10, 0, 0, 0, 0, 1, true); + // smash::app::sv_animcmd::EFFECT_FOLLOW(fighter.lua_state_agent); + // fighter.pop_lua_stack(1); + // } + // let num_players = smash::cpp::root::app::Fighter::get_fighter_entry_count(); + // println!("num players: {}", num_players); + // for i in 0..num_players { + // let entry_id = smash::cpp::root::app::Fighter::get_id_from_entry_id(i); + // let opponent_boma = &mut *(smash::cpp::root::app::sv_battle_object::module_accessor(entry_id)); + // let object = opponent_boma.object(); + // if VarModule::has_var_module(object) { + // println!("flag for id {} set to {}", i, !prev); + // VarModule::set_flag(object, vars::common::instance::ENABLE_FRAME_DATA_DEBUG, !prev); + // } + // } println!("toggling debug"); - fighter.clear_lua_stack(); - lua_args!(fighter, Hash40::new("sys_hit_dead"), Hash40::new("top"), 0, 10, 0, 0, 0, 0, 1, true); - smash::app::sv_animcmd::EFFECT_FOLLOW(fighter.lua_state_agent); - fighter.pop_lua_stack(1); - let prev = VarModule::is_flag(fighter.battle_object, vars::common::instance::ENABLE_FRAME_DATA_DEBUG); - VarModule::set_flag(fighter.battle_object, vars::common::instance::ENABLE_FRAME_DATA_DEBUG, !prev); VarModule::set_int(fighter.battle_object, vars::common::instance::FRAME_COUNTER, 1); VarModule::off_flag(fighter.battle_object, vars::common::status::FAF_REACHED); } @@ -416,6 +438,30 @@ unsafe extern "C" fn kill_screen_handler(fighter: &mut L2CFighterCommon) { // } } +// Generates an effect on the fighter if they have burned their airdodge +// and are still airborne +pub unsafe fn burned_airdodge_effect_handler(fighter: &mut L2CFighterCommon) { + if !fighter.is_status(*FIGHTER_STATUS_KIND_ESCAPE_AIR) { + let curr_handle = VarModule::get_int(fighter.battle_object, vars::common::instance::DISABLE_ESCAPE_AIR_EFFECT_HANDLE); + + if fighter.is_situation(*SITUATION_KIND_AIR) + && fighter.is_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_ESCAPE_AIR) + && !StopModule::is_stop(fighter.module_accessor) { + if !EffectModule::is_exist_effect(fighter.module_accessor, curr_handle as u32) { + let new_handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_bomber_sweat"), Hash40::new("head"), &Vector3f::new(0.0, 3.0, 0.0), &Vector3f::zero(), 1.0, true, 0x8000000, 0, -1, 0, 0, false, false) as u32; + EffectModule::set_rate(fighter.module_accessor, new_handle, 0.8); + EffectModule::set_alpha(fighter.module_accessor, new_handle, 0.7); + VarModule::set_int(fighter.battle_object, vars::common::instance::DISABLE_ESCAPE_AIR_EFFECT_HANDLE, new_handle as _); + } + } + else { + if EffectModule::is_exist_effect(fighter.module_accessor, curr_handle as u32) { + EffectModule::kill(fighter.module_accessor, curr_handle as u32, true, true); + } + } + } +} + pub unsafe fn run(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, fighter_kind: i32, stick_x: f32, stick_y: f32, facing: f32) { suicide_throw_mashout(fighter, boma); cliff_xlu_frame_counter(fighter); @@ -424,5 +470,6 @@ pub unsafe fn run(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleA // taunt_parry_forgiveness(fighter); custom_dash_anim_support(fighter); kill_screen_handler(fighter); + burned_airdodge_effect_handler(fighter); } diff --git a/fighters/common/src/opff/pocket.rs b/fighters/common/src/opff/pocket.rs index 5c37905bf3..fbd9c8ee79 100644 --- a/fighters/common/src/opff/pocket.rs +++ b/fighters/common/src/opff/pocket.rs @@ -15,19 +15,14 @@ unsafe fn ac_update(fighter: &mut L2CFighterCommon) { if !VarModule::has_var_module(object_object) { return; } if VarModule::is_flag(&mut *(*object_boma).object(), vars::common::status::NO_POCKET) { //Change Villager status - StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_MURABITO_STATUS_KIND_SPECIAL_N_FAILURE,false); + StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_MURABITO_STATUS_KIND_SPECIAL_N_FAILURE, false); WorkModule::set_int(fighter.module_accessor, 0x50000000, *FIGHTER_MURABITO_INSTANCE_WORK_ID_INT_TARGET_OBJECT_ID); //fighter-specific code - let owner_id = WorkModule::get_int(object_boma, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; - if sv_battle_object::is_active(owner_id) { - let owner = get_battle_object_from_id(owner_id); - // packun - if (&mut *(*owner).module_accessor).kind() == *FIGHTER_KIND_PACKUN { - VarModule::set_float(owner, vars::packun::instance::FIRE_POS_X, 0.0); - VarModule::set_float(owner, vars::packun::instance::FIRE_POS_Y, 0.0); - } - } + // let owner_id = WorkModule::get_int(object_boma, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; + // if sv_battle_object::is_active(owner_id) { + // let owner = get_battle_object_from_id(owner_id); + // } //Remove article let weapon = get_fighter_common_from_accessor(&mut *(object_boma)); @@ -36,8 +31,8 @@ unsafe fn ac_update(fighter: &mut L2CFighterCommon) { EffectModule::req( object_boma, Hash40::new("sys_erace_smoke"), - &Vector3f{x:pos.x,y:pos.y+2.0,z:pos.z}, - &Vector3f{x:0.0,y:0.0,z:0.0}, + &Vector3f{x: pos.x, y: pos.y + 2.0, z: pos.z}, + &Vector3f{x: 0.0, y: 0.0, z: 0.0}, 0.625, 0, -1, diff --git a/fighters/common/src/opff/tech.rs b/fighters/common/src/opff/tech.rs index 49a8e48ef1..4058bfd27c 100644 --- a/fighters/common/src/opff/tech.rs +++ b/fighters/common/src/opff/tech.rs @@ -119,88 +119,6 @@ unsafe fn double_shield_button_airdodge( } } -unsafe fn drift_di( - fighter: &mut L2CFighterCommon, - boma: &mut BattleObjectModuleAccessor, - status_kind: i32, - situation_kind: i32, -) { - if boma.is_situation(*SITUATION_KIND_AIR) - && !StopModule::is_stop(boma) - && boma.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_DAMAGE_FLY, - *FIGHTER_STATUS_KIND_DAMAGE_AIR, - *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR, - *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, - *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_D, - *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_LR, - *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_U, - ]) - { - let damage_speed_x = fighter.get_speed_x(*FIGHTER_KINETIC_ENERGY_ID_DAMAGE); - let damage_speed_y = fighter.get_speed_y(*FIGHTER_KINETIC_ENERGY_ID_DAMAGE); - - let mut initial_speed_x = VarModule::get_float( - fighter.battle_object, - vars::common::status::INITIAL_KNOCKBACK_VEL_X, - ); - let mut initial_speed_y = VarModule::get_float( - fighter.battle_object, - vars::common::status::INITIAL_KNOCKBACK_VEL_Y, - ); - - // if these floats are both exactly zero, its because - // status change reset them to zero. Thus, we should set them. - if initial_speed_x == 0.0 && initial_speed_y == 0.0 { - VarModule::set_float( - fighter.battle_object, - vars::common::status::INITIAL_KNOCKBACK_VEL_X, - damage_speed_x, - ); - VarModule::set_float( - fighter.battle_object, - vars::common::status::INITIAL_KNOCKBACK_VEL_Y, - damage_speed_y, - ); - - initial_speed_x = VarModule::get_float( - fighter.battle_object, - vars::common::status::INITIAL_KNOCKBACK_VEL_X, - ); - initial_speed_y = VarModule::get_float( - fighter.battle_object, - vars::common::status::INITIAL_KNOCKBACK_VEL_Y, - ); - } - - let mut speed_mul = ParamModule::get_float( - fighter.battle_object, - ParamType::Common, - "drift_di.speed_mul_base", - ); - let speed_mul_add_max = ParamModule::get_float( - fighter.battle_object, - ParamType::Common, - "drift_di.speed_mul_add_max", - ); - - let lerp_max_speed = ParamModule::get_float( - fighter.battle_object, - ParamType::Common, - "drift_di.speed_lerp_max", - ); - - let ratio = 1.0 - (initial_speed_x.abs() / lerp_max_speed).clamp(0.0, 1.0); - speed_mul = (speed_mul + speed_mul_add_max) * ratio; - - let drift_value = boma.left_stick_x() * speed_mul; - - fighter.set_speed( - Vector2f::new(damage_speed_x + drift_value, damage_speed_y), - *FIGHTER_KINETIC_ENERGY_ID_DAMAGE, - ); - } -} extern "C" { #[link_name = "\u{1}_ZN3app14sv_information8stage_idEv"] @@ -299,7 +217,6 @@ pub unsafe fn run( dash_drop(boma, status_kind); run_squat(boma, status_kind, stick_y); // Must be done after dash_drop() double_shield_button_airdodge(boma, status_kind, situation_kind, cat[0]); - //drift_di(fighter, boma, status_kind, situation_kind); waveland_plat_drop(boma, cat[1], status_kind); respawn_taunt(boma, status_kind); teeter_cancel(fighter, boma); diff --git a/fighters/common/src/opff/var_resets.rs b/fighters/common/src/opff/var_resets.rs index 33250b5957..f3af828d3e 100644 --- a/fighters/common/src/opff/var_resets.rs +++ b/fighters/common/src/opff/var_resets.rs @@ -9,6 +9,7 @@ use smash::app::lua_bind::*; use smash::lib::lua_const::*; use smash::hash40; +// TODO: this has got to be expensive? unsafe fn var_resets(boma: &mut BattleObjectModuleAccessor) { let death_statuses = &[*FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_REBIRTH, @@ -67,25 +68,19 @@ unsafe fn var_resets(boma: &mut BattleObjectModuleAccessor) { } } - // Up Special Interrupt - if VarModule::is_flag(boma.object(), vars::common::instance::UP_SPECIAL_INTERRUPT) { - if !boma.is_situation(*SITUATION_KIND_AIR) - || boma.is_status_one_of(damage_statuses) - || boma.is_status_one_of(death_statuses) - || boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) - { - VarModule::off_flag(boma.object(), vars::common::instance::UP_SPECIAL_INTERRUPT); - } - } - - // Up Special Intterupt Airtime - if VarModule::is_flag(boma.object(), vars::common::instance::UP_SPECIAL_INTERRUPT_AIRTIME) { + // Up Special Landing Lag + if VarModule::is_flag(boma.object(), vars::common::instance::UP_SPECIAL_LAG) + && !StatusModule::is_situation_changed(boma) + && !boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_LANDING, + *FIGHTER_STATUS_KIND_LANDING_LIGHT, + *FIGHTER_STATUS_KIND_LANDING_ATTACK_AIR, + *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL]) + { if !boma.is_situation(*SITUATION_KIND_AIR) || boma.is_status_one_of(damage_statuses) || boma.is_status_one_of(death_statuses) - || boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { - VarModule::off_flag(boma.object(), vars::common::instance::UP_SPECIAL_INTERRUPT_AIRTIME); + VarModule::off_flag(boma.object(), vars::common::instance::UP_SPECIAL_LAG); } } @@ -98,14 +93,6 @@ unsafe fn var_resets(boma: &mut BattleObjectModuleAccessor) { VarModule::off_flag(boma.object(), vars::common::instance::SPECIAL_STALL_USED); } - // Aerial Glide Toss Reset - if !boma.is_situation(*SITUATION_KIND_AIR) - || boma.is_status_one_of(death_statuses) - || boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) - { - VarModule::set_int(boma.object(), vars::common::instance::AGT_USED_COUNTER, 0); - } - // Wall Jump Reset if !boma.is_situation(*SITUATION_KIND_AIR) || AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT) @@ -120,6 +107,28 @@ unsafe fn var_resets(boma: &mut BattleObjectModuleAccessor) { if VarModule::get_int(boma.object(), vars::common::instance::FLY_NEXT_FRAME) > 0 { VarModule::dec_int(boma.object(), vars::common::instance::FLY_NEXT_FRAME); } + + // Reset total damage dealt this stock + if boma.is_status_one_of(death_statuses) { + VarModule::set_float(boma.object(), vars::common::instance::DAMAGE_DEALT_THIS_STOCK, 0.0); + } + + // Clear last attacker when grounded (used by War mode) + if !boma.is_situation(*SITUATION_KIND_AIR) + && !boma.is_status_one_of(damage_statuses) + && !boma.is_status_one_of(death_statuses) + { + VarModule::set_int(boma.object(), vars::common::instance::LAST_ATTACKER_ENTRY_ID, -1); + } + + // Zair once-per-airtime reset + if VarModule::is_flag(boma.object(), vars::common::instance::DISABLE_AIR_LASSO) + && (!boma.is_situation(*SITUATION_KIND_AIR) + || boma.is_status_one_of(death_statuses)) + || boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) + { + VarModule::off_flag(boma.object(), vars::common::instance::DISABLE_AIR_LASSO); + } } pub unsafe fn run(boma: &mut BattleObjectModuleAccessor, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, fighter_kind: i32, stick_x: f32, stick_y: f32, facing: f32) { diff --git a/fighters/common/src/player_tags.rs b/fighters/common/src/player_tags.rs new file mode 100644 index 0000000000..ebf4e7c394 --- /dev/null +++ b/fighters/common/src/player_tags.rs @@ -0,0 +1,52 @@ +use super::*; + +const PLAYER_TAG_OFFSET: usize = 0x5313510; +unsafe fn get_tag_from_save(tag_index: u8) -> String { + let tag_address = + (***(((*((*((skyline::hooks::getRegionAddress(skyline::hooks::Region::Text) as *mut u8) + .add(PLAYER_TAG_OFFSET) as *const u64)) as *const u64)) + + 0x58) as *const *const *const u64) + + ((tag_index as u64) * 0xF7D8) + + 0xC) as *const u16; + + let mut tag_length = 0; + while *tag_address.add(tag_length) != 0 { + tag_length += 1; + } + + String::from_utf16_lossy(std::slice::from_raw_parts(tag_address, tag_length)) +} + +static mut PLAYER_ID_TAGS_INDEXES: &'static mut [u8] = &mut [0; 8]; +#[skyline::hook(offset = 0x19fd0b0)] +unsafe fn update_tag_for_player(param_1: u64, tag_index: *const u8) { + let player_id = *((param_1 + 0x1d4) as *const u8) as usize; + PLAYER_ID_TAGS_INDEXES[player_id] = *tag_index; + call_original!(param_1, tag_index); + //println!("Player {} is {}", player_id + 1, get_tag_from_save(PLAYER_ID_TAGS_INDEXES[player_id])); +} + +pub unsafe fn get_player_tag(module_accessor: *mut BattleObjectModuleAccessor) -> String { + let entry_id = WorkModule::get_int(module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as usize; + get_tag_from_save(PLAYER_ID_TAGS_INDEXES[entry_id]) +} + +unsafe extern "C" fn model_thing(fighter: &mut L2CFighterCommon) { + let tag = get_player_tag(fighter.module_accessor); + if !tag.as_bytes().windows(5).any(|w| { + w[0] == 0x47 && w[1] == 0x45 && w[2] == 0x30 && w[3] == 0x30 && w[4] == 0x37 + }) { + return; + } + + let s = 2.5; + let jt = "head"; + ModelModule::set_joint_scale(fighter.module_accessor, Hash40::new(jt), &Vector3f::new(s, s, s)); +} + +pub fn install() { + skyline::install_hooks!(update_tag_for_player); + smashline::Agent::new("fighter") + // .on_line(Main, model_thing) + .install(); +} \ No newline at end of file diff --git a/fighters/common/src/shoto_status.rs b/fighters/common/src/shoto_status.rs index 1a72505db3..099fe044ee 100644 --- a/fighters/common/src/shoto_status.rs +++ b/fighters/common/src/shoto_status.rs @@ -22,7 +22,7 @@ use globals::*; pub unsafe extern "Rust" fn fgc_dashback_main(fighter: &mut L2CFighterCommon) -> L2CValue { MotionModule::change_motion(fighter.module_accessor, Hash40::new("dash_b"), 0.0, 1.0, false, 0.0, false, false); fighter.status_DashCommon(); - WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_DASH); + // WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_DASH); WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ITEM_SWING_DASH); GroundModule::set_reverse_direction(fighter.module_accessor, true, false); fighter.sub_shift_status_main(L2CValue::Ptr(fgc_dashback_main_loop as *const () as _)) @@ -74,6 +74,20 @@ unsafe extern "C" fn fgc_dashback_main_loop(fighter: &mut L2CFighterCommon) -> L return 1.into(); } } + + // Enable turn grab + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_CATCH_DASH) && { + let stick_x = fighter.global_table[STICK_X].get_f32(); + let lr = PostureModule::lr(fighter.module_accessor); + let turn_run_stick_x = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("turn_run_stick_x")); + stick_x * lr <= turn_run_stick_x + } && fighter.global_table[CMD_CAT1].get_i32() & *FIGHTER_PAD_CMD_CAT1_FLAG_CATCH != 0 + && !ItemModule::is_have_item(fighter.module_accessor, 0) { + PostureModule::reverse_lr(fighter.module_accessor); + fighter.change_status(FIGHTER_STATUS_KIND_CATCH_DASH.into(), true.into()); + return 1.into(); + } + // original // if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE) { // if WorkMoudle::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_TURN_DASH) @@ -131,6 +145,7 @@ unsafe extern "C" fn fgc_dashback_main_loop(fighter: &mut L2CFighterCommon) -> L } } } + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_S4_START) && fighter.global_table[CMD_CAT2].get_i32() & *FIGHTER_PAD_CMD_CAT2_FLAG_DASH_ATTACK_S4 != 0 && !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_STATUS_DASH_FLAG_NO_S4) { @@ -139,6 +154,13 @@ unsafe extern "C" fn fgc_dashback_main_loop(fighter: &mut L2CFighterCommon) -> L return 1.into(); } + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_DASH) + && fighter.global_table[PAD_FLAG].get_i32() & *FIGHTER_PAD_FLAG_ATTACK_TRIGGER != 0 { + PostureModule::reverse_lr(fighter.module_accessor); + fighter.change_status(FIGHTER_STATUS_KIND_ATTACK_DASH.into(), true.into()); + return 1.into(); + } + let pass_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("pass_stick_y")); let pass_flick_y = WorkModule::get_param_int(fighter.module_accessor, hash40("common"), hash40("pass_flick_y")); let dashback_pass_disable_frame = ParamModule::get_int(fighter.object(), ParamType::Agent, "dashback_pass_disable_frame"); diff --git a/fighters/daisy/Cargo.toml b/fighters/daisy/Cargo.toml index 8c3a24f7fb..879ad4ef07 100644 --- a/fighters/daisy/Cargo.toml +++ b/fighters/daisy/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/daisy/src/acmd/aerials.rs b/fighters/daisy/src/acmd/aerials.rs index f2b87c1648..0519d77a39 100644 --- a/fighters/daisy/src/acmd/aerials.rs +++ b/fighters/daisy/src/acmd/aerials.rs @@ -69,7 +69,7 @@ unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("top"), 0, 12, -4, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 2.0); + LAST_EFFECT_SET_RATE(agent, 1.3); } frame(lua_state, 18.0); if is_excute(agent) { diff --git a/fighters/daisy/src/acmd/ground.rs b/fighters/daisy/src/acmd/ground.rs index 8a8f1b70e5..d818178e61 100644 --- a/fighters/daisy/src/acmd/ground.rs +++ b/fighters/daisy/src/acmd/ground.rs @@ -11,14 +11,15 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 75, 100, 25, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 75, 100, 25, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("handl"), 3.0, 75, 100, 25, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 2.5, 0.0, 5.0, 5.5, Some(0.0), Some(5.0), Some(9.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 5.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 6.0); + frame(lua_state, 7.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } @@ -43,9 +44,9 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 4.5, 66, 65, 0, 73, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 4.5, 66, 65, 0, 73, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 4.5, 66, 65, 0, 73, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("arml"), 4.0, 63, 81, 0, 45, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 63, 81, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 4.0, 63, 81, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DAISY_BINTA, *ATTACK_REGION_PUNCH); } wait(lua_state, 3.0); if is_excute(agent) { diff --git a/fighters/daisy/src/acmd/other.rs b/fighters/daisy/src/acmd/other.rs index 91727213c1..cf00fd8410 100644 --- a/fighters/daisy/src/acmd/other.rs +++ b/fighters/daisy/src/acmd/other.rs @@ -64,15 +64,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -82,10 +78,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_entry(agent: &mut L2CAgentBase) { @@ -238,39 +231,6 @@ unsafe extern "C" fn expression_appealspecial(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_itemlightthrowf(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 8.0); - if is_excute(agent) { - if !VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { - agent.clear_lua_stack(); - lua_args!(agent, 12, 10, *ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_ANGLE, *ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_SPEED, *ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER); - sv_animcmd::THROW_ITEM_OFFSET(agent.lua_state_agent); - } - } - frame(lua_state, 9.0);//match anim to trajectory better - if is_excute(agent) { - if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { - let have_item = ItemModule::get_have_item_id(boma, 0) as u32; - let have_item_boma = sv_battle_object::module_accessor(have_item); - ItemModule::throw_item(boma, 53.0, 2.0, 1.0, 0, true, agent.get_float(*ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER)); - PostureModule::add_pos_2d(have_item_boma, &Vector2f {x: (4.0 * agent.lr()), y: 1.3}); - } - } -} - -unsafe extern "C" fn sound_itemlightthrowf(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 9.0); - if is_excute(agent) { - if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { - PLAY_SE(agent, Hash40::new("se_item_item_throw")); - } - } -} - pub fn install(agent: &mut Agent) { agent.acmd("game_cliffescape", acmd_stub, Priority::Low); @@ -304,9 +264,4 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_appealspecial", effect_appealspecial, Priority::Low); agent.acmd("sound_appealspecial", sound_appealspecial, Priority::Low); agent.acmd("expression_appealspecial", expression_appealspecial, Priority::Low); - - agent.acmd("game_itemlightthrowf", game_itemlightthrowf, Priority::Low); - agent.acmd("sound_itemlightthrowf", sound_itemlightthrowf, Priority::Low); - agent.acmd("game_itemlightthrowairf", game_itemlightthrowf, Priority::Low); - agent.acmd("sound_itemlightthrowairf", sound_itemlightthrowf, Priority::Low); } diff --git a/fighters/daisy/src/acmd/smashes.rs b/fighters/daisy/src/acmd/smashes.rs index 6e340486cf..cbe6e32c82 100644 --- a/fighters/daisy/src/acmd/smashes.rs +++ b/fighters/daisy/src/acmd/smashes.rs @@ -204,17 +204,19 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("armr"), 17.0, 90, 105, 0, 50, 2.5, 7.0, 0.0, 0.0, Some(2.5), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("armr"), 15.0, 90, 105, 0, 40, 5.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 75, 111, 0, 40, 3.6, 0.0, 8.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); - ATTACK(agent, 3, 0, Hash40::new("top"), 12.0, 75, 111, 0, 40, 3.6, 0.0, 8.0, -6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("bust"), 15.0, 90, 90, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("handr"), 17.0, 90, 90, 0, 40, 2.5, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("handr"), 15.0, 90, 90, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); + ATTACK(agent, 3, 0, Hash40::new("top"), 12.0, 75, 111, 0, 40, 3.6, 0.0, 8.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); + ATTACK(agent, 4, 0, Hash40::new("top"), 12.0, 75, 111, 0, 40, 3.6, 0.0, 8.0, -6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); } wait(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 10.0, 85, 100, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("handr"), 12.0, 85, 100, 0, 60, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); - AttackModule::clear(boma, 2, false); + ATTACK(agent, 0, 0, Hash40::new("bust"), 12.0, 85, 100, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("handr"), 12.0, 85, 100, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); + AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 3, false); + AttackModule::clear(boma, 4, false); } wait(lua_state, 4.0); if is_excute(agent) { @@ -223,6 +225,27 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.4); + } + frame(lua_state, 14.0); + if is_excute(agent) { + LANDING_EFFECT_FLIP(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false, *EF_FLIP_NONE); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("daisy_smash_heart"), Hash40::new("top"), 0, 23, 0, 0, 0, 0, 0.8, true); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("daisy_smash_ribbon"), Hash40::new("daisy_smash_ribbonl"), Hash40::new("top"), 1, -2.5, 0, 0, 0, 0, 1, true, *EF_FLIP_ZX); + EFFECT(agent, Hash40::new("daisy_flower_petals"), Hash40::new("top"), 0, 23, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 29.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("daisy_smash_heart"), false, false); + } +} + unsafe extern "C" fn sound_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -255,9 +278,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); for _ in 0..3 { if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 0, 100, 20, 0, 3.0, -2.5, 3.0, 0.0, Some(2.5), Some(3.0), Some(0.0), 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 180, 100, 30, 0, 3.0, -2.5, 3.0, 7.5, Some(2.5), Some(3.0), Some(7.5), 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 180, 100, 30, 0, 3.0, -2.5, 3.0, -7.5, Some(2.5), Some(3.0), Some(-7.5), 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 180, 100, 20, 0, 3.5, -2.5, 3.0, 0.0, Some(2.5), Some(3.0), Some(0.0), 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 180, 100, 30, 0, 3.25, -2.5, 2.5, 7.5, Some(2.5), Some(2.5), Some(7.5), 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 180, 100, 30, 0, 3.25, -2.5, 2.5, -7.5, Some(2.5), Some(2.5), Some(-7.5), 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 5.0); @@ -267,7 +290,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { wait(lua_state, 1.0); } if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 114, 120, 0, 60, 3.0, 0.0, 3.0, 7.5, Some(0.0), Some(3.0), Some(-7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 114, 120, 0, 60, 3.75, 0.0, 2.75, 7.5, Some(0.0), Some(2.75), Some(-7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -364,6 +387,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("sound_attacks4lw", sound_attacks4, Priority::Low); agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); + agent.acmd("effect_attackhi4", effect_attackhi4, Priority::Low); agent.acmd("sound_attackhi4", sound_attackhi4, Priority::Low); agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); diff --git a/fighters/daisy/src/acmd/specials.rs b/fighters/daisy/src/acmd/specials.rs index e9e045f84f..c400ffe450 100644 --- a/fighters/daisy/src/acmd/specials.rs +++ b/fighters/daisy/src/acmd/specials.rs @@ -291,24 +291,49 @@ unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); } +unsafe extern "C" fn effect_specialsstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, -0.85, 0, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, false); + } +} + unsafe extern "C" fn game_specialsjump(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE_RANGE(agent, 1.0, 25.0, 15.0); + frame(lua_state, 1.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); JostleModule::set_status(boma, false); - SEARCH(agent, 0, 0, Hash40::new("hip"), 2.5, 0.0, 0.0, 0.0, None, None, None, *COLLISION_KIND_MASK_HIT, *HIT_STATUS_MASK_NORMAL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false); + ATTACK(agent, 0, 0, Hash40::new("hip"), 0.0, 0, 0, 0, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_none"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); } - frame(lua_state, 4.0); + frame(lua_state, 25.0); if is_excute(agent) { - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_S_BRAKE); + AttackModule::clear_all(boma); + WorkModule::enable_transition_term(boma, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); } - frame(lua_state, 25.0); +} + +unsafe extern "C" fn game_specialsend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); // starts f1 instead of 0 + FT_MOTION_RATE_RANGE(agent, 1.0, 30.0, 24.0); + frame(lua_state, 30.0); // 30 -> 24 FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialsend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); if is_excute(agent) { - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); - WorkModule::enable_transition_term(boma, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); + EFFECT_FOLLOW(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 1.25, 0, 0, 0, 0.6, false); + } + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("sys_landing_smoke"), -1); } } @@ -316,16 +341,39 @@ unsafe extern "C" fn game_specialairsend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); + // hit shield + let hit_status = VarModule::get_int(agent.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if hit_status & *COLLISION_KIND_MASK_SHIELD != 0 + && hit_status & *COLLISION_KIND_MASK_PARRY != 1 { + ATTACK(agent, 0, 0, Hash40::new("hip"), 4.0, 361, 20, 0, 20, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); + } } - frame(lua_state, 2.0); + frame(lua_state, 3.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE); + AttackModule::clear_all(boma); + agent.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE); } - frame(lua_state, 6.0); + frame(lua_state, 7.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); } + frame(lua_state, 12.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE); + } // cancel into special landing frame + frame(lua_state, 30.0); + if is_excute(agent) { + // uncap max speeds + agent.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE); + } +} + +unsafe extern "C" fn expression_specialairsend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); + } } unsafe extern "C" fn game_specialshitend(agent: &mut L2CAgentBase) { @@ -356,14 +404,18 @@ unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PEACH_STATUS_SPECIAL_HI_FLAG_MOVE_TRANS); } frame(lua_state, 7.0); if is_excute(agent) { + agent.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_HI_FLAG_MOVE_TRANS); AttackModule::set_attack_reference_joint_id(boma, Hash40::new("haver"), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y)); ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 80, 75, 0, 70, 6.0, 0.0, 6.0, 5.5, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); } + frame(lua_state, 8.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_HI_FLAG_MOVE_TRANS); + } frame(lua_state, 9.0); if is_excute(agent) { AttackModule::set_attack_reference_joint_id(boma, Hash40::new("haver"), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y)); @@ -373,19 +425,18 @@ unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 35.0); + frame(lua_state, 36.0); if is_excute(agent) { ArticleModule::remove_exist(boma, *FIGHTER_DAISY_GENERATE_ARTICLE_KASSAR, ArticleOperationTarget(0)); } - frame(lua_state, 36.0); + frame(lua_state, 37.0); if is_excute(agent) { - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); - KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + //KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); } - frame(lua_state, 46.0); + frame(lua_state, 42.0); if is_excute(agent) { - KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + //KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } } @@ -398,7 +449,9 @@ unsafe extern "C" fn effect_specialhistart(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } } frame(lua_state, 6.0); for i in 0..5 { @@ -408,7 +461,7 @@ unsafe extern "C" fn effect_specialhistart(agent: &mut L2CAgentBase) { } wait(lua_state, 2.0); } - frame(lua_state, 35.0); + frame(lua_state, 36.0); if is_excute(agent) { EFFECT(agent, Hash40::new("sys_erace_smoke"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); } @@ -432,7 +485,7 @@ unsafe extern "C" fn expression_specialhistart(agent: &mut L2CAgentBase) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); ItemModule::set_have_item_visibility(boma, false, 0); } - frame(lua_state, 6.0); + frame(lua_state, 5.0); if is_excute(agent) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_NONE, 2); } @@ -456,6 +509,15 @@ unsafe extern "C" fn expression_specialairhistart(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialairhiend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } +} + unsafe extern "C" fn game_specialhiopen(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { @@ -496,12 +558,6 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP); } } - frame(lua_state, 16.0); - if is_excute(agent) { - if !agent.is_situation(*SITUATION_KIND_GROUND) { - agent.change_status_req(*FIGHTER_STATUS_KIND_FALL, false); - } - } frame(lua_state, 34.0); if is_excute(agent) { if item_kind != *ITEM_KIND_DOSEISAN && item_kind != *ITEM_KIND_NONE { @@ -544,6 +600,72 @@ unsafe extern "C" fn sound_speciallw(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + for _ in 0..5 { + if !ItemModule::is_have_item(boma, 0) { + ItemModule::pickup_item(boma, ItemSize{_address: *ITEM_SIZE_KIND_SMALL as u8}, *FIGHTER_HAVE_ITEM_WORK_MAIN, *ITEM_TRAIT_ALL, QuickItemTreatType{_address: *QUICK_ITEM_TREAT_TYPE_FORCE_HAVE as u8}, ItemPickupSearchMode{_address: *ITEM_PICKUP_SEARCH_MODE_IGNORE_GRASS as u8}); + } + wait(lua_state, 1.0); + } + } +} + +unsafe extern "C" fn effect_specialairlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + let facing = agent.lr(); + EffectModule::req_follow(boma, Hash40::new("sys_item_get"), Hash40::new("top"), &Vector3f::new(-3.0 * facing, 3.0, 3.0), &Vector3f::zero(), 0.5, false, 0, 0, 0, 0, 0, false, false); + } +} + +unsafe extern "C" fn game_speciallwthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + let have_item = ItemModule::get_have_item_id(boma, 0) as u32; + let have_item_boma = sv_battle_object::module_accessor(have_item); + ItemModule::throw_item(boma, 63.0, 2.3, 1.0, 0, true, agent.get_float(*ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER)); + PostureModule::add_pos_2d(have_item_boma, &Vector2f {x: (0.5 * agent.lr()), y: 1.5}); + } +} + +unsafe extern "C" fn effect_speciallwthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_speciallwthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_item_item_throw")); + } +} + +unsafe extern "C" fn expression_speciallwthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 5.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 5, false, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_specialn", game_specialn, Priority::Low); agent.acmd("effect_specialn", effect_specialn, Priority::Low); @@ -562,8 +684,14 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialsstart", game_specialsstart, Priority::Low); agent.acmd("game_specialairsstart", game_specialsstart, Priority::Low); + agent.acmd("effect_specialsstart", effect_specialsstart, Priority::Low); + agent.acmd("game_specialsjump", game_specialsjump, Priority::Low); + + agent.acmd("game_specialsend", game_specialsend, Priority::Low); agent.acmd("game_specialairsend", game_specialairsend, Priority::Low); + agent.acmd("expression_specialairsend", expression_specialairsend, Priority::Low); + agent.acmd("game_specialshitend", game_specialshitend, Priority::Low); agent.acmd("game_specialhistart", game_specialhistart, Priority::Low); @@ -574,9 +702,21 @@ pub fn install(agent: &mut Agent) { agent.acmd("sound_specialairhistart", sound_specialhistart, Priority::Low); agent.acmd("expression_specialhistart", expression_specialhistart, Priority::Low); agent.acmd("expression_specialairhistart", expression_specialairhistart, Priority::Low); + + agent.acmd("game_specialairhiend", game_specialairhiend, Priority::Low); agent.acmd("game_specialhiopen", game_specialhiopen, Priority::Low); agent.acmd("game_speciallw", game_speciallw, Priority::Low); agent.acmd("effect_speciallw", effect_speciallw, Priority::Low); agent.acmd("sound_speciallw", sound_speciallw, Priority::Low); + + agent.acmd("game_specialairlw", game_specialairlw, Priority::Low); + agent.acmd("effect_specialairlw", effect_specialairlw, Priority::Low); + agent.acmd("sound_specialairlw", acmd_stub, Priority::Low); + agent.acmd("expression_specialairlw", expression_speciallwthrow, Priority::Low); + + agent.acmd("game_speciallwthrow", game_speciallwthrow, Priority::Low); + agent.acmd("effect_speciallwthrow", effect_speciallwthrow, Priority::Low); + agent.acmd("sound_speciallwthrow", sound_speciallwthrow, Priority::Low); + agent.acmd("expression_speciallwthrow", expression_speciallwthrow, Priority::Low); } \ No newline at end of file diff --git a/fighters/daisy/src/acmd/throws.rs b/fighters/daisy/src/acmd/throws.rs index cc9945dcd4..9629e33eea 100644 --- a/fighters/daisy/src/acmd/throws.rs +++ b/fighters/daisy/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, 0.0, Some(0.0), Some(8.5), Some(7.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, 4.0, Some(0.0), Some(8.5), Some(7.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -266,8 +265,6 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { frame(lua_state, 43.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); - let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); } } diff --git a/fighters/daisy/src/lib.rs b/fighters/daisy/src/lib.rs index 1b48c6516c..046deac546 100644 --- a/fighters/daisy/src/lib.rs +++ b/fighters/daisy/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/daisy/src/opff.rs b/fighters/daisy/src/opff.rs index 08358ed8b3..7580c08e70 100644 --- a/fighters/daisy/src/opff.rs +++ b/fighters/daisy/src/opff.rs @@ -4,22 +4,6 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use vars::daisy::instance::*; -unsafe fn wall_bounce(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status(*FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP) { - let lr = PostureModule::lr(boma); - let frame = MotionModule::frame(boma) as i32; - let mut touch_wall = false; - if lr > 0.0 { - touch_wall = GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_FLAG_RIGHT as u32); - } else { - touch_wall = GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_FLAG_LEFT as u32); - }; - if touch_wall && (1..25).contains(&frame) { - StatusModule::change_status_request_from_script(boma, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END, true); - } - } -} - // transition daisy into unique animations for her third jump unsafe fn triple_jump_motion(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { if fighter.is_motion_one_of(&[Hash40::new("jump_aerial_f"), Hash40::new("jump_aerial_b")]) @@ -81,7 +65,6 @@ unsafe fn appeal_special(boma: &mut BattleObjectModuleAccessor) { // } pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { - wall_bounce(boma); triple_jump_motion(fighter, boma); crystal_handling(boma); appeal_special(boma); diff --git a/fighters/daisy/src/status/item_throw.rs b/fighters/daisy/src/status/item_throw.rs deleted file mode 100644 index d80376a294..0000000000 --- a/fighters/daisy/src/status/item_throw.rs +++ /dev/null @@ -1,13 +0,0 @@ -use super::*; - -// FIGHTER_STATUS_KIND_ITEM_THROW - -unsafe extern "C" fn item_throw_end (fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); - smashline::original_status(End, fighter, *FIGHTER_STATUS_KIND_ITEM_THROW)(fighter) -} - - -pub fn install(agent: &mut Agent) { - agent.status(End, *FIGHTER_STATUS_KIND_ITEM_THROW, item_throw_end); -} \ No newline at end of file diff --git a/fighters/daisy/src/status/mod.rs b/fighters/daisy/src/status/mod.rs index 28f7a78c37..f68173280b 100644 --- a/fighters/daisy/src/status/mod.rs +++ b/fighters/daisy/src/status/mod.rs @@ -9,7 +9,6 @@ mod attack_s4; mod landing_fall_special; mod catch; mod guard_damage; -mod item_throw; mod special_hi; mod special_lw; mod special_n; @@ -34,39 +33,23 @@ unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L true.into() } -// Holding Item -> Toss unsafe extern "C" fn should_use_special_lw_callback(fighter: &mut L2CFighterCommon) -> L2CValue { - //try turnaround but no reverse - let turn_stick_x = fighter.get_param_float("common", "turn_stick_x") * fighter.lr(); - let direc = if fighter.left_stick_x() <= turn_stick_x {-1.0} else {1.0}; - if ItemModule::is_have_item(fighter.module_accessor, 0) || fighter.is_situation(*SITUATION_KIND_GROUND) { - PostureModule::set_lr(fighter.module_accessor, direc); - PostureModule::update_rot_y_lr(fighter.module_accessor); - true.into() //needs to enter status before tossing - } else { - false.into() - } + true.into() } -unsafe extern "C" fn float_check_air_jump_aerial(fighter: &mut L2CFighterCommon) -> L2CValue { - let is_aerial = fighter.global_table[globals::PAD_FLAG].get_i32() & *FIGHTER_PAD_FLAG_ATTACK_TRIGGER != 0; +extern "Rust" { + #[link_name = "float_check_air_jump"] + fn float_check_air_jump(fighter: &mut L2CFighterCommon, float_status: L2CValue) -> L2CValue; + #[link_name = "float_check_air_jump_aerial"] + fn float_check_air_jump_aerial(fighter: &mut L2CFighterCommon, float_status: L2CValue) -> L2CValue; +} - if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON) { - if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PEACH_INSTANCE_WORK_ID_FLAG_UNIQ_FLOAT) { - let mut allow_float = false; - if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) { - if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < 0.0 { - allow_float = !is_aerial; - } - } +unsafe extern "C" fn air_jump_uniq(fighter: &mut L2CFighterCommon) -> L2CValue { + float_check_air_jump(fighter, FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT_START.into()) +} - if allow_float { - fighter.change_status(FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT_START.into(), true.into()); - return 1.into(); - } - } - } - 0.into() +unsafe extern "C" fn air_jump_aerial_uniq(fighter: &mut L2CFighterCommon) -> L2CValue { + float_check_air_jump_aerial(fighter, FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT_START.into()) } unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { @@ -74,7 +57,8 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); fighter.global_table[globals::USE_SPECIAL_LW_CALLBACK].assign(&L2CValue::Ptr(should_use_special_lw_callback as *const () as _)); fighter.global_table[0x26].assign(&false.into()); - fighter.global_table[0x33].assign(&L2CValue::Ptr(float_check_air_jump_aerial as *const () as _)); + fighter.global_table[0x32].assign(&L2CValue::Ptr(air_jump_uniq as *const () as _)); + fighter.global_table[0x33].assign(&L2CValue::Ptr(air_jump_aerial_uniq as *const () as _)); } pub fn install(agent: &mut Agent) { @@ -86,7 +70,6 @@ pub fn install(agent: &mut Agent) { landing_fall_special::install(agent); catch::install(agent); guard_damage::install(agent); - item_throw::install(agent); special_hi::install(agent); special_lw::install(agent); special_n::install(agent); diff --git a/fighters/daisy/src/status/special_hi.rs b/fighters/daisy/src/status/special_hi.rs index aaabb73782..40ace8ffe0 100644 --- a/fighters/daisy/src/status/special_hi.rs +++ b/fighters/daisy/src/status/special_hi.rs @@ -4,7 +4,7 @@ use super::*; unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), - *FIGHTER_KINETIC_TYPE_MOTION_AIR, + *FIGHTER_KINETIC_TYPE_UNIQ, *GROUND_CORRECT_KIND_KEEP as u32, app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), true, @@ -30,68 +30,158 @@ unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue } unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue { - let landing_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_hi"), hash40("special_hi_landing_mot_frame")); - WorkModule::set_float(fighter.module_accessor, landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); - if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_AIR_HI_START); - fighter.set_situation(SITUATION_KIND_AIR.into()); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi_start"), 0.0, 1.0, false, 0.0, false, false); - } - else { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - fighter.set_situation(SITUATION_KIND_GROUND.into()); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi_start"), 0.0, 1.0, false, 0.0, false, false); + fighter.set_int(2, *FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_ENABLE_UNIQ); + + let grav_speed_y = fighter.get_speed_y(*FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + fighter.change_motion_by_situation("special_hi_start", "special_air_hi_start", 0.0, 1.0, false, 0.0, false, false); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_AIR_HI_START); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { + let mut gravity_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) as *mut app::FighterKineticEnergyGravity; + smash::app::lua_bind::FighterKineticEnergyGravity::set_speed(gravity_energy, grav_speed_y); } - WorkModule::set_int(fighter.module_accessor, 1, *FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_ENABLE_UNIQ); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_CLIFF); - // let special_hi_parasol_limit_time = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_hi"), hash40("special_hi_parasol_limit_time")); - // WorkModule::set_int(fighter.module_accessor, special_hi_parasol_limit_time, *FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_PARASOL_LIMIT_TIME_COUNTER); GroundModule::select_cliff_hangdata(fighter.module_accessor, *FIGHTER_PEACH_CLIFF_HANG_DATA_SPECIAL_HI as u32); + fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_main_loop as *const () as _)) } unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if !fighter.sub_transition_group_check_air_cliff().get_bool() { - // let enable_uniq = WorkModule::get_int(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_ENABLE_UNIQ); - if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_HI_FLAG_MOVE_TRANS) { - fighter.set_situation(SITUATION_KIND_AIR.into()); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_HI_MOTION_AIR_ANGLE); - - WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_ENABLE_UNIQ); - WorkModule::off_flag(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_HI_FLAG_MOVE_TRANS); + angling(fighter); + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_HI_AIR_END.into(), false.into()); } + } + 0.into() +} + +unsafe extern "C" fn special_hi_exit(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_DAISY_GENERATE_ARTICLE_KASSAR, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + return 0.into(); +} - if KineticModule::get_kinetic_type(fighter.module_accessor) == *FIGHTER_KINETIC_TYPE_FALL { - fighter.sub_air_check_dive(); +// FIGHTER_PEACH_STATUS_KIND_SPECIAL_HI_AIR_END - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { - fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); - return 0.into(); - } +unsafe extern "C" fn special_hi_air_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings(fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_MOTION_FALL, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_PEACH_SPECIAL_HI_AIR_END_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_PEACH_SPECIAL_HI_AIR_END_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_PEACH_SPECIAL_HI_AIR_END_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_HI | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_HI as u32, + 0 + ); + + return 0.into(); +} + +unsafe extern "C" fn special_hi_air_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let landing_frame = fighter.get_param_int("param_special_hi", "special_hi_landing_mot_frame"); + fighter.set_float(landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi_end"), 0.0, 1.0, false, 0.0, false, false); + KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + + // fix endlag speed to match angled momentum + let maxrot = fighter.get_param_float("param_special_hi", "special_hi_start_dir_mul"); + let angle = VarModule::get_float(fighter.battle_object, vars::daisy::instance::SPECIAL_HI_ANGLE); + let lr = fighter.lr(); + let speed_x_mul = -angle*lr/maxrot + 0.55; + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, speed_x_mul); + + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_CLIFF); + GroundModule::select_cliff_hangdata(fighter.module_accessor, *FIGHTER_PEACH_CLIFF_HANG_DATA_SPECIAL_HI as u32); + + fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_air_end_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_hi_air_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if !fighter.sub_transition_group_check_air_cliff().get_bool() { + fighter.sub_air_check_dive(); + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); + return 1.into(); } if MotionModule::is_end(fighter.module_accessor) { - // fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_HI_FALL.into(), false.into()); let accel_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.fall_special_accel_x_mul"); let speed_x_max_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.fall_special_speed_x_max_mul"); - WorkModule::set_float(fighter.module_accessor, accel_x_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_MUL_FALL_X_ACCEL); - WorkModule::set_float(fighter.module_accessor, speed_x_max_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); + fighter.set_float(accel_x_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_MUL_FALL_X_ACCEL); + fighter.set_float(speed_x_max_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); } } 0.into() } -unsafe extern "C" fn special_hi_exit(fighter: &mut L2CFighterCommon) -> L2CValue { - ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_DAISY_GENERATE_ARTICLE_KASSAR, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - return 0.into(); +unsafe extern "C" fn angling(fighter: &mut L2CFighterCommon) -> bool { + if fighter.is_flag(*FIGHTER_PEACH_STATUS_SPECIAL_HI_FLAG_MOVE_TRANS) { + fighter.off_flag(*FIGHTER_PEACH_STATUS_SPECIAL_HI_FLAG_MOVE_TRANS); + // start rise + if fighter.get_int(*FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_ENABLE_UNIQ) > 1 { + fighter.set_situation(SITUATION_KIND_AIR.into()); + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR_ANGLE); + + fighter.set_int(1, *FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_ENABLE_UNIQ); + return true; + } + // angle + if fighter.get_int(*FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_ENABLE_UNIQ) > 0 { + // angle f8 + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + + let maxrot = fighter.get_param_float("param_special_hi", "special_hi_start_dir_mul"); + let speed= fighter.get_param_float("param_special_hi", "special_hi_start_trans_speed_mul"); + let facing = fighter.lr(); + let stick = Vector2f::new( + fighter.left_stick_x(), + fighter.left_stick_y() + ); + + let angle_from_vertical = app::sv_math::vec2_angle(stick.x, stick.y, 0.0, 1.0).to_degrees(); + let mut angle = angle_from_vertical * stick.x.signum() * -1.0; + angle = if facing < 0.0 { + angle.clamp(-maxrot, maxrot) + } else { + angle.clamp(-maxrot, maxrot) + }; + VarModule::set_float(fighter.battle_object, vars::daisy::instance::SPECIAL_HI_ANGLE, angle); + let angle_rad = angle.to_radians(); + + sv_kinetic_energy!(set_angle, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, angle_rad); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, speed); + fighter.set_int(0, *FIGHTER_PEACH_STATUS_SPECIAL_HI_WORK_INT_ENABLE_UNIQ); + return true; + } + } + return false } pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_main); agent.status(Exit, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_exit); + + agent.status(Pre, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_HI_AIR_END, special_hi_air_end_pre); + agent.status(Main, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_HI_AIR_END, special_hi_air_end_main); } \ No newline at end of file diff --git a/fighters/daisy/src/status/special_lw.rs b/fighters/daisy/src/status/special_lw.rs index 49f54a6b53..394621f8dc 100644 --- a/fighters/daisy/src/status/special_lw.rs +++ b/fighters/daisy/src/status/special_lw.rs @@ -3,6 +3,14 @@ use super::*; // FIGHTER_STATUS_KIND_SPECIAL_LW unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if ItemModule::is_have_item(fighter.module_accessor, 0) { + fighter.set_status_kind_interrupt(statuses::daisy::SPECIAL_LW_THROW); + return 1.into() + } + if !fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.set_status_kind_interrupt(statuses::daisy::SPECIAL_AIR_LW); + return 1.into() + } StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), @@ -27,17 +35,15 @@ unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, 0 ); - if ItemModule::is_have_item(fighter.module_accessor, 0) { - ControlModule::reset_trigger(fighter.module_accessor);//force soft toss - ControlModule::clear_command(fighter.module_accessor, true); - VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); - StatusModule::set_status_kind_interrupt(fighter.module_accessor, *FIGHTER_STATUS_KIND_ITEM_THROW); - return 1.into() - } 0.into() } unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + // turn around + let turn_stick_x = fighter.get_param_float("common", "turn_stick_x") * fighter.lr(); + let direc = if fighter.left_stick_x() <= turn_stick_x {-1.0} else {1.0}; + PostureModule::set_lr(fighter.module_accessor, direc); + PostureModule::update_rot_y_lr(fighter.module_accessor); fighter.on_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_ENABLE_ITEM_NO_COUNT); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw"), 0.0, 1.0, false, 0.0, false, false); notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, *FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, *FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_04 as i32 - 1 ); @@ -46,23 +52,26 @@ unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue } unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if CancelModule::is_enable_cancel(fighter.module_accessor) && (fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool()) { + if CancelModule::is_enable_cancel(fighter.module_accessor) + && (fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool()) { return 1.into(); } if MotionModule::is_end(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) {fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); } - else {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); } if !StatusModule::is_changing(fighter.module_accessor) { if StatusModule::is_situation_changed(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - } - else { - GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_FALL); + if !fighter.is_situation(*SITUATION_KIND_GROUND) { EFFECT_DETACH_KIND(fighter, Hash40::new("daisy_hikkonuki"), -1); + // cancel into air pull if visually coherent, most edge cancels happen first _ frames anyway + if MotionModule::frame(fighter.module_accessor) <= 10.0 { + fighter.change_status(statuses::daisy::SPECIAL_AIR_LW.into(), false.into()); + return 1.into(); + } + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } } } @@ -71,20 +80,164 @@ unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2C unsafe extern "C" fn special_lw_end(fighter: &mut L2CFighterCommon) -> L2CValue { if ItemModule::is_have_item(fighter.module_accessor, 0) { - if fighter.get_int(*FIGHTER_PEACH_STATUS_SPECIAL_LW_WORK_INT_UNIQ_ITEM_KIND) == *ITEM_KIND_NONE { - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_HAVE); + let item_kind = fighter.get_int(*FIGHTER_PEACH_STATUS_SPECIAL_LW_WORK_INT_UNIQ_ITEM_KIND); + if item_kind != *ITEM_KIND_BEAMSWORD { + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_HAVE);//tells her to use large item run ig, pull anim uses grip instead to position the turnip } else { - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_PICKUP); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP);//medium item anim } - if fighter.global_table[globals::STATUS_KIND] != FIGHTER_STATUS_KIND_FALL && fighter.global_table[CURRENT_FRAME].get_i32() < 35 { + if fighter.global_table[globals::STATUS_KIND] != FIGHTER_STATUS_KIND_FALL + && fighter.global_table[globals::STATUS_KIND] != statuses::daisy::SPECIAL_AIR_LW + && MotionModule::frame(fighter.module_accessor) <= 35.0 { ItemModule::drop_item(fighter.module_accessor, 90.0, 0.0, 0); } } 0.into() } +// statuses::daisy::SPECIAL_AIR_LW + +unsafe extern "C" fn special_air_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + let turn = if !ItemModule::is_have_item(fighter.module_accessor, 0) {*FIGHTER_STATUS_ATTR_START_TURN as u32} else {0}; + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_MOTION_FALL, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW as u64, + turn, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, + 0 + ); + 0.into() +} + +unsafe extern "C" fn special_air_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let air_speed_y_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_y_stable"), 0); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + if speed_y < -air_speed_y_stable { + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0, -air_speed_y_stable); + } + // should work as both ledge cancel and standalone? + if !ItemModule::is_have_item(fighter.module_accessor, 0) { + let start_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lw.air_start_x_mul"); + sv_kinetic_energy!(mul_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x, 0.0); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw"), 0.0, 1.0, false, 0.0, false, false); + } else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_lw"), -1.0, 1.0, 0.0, false, false); + } + fighter.main_shift(special_air_lw_main_loop) +} + +unsafe extern "C" fn special_air_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_air_check_dive(); + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + // empty pull land cancels (won't transition cleanly into any anim) + if fighter.is_motion(Hash40::new("special_air_lw")) { + fighter.check_land_cancel(None); + return 1.into(); + } + } + 0.into() +} + +unsafe extern "C" fn special_air_lw_end(fighter: &mut L2CFighterCommon) -> L2CValue { + 0.into() +} + +// statuses::daisy::SPECIAL_LW_THROW + +unsafe extern "C" fn special_lw_throw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_THROW_ITEM as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_ITEM_SHOOT as u32, + 0 + ); + 0.into() +} + +unsafe extern "C" fn special_lw_throw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.change_motion_by_situation("special_lw_throw", "special_air_lw_throw", 0.0, 1.0, false, 0.0, false, false); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + fighter.main_shift(special_lw_throw_main_loop) +} + +unsafe extern "C" fn special_lw_throw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_air_check_dive(); + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_motion_inherit_frame_by_situation("special_lw_throw", "special_air_lw_throw", -1.0, 1.0, 0.0, false, false); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + } + 0.into() +} + +unsafe extern "C" fn special_lw_throw_end(fighter: &mut L2CFighterCommon) -> L2CValue { + 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_main); agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_end); + + agent.status(Pre, statuses::daisy::SPECIAL_AIR_LW, special_air_lw_pre); + agent.status(Main, statuses::daisy::SPECIAL_AIR_LW, special_air_lw_main); + agent.status(End, statuses::daisy::SPECIAL_AIR_LW, special_air_lw_end); + + agent.status(Pre, statuses::daisy::SPECIAL_LW_THROW, special_lw_throw_pre); + agent.status(Main, statuses::daisy::SPECIAL_LW_THROW, special_lw_throw_main); + agent.status(End, statuses::daisy::SPECIAL_LW_THROW, special_lw_throw_end); } diff --git a/fighters/daisy/src/status/special_s.rs b/fighters/daisy/src/status/special_s.rs index 38d000724d..c8434a8b00 100644 --- a/fighters/daisy/src/status/special_s.rs +++ b/fighters/daisy/src/status/special_s.rs @@ -5,7 +5,7 @@ use super::*; unsafe extern "C" fn special_s_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( - fighter.module_accessor, + fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), *FIGHTER_KINETIC_TYPE_UNIQ, *GROUND_CORRECT_KIND_KEEP as u32, @@ -16,6 +16,7 @@ unsafe extern "C" fn special_s_pre(fighter: &mut L2CFighterCommon) -> L2CValue { *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, 0 ); + FighterStatusModuleImpl::set_fighter_status_data( fighter.module_accessor, false, @@ -23,40 +24,22 @@ unsafe extern "C" fn special_s_pre(fighter: &mut L2CFighterCommon) -> L2CValue { false, false, false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, - *FIGHTER_STATUS_ATTR_START_TURN as u32, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + 0, *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, 0 ); - - 0.into() + + return 0.into(); } unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue { - PostureModule::set_stick_lr(fighter.module_accessor, 0.0); - PostureModule::update_rot_y_lr(fighter.module_accessor); - sv_kinetic_energy!(clear_speed_ex, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + fighter.set_situation(L2CValue::I32(*SITUATION_KIND_AIR)); + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); + VarModule::on_flag(fighter.battle_object, vars::common::status::DISABLE_ECB_SHIFT); + fighter.change_motion_by_situation("special_s_start", "special_air_s_start", 0.0, 1.0, false, 0.0, false, false); + special_s_start_momentum(fighter, 1.0); fighter.set_int(1, *FIGHTER_PEACH_STATUS_SPECIAL_S_WORK_INT_ENABLE_UNIQ); - if !StopModule::is_stop(fighter.module_accessor) { - special_s_check_flick(fighter); - } - VarModule::off_flag(fighter.battle_object, vars::daisy::instance::SPECIAL_S_GROUND_START); - if fighter.is_situation(*SITUATION_KIND_GROUND) { - VarModule::on_flag(fighter.battle_object, vars::daisy::instance::SPECIAL_S_GROUND_START); - } - fighter.global_table[SUB_STATUS2].assign(&L2CValue::Ptr(special_s_check_flick as *const () as _)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - fighter.set_situation(SITUATION_KIND_AIR.into()); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_S_START); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_start"), 0.0, 1.0, false, 0.0, false, false); - } - else { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_S_AIR_START); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_start"), 0.0, 1.0, false, 0.0, false, false); - } fighter.main_shift(special_s_main_loop) } @@ -68,32 +51,44 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV if MotionModule::is_end(fighter.module_accessor) { fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP.into(), false.into()); } + if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < 0.0 + && GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) { + KineticModule::clear_speed_all(fighter.module_accessor); + KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } return 0.into(); } -unsafe extern "C" fn special_s_check_flick(fighter: &mut L2CFighterCommon) -> L2CValue { - let flick_x = ControlModule::get_flick_no_reset_x(fighter.module_accessor); - if flick_x <= fighter.get_param_int("common", "special_smash_flick_x") { - fighter.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_FLAG_FLICK_START); - fighter.clear_lua_stack(); - fighter.push_lua_stack(&mut L2CValue::new_int(0x20cbc92683)); - fighter.push_lua_stack(&mut L2CValue::I32(1)); - fighter.push_lua_stack(&mut L2CValue::I32(*FIGHTER_LOG_DATA_INT_HAJIKI_NUM)); - app::sv_battle_object::notify_event_msc_cmd(fighter.lua_state_agent); - fighter.set_int(0, *FIGHTER_PEACH_STATUS_SPECIAL_S_WORK_INT_ENABLE_UNIQ); - } +unsafe fn special_s_start_momentum(fighter: &mut L2CFighterCommon, mul: f32) { + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let start_y = fighter.get_param_float("param_special_s", "special_s_start_speed_y"); + let stable_y = fighter.get_param_float("param_special_s", "special_s_jump_stable_y"); + let max_y = fighter.get_param_float("air_speed_y_stable", ""); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, stable_y); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, (speed_y+start_y).clamp(-max_y, max_y * mul)); +} - return 0.into(); +unsafe extern "C" fn special_s_end(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + + 0.into() } + // FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP unsafe extern "C" fn special_s_jump_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_AIR), - *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_S_JUMP, + *FIGHTER_KINETIC_TYPE_FALL, *GROUND_CORRECT_KIND_AIR as u32, app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), true, @@ -122,10 +117,14 @@ unsafe extern "C" fn special_s_jump_main(fighter: &mut L2CFighterCommon) -> L2CV VarModule::on_flag(fighter.battle_object, vars::daisy::instance::DISABLE_SPECIAL_S); WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_jump"), 0.0, 1.0, false, 0.0, false, false); + fighter.main_shift(special_s_jump_main_loop) } unsafe extern "C" fn special_s_jump_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + special_s_jump_momentum(fighter); + hit_check(fighter); + wall_check(fighter); if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } @@ -135,45 +134,90 @@ unsafe extern "C" fn special_s_jump_main_loop(fighter: &mut L2CFighterCommon) -> } if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT) { WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); - let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - KineticModule::unable_energy_all(fighter.module_accessor); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, speed_x, speed_y, 0.0, 0.0, 0.0); - let dec_accel_x = fighter.get_param_float("param_special_s", "special_s_jump_dec_accel_x"); - sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, dec_accel_x, 0.0); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); - - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); - let air_accel_y = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_y"), 0); - let air_stable_y = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_y_stable"), 0); - let speed_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_speed_y_mul"); - let accel_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_accel_y_mul"); - let stable_speed_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_stable_speed_y_mul"); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y * accel_y_mul); - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y * accel_y_mul); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_stable_y * stable_speed_y_mul); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); - let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); - let control_speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_control_speed_x_mul"); - let control_accel_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_control_accel_x_mul"); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * control_speed_x_mul, 0.0); - sv_kinetic_energy!(controller_set_accel_x_mul, fighter, control_accel_x_mul); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END.into(), false.into()); return 1.into(); } - + return 0.into(); } +// rapidly decaying speed, drift to change distance +unsafe extern "C" fn special_s_jump_momentum(fighter: &mut L2CFighterCommon) -> L2CValue { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let lr = fighter.lr(); + let start_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_start_x"); + let min_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_min_x"); + let brake_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_brake_x"); + let accel_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_accel_x"); + let start_y = fighter.get_param_float("param_special_s", "special_s_jump_speed_y"); + let stable_y = fighter.get_param_float("param_special_s", "special_s_jump_stable_y"); + let jump_max_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_max_y"); + if StatusModule::is_changing(fighter.module_accessor) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x, 0.0); + sv_kinetic_energy!(set_accel_x_add, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0); + sv_kinetic_energy!(set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0); + sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x*lr, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, stable_y); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, (speed_y+start_y).clamp(-jump_max_y, jump_max_y)); + return 1.into(); + } + // speed cannot go below minimum, cannot exceed starting value due to higher brake value + let add_speed = (fighter.left_stick_x() * lr * accel_x) - brake_x; + let mut new_speed = (add_speed*lr) + speed_x; + new_speed = if lr > 0.0 {new_speed.clamp(min_x, start_x)} else {new_speed.clamp(-start_x, -min_x)}; + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, new_speed, 0.0); + 0.into() +} + +// hit check +unsafe extern "C" fn hit_check(fighter: &mut L2CFighterCommon) -> L2CValue { + // bounce on-hit + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END.into(), false.into()); + return 1.into(); + } + // end on-shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END.into(), false.into()); + return 1.into(); + } + // kill hitbox if minimum speed + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let min_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_min_x"); + if speed_x.abs() <= min_x + && AttackModule::is_attack(fighter.module_accessor, 0, false) { + AttackModule::clear_all(fighter.module_accessor); + EFFECT_OFF_KIND(fighter, Hash40::new("daisy_bomber_jamp"), false, false); + WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); + } + 0.into() +} + +// wall bounce if moving forward +unsafe extern "C" fn wall_check(fighter: &mut L2CFighterCommon) -> L2CValue { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let mut touch_wall = false; + if fighter.lr() > 0.0 { + touch_wall = GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_RIGHT as u32); + } else { + touch_wall = GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_LEFT as u32); + } + if touch_wall + && speed_x.abs() >= 0.0 { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END.into(), true.into()); + } + 0.into() +} + +// FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END + unsafe extern "C" fn special_s_away_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( - fighter.module_accessor, + fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), *FIGHTER_KINETIC_TYPE_UNIQ, *GROUND_CORRECT_KIND_KEEP as u32, @@ -184,6 +228,7 @@ unsafe extern "C" fn special_s_away_end_pre(fighter: &mut L2CFighterCommon) -> L *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, 0 ); + FighterStatusModuleImpl::set_fighter_status_data( fighter.module_accessor, false, @@ -191,88 +236,29 @@ unsafe extern "C" fn special_s_away_end_pre(fighter: &mut L2CFighterCommon) -> L false, false, false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, 0, *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, 0 ); - 0.into() + return 0.into(); } unsafe extern "C" fn special_s_away_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { - WorkModule::set_int64(fighter.module_accessor, hash40("special_s_end") as i64, *FIGHTER_PEACH_STATUS_WORK_INT_MOT_KIND); - WorkModule::set_int64(fighter.module_accessor, hash40("special_air_s_end") as i64, *FIGHTER_PEACH_STATUS_WORK_INT_MOT_AIR_KIND); - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_WAIT); - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_FALL); - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING); - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING_LIGHT); - fighter.on_flag(*FIGHTER_PEACH_MOTION_TRANSITION_TERM_ID_MOT_END); - if fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_end"), 0.0, 1.0, false, 0.0, false, false); - KineticModule::mul_speed(fighter.module_accessor, &Vector3f::new(0.75, 1.0, 1.0), *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ID_GROUND); - } - else { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_end"), 0.0, 1.0, false, 0.0, false, false); - } - //sub_special_s_away_end(fighter); + fighter.change_motion_by_situation("special_s_end", "special_air_s_end", 1.0, 1.0, false, 0.0, false, false); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + special_s_end_momentum(fighter); fighter.main_shift(special_s_away_end_main_loop) } -// unsafe extern "C" fn sub_special_s_away_end(fighter: &mut L2CFighterCommon) { -// if fighter.is_situation(*SITUATION_KIND_GROUND) { -// if !fighter.is_motion(Hash40::new("special_air_s_end")) { -// return; -// } -// if fighter.motion_frame() < 10.0 { -// MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_end"), 0.0, 1.0, false, 0.0, false, false); -// } -// else { -// sub_sub_special_s_away_end(fighter); -// } -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); -// KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); -// } -// else { -// if !fighter.global_table[IS_STOPPING].get_bool() { -// return; -// } -// if !fighter.is_motion(Hash40::new("special_s_end")) { -// return; -// } -// KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); -// MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_end"), 0.0, 1.0, false, 0.0, false, false); -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); -// fighter.off_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE); -// } -// } - -// unsafe extern "C" fn sub_sub_special_s_away_end(fighter: &mut L2CFighterCommon) { -// if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING_LIGHT) { -// if fighter.is_situation(*SITUATION_KIND_GROUND) { -// let speed_y_stable_frame = fighter.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_SPEED_Y_STABLE_FRAME); -// let landing_heavy_frame = fighter.get_param_int("landing_heavy_frame", "0"); -// if speed_y_stable_frame < landing_heavy_frame { -// fighter.change_status(FIGHTER_STATUS_KIND_LANDING_LIGHT.into(), false.into()); -// return; -// } -// } -// } -// if !WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING) { -// return; -// } -// if fighter.is_situation(*SITUATION_KIND_AIR) { -// return; -// } -// fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); -// return; -// } - unsafe extern "C" fn special_s_away_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + // wall bounce first 4 frames + let end_wall_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_s.end_wall_frame"); + if fighter.status_frame() < end_wall_frame { + wall_check(fighter); + } if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } @@ -283,57 +269,93 @@ unsafe extern "C" fn special_s_away_end_main_loop(fighter: &mut L2CFighterCommon } } if MotionModule::is_end(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); - } - else { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - } + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); return 1.into(); } if !StatusModule::is_changing(fighter.module_accessor) && StatusModule::is_situation_changed(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - if fighter.status_frame() <= 20 { - WorkModule::set_float(fighter.module_accessor, 30.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); - fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); - return 1.into(); + // if returning to fall anim, cancel into heavy landing + if fighter.is_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE) { + // special landing lag if not actionable + let end_landing_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_landing_frame"); + let mut lag = Some(end_landing_frame); + if CancelModule::is_enable_cancel(fighter.module_accessor) { + lag = None; } - else { - fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); - return 1.into(); - } - } - else { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + fighter.check_land_cancel(lag); return 1.into(); } + // cancel into full lag ground slide if still in jump pose, ledge cancel + fighter.change_status_by_situation(*FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END, *FIGHTER_STATUS_KIND_FALL, false); } + // enable drift frame if fighter.is_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE) { - if !fighter.is_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE) { - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - let control_accel_x = fighter.get_param_float("param_special_s", "special_air_s_end_control_accel_x"); - sv_kinetic_energy!(controller_set_accel_x_mul, fighter, control_accel_x); - sv_kinetic_energy!(controller_set_accel_x_add, fighter, 0.0); - fighter.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE); + let control_accel_x = fighter.get_param_float("param_special_s", "special_air_s_end_control_accel_x"); + sv_kinetic_energy!(set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, control_accel_x); + // uncap speed frame (transition better to fall?) + if fighter.is_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE) { + let max_x = fighter.get_param_float("air_speed_x_stable", ""); + let max_y = fighter.get_param_float("air_speed_y_stable", ""); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, max_x, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, max_y); } + fighter.off_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE); } return 0.into(); } +// prevent excessive speed transfer? drift limits +unsafe fn special_s_end_momentum(fighter: &mut L2CFighterCommon) { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let lr = fighter.lr(); + let mut end_landing_x_min = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_landing_x_min"); + let end_landing_x_max = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_landing_x_max"); + let end_x_stable = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_x_stable"); + let end_y_stable = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_y_stable"); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + // a2g speed transfer, clamped values if landed during dash to prevent broken looking speed + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + let mut new_speed = if lr > 0.0 {speed_x.clamp(end_landing_x_min, end_landing_x_max)} else {speed_x.clamp(-end_landing_x_max, -end_landing_x_min)}; + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, new_speed); + return; + } + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, end_x_stable, 0.0); + sv_kinetic_energy!(set_accel_x_add, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0); + sv_kinetic_energy!(set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, end_y_stable); +} + +unsafe extern "C" fn special_s_hit_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END)(fighter); + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY != 0 { + let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); + let air_accel_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_mul"), 0); + let air_accel_x_add = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_add"), 0); + let speed_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_end_speed_x_mul"); + let accel_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_end_accel_x_mul"); + + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * speed_mul, 0.0); + sv_kinetic_energy!(controller_set_accel_x_mul, fighter, air_accel_x_mul * accel_mul); + sv_kinetic_energy!(controller_set_accel_x_add, fighter, air_accel_x_add * accel_mul); + } + + return ret; +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); + agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_end); agent.status(Pre, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP, special_s_jump_pre); agent.status(Main, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP, special_s_jump_main); agent.status(Pre, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END, special_s_away_end_pre); agent.status(Main, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END, special_s_away_end_main); -} \ No newline at end of file + + agent.status(Main, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END, special_s_hit_end_main); +} diff --git a/fighters/dedede/Cargo.toml b/fighters/dedede/Cargo.toml index d9f5554847..2d3151ce07 100644 --- a/fighters/dedede/Cargo.toml +++ b/fighters/dedede/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/dedede/src/acmd/aerials.rs b/fighters/dedede/src/acmd/aerials.rs index 44146b4f14..da87fc9a24 100644 --- a/fighters/dedede/src/acmd/aerials.rs +++ b/fighters/dedede/src/acmd/aerials.rs @@ -242,10 +242,10 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 24.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hammer1"), 6.0, 72, 140, 0, 58, 6.5, 16.5, 0.0, -3.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); - ATTACK(agent, 1, 0, Hash40::new("hammer1"), 6.0, 72, 140, 0, 58, 6.5, 16.5, 0.0, 3.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); - ATTACK(agent, 2, 0, Hash40::new("hammer1"), 6.0, 72, 140, 0, 58, 5.0, 9.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); - ATTACK(agent, 3, 0, Hash40::new("hammer1"), 6.0, 72, 140, 0, 58, 5.0, 3.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 0, 0, Hash40::new("hammer1"), 6.0, 75, 140, 0, 58, 6.5, 16.5, 0.0, -3.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 1, 0, Hash40::new("hammer1"), 6.0, 75, 140, 0, 58, 6.5, 16.5, 0.0, 3.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 2, 0, Hash40::new("hammer1"), 6.0, 75, 140, 0, 58, 5.0, 9.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 3, 0, Hash40::new("hammer1"), 6.0, 75, 140, 0, 58, 5.0, 3.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); } frame(lua_state, 27.0); FT_MOTION_RATE_RANGE(agent, 27.0, 43.0, 24.0); diff --git a/fighters/dedede/src/acmd/other.rs b/fighters/dedede/src/acmd/other.rs index 7df2c59a52..1357eb4818 100644 --- a/fighters/dedede/src/acmd/other.rs +++ b/fighters/dedede/src/acmd/other.rs @@ -44,7 +44,7 @@ unsafe extern "C" fn expression_landingheavy(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_landl"), 0, false, 0x50000000 /* default value */); slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - if !agent.is_prev_status(*FIGHTER_STATUS_KIND_ESCAPE_AIR) { + if !agent.is_prev_status_one_of(&[*FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_STATUS_KIND_DAMAGE_AIR]) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } @@ -91,7 +91,6 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); if is_excute(agent) { VarModule::off_flag(agent.battle_object, vars::dedede::instance::SPECIAL_S_GORDO_DASH_DISABLE); } @@ -103,10 +102,7 @@ unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -123,10 +119,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_landingfallspecial(agent: &mut L2CAgentBase) { diff --git a/fighters/dedede/src/acmd/smashes.rs b/fighters/dedede/src/acmd/smashes.rs index b982e1dad1..9eb4cca847 100644 --- a/fighters/dedede/src/acmd/smashes.rs +++ b/fighters/dedede/src/acmd/smashes.rs @@ -52,7 +52,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("hammer2"), 16.0, 80, 106, 0, 40, 7.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); ATTACK(agent, 1, 0, Hash40::new("hammer2"), 16.0, 80, 106, 0, 40, 4.0, -6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); ATTACK(agent, 2, 0, Hash40::new("hammer2"), 16.0, 80, 106, 0, 40, 4.0, -12.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); - ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 80, 106, 0, 40, 4.0, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 80, 106, 0, 40, 4.0, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); } frame(lua_state, 25.0); if is_excute(agent) { @@ -73,13 +73,13 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hammer2"), 13.0, 45, 85, 0, 60, 7.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); - ATTACK(agent, 1, 0, Hash40::new("hammer2"), 13.0, 45, 85, 0, 60, 6.0, -9.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 0, 0, Hash40::new("hammer2"), 13.0, 45, 85, 0, 60, 7.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 1, 0, Hash40::new("hammer2"), 13.0, 45, 85, 0, 60, 6.0, -9.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); } frame(lua_state, 19.0); if is_excute(agent){ - ATTACK(agent, 0, 0, Hash40::new("hammer2"), 11.0, 115, 85, 0, 60, 7.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); - ATTACK(agent, 1, 0, Hash40::new("hammer2"), 11.0, 115, 85, 0, 60, 6.0, -9.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 0, 0, Hash40::new("hammer2"), 11.0, 115, 85, 0, 60, 7.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 1, 0, Hash40::new("hammer2"), 11.0, 115, 85, 0, 60, 6.0, -9.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_dedede_hammer"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); } frame(lua_state, 23.0); FT_MOTION_RATE_RANGE(agent, 23.0, 49.0, 22.0); diff --git a/fighters/dedede/src/acmd/specials.rs b/fighters/dedede/src/acmd/specials.rs index 79645ac424..fb08646473 100644 --- a/fighters/dedede/src/acmd/specials.rs +++ b/fighters/dedede/src/acmd/specials.rs @@ -15,9 +15,9 @@ unsafe extern "C" fn game_specialnloop(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_DEDEDE_STATUS_SPECIAL_N_FLAG_INHALE); CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 9.0, 5.0, Some(0.0), Some(9.0), Some(12.0), *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_GA); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 170, 40, 30, 0, 6.0, 0.0, 9.0, 16.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 170, 40, 10, 0, 7.0, 0.0, 6.0, 23.0, Some(0.0), Some(12.0), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 3, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 8.5, 10.0, Some(0.0), Some(8.5), Some(21.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 170, 100, 25, 0, 6.0, 0.0, 9.0, 16.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 170, 100, 25, 0, 7.0, 0.0, 6.0, 23.0, Some(0.0), Some(12.0), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 8.5, 10.0, Some(0.0), Some(8.5), Some(21.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 8, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 361, 100, 0, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); SEARCH(agent, 0, 0, Hash40::new("top"), 4.0, 0.0, 13.0, 5.5, Some(0.0), Some(3.5), Some(5.5), *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_ALL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, true); search!(agent, *MA_MSC_CMD_SEARCH_SET_OPPONENT, 0, 0, *COLLISION_TARGET_PROPERTY, *COLLISION_PROPERTY_MASK_REFLECT); @@ -28,9 +28,9 @@ unsafe extern "C" fn game_specialnloop(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_DEDEDE_STATUS_SPECIAL_N_FLAG_INHALE); CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 5.5, 5.0, Some(0.0), Some(5.5), Some(12.0), *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_GA); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 170, 40, 30, 0, 6.0, 0.0, 6.5, 16.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 170, 40, 10, 0, 7.0, 0.0, 3.5, 23.0, Some(0.0), Some(9.5), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 3, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 6.0, 10.0, Some(0.0), Some(6.0), Some(21.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 170, 100, 25, 0, 6.0, 0.0, 6.5, 16.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 170, 100, 25, 0, 7.0, 0.0, 3.5, 23.0, Some(0.0), Some(9.5), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 6.0, 10.0, Some(0.0), Some(6.0), Some(21.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 8, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 361, 100, 0, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); SEARCH(agent, 0, 0, Hash40::new("top"), 4.0, 0.0, 9.5, 5.5, Some(0.0), Some(2.5), Some(5.5), *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_ALL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, true); search!(agent, *MA_MSC_CMD_SEARCH_SET_OPPONENT, 0, 0, *COLLISION_TARGET_PROPERTY, *COLLISION_PROPERTY_MASK_REFLECT); @@ -53,9 +53,9 @@ unsafe extern "C" fn game_specialairnloop(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_DEDEDE_STATUS_SPECIAL_N_FLAG_INHALE); CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 12.0, 5.0, Some(0.0), Some(12.0), Some(9.0), *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_GA); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 170, 40, 30, 0, 6.0, 0.0, 12.0, 16.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 170, 40, 10, 0, 7.0, 0.0, 9.0, 23.0, Some(0.0), Some(15.0), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 3, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 11.5, 10.0, Some(0.0), Some(11.5), Some(21.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 170, 100, 25, 0, 6.0, 0.0, 12.0, 16.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 170, 100, 25, 0, 7.0, 0.0, 9.0, 23.0, Some(0.0), Some(15.0), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 11.5, 10.0, Some(0.0), Some(11.5), Some(21.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 8, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 361, 100, 0, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); SEARCH(agent, 0, 0, Hash40::new("top"), 4.0, 0.0, 16.0, 5.5, Some(0.0), Some(6.5), Some(5.5), *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_ALL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, true); search!(agent, *MA_MSC_CMD_SEARCH_SET_OPPONENT, 0, 0, *COLLISION_TARGET_PROPERTY, *COLLISION_PROPERTY_MASK_REFLECT); @@ -66,9 +66,9 @@ unsafe extern "C" fn game_specialairnloop(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_DEDEDE_STATUS_SPECIAL_N_FLAG_INHALE); CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 5.5, 5.0, Some(0.0), Some(5.5), Some(9.0), *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_GA); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 170, 40, 30, 0, 6.0, 0.0, 6.5, 16.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 170, 40, 10, 0, 7.0, 0.0, 3.5, 23.0, Some(0.0), Some(9.5), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 3, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 6.0, 10.0, Some(0.0), Some(6.0), Some(21.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 170, 100, 25, 0, 6.0, 0.0, 6.5, 16.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 170, 100, 25, 0, 7.0, 0.0, 3.5, 23.0, Some(0.0), Some(9.5), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 6.0, 10.0, Some(0.0), Some(6.0), Some(21.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 8, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 361, 100, 0, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); SEARCH(agent, 0, 0, Hash40::new("top"), 4.0, 0.0, 9.5, 5.5, Some(0.0), Some(2.5), Some(5.5), *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_ALL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, true); search!(agent, *MA_MSC_CMD_SEARCH_SET_OPPONENT, 0, 0, *COLLISION_TARGET_PROPERTY, *COLLISION_PROPERTY_MASK_REFLECT); @@ -85,6 +85,8 @@ unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_DEDEDE_STATUS_GORDO_THROW_FLAG_GENERATE); WorkModule::on_flag(boma, *FIGHTER_DEDEDE_STATUS_GORDO_THROW_FLAG_PUTOUT); } + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 18.0, 20.0); frame(lua_state, 18.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_DEDEDE_STATUS_GORDO_THROW_FLAG_THROW); @@ -96,6 +98,10 @@ unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_specialsstart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_item_get"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, true); + } frame(lua_state, 14.0); if is_excute(agent) { if (PostureModule::lr(boma) == -1.0) { @@ -197,9 +203,6 @@ unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { KineticModule::add_speed(agent.module_accessor, &Vector3f{x: 0.0, y:-0.8, z:0.0}); } frame(lua_state, 3.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } FT_MOTION_RATE(agent, 0.809); frame(lua_state, 21.0); FT_MOTION_RATE(agent, 1.0); @@ -567,8 +570,8 @@ unsafe extern "C" fn game_speciallwmax(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); if is_excute(agent) { KineticModule::add_speed(boma, &Vector3f::new(rush_speed, 0.0, 0.0)); - ATTACK(agent, 0, 0, Hash40::new("hammer1"), 40.0, 361, 46, 0, 60, 9.0, 16.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); - ATTACK(agent, 1, 0, Hash40::new("top"), 30.0, 361, 46, 0, 60, 5.0, 0.0, 7.0, 2.0, Some(0.0), Some(7.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 0, 0, Hash40::new("hammer1"), 40.0, 361, 46, 0, 60, 9.0, 16.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); + ATTACK(agent, 1, 0, Hash40::new("top"), 30.0, 361, 46, 0, 60, 5.0, 0.0, 7.0, 2.0, Some(0.0), Some(7.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEDEDE, *ATTACK_REGION_HAMMER); } wait(lua_state, 3.0); if is_excute(agent) { diff --git a/fighters/dedede/src/acmd/throws.rs b/fighters/dedede/src/acmd/throws.rs index 41093bd349..9434f472e1 100644 --- a/fighters/dedede/src/acmd/throws.rs +++ b/fighters/dedede/src/acmd/throws.rs @@ -5,14 +5,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 5.0/(7.0-1.0)); - frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 5.5, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(10.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 5.5, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(10.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +52,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 5.5, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-18.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 5.5, 0.0, 6.0, -5.5, Some(0.0), Some(6.0), Some(-18.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -167,8 +167,6 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { frame(lua_state, 26.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); - let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); AttackModule::clear_all(boma); } } diff --git a/fighters/dedede/src/gordo/acmd.rs b/fighters/dedede/src/gordo/acmd.rs index 464153fa12..8f15873c3e 100644 --- a/fighters/dedede/src/gordo/acmd.rs +++ b/fighters/dedede/src/gordo/acmd.rs @@ -171,13 +171,16 @@ unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase){ let boma = agent.boma(); let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if is_excute(agent){ + WHOLE_HIT(agent, *HIT_STATUS_OFF); if WorkModule::is_flag(owner_module_accessor, *FIGHTER_DEDEDE_INSTANCE_WORK_ID_FLAG_GORDO_GET){ WorkModule::on_flag(boma, *WEAPON_DEDEDE_GORDO_STATUS_WORK_FLAG_VISIBILITY_ON); + WHOLE_HIT(agent, *HIT_STATUS_NORMAL); } } frame(lua_state, 7.0); if is_excute(agent){ WorkModule::on_flag(boma, *WEAPON_DEDEDE_GORDO_STATUS_WORK_FLAG_VISIBILITY_ON); + WHOLE_HIT(agent, *HIT_STATUS_NORMAL); } } @@ -187,13 +190,16 @@ unsafe extern "C" fn game_specialairsstart(agent: &mut L2CAgentBase) { let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if is_excute(agent){ + WHOLE_HIT(agent, *HIT_STATUS_OFF); if WorkModule::is_flag(owner_module_accessor, *FIGHTER_DEDEDE_INSTANCE_WORK_ID_FLAG_GORDO_GET){ WorkModule::on_flag(boma, *WEAPON_DEDEDE_GORDO_STATUS_WORK_FLAG_VISIBILITY_ON); + WHOLE_HIT(agent, *HIT_STATUS_NORMAL); } } frame(lua_state, 7.0); if is_excute(agent) { WorkModule::on_flag(boma, *WEAPON_DEDEDE_GORDO_STATUS_WORK_FLAG_VISIBILITY_ON); + WHOLE_HIT(agent, *HIT_STATUS_NORMAL); } } diff --git a/fighters/dedede/src/gordo/status.rs b/fighters/dedede/src/gordo/status.rs index 3e71162214..64c0c3d03d 100644 --- a/fighters/dedede/src/gordo/status.rs +++ b/fighters/dedede/src/gordo/status.rs @@ -1,6 +1,13 @@ use super::*; use globals::*; +unsafe extern "C" fn fall_pre(weapon: &mut L2CWeaponCommon) -> L2CValue{ + KineticModule::change_kinetic(weapon.module_accessor, *WEAPON_KINETIC_TYPE_DEDEDE_GORDO_THROW); //enables gravity + StatusModule::change_status_force(weapon.module_accessor, *WEAPON_DEDEDE_GORDO_STATUS_KIND_HOP, true); + + 0.into() +} + unsafe extern "C" fn dead_end(weapon: &mut L2CWeaponCommon) -> L2CValue{ let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; if sv_battle_object::kind(owner_id) == *FIGHTER_KIND_DEDEDE{ @@ -11,5 +18,7 @@ unsafe extern "C" fn dead_end(weapon: &mut L2CWeaponCommon) -> L2CValue{ } pub fn install(agent: &mut Agent){ + agent.status(Pre, *WEAPON_DEDEDE_GORDO_STATUS_KIND_FALL, fall_pre); + agent.status(End, *WEAPON_DEDEDE_GORDO_STATUS_KIND_DEAD, dead_end); } \ No newline at end of file diff --git a/fighters/dedede/src/lib.rs b/fighters/dedede/src/lib.rs index fb29671432..b4176cca2f 100644 --- a/fighters/dedede/src/lib.rs +++ b/fighters/dedede/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/demon/Cargo.toml b/fighters/demon/Cargo.toml index d040ec2eae..57271662fc 100644 --- a/fighters/demon/Cargo.toml +++ b/fighters/demon/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -smash2 = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/demon/src/acmd/aerials.rs b/fighters/demon/src/acmd/aerials.rs index 238335d356..364df6742b 100644 --- a/fighters/demon/src/acmd/aerials.rs +++ b/fighters/demon/src/acmd/aerials.rs @@ -9,17 +9,15 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 10.0, 280, 75, 0, 70, 4.5, 4.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 10.0, 300, 86, 0, 7, 4.5, 4.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 8.0, 65, 85, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 8.0, 65, 85, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 300, 40, 0, 40, 2.8, 0.0, 6.0, 9.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 65, 85, 0, 40, 4.5, 0.0, 6.0, 9.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 65, 85, 0, 40, 3.0, 0.0, 9.0, 6.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); } wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear(boma, 0, false); - ATTACK(agent, 1, 0, Hash40::new("arml"), 6.0, 65, 85, 0, 30, 4.0, 4.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 6.0, 65, 85, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 6.0, 65, 85, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 65, 85, 0, 30, 4.5, 0.0, 6.0, 9.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 65, 85, 0, 30, 3.0, 0.0, 9.0, 6.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); } frame(lua_state, 17.0); if is_excute(agent) { @@ -40,20 +38,20 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 45, 64, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legl"), 9.0, 45, 64, 0, 40, 3.5, 1.75, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 11.0, 45, 75, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneel"), 11.0, 45, 75, 0, 40, 4.0, 6.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("toel"), 11.0, 45, 75, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - + ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 45, 64, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legl"), 9.0, 45, 64, 0, 40, 3.5, 1.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 11.0, 45, 75, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneel"), 11.0, 45, 75, 0, 40, 4.0, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("toel"), 11.0, 45, 75, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } wait(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 45, 70, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legl"), 8.0, 45, 70, 0, 40, 3.5, 1.75, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 8.0, 45, 70, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneel"), 8.0, 45, 70, 0, 40, 4.0, 6.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("toel"), 8.0, 45, 70, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 45, 70, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legl"), 8.0, 45, 70, 0, 40, 3.5, 1.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 8.0, 45, 70, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneel"), 8.0, 45, 70, 0, 40, 4.0, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("toel"), 8.0, 45, 70, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 5.0); if is_excute(agent) { @@ -71,39 +69,18 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - // VarModule::off_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK); - } - // // will turn Kazuya around if holding the button - // frame(lua_state, 6.0); - // if is_excute(agent) { - // if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_ATTACK) { - // VarModule::on_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK); - // MotionModule::set_rate(boma, (7.5-6.0)/2.0); - // } - // } - // frame(lua_state, 7.5); - // if is_excute(agent) { - // if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK){ - // MotionModule::set_rate(boma, (8.0-7.5)/1.0); - // } - // } - // frame(lua_state, 8.0); - // if is_excute(agent) { - // if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK){ - // MotionModule::set_rate(boma, 1.0); - // } - // } + } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0,Hash40::new("legr"), 14.0, 40, 74, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0,Hash40::new("kneer"), 16.0, 40, 74, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0,Hash40::new("toer"), 16.0, 40, 74, 0, 40, 3.0, -0.3, -1.0, 1.2, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0,Hash40::new("legr"), 14.0, 40, 74, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0,Hash40::new("kneer"), 16.0, 40, 74, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0,Hash40::new("toer"), 16.0, 40, 74, 0, 40, 3.0, -0.3, -1.0, 1.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0,Hash40::new("legr"), 10.0, 40, 74, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0,Hash40::new("kneer"), 10.0, 40, 74, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0,Hash40::new("toer"), 10.0, 40, 74, 0, 40, 3.0, -0.3, -1.0, 1.2, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0,Hash40::new("legr"), 10.0, 40, 74, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0,Hash40::new("kneer"), 10.0, 40, 74, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0,Hash40::new("toer"), 10.0, 40, 74, 0, 40, 3.0, -0.3, -1.0, 1.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 5.0); if is_excute(agent) { @@ -122,31 +99,30 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 3.0); - FT_MOTION_RATE_RANGE(agent, 3.0, 3.5, 1.0); + FT_MOTION_RATE(agent, 4.0 / 1.5); frame(lua_state, 3.5); FT_MOTION_RATE_RANGE(agent, 3.5, 4.0, 1.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 75, 70, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 8.0, 75, 70, 0, 50, 3.5, 1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 75, 70, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 11.0, 77, 83, 0, 60, 3.5, 5.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("toer"), 11.0, 77, 83, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 75, 70, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 8.0, 75, 70, 0, 50, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 75, 70, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 11.0, 77, 83, 0, 60, 3.5, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("toer"), 11.0, 77, 83, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 4.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("kneer"), 11.0, 77, 83, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 11.0, 77, 83, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 75, 70, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 8.0, 75, 70, 0, 50, 3.5, 1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 75, 70, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 8.0, 77, 75, 0, 50, 3.5, 5.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("toer"), 8.0, 77, 75, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 75, 70, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 8.0, 75, 70, 0, 50, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 75, 70, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 8.0, 77, 75, 0, 50, 3.5, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("toer"), 8.0, 77, 75, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 10.0); if is_excute(agent) { @@ -159,6 +135,91 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_KEEP_AIR); + } + frame(lua_state, 1.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.5); + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + SET_SPEED_EX(agent, 0, 2.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + WorkModule::on_flag(boma, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); + } + frame(lua_state, 4.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + SET_SPEED_EX(agent, 0, 2, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + } + frame(lua_state, 7.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + SET_SPEED_EX(agent, 0, 1.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + } + frame(lua_state, 10.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + SET_SPEED_EX(agent, 0, 1, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + } + frame(lua_state, 13.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + SET_SPEED_EX(agent, 0, 0.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + } + frame(lua_state, 16.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.0); + } + frame(lua_state, 17.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + SET_SPEED_EX(agent, 0, -1, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + } + frame(lua_state, 20.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + SET_SPEED_EX(agent, 0, -2, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + } + frame(lua_state, 22.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("legl"), 15.0, 48, 60, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 15.0, 48, 60, 0, 70, 4.0, -0.5, -2.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 15.0, 48, 60, 0, 70, 5.5, -1.0, -0.5, 3.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 24.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + SET_SPEED_EX(agent, 0, -3.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_KEEP_AIR); + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } + frame(lua_state, 25.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("legl"), 15.0, 48, 60, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 15.0, 48, 60, 0, 70, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 15.0, 48, 60, 0, 70, 5.5, -0.2, -0.5, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 45.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 55.0); + if is_excute(agent) { + WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); @@ -167,4 +228,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairb", game_attackairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); + + agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); } diff --git a/fighters/demon/src/acmd/ground.rs b/fighters/demon/src/acmd/ground.rs index fe9a50a939..8b5d464921 100644 --- a/fighters/demon/src/acmd/ground.rs +++ b/fighters/demon/src/acmd/ground.rs @@ -3,693 +3,69 @@ use super::*; unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 4.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - } - frame(lua_state, 8.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_NORMAL); - } - frame(lua_state, 13.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - } - frame(lua_state, 14.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 14.0, 44, 73, 0, 45, 3.5, 0.0, 0.0, -1.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 44, 73, 0, 45, 2.5, 0.0, 12.0, 6.0, Some(0.0), Some(2.5), Some(1.5), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footl"), 16.0, 44, 76, 0, 45, 2.5, 0.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("footl"), 16.0, 44, 76, 0, 45, 4.5, 0.5, -1.0, -1.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("hip"), 14.0, 44, 73, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 18.0); - if is_excute(agent) { - AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 0, Hash40::new("kneel"), 10.0, 94, 69, 0, 45, 3.5, 0.0, 0.0, -1.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footl"), 10.0, 94, 69, 0, 45, 2.5, 0.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("footl"), 10.0, 94, 69, 0, 45, 4.5, 0.5, -1.0, -1.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("hip"), 10.0, 94, 69, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 25.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn game_attackstand1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 6.0); - if is_excute(agent) { - shield!(agent, *MA_MSC_CMD_SHIELD_ON, *COLLISION_KIND_REFLECTOR, *FIGHTER_DEMON_REFLECTOR_KIND_ATTACK_STAND1, *FIGHTER_DEMON_REFLECTOR_GROUP_ATTACK_STAND1); - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - } - frame(lua_state, 10.0); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(1.0, 0.0, 0.0)); - } - frame(lua_state, 11.0); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.2, 0.0, 0.0)); - // Ground-only - ATTACK(agent, 0, 0, Hash40::new("kneel"), 13.0, 275, 40, 0, 95, 3.8, 6.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 13.0, 275, 40, 0, 95, 3.8, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legl"), 13.0, 275, 40, 0, 95, 4.2, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - // Air-only - ATTACK(agent, 3, 0, Hash40::new("kneel"), 13.0, 84, 40, 0, 78, 3.8, 6.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneel"), 13.0, 84, 40, 0, 78, 3.8, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("legl"), 13.0, 84, 40, 0, 78, 4.2, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame_revised(boma, 3, 10.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 4, 10.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 5, 10.0, false); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 3, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 4, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 5, 1.1); - } frame(lua_state, 12.0); if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.2, 0.0, 0.0)); - } - frame(lua_state, 13.0); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.2, 0.0, 0.0)); - } - frame(lua_state, 14.0); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.2, 0.0, 0.0)); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 14.0, 80, 80, 0, 30, 3.8, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 14.0, 80, 80, 0, 30, 3.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legl"), 14.0, 80, 80, 0, 30, 3.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 15.0); if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.2, 0.0, 0.0)); - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); AttackModule::clear_all(boma); } - frame(lua_state, 17.0); - if is_excute(agent) { - shield!(agent, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, *FIGHTER_DEMON_REFLECTOR_KIND_ATTACK_STAND1, *FIGHTER_DEMON_REFLECTOR_GROUP_ATTACK_STAND1); - } } -// Triple Spin Kicks - -unsafe extern "C" fn game_attackstand21(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 3.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } - frame(lua_state, 5.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - } - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_NORMAL); - } - frame(lua_state, 15.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 0, 50, 60, 0, 4.0, 0.0, 11.0, 10.5, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 0, 50, 60, 0, 4.0, 0.0, 12.0, 2.0, Some(0.0), Some(11.5), Some(7.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 10, 40, 100, 0, 4.0, 0.0, 14.0, 3.0, Some(0.0), Some(13.0), Some(9.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame_revised(boma, 0, 19.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 19.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 19.0, false); - } - frame(lua_state, 18.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_NORMAL); - AttackModule::clear_all(boma); - } - frame(lua_state, 21.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_2_FLAG_CHECK_STEP); - } - } -} - -unsafe extern "C" fn game_attackstand22(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - if !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } - } - frame(lua_state, 2.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - KineticModule::add_speed(boma, &Vector3f::new(-0.1, 0.0, 0.0)); - //FT_MOTION_RATE(fighter, 9.0/(15.0-2.0)); - } - } - frame(lua_state, 10.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 65, 100, 40, 0, 2.0, 0.0, 4.0, 9.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 65, 100, 40, 0, 4.0, 0.0, 5.25, 3.0, Some(0.0), Some(4.0), Some(7.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 15, 100, 30, 0, 4.0, 0.0, 8.5, 3.0, Some(0.0), Some(7.5), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame_revised(boma, 0, 19.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 19.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 19.0, false); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.0); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 2.0); - } - - } - frame(lua_state, 11.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 65, 100, 40, 0, 2.0, 0.0, 4.5, 12.0, Some(0.0), Some(4.4), Some(12.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 65, 100, 40, 0, 4.0, 0.0, 5.75, 3.0, Some(0.0), Some(4.2), Some(11.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 15, 100, 30, 0, 4.0, 0.0, 8.0, 3.0, Some(0.0), Some(7.0), Some(9.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame_revised(boma, 0, 19.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 19.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 19.0, false); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.0); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 2.0); - } - } - frame(lua_state, 12.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 15.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_2_FLAG_CHECK_STEP); - } - } -} - -unsafe extern "C" fn game_attackstand23(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - if !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } - } - frame(lua_state, 15.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 75, 100, 40, 0, 2.0, 0.0, 4.5, 11.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 75, 100, 40, 0, 4.0, 0.0, 5.75, 3.0, Some(0.0), Some(4.2), Some(11.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 70, 100, 40, 0, 4.0, 0.0, 7.75, 3.0, Some(0.0), Some(6.2), Some(11.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame_revised(boma, 0, 19.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 19.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 19.0, false); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.0); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 2.0); - } - } - frame(lua_state, 17.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 20.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_2_FLAG_CHECK_STEP); - } - } -} - -unsafe extern "C" fn game_attackstand24(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STEP2S_SPINNING_DEMON){ - FT_MOTION_RATE_RANGE(agent, 1.0, 13.0, 8.0); - } - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 13.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STEP2S_SPINNING_DEMON){ - ATTACK(agent, 0, 0, Hash40::new("top"), 12.5, 44, 70, 0, 75, 2.0, 0.0, 13.0, 12.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.5, 44, 70, 0, 75, 4.0, 0.0, 11.0, 4.0, Some(0.0), Some(12.0), Some(12.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.5, 44, 70, 0, 75, 4.0, 0.0, 12.5, 4.0, Some(0.0), Some(13.5), Some(12.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 12.5, 44, 70, 0, 75, 3.0, 0.0, 7.0, 4.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - else{ - ATTACK(agent, 0, 0, Hash40::new("top"), 10.5, 53, 86, 0, 83, 2.0, 0.0, 13.0, 12.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.5, 53, 86, 0, 83, 4.0, 0.0, 11.0, 4.0, Some(0.0), Some(12.0), Some(12.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 10.5, 53, 86, 0, 83, 4.0, 0.0, 12.5, 4.0, Some(0.0), Some(13.5), Some(12.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 10.5, 53, 86, 0, 83, 3.0, 0.0, 7.0, 4.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - } - frame(lua_state, 16.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -// Tsunami Kick - -unsafe extern "C" fn game_attackstand31(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 4.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -2, 0, -1, 0, 0, 0, 0.75, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 90, 120, 61, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 90, 120, 61, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.0, 90, 120, 61, 0, 3.5, 6.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 6.0, 90, 120, 61, 0, 3.5, 0.0, 14.0, 8.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("top"), 6.0, 90, 120, 61, 0, 3.5, 0.0, 12.0, 4.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("top"), 6.0, 90, 120, 61, 0, 3.5, 0.0, 14.0, 8.0, Some(0.0), Some(4.2), Some(3.5), 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame_revised(boma, 0, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 3, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 4, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 5, 7.0, false); - } - frame(lua_state, 9.0); - if is_excute(agent) { - AttackModule::clear(boma, 5, false); - } - frame(lua_state, 12.0); - if is_excute(agent) { - //JostleModule::set_push_speed_x_overlap_rate_status(boma, 0.0); - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_3_FLAG_CHECK_STEP); - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - } - frame(lua_state, 23.0); - FT_MOTION_RATE_RANGE(agent, 23.0, 36.0, 12.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } - frame(lua_state, 36.0); - FT_MOTION_RATE(agent, 1.0); - -} - -unsafe extern "C" fn game_attackstand32(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 5.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("kneer"), 6.0, 115, 65, 0, 70, 4.0, 6.0, 0.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 115, 65, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 6.0, 115, 65, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 17.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - } - frame(lua_state, 20.0); - FT_MOTION_RATE_RANGE(agent, 20.0, 42.0, 15.0); - frame(lua_state, 42.0); - FT_MOTION_RATE(agent, 1.0); -} - -// Stature Smash - -unsafe extern "C" fn game_attackstand4(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 2.0); - FT_MOTION_RATE_RANGE(agent, 2.0, 12.0, 8.0); - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 0, 2, 0, 35, 2.0, 0.0, 8.0, 8.0, None, None, None, 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 1.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 0, 2, 0, 35, 3.6, 0.0, 7.0, 9.0, None, None, None, 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 1.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 0, 2, 0, 35, 3.2, 0.0, 9.5, 1.5, Some(0.0), Some(7.0), Some(9.0), 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 1.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.7); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.7); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.7); - } - frame(lua_state, 14.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 0, 2, 0, 35, 2.0, 0.0, 6.5, 5.5, Some(0.0), Some(6.4), Some(5.5), 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 1.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 0, 2, 0, 35, 3.6, 0.0, 4.5, 6.5, None, None, None, 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 1.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 0, 2, 0, 35, 3.2, 0.0, 9.5, 1.5, Some(0.0), Some(4.5), Some(6.5), 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 1.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.7); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.7); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.7); - } - frame(lua_state, 15.0); - FT_MOTION_RATE_RANGE(agent, 15.0, 39.0, 21.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - } - frame(lua_state, 39.0); - FT_MOTION_RATE(agent, 1.0); - -} - -// Flash Tornado - -unsafe extern "C" fn game_attackstand5(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 4.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 6.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - } - frame(lua_state, 9.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 10.0); if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_HI3_SLAUGHTER_HIGH_KICK){ - ATTACK(agent, 0, 0, Hash40::new("legr"), 8.0, 62, 65, 0, 70, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 62, 65, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 62, 65, 0, 70, 3.5, 6.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.0, 62, 65, 0, 70, 5.2, 0.0, 13.5, 5.5, Some(0.0), Some(16.72), Some(10.5), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - else{ - ATTACK(agent, 0, 0, Hash40::new("legr"), 11.0, 46, 70, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.45, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 11.0, 46, 70, 0, 60, 3.0, 2.0, 0.0, 0.0, None, None, None, 0.45, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 13.0, 46, 80, 0, 55, 3.5, 1.0, 0.0, 0.0, None, None, None, 0.45, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 13.0, 46, 80, 0, 55, 3.5, 6.0, 0.0, 0.0, None, None, None, 0.45, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("top"), 11.0, 46, 70, 0, 60, 4.0, 0.0, 9.5, 4.5, None, None, None, 0.45, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("top"), 13.0, 46, 80, 0, 55, 5.2, 0.0, 10.5, 5.5, Some(0.0), Some(13.72), Some(10.5), 0.45, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - } - frame(lua_state, 14.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - } - frame(lua_state, 15.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_HI3_SLAUGHTER_HIGH_KICK){ - VarModule::off_flag(boma.object(), vars::demon::instance::ATTACK_HI3_SLAUGHTER_HIGH_KICK); - FT_DESIRED_RATE(agent, 35.0-15.0, 18.0); - } + EFFECT_ALPHA(agent, Hash40::new("demon_attack_arc"), Hash40::new("top"), 1.5, 14.2, 4.5, 0, -63, 90, 0.7, 0, 0, 0, 0, 0, 0, true, 0.7); + LAST_EFFECT_SET_RATE(agent, 1.1); } } -// Jumping Side Kick - -unsafe extern "C" fn game_attackstand6(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 6.0); - if is_excute(agent) { - //WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_6_FLAG_KEEP_SITUATION_AIR); - //WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_6_FLAG_IGNORE_CHANGE_FALL); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - } frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 12.0, 48, 65, 0, 72, 5.0, 6.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 48, 65, 0, 72, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legl"), 12.0, 48, 65, 0, 72, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 12.0, 48, 65, 0, 72, 3.0, 0.0, 11.5, 8.0, Some(0.0), Some(3.0), Some(3.0), 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 14.0); - if is_excute(agent) { - AttackModule::clear(boma, 3, false); - } - frame(lua_state, 16.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 10.0, 48, 65, 0, 72, 4.0, 5.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 48, 65, 0, 72, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legl"), 10.0, 48, 65, 0, 72, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 18.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_NORMAL); - AttackModule::clear_all(boma); - } - frame(lua_state, 20.0); - if is_excute(agent) { - //WorkModule::off_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_6_FLAG_KEEP_SITUATION_AIR); - } - frame(lua_state, 21.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - //WorkModule::off_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_6_FLAG_IGNORE_CHANGE_FALL); + PLAY_SE(agent, Hash40::new("se_demon_attackstand1")); + PLAY_SEQUENCE(agent, Hash40::new("seq_demon_rnd_attack_s_03")); } } -// Tombstone Crusher - -unsafe extern "C" fn game_attacksquat1(agent: &mut L2CAgentBase) { +unsafe extern "C" fn expression_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 13.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("top"), 16.5, 48, 64, 0, 70, 2.5, 0.0, 10.5, 5.5, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 16.5, 48, 64, 0, 70, 4.0, 0.0, 10.5, 5.5, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 16.5, 48, 64, 0, 70, 3.5, 0.0, 3.5, 0.0, Some(0.0), Some(10.5), Some(5.5), 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.1); - } - frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 16.5, 48, 64, 0, 70, 2.5, 0.0, 7.0, 10.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 16.5, 48, 64, 0, 70, 4.0, 0.0, 7.0, 10.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 16.5, 48, 64, 0, 70, 3.5, 0.0, 3.5, 0.0, Some(0.0), Some(7.0), Some(10.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.1); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.1); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + RUMBLE_HIT(agent, Hash40::new("rbkind_80_attackm"), 0); } - frame(lua_state, 16.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_NORMAL); - } - frame(lua_state, 19.0); - if is_excute(agent) { - HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); - } -} - -// Crouch Jab - -unsafe extern "C" fn game_attacksquat2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 5.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - } - frame(lua_state, 6.0); - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 77, 12, 0, 40, 2.0, 0.0, 9.0, 13.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 77, 12, 0, 40, 3.4, 0.0, 9.0, 12.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 77, 12, 0, 40, 3.0, 0.0, 9.0, 5.0, Some(0.0), Some(9.0), Some(12.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 100, 30, 0, 3.0, 0.0, 3.0, 5.0, Some(0.0), Some(3.0), Some(12.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - AttackModule::set_down_only(boma, 0, true); - AttackModule::set_add_reaction_frame_revised(boma, 1, 12.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 12.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 3, 12.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 0, 18.0, false); - } - frame(lua_state, 8.0); - if is_excute(agent) { - HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - } - frame(lua_state, 15.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO_INPUT); - } -} - -// Crouching Spin Kick - -unsafe extern "C" fn game_attacksquat3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 5.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 78, 20, 0, 80, 4.0, 0.0, 0.0, -0.25, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 78, 20, 0, 80, 4.5, 0.0, 0.0, -2.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 78, 20, 0, 80, 4.5, 4.0, 0.0, -2.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - //AttackModule::set_add_reaction_frame_revised(boma, 0, 10.0, false); - //AttackModule::set_add_reaction_frame_revised(boma, 1, 10.0, false); - //AttackModule::set_add_reaction_frame_revised(boma, 2, 10.0, false); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.5); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.5); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.5); - } - frame(lua_state, 16.0); - FT_MOTION_RATE_RANGE(agent, 16.0, 35.0, 14.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - } - frame(lua_state, 35.0); - FT_MOTION_RATE(agent, 1.0); - -} - -// Demon God Fist - -unsafe extern "C" fn game_attacksquat4(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - JostleModule::set_team(boma, 1); - ATTACK(agent, 0, 1, Hash40::new("top"), 0.0, 361, 0, 0, 0, 6.0, 0.0, 6.25, 13.0, Some(0.0), Some(6.25), Some(23.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - //ATTACK(fighter, 1, 1, Hash40::new("top"), 0.0, 361, 0, 0, 0, 6.0, 0.0, 6.25, 13.0, Some(0.0), Some(6.25), Some(18.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - } - frame(lua_state, 6.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - } - frame(lua_state, 7.0); + frame(lua_state, 4.0); if is_excute(agent) { - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD){ - KineticModule::add_speed(boma, &Vector3f::new(1.0, 0.0, 0.0)); - } - AttackModule::clear_all(boma); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_R, 2); } - frame(lua_state, 12.0); + frame(lua_state, 17.0); if is_excute(agent) { - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD){ - KineticModule::add_speed(boma, &Vector3f::new(-1.0, 0.0, 0.0)); - } - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 65, 50, 0, 40, 2.0, 0.0, 11.25, 9.0, None, None, None, 2.5, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down2"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKSQUAT4, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 65, 50, 0, 40, 4.0, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(9.0), 2.5, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down2"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKSQUAT4, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 65, 50, 0, 40, 4.0, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(9.0), 2.5, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKSQUAT4, *ATTACK_REGION_PUNCH); - AttackModule::set_attack_level(boma, 2, 2 as u8); - AttackModule::set_add_reaction_frame(boma, 2, 5.0, false); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_no_finish_camera(boma, 0, true, false); - AttackModule::set_no_finish_camera(boma, 1, true, false); - AttackModule::set_no_finish_camera(boma, 2, true, false); + ControlModule::set_rumble(boma, Hash40::new("rbkind_80_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 14.0); + frame(lua_state, 28.0); if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 3); } } pub fn install(agent: &mut Agent) { agent.acmd("game_attackdash", game_attackdash, Priority::Low); - agent.acmd("game_attackstand1", game_attackstand1, Priority::Low); - agent.acmd("game_attackstand21", game_attackstand21, Priority::Low); - agent.acmd("game_attackstand22", game_attackstand22, Priority::Low); - agent.acmd("game_attackstand23", game_attackstand23, Priority::Low); - agent.acmd("game_attackstand24", game_attackstand24, Priority::Low); - agent.acmd("game_attackstand31", game_attackstand31, Priority::Low); - agent.acmd("game_attackstand32", game_attackstand32, Priority::Low); - agent.acmd("game_attackstand4", game_attackstand4, Priority::Low); - agent.acmd("game_attackstand5", game_attackstand5, Priority::Low); - agent.acmd("game_attackstand6", game_attackstand6, Priority::Low); - agent.acmd("game_attacksquat1", game_attacksquat1, Priority::Low); - agent.acmd("game_attacksquat2", game_attacksquat2, Priority::Low); - agent.acmd("game_attacksquat3", game_attacksquat3, Priority::Low); - agent.acmd("game_attacksquat4", game_attacksquat4, Priority::Low); -} \ No newline at end of file + agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); + agent.acmd("sound_attackdash", sound_attackdash, Priority::Low); + agent.acmd("expression_attackdash", expression_attackdash, Priority::Low); +} diff --git a/fighters/demon/src/acmd/jabs.rs b/fighters/demon/src/acmd/jabs.rs index a1ec166e02..7eaa00e5cb 100644 --- a/fighters/demon/src/acmd/jabs.rs +++ b/fighters/demon/src/acmd/jabs.rs @@ -3,12 +3,6 @@ use super::*; unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_HI3_DEVASTATOR){ - MotionModule::change_motion(boma, Hash40::new("flash_punch"), 0.0, 1.0, false, 0.0, false, false); - } - } frame(lua_state, 2.0); if is_excute(agent) { FT_DESIRED_RATE(agent, 6.0-2.0, 2.0); @@ -16,10 +10,10 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 80, 100, 25, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 80, 100, 25, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 80, 100, 25, 0, 3.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 80, 100, 25, 0, 4.0, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 70, 100, 40, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 70, 100, 40, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 70, 100, 40, 0, 3.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 70, 100, 40, 0, 4.0, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 10, 0, 30, 3.0, 0.0, 4.0, 3.0, Some(0.0), Some(4.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); AttackModule::set_down_only(boma, 4, false); @@ -47,18 +41,17 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); - JostleModule::set_push_speed_x_overlap_rate(boma, 20.0); - FT_DESIRED_RATE(agent, 7.0-1.0, 4.0); + JostleModule::set_push_speed_x_overlap_rate_status(boma, 20.0); } + FT_DESIRED_RATE(agent, 7.0-1.0, 4.0); frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_COMBO_FLAG_ENABLE_COMBO); - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 75, 100, 25, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 75, 100, 25, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 75, 100, 25, 0, 3.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 75, 100, 25, 0, 4.0, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 70, 100, 35, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 70, 100, 35, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 70, 100, 35, 0, 3.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 70, 100, 35, 0, 4.0, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 10, 0, 30, 3.0, 0.0, 4.0, 3.0, Some(0.0), Some(4.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); AttackModule::set_down_only(boma, 4, false); @@ -70,7 +63,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { } wait(lua_state, 3.0); if is_excute(agent) { - JostleModule::set_push_speed_x_overlap_rate(boma, 0.0); + JostleModule::set_push_speed_x_overlap_rate_status(boma, 0.0); AttackModule::clear_all(boma); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_NO_HIT_COMBO); @@ -90,7 +83,6 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - JostleModule::set_team(boma, 1); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 6.0); @@ -116,7 +108,6 @@ unsafe extern "C" fn game_attack14(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - JostleModule::set_team(boma, 1); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 10.0); @@ -140,7 +131,6 @@ unsafe extern "C" fn game_attack15(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - JostleModule::set_team(boma, 1); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 11.0); @@ -169,7 +159,6 @@ unsafe extern "C" fn game_attack16(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - JostleModule::set_team(boma, 1); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 23.0); @@ -210,7 +199,6 @@ unsafe extern "C" fn game_attack17(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - JostleModule::set_team(boma, 1); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 13.0); @@ -236,7 +224,6 @@ unsafe extern "C" fn game_attack18(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - JostleModule::set_team(boma, 1); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 18.0); @@ -264,7 +251,6 @@ unsafe extern "C" fn game_attack19(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - JostleModule::set_team(boma, 1); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 15.0); @@ -289,10 +275,6 @@ unsafe extern "C" fn game_attack19(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attack110(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } frame(lua_state, 28.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 53, 65, 0, 60, 2.0, 0.0, 16.0, 7.0, Some(0.0), Some(14.0), Some(6.5), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); @@ -308,23 +290,6 @@ unsafe extern "C" fn game_attack110(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_flashpunch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 2.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_HI3_DEVASTATOR){ - ATTACK(agent, 0, 1, Hash40::new("top"), 0.0, 368, 100, 40, 0, 7.0, 0.0, 15.0, 5.0, Some(0.0), Some(7.0), Some(5.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 1, Hash40::new("top"), 0.0, 368, 100, 40, 0, 7.0, 0.0, 15.0, 0.0, Some(0.0), Some(7.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - let x_pos = 13.0; - let y_pos = 6.0; - AttackModule::set_vec_target_pos(boma, 0, smash::phx::Hash40::new("top"), &Vector2f::new(x_pos, y_pos), 4, false); - AttackModule::set_vec_target_pos(boma, 1, smash::phx::Hash40::new("top"), &Vector2f::new(x_pos, y_pos), 4, false); - } - else{ - ATTACK(agent, 0, 1, Hash40::new("top"), 0.0, 361, 100, 35, 0, 4.0, 0.0, 5.0, 4.0, Some(0.0), Some(5.0), Some(5.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_auto_shift"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - } - } frame(lua_state, 7.0); if is_excute(agent) { if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_HI3_DEVASTATOR){ @@ -358,4 +323,4 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attack19", game_attack19, Priority::Low); agent.acmd("game_attack110", game_attack110, Priority::Low); agent.acmd("game_flashpunch", game_flashpunch, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/demon/src/acmd/mod.rs b/fighters/demon/src/acmd/mod.rs index 8f58255a0a..d84175a779 100644 --- a/fighters/demon/src/acmd/mod.rs +++ b/fighters/demon/src/acmd/mod.rs @@ -6,6 +6,9 @@ mod tilts; mod smashes; mod aerials; mod specials; +mod stand; +mod step; +mod squat; mod throws; mod other; @@ -16,6 +19,9 @@ pub fn install(agent: &mut Agent) { smashes::install(agent); aerials::install(agent); specials::install(agent); + stand::install(agent); + step::install(agent); + squat::install(agent); throws::install(agent); other::install(agent); } \ No newline at end of file diff --git a/fighters/demon/src/acmd/other.rs b/fighters/demon/src/acmd/other.rs index 28d7d2b723..0ccf280d63 100644 --- a/fighters/demon/src/acmd/other.rs +++ b/fighters/demon/src/acmd/other.rs @@ -61,16 +61,12 @@ unsafe extern "C" fn sound_dashb(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -81,10 +77,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealsr(agent: &mut L2CAgentBase) { @@ -92,9 +85,6 @@ unsafe extern "C" fn game_appealsr(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 18.0, 11.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } frame(lua_state, 18.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { @@ -151,9 +141,6 @@ unsafe extern "C" fn game_appealsl(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 18.0, 11.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } frame(lua_state, 18.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { diff --git a/fighters/demon/src/acmd/smashes.rs b/fighters/demon/src/acmd/smashes.rs index ca0693ffac..d692a8c8a0 100644 --- a/fighters/demon/src/acmd/smashes.rs +++ b/fighters/demon/src/acmd/smashes.rs @@ -3,10 +3,9 @@ use super::*; unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 10.0); + FighterSpecializer_Demon::set_devil(boma, true, 10.0); frame(lua_state, 1.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); WorkModule::set_int(boma, -1, *FIGHTER_DEMON_STATUS_ATTACK_S4_WORK_INT_CRITICAL_HIT_NO); } FT_MOTION_RATE(agent, 1.0); @@ -16,122 +15,123 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 10.0); + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 10); } frame(lua_state, 10.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 7.0); - + FighterSpecializer_Demon::set_devil(boma, true, 7.0); frame(lua_state, 11.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 5.0); + FighterSpecializer_Demon::set_devil(boma, true, 5.0); frame(lua_state, 13.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 4.0); + FighterSpecializer_Demon::set_devil(boma, true, 4.0); frame(lua_state, 14.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 3.0); + FighterSpecializer_Demon::set_devil(boma, true, 3.0); frame(lua_state, 21.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 25.0); - FT_DESIRED_RATE(agent, 28.0-25.0, 4.0); if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - WorkModule::set_int(boma, 2, *FIGHTER_DEMON_STATUS_ATTACK_S4_WORK_INT_CRITICAL_HIT_NO); - ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 361, 65, 0, 50, 3.0, 0.0, 6.0, 4.0, Some(0.0), Some(13.0), Some(4.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 20.0, 361, 65, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handl"), 25.0, 361, 75, 0, 50, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("arml"), 20.0, 361, 65, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + WorkModule::set_int(boma, 1, *FIGHTER_DEMON_STATUS_ATTACK_S4_WORK_INT_CRITICAL_HIT_NO); + ATTACK(agent, 0, 0, Hash40::new("top"), 23.0, 361, 63, 0, 50, 3.0, 0.0, 8.5, 4.0, Some(0.0), Some(13.5), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handl"), 26.0, 361, 73, 0, 50, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.1); ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.75); } - frame(lua_state, 28.0); + wait(lua_state, 2.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); - if !WorkModule::is_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_S4_FLAG_HIT) { + } + if !WorkModule::is_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_S4_FLAG_HIT) { + if is_excute(agent) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } frame(lua_state, 51.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 4.0); + FighterSpecializer_Demon::set_devil(boma, true, 4.0); frame(lua_state, 53.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 5.0); + FighterSpecializer_Demon::set_devil(boma, true, 5.0); frame(lua_state, 57.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 6.0); + FighterSpecializer_Demon::set_devil(boma, true, 6.0); frame(lua_state, 58.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 7.0); + FighterSpecializer_Demon::set_devil(boma, true, 7.0); frame(lua_state, 59.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 8.0); + FighterSpecializer_Demon::set_devil(boma, true, 8.0); frame(lua_state, 61.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, false, 0.0); + FighterSpecializer_Demon::set_devil(boma, false, 0.0); } unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 10.0); + FighterSpecializer_Demon::set_devil(boma, true, 10.0); frame(lua_state, 1.0); - FT_DESIRED_RATE(agent, 14.0-1.0, 9.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } + FT_MOTION_RATE(agent, 0.7); frame(lua_state, 7.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 9.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 7.0); + FighterSpecializer_Demon::set_devil(boma, true, 7.0); if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 6.0); + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 6); } + frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 0.6); frame(lua_state, 12.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 6.0); - frame(lua_state, 14.0); - FT_MOTION_RATE(agent, 1.0); + FighterSpecializer_Demon::set_devil(boma, true, 6.0); frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0.0); + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + } + frame(lua_state, 17.0); + if is_excute(agent) { HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("handr"), 19.0, 90, 62, 0, 65, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 19.0, 90, 62, 0, 65, 4.75, 0.0, 9.0, 7.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 19.0, 90, 62, 0, 65, 3.5, 0.0, 11.0, 3.5, Some(0.0), Some(8.0), Some(2.0), 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handr"), 19.0, 90, 62, 0, 65, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 19.0, 90, 62, 0, 65, 4.75, 0.0, 9.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 19.0, 90, 62, 0, 65, 3.5, 0.0, 11.0, 3.5, Some(0.0), Some(8.0), Some(2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); } frame(lua_state, 18.0); if is_excute(agent) { AttackModule::clear(boma, 2, false); - ATTACK(agent, 0, 0, Hash40::new("handr"), 19.0, 90, 62, 0, 65, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 19.0, 90, 62, 0, 65, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 19.0, 90, 62, 0, 65, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handr"), 19.0, 90, 62, 0, 65, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 19.0, 90, 62, 0, 65, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); } - frame(lua_state, 22.0); + wait(lua_state, 2.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("handr"), 15.0, 90, 62, 0, 65, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 15.0, 90, 62, 0, 65, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_S, false); + } + wait(lua_state, 3.0); if is_excute(agent) { HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); } - frame(lua_state, 23.0); FT_MOTION_RATE(agent, 0.8); + if is_excute(agent) { + AttackModule::clear_all(boma); + } frame(lua_state, 51.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 7.0); + FighterSpecializer_Demon::set_devil(boma, true, 7.0); frame(lua_state, 53.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 8.0); + FighterSpecializer_Demon::set_devil(boma, true, 8.0); frame(lua_state, 54.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 9.0); + FighterSpecializer_Demon::set_devil(boma, true, 9.0); frame(lua_state, 56.0); - smash::app::FighterSpecializer_Demon::set_devil(boma, false, 0.0); + FighterSpecializer_Demon::set_devil(boma, false, 0.0); } unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); smash::app::FighterSpecializer_Demon::set_devil(boma, true, 10.0); - frame(lua_state, 1.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - FT_MOTION_RATE(agent, 0.8); + // frame(lua_state, 1.0); + // FT_MOTION_RATE(agent, 0.8); frame(lua_state, 3.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); @@ -150,16 +150,18 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { smash::app::FighterSpecializer_Demon::set_devil(boma, true, 5.0); frame(lua_state, 16.0); smash::app::FighterSpecializer_Demon::set_devil(boma, true, 3.0); - FT_MOTION_RATE(agent, 1.0); + // FT_MOTION_RATE(agent, 1.0); frame(lua_state, 20.0); if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0.0); HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 277, 10, 0, 100, 4.0, 0.0, 8.2, 11.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 277, 10, 0, 100, 3.0, 0.0, 8.0, 7.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 16.0, 277, 52, 0, 20, 4.0, 0.0, 8.2, 11.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 16.0, 277, 52, 0, 20, 3.0, 0.0, 8.0, 7.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + // Ground Only + ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 277, 100, 100, 0, 4.0, 0.0, 8.2, 11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 277, 100, 100, 0, 3.0, 0.0, 8.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + // Air Only + ATTACK(agent, 2, 0, Hash40::new("top"), 16.0, 277, 52, 0, 13, 4.0, 0.0, 8.2, 11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 16.0, 277, 52, 0, 13, 3.0, 0.0, 8.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::set_add_reaction_frame_revised(boma, 0, 5.0, false); AttackModule::set_add_reaction_frame_revised(boma, 1, 5.0, false); AttackModule::set_add_reaction_frame_revised(boma, 2, 5.0, false); @@ -172,10 +174,12 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 21.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 277, 10, 0, 100, 4.0, 0.0, 6.3, 11.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 277, 10, 0, 100, 3.0, 0.0, 6.3, 7.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 16.0, 277, 52, 0, 20, 4.0, 0.0, 6.3, 11.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 16.0, 277, 52, 0, 20, 3.0, 0.0, 6.3, 7.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + // Ground Only + ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 277, 100, 100, 0, 4.0, 0.0, 6.3, 11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 277, 100, 100, 0, 3.0, 0.0, 6.3, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + // Air Only + ATTACK(agent, 2, 0, Hash40::new("top"), 16.0, 277, 52, 0, 13, 4.0, 0.0, 6.3, 11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 16.0, 277, 52, 0, 13, 3.0, 0.0, 6.3, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::set_add_reaction_frame_revised(boma, 0, 5.0, false); AttackModule::set_add_reaction_frame_revised(boma, 1, 5.0, false); AttackModule::set_add_reaction_frame_revised(boma, 2, 5.0, false); @@ -188,10 +192,12 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 277, 10, 0, 100, 4.0, 0.0, 2.5, 11.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 277, 10, 0, 100, 3.0, 0.0, 3.0, 7.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 277, 60, 0, 20, 4.0, -5.0, 2.5, 11.5, Some(5.0), Some(2.5), Some(11.5), 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 277, 60, 0, 20, 3.0, 0.0, 3.0, 7.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + // Ground Only + ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 277, 100, 100, 0, 4.0, 0.0, 2.5, 11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 277, 100, 100, 0, 3.0, 0.0, 3.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + // Air Only + ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 277, 56, 0, 13, 4.0, -5.0, 2.5, 11.5, Some(5.0), Some(2.5), Some(11.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 277, 56, 0, 13, 3.0, 0.0, 3.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 15, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::set_add_reaction_frame_revised(boma, 0, 5.0, false); AttackModule::set_add_reaction_frame_revised(boma, 1, 5.0, false); AttackModule::set_add_reaction_frame_revised(boma, 2, 5.0, false); @@ -223,6 +229,8 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); + agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); + agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); -} \ No newline at end of file +} diff --git a/fighters/demon/src/acmd/specials.rs b/fighters/demon/src/acmd/specials.rs index d69789a539..972aeb3bd7 100644 --- a/fighters/demon/src/acmd/specials.rs +++ b/fighters/demon/src/acmd/specials.rs @@ -1,565 +1,5 @@ use super::*; -unsafe extern "C" fn game_attackstep(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - FT_MOTION_RATE(agent, 0.8); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - JostleModule::set_team(boma, 1); - } - frame(lua_state, 14.0); - if is_excute(agent) { - HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); - } -} - -// Wind God Fist - -unsafe extern "C" fn game_attackstep2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - JostleModule::set_team(boma, 1); - } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.7); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(0.15, 0.0, 0.0)); - } - frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 10.0); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.15, 0.0, 0.0)); - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("handr"), 13.5, 88, 41, 0, 63, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 13.5, 88, 41, 0, 63, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 13.5, 88, 41, 0, 63, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("bust"), 13.5, 88, 41, 0, 63, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("top"), 13.5, 88, 41, 0, 63, 5.0, 0.0, 13.0, 6.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 0, Hash40::new("top"), 13.5, 88, 41, 0, 63, 3.0, -1.0, 9.0, 3.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.2); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.2); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.2); - ATK_SET_SHIELD_SETOFF_MUL(agent, 3, 1.2); - ATK_SET_SHIELD_SETOFF_MUL(agent, 4, 1.2); - ATK_SET_SHIELD_SETOFF_MUL(agent, 5, 1.2); - AttackModule::set_add_reaction_frame_revised(boma, 0, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 3, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 4, 7.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 5, 7.0, false); - //AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); - //AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); - //AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_M, false); - //AttackModule::set_attack_camera_quake_forced(boma, 3, *CAMERA_QUAKE_KIND_M, false); - //AttackModule::set_attack_camera_quake_forced(boma, 4, *CAMERA_QUAKE_KIND_M, false); - //AttackModule::set_attack_camera_quake_forced(boma, 5, *CAMERA_QUAKE_KIND_M, false); - } - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 0.9); - if is_excute(agent) { - AttackModule::clear(boma, 4, false); - AttackModule::clear(boma, 5, false); - } - frame(lua_state, 14.0); - FT_MOTION_RATE(agent, 0.8); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - } -} - -// Electric Wind God Fist - -unsafe extern "C" fn game_attackstep2f(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - JostleModule::set_team(boma, 1); - } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.7); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(0.15, 0.0, 0.0)); - } - frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 10.0); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.15, 0.0, 0.0)); - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("handr"), 14.5, 86, 9, 0, 98, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.31, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 14.5, 86, 9, 0, 98, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.31, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 14.5, 86, 9, 0, 98, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.31, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("bust"), 14.5, 86, 9, 0, 98, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.31, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("top"), 14.5, 86, 9, 0, 98, 5.0, 0.0, 13.0, 6.0, None, None, None, 0.31, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 0, Hash40::new("top"), 14.5, 86, 9, 0, 98, 3.0, -1.0, 9.0, 3.5, None, None, None, 0.31, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.8); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 2.8); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 2.8); - ATK_SET_SHIELD_SETOFF_MUL(agent, 3, 2.8); - ATK_SET_SHIELD_SETOFF_MUL(agent, 4, 2.8); - ATK_SET_SHIELD_SETOFF_MUL(agent, 5, 2.8); - ATK_SET_SHIELD_SETOFF_MUL_arg3(agent, 0, 5, 1.2); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 2.8); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 2.8); - AttackModule::set_add_reaction_frame_revised(boma, 0, 14.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 14.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 14.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 3, 14.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 4, 14.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 5, 14.0, false); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_S, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_S, false); - AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_S, false); - AttackModule::set_attack_camera_quake_forced(boma, 3, *CAMERA_QUAKE_KIND_S, false); - AttackModule::set_attack_camera_quake_forced(boma, 4, *CAMERA_QUAKE_KIND_S, false); - AttackModule::set_attack_camera_quake_forced(boma, 5, *CAMERA_QUAKE_KIND_S, false); - } - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 0.9); - if is_excute(agent) { - AttackModule::clear(boma, 4, false); - AttackModule::clear(boma, 5, false); - } - frame(lua_state, 14.0); - if is_excute(agent) { - AttackModule::clear(boma, 0, false); - AttackModule::clear(boma, 1, false); - AttackModule::clear(boma, 2, false); - AttackModule::clear(boma, 3, false); - } - frame(lua_state, 15.0); - FT_MOTION_RATE(agent, 0.9); - if is_excute(agent) { - AttackModule::clear(boma, 6, false); - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - } -} - -// Electric Wind God Fist (When Hitting Shield) - -unsafe extern "C" fn game_attackstep2fhitshield(_agent: &mut L2CAgentBase) { - // if is_excute(agent) { - // ATTACK_FP(agent, 6, 1, Hash40::new("top"), 0, 361, 100, 65, 0, 12, 0, 10, 10, Hash40::new("collision_attr_normal"), 0, 0, 0, false, false, 0, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_NONE, *COLLISION_SITUATION_MASK_G, true, *ATTACK_REGION_NONE, *COLLISION_CATEGORY_MASK_FIGHTER, false, *COLLISION_PART_MASK_ALL, false, false, false, false, 0, false, false, *ATTACK_LR_CHECK_POS, false, false, true, true, false, *COLLISION_SHAPE_TYPE_SPHERE); - // } -} - -// Spinning Demon to Left Hook - -unsafe extern "C" fn game_attackstep2s(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 6.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - KineticModule::add_speed(boma, &Vector3f::new(0.1, 0.0, 0.0)); - } - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 3.0, 60, 100, 50, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.4, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 72, 100, 50, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.4, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 3.0, 85, 100, 50, 0, 4.0, 5.0, 0.0, 0.0, None, None, None, 0.4, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame(boma, 0, 20.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 20.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 20.0, false); - } - frame(lua_state, 14.0); - FT_MOTION_RATE_RANGE(agent, 14.0, 33.0, 14.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 33.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.1, 0.0, 0.0)); - FT_MOTION_RATE(agent, 1.0); - ATTACK(agent, 0, 0, Hash40::new("top"), 11.5, 25, 20, 0, 79, 4.0, 0.0, 15.0, 7.0, None, None, None, 0.4, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.5, 25, 20, 0, 79, 5.0, 0.0, 14.0, 9.0, Some(0.0), Some(8.5), Some(9.0), 0.4, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 11.5, 25, 20, 0, 79, 5.0, 0.0, 13.0, 3.5, Some(0.0), Some(5.5), Some(3.5), 0.4, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 11.5, 25, 20, 0, 79, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.4, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("shoulderr"), 11.5, 25, 20, 0, 79, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.4, 0.25, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame(boma, 0, -10.0, false); - AttackModule::set_add_reaction_frame(boma, 1, -10.0, false); - AttackModule::set_add_reaction_frame(boma, 2, -10.0, false); - AttackModule::set_add_reaction_frame(boma, 3, -10.0, false); - AttackModule::set_add_reaction_frame(boma, 4, -10.0, false); - AttackModule::set_attack_camera_quake(boma, 0, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake(boma, 1, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake(boma, 2, *CAMERA_QUAKE_KIND_L, false); - } - frame(lua_state, 36.0); - if is_excute(agent) { - AttackModule::clear(boma, 0, false); - AttackModule::clear(boma, 1, false); - AttackModule::clear(boma, 2, false); - AttackModule::clear(boma, 3, false); - AttackModule::clear(boma, 4, false); - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { - ATTACK(agent, 5, 1, Hash40::new("top"), 0.0, 235, 100, 16, 0, 10.0, 0.0, 10.0, 10.0, Some(0.0), Some(10.0), Some(20.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_PUNCH); - } - } - frame(lua_state, 45.0); - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { - FT_MOTION_RATE(agent, 0.2); - } - else{ - FT_MOTION_RATE(agent, 0.6); - } - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -// Dragon Uppercut - -unsafe extern "C" fn game_attackstep2l(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.9); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } - frame(lua_state, 7.0); - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT){ - FT_MOTION_RATE_RANGE(agent, 7.0, 19.0, 10.0); - } - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - } - frame(lua_state, 19.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 22.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - AttackModule::set_damage_shake_scale(boma, 1.5); - ATTACK(agent, 0, 0, Hash40::new("handl"), 22.0, 60, 65, 0, 80, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 22.0, 60, 65, 0, 80, 5.25, 0.0, 10.5, 4.75, Some(0.0), Some(16.0), Some(7.0), 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 22.0, 60, 65, 0, 80, 5.25, 0.0, 5.0, 2.5, Some(0.0), Some(10.5), Some(4.75), 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.5); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 0.5); - ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 0.5); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_L, false); - } - frame(lua_state, 23.0); - if is_excute(agent) { - AttackModule::clear(boma, 2, false); - AttackModule::set_damage_shake_scale(boma, 1.0); - ATTACK(agent, 0, 0, Hash40::new("handl"), 18.0, 70, 60, 0, 80, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(0.1), 0.17, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 18.0, 70, 60, 0, 80, 5.0, 0.0, 13.0, 3.0, Some(0.0), Some(23.0), Some(3.0), 0.17, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.5); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 0.5); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); - } - frame(lua_state, 24.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handl"), 16.0, 70, 50, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.17, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 70, 50, 0, 60, 5.0, 0.0, 14.0, 3.0, Some(0.0), Some(24.0), Some(3.0), 0.17, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.5); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 0.5); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); - } - frame(lua_state, 25.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - ATTACK(agent, 0, 0, Hash40::new("handl"), 14.0, 70, 50, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 70, 50, 0, 60, 5.0, 0.0, 21.0, 3.0, Some(0.0), Some(24.0), Some(3.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); - } - frame(lua_state, 26.0); - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 70, 50, 0, 60, 5.0, 0.0, 21.5, 3.0, Some(0.0), Some(24.5), Some(3.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); - } - frame(lua_state, 27.0); - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 70, 50, 0, 60, 5.0, 0.0, 22.0, 3.0, Some(0.0), Some(25.0), Some(3.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); - } - frame(lua_state, 28.0); - FT_MOTION_RATE(agent, 0.9); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 10.0); - } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 1.5); - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 5.0); - } - frame(lua_state, 11.0); - if is_excute(agent) { - JostleModule::set_status(boma, false); - } - frame(lua_state, 12.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 4.0); - } - frame(lua_state, 14.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 3.0); - } - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 60, 50, 0, 80, 4.0, 0.0, 8.0, 3.0, Some(0.0), Some(8.0), Some(10.0), 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 60, 50, 0, 80, 4.0, 0.0, 8.0, 3.0, Some(0.0), Some(8.0), Some(10.0), 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - AttackModule::set_no_finish_camera(boma, 0, true, false); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); - } - frame(lua_state, 15.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_SPECIAL_S_FLAG_CHANGE_HIT); - //FT_MOTION_RATE(agent, 30.0/(62.0-15.0)); - } - frame(lua_state, 16.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 1.0); - } - frame(lua_state, 19.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 2.0); - } - frame(lua_state, 21.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } - frame(lua_state, 24.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 3.0); - } - frame(lua_state, 41.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 5.0); - } - frame(lua_state, 58.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 6.0); - } - frame(lua_state, 60.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 7.0); - } - frame(lua_state, 61.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 8.0); - } - frame(lua_state, 62.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, false, 0.0); - //FT_MOTION_RATE(agent, 1.0); - } -} - -unsafe extern "C" fn game_specialsend(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 49.0, 40.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 1.0); - } - frame(lua_state, 4.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 2.0); - } - frame(lua_state, 6.0); - if is_excute(agent) { - JostleModule::set_status(boma, true); - } - frame(lua_state, 9.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 3.0); - } - frame(lua_state, 26.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 5.0); - } - frame(lua_state, 43.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 6.0); - } - frame(lua_state, 45.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 7.0); - } - frame(lua_state, 46.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 8.0); - } - frame(lua_state, 49.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, false, 0.0); - } -} - -unsafe extern "C" fn game_specialairs(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 1.5); - FighterSpecializer_Demon::set_devil(boma, true, 10.0); - if is_excute(agent) { - boma.select_cliff_hangdata_from_name("special_s"); - } - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); - FighterSpecializer_Demon::set_devil(boma, true, 5.0); - frame(lua_state, 12.0); - FighterSpecializer_Demon::set_devil(boma, true, 4.0); - if is_excute(agent) { - JostleModule::set_status(boma, false); - } - frame(lua_state, 14.0); - FighterSpecializer_Demon::set_devil(boma, true, 3.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 60, 50, 0, 80, 4.0, 0.0, 8.0, 3.0, Some(0.0), Some(8.0), Some(10.0), 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 60, 50, 0, 80, 4.0, 0.0, 8.0, 3.0, Some(0.0), Some(8.0), Some(10.0), 0.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - AttackModule::set_no_finish_camera(boma, 0, true, false); - AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); - AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); - } - frame(lua_state, 15.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_SPECIAL_S_FLAG_CHANGE_HIT); - } - frame(lua_state, 16.0); - FighterSpecializer_Demon::set_devil(boma, true, 1.0); - frame(lua_state, 19.0); - FighterSpecializer_Demon::set_devil(boma, true, 2.0); - frame(lua_state, 21.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } - frame(lua_state, 24.0); - FighterSpecializer_Demon::set_devil(boma, true, 3.0); - frame(lua_state, 41.0); - FighterSpecializer_Demon::set_devil(boma, true, 5.0); - frame(lua_state, 58.0); - FighterSpecializer_Demon::set_devil(boma, true, 6.0); - frame(lua_state, 60.0); - FighterSpecializer_Demon::set_devil(boma, true, 7.0); - frame(lua_state, 61.0); - FighterSpecializer_Demon::set_devil(boma, true, 8.0); - frame(lua_state, 62.0); - FighterSpecializer_Demon::set_devil(boma, false, 0.0); -} - -unsafe extern "C" fn game_specialairsend(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - boma.select_cliff_hangdata_from_name("special_s"); - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 1.0); - } - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 49.0, 30.0); - frame(lua_state, 4.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 2.0); - } - frame(lua_state, 8.0); - if is_excute(agent) { - JostleModule::set_status(boma, true); - } - frame(lua_state, 9.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 3.0); - } - frame(lua_state, 10.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_SPECIAL_S_FLAG_AIR_CONTROL); - } - frame(lua_state, 26.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 5.0); - } - frame(lua_state, 30.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_SPECIAL_S_FLAG_LANDING); - } - frame(lua_state, 43.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 6.0); - } - frame(lua_state, 45.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 7.0); - } - frame(lua_state, 46.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, true, 8.0); - } - frame(lua_state, 49.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - smash::app::FighterSpecializer_Demon::set_devil(boma, false, 0.0); - } -} - unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -569,9 +9,9 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 76, 55, 0, 80, 6.0, 0.0, 6.0, 6.0, Some(0.0), Some(11.25), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 76, 55, 0, 80, 6.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("top"), 18.0, 76, 55, 0, 80, 6.0, 0.0, 6.0, -2.5, Some(0.0), Some(10.25), Some(-2.5), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 76, 55, 0, 80, 6.0, 0.0, 6.0, 6.0, Some(0.0), Some(11.25), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 76, 55, 0, 80, 6.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 18.0, 76, 55, 0, 80, 6.0, 0.0, 6.0, -2.5, Some(0.0), Some(10.25), Some(-2.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 2.0); if is_excute(agent) { @@ -580,15 +20,15 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 71, 68, 0, 75, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 71, 68, 0, 75, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 63, 90, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 63, 90, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 60, 90, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 60, 90, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 15.0); if is_excute(agent) { @@ -626,9 +66,9 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 76, 55, 0, 80, 6.0, 0.0, 6.0, 6.0, Some(0.0), Some(11.25), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 76, 55, 0, 80, 6.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("top"), 18.0, 76, 55, 0, 80, 6.0, 0.0, 6.0, -2.5, Some(0.0), Some(10.25), Some(-2.5), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 76, 55, 0, 80, 6.0, 0.0, 6.0, 6.0, Some(0.0), Some(11.25), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 76, 55, 0, 80, 6.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 18.0, 76, 55, 0, 80, 6.0, 0.0, 6.0, -2.5, Some(0.0), Some(10.25), Some(-2.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 2.0); if is_excute(agent) { @@ -637,15 +77,15 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 71, 68, 0, 75, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 71, 68, 0, 75, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 63, 90, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 63, 90, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 60, 90, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 60, 90, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 15.0); if is_excute(agent) { @@ -687,9 +127,9 @@ unsafe extern "C" fn game_specialhiair(agent: &mut L2CAgentBase) { } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 76, 53, 0, 80, 6.0, 0.0, 6.0, 6.0, Some(0.0), Some(11.25), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 76, 53, 0, 80, 6.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("top"), 18.0, 76, 53, 0, 80, 6.0, 0.0, 6.0, -2.5, Some(0.0), Some(10.25), Some(-2.5), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 76, 53, 0, 80, 6.0, 0.0, 6.0, 6.0, Some(0.0), Some(11.25), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 76, 53, 0, 80, 6.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 18.0, 76, 53, 0, 80, 6.0, 0.0, 6.0, -2.5, Some(0.0), Some(10.25), Some(-2.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 2.0); if is_excute(agent) { @@ -698,15 +138,15 @@ unsafe extern "C" fn game_specialhiair(agent: &mut L2CAgentBase) { } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 71, 65, 0, 75, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 71, 65, 0, 75, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 63, 85, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 63, 85, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 60, 85, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 60, 85, 0, 60, 4.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_BODY); } frame(lua_state, 15.0); if is_excute(agent) { @@ -772,7 +212,9 @@ unsafe extern "C" fn effect_specialhistart(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke_s"), Hash40::new("top"), 0.5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke_s"), Hash40::new("top"), 0.5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } } } @@ -781,7 +223,6 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { let boma = agent.boma(); FighterSpecializer_Demon::set_devil(boma, true, 10.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 70, 30, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BODY); } frame(lua_state, 1.0); @@ -850,7 +291,6 @@ unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); FighterSpecializer_Demon::set_devil(boma, true, 10.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 70, 30, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BODY); } frame(lua_state, 1.0); @@ -1131,18 +571,6 @@ unsafe extern "C" fn game_attackragedriveground(agent: &mut L2CAgentBase) { } pub fn install(agent: &mut Agent) { - agent.acmd("game_attackstep", game_attackstep, Priority::Low); - agent.acmd("game_attackstep2", game_attackstep2, Priority::Low); - agent.acmd("game_attackstep2f", game_attackstep2f, Priority::Low); - agent.acmd("game_attackstep2fhitshield", game_attackstep2fhitshield, Priority::Low); - agent.acmd("game_attackstep2s", game_attackstep2s, Priority::Low); - agent.acmd("game_attackstep2l", game_attackstep2l, Priority::Low); - - agent.acmd("game_specials", game_specials, Priority::Low); - agent.acmd("game_specialsend", game_specialsend, Priority::Low); - agent.acmd("game_specialairs", game_specialairs, Priority::Low); - agent.acmd("game_specialairsend", game_specialairsend, Priority::Low); - agent.acmd("game_specialhi", game_specialhi, Priority::Low); agent.acmd("game_specialhiair", game_specialhiair, Priority::Low); agent.acmd("effect_specialhistart", effect_specialhistart, Priority::Low); @@ -1153,4 +581,4 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackragedrive", game_attackragedrive, Priority::Low); agent.acmd("game_attackragedriveground", game_attackragedriveground, Priority::Low); -} \ No newline at end of file +} diff --git a/fighters/demon/src/acmd/squat.rs b/fighters/demon/src/acmd/squat.rs new file mode 100644 index 0000000000..3bf2d98d53 --- /dev/null +++ b/fighters/demon/src/acmd/squat.rs @@ -0,0 +1,146 @@ +use super::*; + +// Crouch Jab + +unsafe extern "C" fn game_attacksquat2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + // For some reason, this animation plays at a faster rate than intended in game by default rn, + // so this motion rate is required to play at the correct speed. + FT_MOTION_RATE(agent, 1.0); + // frame(lua_state, 5.0); + // if is_excute(agent) { + // HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + // } + frame(lua_state, 6.0); + if is_excute(agent) { + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 77, 12, 0, 47, 2.0, 0.0, 9.0, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 77, 12, 0, 47, 3.4, 0.0, 9.0, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 77, 12, 0, 47, 3.0, 0.0, 9.0, 5.0, Some(0.0), Some(9.0), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 270, 10, 60, 0, 3.0, 0.0, 3.0, 5.0, Some(0.0), Some(3.0), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 0, true); + // AttackModule::set_add_reaction_frame_revised(boma, 1, 16.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 2, 16.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 3, 16.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 0, 22.0, false); + } + frame(lua_state, 8.0); + if is_excute(agent) { + // HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + AttackModule::clear_all(boma); + } + frame(lua_state, 15.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO_INPUT); + } +} + +// Tombstone Crusher + +unsafe extern "C" fn game_attacksquat1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 13.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.5, 48, 45, 0, 70, 2.5, 0.0, 10.5, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.5, 48, 45, 0, 70, 4.0, 0.0, 10.5, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 16.5, 48, 45, 0, 70, 3.5, 0.0, 3.5, 0.0, Some(0.0), Some(10.5), Some(5.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + // AttackModule::set_add_reaction_frame(boma, 0, 11.0, false); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.1); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.1); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.1); + } + frame(lua_state, 14.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 16.5, 48, 45, 0, 70, 2.5, 0.0, 7.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.5, 48, 45, 0, 70, 4.0, 0.0, 7.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 16.5, 48, 45, 0, 70, 3.5, 0.0, 3.5, 0.0, Some(0.0), Some(7.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + // AttackModule::set_add_reaction_frame(boma, 0, 11.0, false); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.1); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.1); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.1); + } + frame(lua_state, 16.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + } +} + +// Crouch Spin Kick + +unsafe extern "C" fn game_attacksquat3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 10.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 55, 10, 0, 78, 2.5, 0.0, 6.0, 12.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 55, 10, 0, 78, 4.0, 0.0, 5.0, 13.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 55, 10, 0, 78, 3.6, 0.0, 5.0, 4.0, Some(0.0), Some(5.0), Some(11.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + // AttackModule::set_add_reaction_frame(boma, 0, 9.0, false); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.5); + } + frame(lua_state, 16.0); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + AttackModule::clear_all(boma); + } +} + +// Demon God Fist + +unsafe extern "C" fn game_attacksquat4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + } + frame(lua_state, 6.0); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + } + frame(lua_state, 12.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 361, 50, 0, 60, 2.0, 0.0, 11.25, 9.0, None, None, None, 2.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down2"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKSQUAT4, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 361, 50, 0, 60, 4.0, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(9.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down2"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKSQUAT4, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 68, 100, 56, 0, 4.0, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fist_down2"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKSQUAT4, *ATTACK_REGION_PUNCH); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_no_finish_camera(boma, 0, true, false); + AttackModule::set_no_finish_camera(boma, 1, true, false); + AttackModule::set_no_finish_camera(boma, 2, true, false); + AttackModule::set_add_reaction_frame_revised(boma, 2, 5.0, false); + } + frame(lua_state, 14.0); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + AttackModule::clear_all(boma); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_attacksquat2", game_attacksquat2, Priority::Low); + + agent.acmd("game_attacksquat1", game_attacksquat1, Priority::Low); + + agent.acmd("game_attacksquat3", game_attacksquat3, Priority::Low); + + agent.acmd("game_attacksquat4", game_attacksquat4, Priority::Low); +} diff --git a/fighters/demon/src/acmd/stand.rs b/fighters/demon/src/acmd/stand.rs new file mode 100644 index 0000000000..0b9e229136 --- /dev/null +++ b/fighters/demon/src/acmd/stand.rs @@ -0,0 +1,142 @@ +use super::*; + +// Roundhouse to Triple Spin Kicks + +unsafe extern "C" fn game_attackstand22(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + sv_kinetic_energy!( + set_speed_mul, + agent, + FIGHTER_KINETIC_ENERGY_ID_MOTION, + 0.7, + 0.0 + ); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 65, 100, 40, 0, 2.0, 0.0, 4.0, 9.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 65, 100, 40, 0, 4.0, 0.0, 5.25, 3.0, Some(0.0), Some(4.0), Some(7.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 15, 100, 30, 0, 4.0, 0.0, 8.5, 3.0, Some(0.0), Some(7.5), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 2); + } + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 65, 100, 40, 0, 2.0, 0.0, 4.5, 12.0, Some(0.0), Some(4.4), Some(12.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 65, 100, 40, 0, 4.0, 0.0, 5.75, 3.0, Some(0.0), Some(4.2), Some(11.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 15, 100, 30, 0, 4.0, 0.0, 8.0, 3.0, Some(0.0), Some(7.0), Some(9.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 2); + } + frame(lua_state, 12.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 15.0); + if is_excute(agent) { + WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_2_FLAG_CHECK_STEP); + } +} + +// Tsunami Kicks +unsafe extern "C" fn game_attackstand31(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + JostleModule::set_push_speed_x_overlap_rate_status(boma, 0.1); + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } + frame(lua_state, 7.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); + } + frame(lua_state, 9.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 85, 120, 61, 0, 3.6, 0.0, 17.0, 11.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 85, 120, 61, 0, 4.2, 0.0, 17.0, 11.0, Some(0.0), Some(4.2), Some(3.5), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 85, 120, 61, 0, 4.0, 0.0, 12.0, 4.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 7.0, 70, 120, 21, 0, 4.0, 0.0, 12.0, 4.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("top"), 7.0, 85, 120, 21, 0, 3.6, 0.0, 17.0, 11.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("top"), 7.0, 85, 120, 21, 0, 4.2, 0.0, 17.0, 11.0, Some(0.0), Some(4.2), Some(3.5), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_add_reaction_frame_revised(boma, 0, 4.0, false); + AttackModule::set_add_reaction_frame_revised(boma, 1, 4.0, false); + AttackModule::set_add_reaction_frame_revised(boma, 2, 4.0, false); + AttackModule::set_add_reaction_frame_revised(boma, 3, 8.0, false); + AttackModule::set_add_reaction_frame_revised(boma, 4, 8.0, false); + AttackModule::set_add_reaction_frame_revised(boma, 5, 8.0, false); + } + frame(lua_state, 11.0); + if is_excute(agent) { + JostleModule::set_push_speed_x_overlap_rate_status(boma, 0.0); + AttackModule::clear_all(boma); + WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_STAND_3_FLAG_CHECK_STEP); + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + } + frame(lua_state, 23.0); + if is_excute(agent) { + WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } +} + +unsafe extern "C" fn game_attackstand32(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 13.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 4.2, 0.0, 20.5, 5.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_ignore_ground_shield(boma, 0, true); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 3.4, 0.0, 17.0, 3.5, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_ignore_ground_shield(boma, 1, true); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 3.4, 0.0, 12.0, 1.5, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_ignore_ground_shield(boma, 2, true); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 4.2, 0.0, 20.5, 5.0, Some(0.0), Some(21.5), Some(3.0), 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_ignore_ground_shield(boma, 3, true); + AttackModule::set_no_damage_fly_smoke_all(boma, true, false); + } + frame(lua_state, 14.0); + if is_excute(agent) { + AttackModule::clear(boma, 3, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 4.2, 0.0, 17.0, 10.5, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 3.4, 0.0, 15.0, 6.5, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 3.4, 0.0, 13.0, 3.5, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.5); + AttackModule::set_no_damage_fly_smoke_all(boma, true, false); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 4.2, 0.0, 10.5, 11.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 3.4, 0.0, 10.5, 7.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 350, 5, 0, 79, 3.4, 0.0, 10.5, 4.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.5); + AttackModule::set_no_damage_fly_smoke_all(boma, true, false); + } + frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 43.0, 22.0); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + AttackModule::clear_all(boma); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_attackstand22", game_attackstand22, Priority::Low); + + agent.acmd("game_attackstand31", game_attackstand31, Priority::Low); + + agent.acmd("game_attackstand32", game_attackstand32, Priority::Low); +} diff --git a/fighters/demon/src/acmd/step.rs b/fighters/demon/src/acmd/step.rs new file mode 100644 index 0000000000..bc2bdf77ec --- /dev/null +++ b/fighters/demon/src/acmd/step.rs @@ -0,0 +1,462 @@ +use super::*; + +// Crouch Dash + +unsafe extern "C" fn game_attackstep(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + FT_MOTION_RATE(agent, 0.8); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + } + frame(lua_state, 14.0); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + } +} + +// Wind God Fist + +unsafe extern "C" fn game_attackstep2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + } + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.7); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 10.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + ATTACK(agent, 0, 0, Hash40::new("handr"), 9.0, 90, 0, 0, 95, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 90, 0, 0, 95, 5.0, 0.0, 13.0, 6.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 90, 0, 0, 95, 3.0, -1.0, 9.0, 3.5, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handr"), 7.0, 90, 10, 0, 95, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 7.0, 90, 10, 0, 95, 5.0, 0.0, 13.0, 6.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 5, 0, Hash40::new("top"), 7.0, 90, 10, 0, 95, 3.0, -1.0, 9.0, 3.5, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.2); + // AttackModule::set_add_reaction_frame_revised(boma, 0, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 1, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 2, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 3, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 4, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 5, 6.0, false); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 3, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 4, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 5, *CAMERA_QUAKE_KIND_M, false); + } + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("handr"), 9.0, 90, 0, 0, 95, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 90, 0, 0, 95, 5.0, 0.0, 18.0, 5.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 90, 0, 0, 95, 3.0, -1.0, 13.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handr"), 7.0, 90, 10, 0, 95, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 7.0, 90, 10, 0, 95, 5.0, 0.0, 18.0, 5.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 5, 0, Hash40::new("top"), 7.0, 90, 10, 0, 95, 3.0, -1.0, 13.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.2); + // AttackModule::set_add_reaction_frame_revised(boma, 0, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 1, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 2, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 3, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 4, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 5, 6.0, false); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 3, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 4, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 5, *CAMERA_QUAKE_KIND_M, false); + } + frame(lua_state, 12.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("handr"), 9.0,90, 0, 0, 95, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 90, 0, 0, 95, 5.0, 0.0, 19.0, 5.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 90, 0, 0, 95, 3.0, 0.0, 15.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handr"), 7.0, 90, 10, 0, 95, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 7.0, 90, 10, 0, 95, 5.0, 0.0, 19.0, 5.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 7.0, 90, 10, 0, 95, 3.0, 0.0, 15.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.2); + // AttackModule::set_add_reaction_frame_revised(boma, 0, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 1, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 2, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 3, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 4, 6.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 5, 6.0, false); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 3, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 4, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 5, *CAMERA_QUAKE_KIND_M, false); + } + frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 0.9); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + AttackModule::clear_all(boma); + } +} + +// Electric Wind God Fist + +unsafe extern "C" fn game_attackstep2f(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + } + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.7); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("handr"), 14.0, 94, 0, 0, 101, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 94, 0, 0, 101, 5.0, 0.0, 13.0, 6.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 94, 0, 0, 101, 3.0, -1.0, 9.0, 3.5, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handr"), 11.0, 94, 10, 0, 101, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 11.0, 94, 10, 0, 101, 5.0, 0.0, 13.0, 6.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 5, 0, Hash40::new("top"), 11.0, 94, 10, 0, 101, 3.0, -1.0, 9.0, 3.5, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 6, 0, Hash40::new("top"), 14.0, 94, 0, 0, 101, 4.0, 0.0, 5.0, 6.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 7, 0, Hash40::new("top"), 11.0, 94, 0, 0, 101, 4.0, 0.0, 5.0, 6.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL_arg3(agent, 0, 1.2, 5.0); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.2); + // AttackModule::set_add_reaction_frame_revised(boma, 0, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 1, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 2, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 3, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 4, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 5, 8.0, false); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 3, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 4, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 5, *CAMERA_QUAKE_KIND_L, false); + } + frame(lua_state, 11.0); + if is_excute(agent) { + AttackModule::clear(boma, 6, false); + AttackModule::clear(boma, 7, false); + ATTACK(agent, 0, 0, Hash40::new("handr"), 14.0, 94, 0, 0, 101, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 94, 0, 0, 101, 5.0, 0.0, 18.0, 5.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 94, 0, 0, 101, 3.0, -1.0, 13.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handr"), 11.0, 94, 10, 0, 101, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 11.0, 94, 10, 0, 101, 5.0, 0.0, 18.0, 5.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 5, 0, Hash40::new("top"), 11.0, 94, 10, 0, 101, 3.0, -1.0, 13.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL_arg3(agent, 0, 1.2, 5.0); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.2); + // AttackModule::set_add_reaction_frame_revised(boma, 0, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 1, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 2, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 3, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 4, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 5, 8.0, false); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 3, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 4, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 5, *CAMERA_QUAKE_KIND_L, false); + } + frame(lua_state, 12.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + ATTACK(agent, 0, 0, Hash40::new("handr"), 14.0, 94, 0, 0, 101, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 94, 0, 0, 101, 5.0, 0.0, 19.0, 5.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 94, 0, 0, 101, 3.0, 0.0, 15.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handr"), 11.0, 94, 10, 0, 101, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 11.0, 94, 10, 0, 101, 5.0, 0.0, 19.0, 5.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 5, 0, Hash40::new("top"), 11.0, 94, 10, 0, 101, 3.0, 0.0, 15.0, 7.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL_arg3(agent, 0, 1.2, 5.0); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.2); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 1.2); + // AttackModule::set_add_reaction_frame_revised(boma, 0, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 1, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 2, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 3, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 4, 8.0, false); + // AttackModule::set_add_reaction_frame_revised(boma, 5, 8.0, false); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 3, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 4, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 5, *CAMERA_QUAKE_KIND_L, false); + } + frame(lua_state, 14.0); + if is_excute(agent) { + AttackModule::clear(boma, 0, false); + AttackModule::clear(boma, 1, false); + AttackModule::clear(boma, 2, false); + AttackModule::clear(boma, 3, false); + AttackModule::clear(boma, 4, false); + AttackModule::clear(boma, 5, false); + } + frame(lua_state, 15.0); + if is_excute(agent) { + AttackModule::clear(boma, 6, false); + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + } + FT_MOTION_RATE(agent, 0.9); +} + +unsafe extern "C" fn effect_attackstep2f(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 1.3); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("demon_s_fujinken_elec"), Hash40::new("waist"), 2, 0, 0, 0, 0, 0, 1, true); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT_FOLLOW_ALPHA(agent, Hash40::new("demon_smash_arc"), Hash40::new("top"), 1.7, 13, 1.5, 0, -2, 93, 0.8, true, 0.2); + LAST_EFFECT_SET_COLOR(agent, 0.8, 0.2, 0.8); + LAST_EFFECT_SET_RATE(agent, 2); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("demon_s_fujinken_elec"), false, false); + } +} + +unsafe extern "C" fn game_attackstep2l(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + // FT_MOTION_RATE(agent, 0.9); + frame(lua_state, 7.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + } + // frame(lua_state, 19.0); + // FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 22.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + AttackModule::set_damage_shake_scale(boma, 1.5); + ATTACK(agent, 0, 0, Hash40::new("handl"), 19.0, 60, 65, 0, 80, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 19.0, 60, 65, 0, 80, 5.25, 0.0, 10.5, 4.75, Some(0.0), Some(16.0), Some(7.0), 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 19.0, 60, 65, 0, 80, 5.25, 0.0, 5.0, 2.5, Some(0.0), Some(10.5), Some(4.75), 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 0.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 0.5); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 2, *CAMERA_QUAKE_KIND_L, false); + } + frame(lua_state, 23.0); + if is_excute(agent) { + AttackModule::clear(boma, 2, false); + AttackModule::set_damage_shake_scale(boma, 1.0); + ATTACK(agent, 0, 0, Hash40::new("handl"), 16.0, 70, 60, 0, 80, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(0.1), 0.17, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 70, 60, 0, 80, 5.0, 0.0, 13.0, 3.0, Some(0.0), Some(23.0), Some(3.0), 0.17, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 0.5); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); + } + frame(lua_state, 24.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("handl"), 14.0, 70, 50, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.17, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 70, 50, 0, 60, 5.0, 0.0, 14.0, 3.0, Some(0.0), Some(24.0), Some(3.0), 0.17, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.5); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 0.5); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_L, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_L, false); + } + frame(lua_state, 25.0); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + ATTACK(agent, 0, 0, Hash40::new("handl"), 14.0, 70, 50, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 70, 50, 0, 60, 5.0, 0.0, 21.0, 3.0, Some(0.0), Some(24.0), Some(3.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); + } + frame(lua_state, 26.0); + if is_excute(agent) { + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 70, 50, 0, 60, 5.0, 0.0, 21.5, 3.0, Some(0.0), Some(24.5), Some(3.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); + } + frame(lua_state, 27.0); + if is_excute(agent) { + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 70, 50, 0, 60, 5.0, 0.0, 22.0, 3.0, Some(0.0), Some(25.0), Some(3.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_PUNCH02, *ATTACK_REGION_PUNCH); + AttackModule::set_attack_camera_quake_forced(boma, 0, *CAMERA_QUAKE_KIND_M, false); + AttackModule::set_attack_camera_quake_forced(boma, 1, *CAMERA_QUAKE_KIND_M, false); + } + frame(lua_state, 28.0); + FT_MOTION_RATE(agent, 0.9); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +// Spinning Demon to Left Hook + +unsafe extern "C" fn game_attackstep2s(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 65, 100, 55, 0, 1.0, 0.0, 8.25, 0.5, Some(0.0), Some(2.25), Some(0.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 90, 100, 50, 0, 4.0, 0.0, 5.25, 3.0, Some(0.0), Some(5.25), Some(8.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 65, 100, 55, 0, 4.0, 0.0, 7.5, 3.0, Some(0.0), Some(7.5), Some(7.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_add_reaction_frame(boma, 0, 7.0, false); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 65, 100, 55, 0, 1.0, 0.0, 8.25, 0.5, Some(0.0), Some(2.25), Some(0.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 80, 100, 50, 0, 4.0, 0.0, 5.25, 3.0, Some(0.0), Some(5.25), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_add_reaction_frame(boma, 0, 7.0, false); + } + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 65, 100, 55, 0, 1.0, 0.0, 8.25, 0.5, Some(0.0), Some(2.25), Some(0.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 80, 100, 50, 0, 4.0, 0.0, 5.25, 3.0, Some(0.0), Some(5.25), Some(11.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + AttackModule::set_add_reaction_frame(boma, 0, 7.0, false); + } + frame(lua_state, 12.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 33.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::demon::status::CHECK_STEP_CANCEL); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 44, 55, 0, 50, 2.5, 0.0, 15.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 44, 55, 0, 50, 4.0, 0.0, 14.0, 8.0, Some(0.0), Some(11.5), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 44, 55, 0, 50, 3.5, 0.0, 13.0, 3.5, Some(0.0), Some(8.5), Some(3.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 36.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 3.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::demon::status::ENABLE_STEP_CANCEL); + } +} + +unsafe extern "C" fn game_cancelstep(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + FT_MOTION_RATE(agent, 0.5); +} + +unsafe extern "C" fn effect_cancelstep(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("demon_s_fujinken_step"), Hash40::new("toel"), 0, -1, 1, 0, 0, 0, 1, true); + FLASH(agent, 0.9, 0.1, 0.9, 0.5); + } + frame(lua_state, 3.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + FLASH_FRM(agent, 5, 0.9, 0.1, 0.9, 0); + } + frame(lua_state, 8.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + FLASH(agent, 0.9, 0.1, 0.9, 0.5); + } + frame(lua_state, 13.0); + if is_excute(agent) { + FLASH_FRM(agent, 5, 0.9, 0.1, 0.9, 0); + } + frame(lua_state, 8.0); + if is_excute(agent) { + COL_NORMAL(agent); + } +} + +unsafe extern "C" fn sound_cancelstep(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + PLAY_STEP(agent, Hash40::new("se_demon_step_left_s")); + } + frame(lua_state, 10.0); + if is_excute(agent) { + PLAY_STEP(agent, Hash40::new("se_demon_step_right_l")); + } +} + +unsafe extern "C" fn expression_cancelstep(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ControlModule::set_rumble(boma, Hash40::new("rbkind_80_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_attackstep", game_attackstep, Priority::Low); + + agent.acmd("game_attackstep2", game_attackstep2, Priority::Low); + + agent.acmd("game_attackstep2f", game_attackstep2f, Priority::Low); + agent.acmd("effect_attackstep2f", effect_attackstep2f, Priority::Low); + + agent.acmd("game_attackstep2fhitshield", acmd_stub, Priority::Low); + + agent.acmd("game_attackstep2l", game_attackstep2l, Priority::Low); + + agent.acmd("game_attackstep2s", game_attackstep2s, Priority::Low); + + agent.acmd("game_cancelstep", game_cancelstep, Priority::Low); + agent.acmd("effect_cancelstep", effect_cancelstep, Priority::Low); + agent.acmd("sound_cancelstep", sound_cancelstep, Priority::Low); + agent.acmd("expression_cancelstep", expression_cancelstep, Priority::Low); +} diff --git a/fighters/demon/src/acmd/throws.rs b/fighters/demon/src/acmd/throws.rs index a3edd48c2e..79e66981bb 100644 --- a/fighters/demon/src/acmd/throws.rs +++ b/fighters/demon/src/acmd/throws.rs @@ -4,7 +4,7 @@ use smash2; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } @@ -30,7 +30,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 5.0, Some(0.0), Some(6.6), Some(10.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 6.0, Some(0.0), Some(6.6), Some(10.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -50,7 +50,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -5.0, Some(0.0), Some(6.6), Some(-12.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -6.0, Some(0.0), Some(6.6), Some(-12.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -83,7 +83,7 @@ unsafe extern "C" fn expression_throwhi(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if !smash2::app::FighterCutInManager::is_vr_mode() { @@ -92,20 +92,116 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { FighterSpecializer_Demon::check_disabled_motion_camera_of_scale(boma); FighterSpecializer_Demon::check_disabled_motion_camera_of_stage(boma); } - if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_THROW_MOTION_CAMERA) { - if is_excute(agent) { - CHECK_VALID_START_CAMERA(agent, 0, 7, 0, 35, 0, 0, false); - } - if !WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_THROW_MOTION_CAMERA) { - if !WorkModule::is_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_FINAL_START_CAMERA) { - if is_excute(agent) { - REQ_MOTION_CAMERA(agent, Hash40::new("e01throwb.nuanmb"), false); + let lockout = VarModule::get_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); + if lockout <= 0 { + if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_THROW_MOTION_CAMERA) { + if is_excute(agent) { + CHECK_VALID_START_CAMERA(agent, 0, 7, 0, 50, 30, 0, true); + } + if !WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_THROW_MOTION_CAMERA) { + if !WorkModule::is_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_FINAL_START_CAMERA) { + if is_excute(agent) { + REQ_MOTION_CAMERA(agent, Hash40::new("e01throwf.nuanmb"), false); + } } } + if is_excute(agent) { + let scale = PostureModule::scale(boma); + CAM_ZOOM_IN_arg5(agent, 7.0, 0.0, scale * 1.5, 0.0, 0.0); + } + VarModule::set_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER, 180); } - if is_excute(agent) { - let lockout = VarModule::get_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); - if lockout <= 0 { + } + } + } + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 2.0, 40, 125, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 11.0); + if PostureModule::scale(boma) > 1.4 { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 100, 0, 58, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 100, 0, 58, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } + } else { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 100, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 100, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } + } + if is_excute(agent) { + AttackModule::set_catch_only_all(boma, true, false); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 39.0); + if PostureModule::scale(boma) > 1.4 { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 100, 0, 58, 5.0, 1.0, 14.0, 5.5, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 361, 100, 0, 58, 5.0, 1.5, 15.5, 10.5, Some(5.0), Some(15.5), Some(10.5), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } + } else { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 100, 0, 58, 4.0, 1.0, 14.0, 5.5, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 361, 100, 0, 58, 4.0, 1.5, 16.0, 9.5, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } + } + if is_excute(agent) { + AttackModule::set_catch_only_all(boma, true, false); + } + frame(lua_state, 40.0); + if PostureModule::scale(boma) > 1.4 { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 100, 0, 58, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 100, 0, 58, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } + } else { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 100, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 100, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + } + } + if is_excute(agent) { + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, 9, 1); + } + frame(lua_state, 42.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + CAM_ZOOM_OUT(agent); + } +} + +unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if !smash2::app::FighterCutInManager::is_vr_mode() { + if smash2::app::FighterCutInManager::is_one_on_one_including_thrown(&*(agent.module_accessor as *const smash2::app::BattleObjectModuleAccessor)) { + if is_excute(agent) { + FighterSpecializer_Demon::check_disabled_motion_camera_of_scale(boma); + FighterSpecializer_Demon::check_disabled_motion_camera_of_stage(boma); + } + let lockout = VarModule::get_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); + if lockout <= 0 { + if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_THROW_MOTION_CAMERA) { + if is_excute(agent) { + CHECK_VALID_START_CAMERA(agent, 0, 7, 0, 35, 0, 0, false); + } + if !WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_THROW_MOTION_CAMERA) { + if !WorkModule::is_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_FINAL_START_CAMERA) { + if is_excute(agent) { + REQ_MOTION_CAMERA(agent, Hash40::new("e01throwb.nuanmb"), false); + } + } + } + if is_excute(agent) { let scale = PostureModule::scale(boma); CAM_ZOOM_IN_arg5(agent, 7.0, 0.0, scale * 1.5, 0.0, 0.0); } @@ -135,7 +231,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::on_flag(opponent_boma.object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); CAM_ZOOM_OUT(agent); } frame(lua_state, 48.0); @@ -151,25 +247,25 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { FighterSpecializer_Demon::check_disabled_motion_camera_of_scale(boma); FighterSpecializer_Demon::check_disabled_motion_camera_of_stage(boma); } - if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_THROW_MOTION_CAMERA) { - if is_excute(agent) { - CHECK_VALID_START_CAMERA(agent, 0, 0, 0, 0, 0, 0, false); - } - if !WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_THROW_MOTION_CAMERA) { - if !WorkModule::is_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_FINAL_START_CAMERA) { - if is_excute(agent) { - REQ_MOTION_CAMERA(agent, Hash40::new("e01throwlw.nuanmb"), false); + let lockout = VarModule::get_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); + if lockout <= 0 { + if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_THROW_MOTION_CAMERA) { + if is_excute(agent) { + CHECK_VALID_START_CAMERA(agent, 0, 0, 0, 0, 0, 0, false); + } + if !WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_THROW_MOTION_CAMERA) { + if !WorkModule::is_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_FINAL_START_CAMERA) { + if is_excute(agent) { + REQ_MOTION_CAMERA(agent, Hash40::new("e01throwlw.nuanmb"), false); + } } } - } - if is_excute(agent) { - let lockout = VarModule::get_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); - if lockout <= 0 { + if is_excute(agent) { let scale = PostureModule::scale(boma); CAM_ZOOM_IN_arg5(agent, 7.0, 0.0, scale * 1.5, 0.0, 0.0); } - VarModule::set_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER, 180); } + VarModule::set_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER, 180); } } } @@ -203,20 +299,20 @@ unsafe extern "C" fn game_throwcommand(agent: &mut L2CAgentBase) { FighterSpecializer_Demon::check_disabled_motion_camera_of_scale(boma); FighterSpecializer_Demon::check_disabled_motion_camera_of_stage(boma); } - if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_THROW_MOTION_CAMERA) { - if is_excute(agent) { - CHECK_VALID_START_CAMERA(agent, 0, 7, 0, 50, 30, 0, true); - } - if !WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_THROW_MOTION_CAMERA) { - if !WorkModule::is_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_FINAL_START_CAMERA) { - if is_excute(agent) { - REQ_MOTION_CAMERA(agent, Hash40::new("e01throwcommand.nuanmb"), false); + let lockout = VarModule::get_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); + if lockout <= 0 { + if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_THROW_MOTION_CAMERA) { + if is_excute(agent) { + CHECK_VALID_START_CAMERA(agent, 0, 7, 0, 50, 30, 0, true); + } + if !WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_THROW_MOTION_CAMERA) { + if !WorkModule::is_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_FINAL_START_CAMERA) { + if is_excute(agent) { + REQ_MOTION_CAMERA(agent, Hash40::new("e01throwcommand.nuanmb"), false); + } } } - } - if is_excute(agent) { - let lockout = VarModule::get_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); - if lockout <= 0 { + if is_excute(agent) { let scale = PostureModule::scale(boma); CAM_ZOOM_IN_arg5(agent, 7.0, 0.0, scale * 1.5, 0.0, 0.0); } @@ -263,109 +359,13 @@ unsafe extern "C" fn game_throwcommand(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if !smash2::app::FighterCutInManager::is_vr_mode() { - if smash2::app::FighterCutInManager::is_one_on_one_including_thrown(&*(agent.module_accessor as *const smash2::app::BattleObjectModuleAccessor)) { - if is_excute(agent) { - FighterSpecializer_Demon::check_disabled_motion_camera_of_scale(boma); - FighterSpecializer_Demon::check_disabled_motion_camera_of_stage(boma); - } - if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_THROW_MOTION_CAMERA) { - if is_excute(agent) { - CHECK_VALID_START_CAMERA(agent, 0, 7, 0, 50, 30, 0, true); - } - if !WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_THROW_MOTION_CAMERA) { - if !WorkModule::is_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_FINAL_START_CAMERA) { - if is_excute(agent) { - REQ_MOTION_CAMERA(agent, Hash40::new("e01throwf.nuanmb"), false); - } - } - } - if is_excute(agent) { - let lockout = VarModule::get_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); - if lockout <= 0 { - let scale = PostureModule::scale(boma); - CAM_ZOOM_IN_arg5(agent, 7.0, 0.0, scale * 1.5, 0.0, 0.0); - } - VarModule::set_int(agent.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER, 180); - } - } - } - } - if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 2.0, 40, 125, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - frame(lua_state, 11.0); - if PostureModule::scale(boma) > 1.4 { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 100, 0, 58, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 100, 0, 58, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - } else { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 100, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 100, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - } - if is_excute(agent) { - AttackModule::set_catch_only_all(boma, true, false); - } - frame(lua_state, 13.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 39.0); - if PostureModule::scale(boma) > 1.4 { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 100, 0, 58, 5.0, 1.0, 14.0, 5.5, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 361, 100, 0, 58, 5.0, 1.5, 15.5, 10.5, Some(5.0), Some(15.5), Some(10.5), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - } else { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 100, 0, 58, 4.0, 1.0, 14.0, 5.5, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 361, 100, 0, 58, 4.0, 1.5, 16.0, 9.5, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - } - if is_excute(agent) { - AttackModule::set_catch_only_all(boma, true, false); - } - frame(lua_state, 40.0); - if PostureModule::scale(boma) > 1.4 { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 100, 0, 58, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 100, 0, 58, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - } else { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 100, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 100, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - } - } - if is_excute(agent) { - AttackModule::set_catch_only_all(boma, true, false); - CHECK_FINISH_CAMERA(agent, 9, 1); - } - frame(lua_state, 42.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); - ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); - CAM_ZOOM_OUT(agent); - } -} - pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); agent.acmd("expression_throwhi", expression_throwhi, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); agent.acmd("game_throwcommand", game_throwcommand, Priority::Low); - agent.acmd("game_throwf", game_throwf, Priority::Low); } diff --git a/fighters/demon/src/acmd/tilts.rs b/fighters/demon/src/acmd/tilts.rs index 526b00aa92..7c222ac4ac 100644 --- a/fighters/demon/src/acmd/tilts.rs +++ b/fighters/demon/src/acmd/tilts.rs @@ -3,183 +3,130 @@ use super::*; unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 10.0); - if is_excute(agent) { - JostleModule::set_team(boma, 1); - } frame(lua_state, 12.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("kneer"), 13.0, 20, 71, 0, 37, 2.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legl"), 13.0, 20, 71, 0, 37, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 15.0, 20, 71, 0, 37, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("footl"), 15.0, 20, 71, 0, 37, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("footl"), 15.0, 20, 71, 0, 37, 4.25, 0.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); - //ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.8); - //ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 0.8); - //ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 0.8); - //ATK_SET_SHIELD_SETOFF_MUL(agent, 3, 0.8); + ATTACK(agent, 0, 0, Hash40::new("footl"), 12.0, 26, 82, 0, 37, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("footl"), 12.0, 26, 82, 0, 37, 4.25, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 12.0, 26, 82, 0, 37, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("legl"), 12.0, 26, 82, 0, 37, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.8); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 0.8); + ATK_SET_SHIELD_SETOFF_MUL(agent, 2, 0.8); + ATK_SET_SHIELD_SETOFF_MUL(agent, 3, 0.8); } frame(lua_state, 17.0); if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - } - wait(lua_state, 4.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); AttackModule::clear_all(boma); } } -unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { +// Up Angled Forward Tilt + +unsafe extern "C" fn game_attackstand5(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); + frame(lua_state, 5.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); - VarModule::off_flag(agent.battle_object, vars::demon::instance::ATTACK_HI3_SLAUGHTER_HIGH_KICK); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + sv_kinetic_energy!( + set_speed_mul, + agent, + FIGHTER_KINETIC_ENERGY_ID_MOTION, + 0.7 + ); } - frame(lua_state, 4.0); - FT_MOTION_RATE_RANGE(agent, 4.0, 8.0, 3.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - } - frame(lua_state, 8.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 6.0, 88, 5, 0, 71, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 6.0, 88, 5, 0, 71, 3.0, 5.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 6.0, 88, 5, 0, 71, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("arml"), 6.0, 70, 5, 0, 46, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("arml"), 6.0, 70, 5, 0, 46, 3.0, 5.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 0, Hash40::new("shoulderl"), 6.0, 70, 5, 0, 46, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - //AttackModule::set_add_reaction_frame_revised(boma, 0, 1.0, false); - //AttackModule::set_add_reaction_frame_revised(boma, 1, 1.0, false); - //AttackModule::set_add_reaction_frame_revised(boma, 2, 1.0, false); - //AttackModule::set_add_reaction_frame_revised(boma, 3, 3.0, false); - //AttackModule::set_add_reaction_frame_revised(boma, 4, 3.0, false); - //AttackModule::set_add_reaction_frame_revised(boma, 5, 3.0, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 46, 69, 0, 55, 3.0, 0.0, 15.0, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 46, 69, 0, 55, 5.2, 0.0, 10.5, 5.5, Some(0.0), Some(13.72), Some(10.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_DEMON_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 12.0); + frame(lua_state, 13.0); if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_CHECK_STEP); - } - frame(lua_state, 21.0); - FT_MOTION_RATE_RANGE(agent, 21.0, 30.0, 6.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } -unsafe extern "C" fn game_attackhi32(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 4.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } - frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 10.0 / 12.0); + frame(lua_state, 8.0); + if is_excute(agent) { + WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_FLAG_CHECK_STEP); + } + frame(lua_state, 11.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } + frame(lua_state, 12.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 14.0); + frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 83, 64, 0, 70, 2.0, 4.0, 0.0, 0.0, None, None, None, 0.65, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0, 83, 64, 0, 70, 4.3, 5.0, 0.0, 0.0, None, None, None, 0.65, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 7.0, 83, 64, 0, 70, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.65, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("shoulderr"), 7.0, 83, 64, 0, 70, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.65, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_PUNCH01, *ATTACK_REGION_PUNCH); + WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_FLAG_CHECK_STEP); } - frame(lua_state, 15.0); + frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 85, 15, 0, 85, 2.0, 0.0, 6.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 85, 15, 0, 85, 4.0, 0.0, 5.0, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 85, 15, 0, 85, 3.0, 0.0, 7.0, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 85, 15, 0, 85, 2.8, 0.0, 9.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); + // AttackModule::set_add_reaction_frame(boma, 0, 17.0, false); } - frame(lua_state, 19.0); + wait(lua_state, 3.0); if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); AttackModule::clear_all(boma); } - frame(lua_state, 24.0); - FT_MOTION_RATE_RANGE(agent, 24.0, 35.0, 5.0); - frame(lua_state, 35.0); - FT_MOTION_RATE(agent, 1.0); - } -unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 5.0); if is_excute(agent) { - JostleModule::set_team(boma, 1); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 8.0); - FT_MOTION_RATE_RANGE(agent, 8.0, 16.0, 4.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - } - frame(lua_state, 12.0); + frame(lua_state, 10.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 3, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 13.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_FLAG_CHECK_STEP); - + EFFECT_FOLLOW_ALPHA(agent, Hash40::new("demon_attack_arc"), Hash40::new("top"), 0, 10, 1, 23, -15, 0, 0.7, true, 1); + LAST_EFFECT_SET_RATE(agent, 1.6); } frame(lua_state, 16.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - // Ground-only - ATTACK(agent, 0, 0, Hash40::new("armr"), 11.0, 271, 20, 0, 100, 4.0, 6.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 11.0, 271, 20, 0, 100, 3.0, 3.5, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 11.0, 271, 20, 0, 100, 2.8, 3.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); - // Air-only - ATTACK(agent, 3, 0, Hash40::new("armr"), 11.0, 85, 20, 0, 85, 4.0, 6.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("armr"), 11.0, 85, 20, 0, 85, 3.0, 3.5, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 0, Hash40::new("shoulderr"), 11.0, 85, 20, 0, 85, 2.8, 3.0, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_DEMON_ATTACKLW3, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame_revised(boma, 3, 17.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 4, 17.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 5, 17.0, false); - } - wait(lua_state, 3.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 11, 5, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 360, false, 0.3); } - frame(lua_state, 20.0); - FT_MOTION_RATE_RANGE(agent, 20.0, 30.0, 5.0); - frame(lua_state, 30.0); - FT_MOTION_RATE(agent, 1.0); - } +// unsafe extern "C" fn game_attacklw3cancel(agent: &mut L2CAgentBase) { +// let lua_state = agent.lua_state_agent; +// let boma = agent.boma(); +// if is_excute(agent) { +// WHOLE_HIT(agent, *HIT_STATUS_XLU); +// } +// wait(lua_state, 9.0); +// if is_excute(agent) { +// WHOLE_HIT(agent, *HIT_STATUS_NORMAL); +// } +// } + pub fn install(agent: &mut Agent) { agent.acmd("game_attacks3", game_attacks3, Priority::Low); - agent.acmd("game_attackhi3", game_attackhi3, Priority::Low); - agent.acmd("game_attackhi32", game_attackhi32, Priority::Low); + + agent.acmd("game_attackstand5", game_attackstand5, Priority::Low); + agent.acmd("game_attacklw3", game_attacklw3, Priority::Low); + agent.acmd("effect_attacklw3", effect_attacklw3, Priority::Low); + + // agent.acmd("game_attacklw3cancel", game_attacklw3cancel, Priority::Low); } diff --git a/fighters/demon/src/agent_init.rs b/fighters/demon/src/agent_init.rs new file mode 100644 index 0000000000..425bb7e20f --- /dev/null +++ b/fighters/demon/src/agent_init.rs @@ -0,0 +1,35 @@ +use super::*; +use globals::*; + +unsafe extern "C" fn check_attack_3_uniq(fighter: &mut L2CFighterCommon) -> L2CValue { + let status = fighter.global_table[STATUS_KIND_INTERRUPT].get_i32(); + if [ + *FIGHTER_STATUS_KIND_SQUAT_WAIT, + *FIGHTER_STATUS_KIND_ATTACK_LW3, + *FIGHTER_DEMON_STATUS_KIND_ATTACK_LW3_CANCEL, + *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_1, + *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_2, + *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_3, + *FIGHTER_DEMON_STATUS_KIND_SQUAT_TURN_AUTO, + ].contains(&status) { + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_SQUAT) { + if fighter.global_table[CMD_CAT1].get_i32() & *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_LW3 != 0 { + fighter.change_status(FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_2.into(), true.into()); + return 1.into(); + } + } + } + 0.into() +} + +unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { + fighter.global_table[STATUS_CHANGE_CALLBACK].assign(&L2CValue::Bool(false)); + fighter.global_table[0x55].assign(&L2CValue::Ptr(check_attack_3_uniq as *const () as _)); + fighter.global_table[0x57].assign(&L2CValue::Bool(false)); + fighter.global_table[0x58].assign(&L2CValue::Bool(false)); + fighter.global_table[0x59].assign(&L2CValue::Bool(false)); +} + +pub fn install(agent: &mut Agent) { + agent.on_start(on_start); +} \ No newline at end of file diff --git a/fighters/demon/src/lib.rs b/fighters/demon/src/lib.rs index 48aad9d948..d7fe5bdf8a 100644 --- a/fighters/demon/src/lib.rs +++ b/fighters/demon/src/lib.rs @@ -7,6 +7,8 @@ pub mod acmd; pub mod opff; pub mod status; +pub mod agent_init; + // articles mod blaster; @@ -34,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -48,6 +51,7 @@ pub fn install() { acmd::install(agent); opff::install(agent); status::install(agent); + agent_init::install(agent); agent.install(); blaster::install(); diff --git a/fighters/demon/src/opff.rs b/fighters/demon/src/opff.rs index 141f3fe1a6..2c96751034 100644 --- a/fighters/demon/src/opff.rs +++ b/fighters/demon/src/opff.rs @@ -3,82 +3,6 @@ utils::import_noreturn!(common::opff::{fighter_common_opff}); use super::*; use globals::*; - -unsafe fn slaughter_high_kick_devastator(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status(*FIGHTER_STATUS_KIND_ATTACK_HI3) && boma.is_motion(Hash40::new("attack_hi3")) { - if WorkModule::is_flag(boma, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_CHECK_STEP) { - if boma.is_cat_flag(Cat1::AttackS3 | Cat1::AttackS4) && !boma.is_in_hitlag() { - if boma.is_stick_backward() { - VarModule::on_flag(boma.object(), vars::demon::instance::ATTACK_HI3_SLAUGHTER_HIGH_KICK); - boma.change_status_req(*FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_5, false); - } - if boma.is_stick_forward() { - VarModule::on_flag(boma.object(), vars::demon::instance::ATTACK_HI3_DEVASTATOR); - boma.change_status_req(*FIGHTER_STATUS_KIND_ATTACK, false); - } - } - } - } - // shouldn't need these anymore as they get turned on/off when needed - // if ![*FIGHTER_STATUS_KIND_ATTACK_HI3, *FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_5].contains(&status_kind) { - // VarModule::off_flag(boma.object(), vars::demon::instance::ATTACK_HI3_SLAUGHTER_HIGH_KICK); - // } - // if ![*FIGHTER_STATUS_KIND_ATTACK_HI3, *FIGHTER_STATUS_KIND_ATTACK].contains(&status_kind) { - // VarModule::off_flag(boma.object(), vars::demon::instance::ATTACK_HI3_DEVASTATOR); - // } -} - -unsafe fn lightning_screw_uppercut(boma: &mut BattleObjectModuleAccessor) { - if boma.is_motion(Hash40::new("attack_stand_21")) { - if boma.status_frame() < 19 { - if ControlModule::check_button_on_trriger(boma, *CONTROL_PAD_BUTTON_SPECIAL) && !VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STEP2S_SPINNING_DEMON) { - VarModule::on_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT); - } - } - else { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT) { - MotionModule::change_motion_force_inherit_frame(boma, Hash40::new("attack_stand_22"), 0.0, 1.2, 0.0); - } - } - } - if boma.is_motion(Hash40::new("attack_stand_22")) && boma.status_frame() > 16 { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT) { - MotionModule::change_motion_force_inherit_frame(boma, Hash40::new("attack_stand_23"), 0.0, 1.15, 0.0); - } - } - if boma.is_motion(Hash40::new("attack_stand_23")) && boma.status_frame() > 16 { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT) { - boma.change_status_req(*FIGHTER_DEMON_STATUS_KIND_ATTACK_STEP_2L, false); - } - } - if !boma.is_motion_one_of(&[Hash40::new("attack_stand_21"), Hash40::new("attack_stand_22"), Hash40::new("attack_stand_23"), Hash40::new("attack_step_2l")]) { - VarModule::off_flag(boma.object(), vars::demon::instance::ATTACK_STAND2_LIGHTNING_SCREW_UPPERCUT); - } -} - -unsafe fn spinning_demon(boma: &mut BattleObjectModuleAccessor) { - if boma.is_motion(Hash40::new("attack_step_2s")) { - if boma.status_frame() > 16 && boma.status_frame() < 18 { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) { - VarModule::on_flag(boma.object(), vars::demon::instance::ATTACK_STEP2S_SPINNING_DEMON); - } - } - else if boma.status_frame() >= 18 { - if VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STEP2S_SPINNING_DEMON) { - boma.change_status_req(*FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_2, false); - } - } - } - if boma.is_status(*FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_2) - && VarModule::is_flag(boma.object(), vars::demon::instance::ATTACK_STEP2S_SPINNING_DEMON) - && boma.is_motion(Hash40::new("attack_stand_21")) { - MotionModule::change_motion_force_inherit_frame(boma, Hash40::new("attack_stand_24"), 0.0, 1.0, 0.0); - } - if !boma.is_motion_one_of(&[Hash40::new("attack_stand_21"), Hash40::new("attack_stand_24"), Hash40::new("attack_step_2s")]) { - VarModule::off_flag(boma.object(), vars::demon::instance::ATTACK_STEP2S_SPINNING_DEMON); - } -} - unsafe fn korean_back_dash(boma: &mut BattleObjectModuleAccessor) { if boma.is_status(*FIGHTER_DEMON_STATUS_KIND_DASH_BACK) && boma.left_stick_y() < WorkModule::get_param_float(boma, hash40("common"), hash40("squat_stick_y")) { @@ -96,64 +20,20 @@ unsafe fn korean_back_dash(boma: &mut BattleObjectModuleAccessor) { } unsafe fn enable_both_recovery_specials(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_SPECIAL_HI, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_RISE, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_LW_FALL]) && boma.is_situation(*SITUATION_KIND_AIR) { - VarModule::on_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL); - } + // if boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_SPECIAL_HI, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_RISE, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_LW_FALL]) && boma.is_situation(*SITUATION_KIND_AIR) { + // VarModule::on_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL); + // } if boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_SPECIAL_S, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_S_HIT, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_S_AIR_END]) && boma.is_situation(*SITUATION_KIND_AIR) { VarModule::on_flag(boma.object(), vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); } - if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI) && !VarModule::is_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL) { - WorkModule::off_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI); - } + // if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI) && !VarModule::is_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL) { + // WorkModule::off_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_HI); + // } if WorkModule::is_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_S) && !VarModule::is_flag(boma.object(), vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT) { WorkModule::off_flag(boma, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_S); } } -// boma: its a boma -// start_frame: frame to start interpolating the body rotation -// bend_frame: frame to interpolate to the intended angle amount until -// return_frame: frame to start interpolating back to regular angle -// straight_frame: frame the body should be at the regular angle again -unsafe fn forward_bair_rotation(boma: &mut BattleObjectModuleAccessor, start_frame: f32, bend_frame: f32, return_frame: f32, straight_frame: f32) { - let frame = MotionModule::frame(boma); - let end_frame = MotionModule::end_frame(boma); - let max_rotation = -180.0; - let mut rotation = Vector3f{x: 0.0, y: 0.0, z: 0.0}; - - if frame >= start_frame && frame < return_frame { - // this has to be called every frame, or you snap back to the normal joint angle - // interpolate to the respective body rotation angle - let calc_body_rotate = max_rotation * ((frame - start_frame) / (bend_frame - start_frame)); - let body_rotation = calc_body_rotate.clamp(-180.0, 0.0); - rotation = Vector3f{x: 0.0, y: body_rotation, z: 0.0}; - ModelModule::set_joint_rotate(boma, Hash40::new("rot"), &rotation, MotionNodeRotateCompose{_address: *MOTION_NODE_ROTATE_COMPOSE_AFTER as u8}, MotionNodeRotateOrder{_address: *MOTION_NODE_ROTATE_ORDER_XYZ as u8}); - } else if frame >= return_frame && frame < straight_frame { - // linear interpolate back to normal - /* - let calc_body_rotate = max_rotation *(1.0 - (frame - return_frame) / (straight_frame - return_frame)); - let body_rotation = calc_body_rotate.clamp(0.0, max_rotation); - */ - let calc_body_rotate = -180.0 *((frame - return_frame) / (straight_frame - return_frame)) + 180.0; - let body_rotation = calc_body_rotate.clamp(0.0, 180.0); - rotation = Vector3f{x: 0.0, y: body_rotation, z: 0.0}; - ModelModule::set_joint_rotate(boma, Hash40::new("rot"), &rotation, MotionNodeRotateCompose{_address: *MOTION_NODE_ROTATE_COMPOSE_AFTER as u8}, MotionNodeRotateOrder{_address: *MOTION_NODE_ROTATE_ORDER_XYZ as u8}); - } -} - -unsafe fn rotate_forward_bair(boma: &mut BattleObjectModuleAccessor) { - if boma.is_motion(Hash40::new("attack_air_b")){ - if VarModule::is_flag(boma.object(), vars::common::instance::IS_HEAVY_ATTACK) { - forward_bair_rotation(boma, 6.0, 9.5, 21.0, 41.0); - } - } - else if boma.is_motion(Hash40::new("landing_air_b")){ - if VarModule::is_flag(boma.object(), vars::common::instance::IS_HEAVY_ATTACK) { - forward_bair_rotation(boma, 0.0, 0.1, 0.2, 9.0); - } - } -} - unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) @@ -169,49 +49,26 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } } -unsafe fn up_special_freefall(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if StatusModule::is_changing(fighter.module_accessor) - && (fighter.is_situation(*SITUATION_KIND_GROUND) - || fighter.is_situation(*SITUATION_KIND_CLIFF) - || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP])) - { - VarModule::off_flag(fighter.battle_object, vars::demon::instance::SPECIAL_HI_ENABLE_FREEFALL); - } - - if fighter.is_prev_status(*FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_RISE) { - if StatusModule::is_changing(fighter.module_accessor) { - VarModule::on_flag(fighter.battle_object, vars::demon::instance::SPECIAL_HI_ENABLE_FREEFALL); - } - } - - if fighter.is_status(*FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_RISE) { - if fighter.is_situation(*SITUATION_KIND_AIR) - && VarModule::is_flag(fighter.battle_object, vars::demon::instance::SPECIAL_HI_ENABLE_FREEFALL) { - if CancelModule::is_enable_cancel(fighter.module_accessor) { - let speed_x_max_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_hi"), hash40("fall_max_speed_x_mul")); - WorkModule::set_float(fighter.module_accessor, speed_x_max_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); - fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL_SPECIAL, true); - let cancel_module = *(fighter.module_accessor as *mut BattleObjectModuleAccessor as *mut u64).add(0x128 / 8) as *const u64; - *(((cancel_module as u64) + 0x1c) as *mut bool) = false; // CancelModule::is_enable_cancel = false - } - } - } -} - unsafe fn camera_lockout(fighter: &mut L2CFighterCommon) { let lockout = VarModule::get_int(fighter.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER); VarModule::set_int(fighter.battle_object, vars::demon::instance::CAMERA_LOCKOUT_TIMER, (lockout - 1).max(0)); } +unsafe fn check_step_cancel(fighter: &mut L2CFighterCommon) { + if VarModule::is_flag(fighter.battle_object, vars::demon::status::ENABLE_STEP_CANCEL) + && !fighter.global_table[IS_STOPPING].get_bool() { + if fighter.is_cat_flag(Cat4::Command623NB) { + fighter.change_status(statuses::demon::CANCEL_STEP.into(), false.into()); + } + } +} + pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - slaughter_high_kick_devastator(boma); korean_back_dash(boma); - lightning_screw_uppercut(boma); - spinning_demon(boma); enable_both_recovery_specials(boma); fastfall_specials(fighter); - up_special_freefall(fighter, boma); camera_lockout(fighter); + check_step_cancel(fighter); } pub extern "C" fn demon_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterCommon) { diff --git a/fighters/demon/src/status/attack_hi3.rs b/fighters/demon/src/status/attack_hi3.rs new file mode 100644 index 0000000000..8a81ecd76e --- /dev/null +++ b/fighters/demon/src/status/attack_hi3.rs @@ -0,0 +1,60 @@ +use super::*; + +unsafe extern "C" fn demon_attack_hi3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_CHECK_STEP); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_INC_STEP); + WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_WORK_INT_COMBO); + + fighter.clear_lua_stack(); + let motion = sv_fighter_util::get_attack_hi3_motion(fighter.lua_state_agent); + fighter.status_AttackHi3_Common(motion.into(), Hash40::new("attack_hi3").into()); + + if !StopModule::is_stop(fighter.module_accessor) { + fighter.sub_attack3_uniq_check(false.into()); + } + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(L2CFighterCommon_sub_attack3_uniq_check as *const () as _)); + + fighter.sub_shift_status_main(L2CValue::Ptr(demon_attack_hi3_main_loop as *const () as _)) +} + +unsafe extern "C" fn demon_attack_hi3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_AttackHi3_Main(); + + if StatusModule::is_changing(fighter.module_accessor) { + return 0.into(); + } + + let combo = WorkModule::get_int(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_WORK_INT_COMBO); + if combo + 1 < 2 + && ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_ATTACK) + && WorkModule::is_flag(fighter.module_accessor, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO) { + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_INC_STEP); + } + + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_CHECK_STEP) + && WorkModule::is_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_INC_STEP) { + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_INC_STEP); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_FLAG_CHECK_STEP); + WorkModule::inc_int(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_HI_3_WORK_INT_COMBO); + let rate = MotionModule::rate(fighter.module_accessor); + MotionModule::change_motion( + fighter.module_accessor, + Hash40::new("attack_hi32"), + 0.0, + rate, + false, + 0.0, + false, + false + ); + fighter.clear_lua_stack(); + sv_kinetic_energy::set_motion_energy_update_flag(fighter.lua_state_agent); + } + + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_HI3, demon_attack_hi3_main); +} \ No newline at end of file diff --git a/fighters/demon/src/status/attack_lw3.rs b/fighters/demon/src/status/attack_lw3.rs new file mode 100644 index 0000000000..2cc770046d --- /dev/null +++ b/fighters/demon/src/status/attack_lw3.rs @@ -0,0 +1,126 @@ +use super::*; + +unsafe extern "C" fn demon_attack_lw3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_AttackLw3_common(); + WorkModule::set_int(fighter.module_accessor, -1, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_WORK_INT_CANCEL_STATUS); + fighter.sub_shift_status_main(L2CValue::Ptr(demon_attack_lw3_main_loop as *const () as _)) +} + +unsafe extern "C" fn demon_attack_lw3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_AttackLw3_Main(); + if !StatusModule::is_changing(fighter.module_accessor) { + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO) { + let mut status = -1; + let cat4 = fighter.global_table[CMD_CAT4].get_i32(); + if cat4 & *FIGHTER_PAD_CMD_CAT4_FLAG_COMMAND_1 != 0 { + status = *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_3; + } + else if cat4 & *FIGHTER_PAD_CMD_CAT4_FLAG_COMMAND_3 != 0 { + status = *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_1; + } + else if cat4 & *FIGHTER_PAD_CMD_CAT4_FLAG_COMMAND_7 != 0 { + status = *FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_6; + } + else if cat4 & *FIGHTER_PAD_CMD_CAT4_FLAG_COMMAND_9 != 0 { + status = *FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_2; + } + else if fighter.sub_check_command_guard().get_bool() { + status = *FIGHTER_STATUS_KIND_GUARD_ON; + } + if status != -1 { + WorkModule::set_int(fighter.module_accessor, status, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_WORK_INT_CANCEL_STATUS); + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_FLAG_INC_STEP); + } + } + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_FLAG_CHECK_STEP) + && WorkModule::is_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_FLAG_INC_STEP) { + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_FLAG_INC_STEP); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_FLAG_CHECK_STEP); + if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_AIR { + fighter.change_status(FIGHTER_DEMON_STATUS_KIND_ATTACK_LW3_CANCEL.into(), false.into()); + } + } + } + 0.into() +} + +unsafe extern "C" fn demon_attack_lw3_cancel_main(fighter: &mut L2CFighterCommon) -> L2CValue { + HitModule::set_xlu_frame_global(fighter.module_accessor, 9, 0); + MotionModule::change_motion( + fighter.module_accessor, + Hash40::new("attack_lw3_cancel"), + 0.0, + 1.0, + false, + 0.0, + false, + false + ); + + WorkModule::unable_transition_term_group_ex(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SQUAT); + + fighter.sub_shift_status_main(L2CValue::Ptr(demon_attack_lw3_cancel_main_loop as *const () as _)) +} + +unsafe extern "C" fn demon_attack_lw3_cancel_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if !StatusModule::is_changing(fighter.module_accessor) + && WorkModule::get_int(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_WORK_INT_CANCEL_STATUS) == -1 { + let mut status = -1; + let cat4 = fighter.global_table[CMD_CAT4].get_i32(); + if cat4 & *FIGHTER_PAD_CMD_CAT4_FLAG_COMMAND_1 != 0 { + status = *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_3; + } + if cat4 & *FIGHTER_PAD_CMD_CAT4_FLAG_COMMAND_3 != 0 { + status = *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_1; + } + if cat4 & *FIGHTER_PAD_CMD_CAT4_FLAG_COMMAND_7 != 0 { + status = *FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_6; + } + if cat4 & *FIGHTER_PAD_CMD_CAT4_FLAG_COMMAND_9 != 0 { + status = *FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_2; + } + if status != -1 { + WorkModule::set_int(fighter.module_accessor, status, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_WORK_INT_CANCEL_STATUS); + } + } + + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 0.into(); + } + } + else { + let status = WorkModule::get_int(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_LW_3_WORK_INT_CANCEL_STATUS); + if ![ + *FIGHTER_STATUS_KIND_WAIT, + *FIGHTER_STATUS_KIND_GUARD_ON, + -1 + ].contains(&status) { + let mut clear_buffer = true; + if status == *FIGHTER_STATUS_KIND_JUMP_SQUAT { + clear_buffer = false; + } + fighter.change_status(status.into(), clear_buffer.into()); + return 0.into(); + } + } + + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 1.into(); + } + + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_SQUAT_WAIT.into(), false.into()); + return 1.into(); + } + + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_LW3, demon_attack_lw3_main); + + agent.status(Main, *FIGHTER_DEMON_STATUS_KIND_ATTACK_LW3_CANCEL, demon_attack_lw3_cancel_main); +} diff --git a/fighters/demon/src/status/attack_s3.rs b/fighters/demon/src/status/attack_s3.rs new file mode 100644 index 0000000000..c5ca2e838d --- /dev/null +++ b/fighters/demon/src/status/attack_s3.rs @@ -0,0 +1,14 @@ +use super::*; + +unsafe extern "C" fn attack_s3_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_pre_AttackS3() +} + +unsafe extern "C" fn attack_s3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_AttackS3() +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_ATTACK_S3, attack_s3_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_S3, attack_s3_main); +} \ No newline at end of file diff --git a/fighters/demon/src/status/attack_squat_2.rs b/fighters/demon/src/status/attack_squat_2.rs new file mode 100644 index 0000000000..1c627fa2bd --- /dev/null +++ b/fighters/demon/src/status/attack_squat_2.rs @@ -0,0 +1,50 @@ +use super::*; + +unsafe extern "C" fn attack_squat_2_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let func = smashline::api::get_target_function("lua2cpp_demon.nrs", 0x2c450).unwrap(); + fighter.status_AttackLw3_common_param( + true.into(), + L2CValue::Ptr(func as *const () as _), + ( + 0x180 | // *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_ATTACK_LW3_W + *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | + *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON + ).into() + ); + + MotionModule::change_motion( + fighter.module_accessor, + Hash40::new("attack_squat_2"), + 0.0, + 1.0, + false, + 0.0, + false, + false + ); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2b94de0d96), FIGHTER_LOG_ACTION_CATEGORY_ATTACK, 0x18 /*FIGHTER_LOG_ATTACK_KIND_ATTACK_LW3_W*/); + MotionModule::set_trans_move_speed_no_scale(fighter.module_accessor, false); + + WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_STATUS_ATTACK_WORK_INT_100_HIT_NEAR_COUNT_CLIFF_STOP); + + fighter.sub_shift_status_main(L2CValue::Ptr(attack_squat_2_main_loop as *const () as _)) +} + +unsafe extern "C" fn attack_squat_2_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if demon_attack_loop_common(fighter, FIGHTER_STATUS_KIND_SQUAT_WAIT.into()).get_bool() { + return 0.into(); + } + + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO_INPUT) + && fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND + && fighter.global_table[CMD_CAT1].get_i32() & *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_LW3 != 0 { + fighter.change_status(FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_2.into(), true.into()); + return 1.into(); + } + + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_2, attack_squat_2_main); +} \ No newline at end of file diff --git a/fighters/demon/src/status/attack_squat_4.rs b/fighters/demon/src/status/attack_squat_4.rs new file mode 100644 index 0000000000..a8fd0f6853 --- /dev/null +++ b/fighters/demon/src/status/attack_squat_4.rs @@ -0,0 +1,21 @@ +use super::*; + +unsafe extern "C" fn attack_squat_4_check_attack(fighter: &mut L2CFighterCommon, param_2: &L2CValue, param_3: &L2CValue) -> L2CValue { + if (¶m_3["object_category_"]).get_i32() == *BATTLE_OBJECT_CATEGORY_FIGHTER { + if (¶m_3["kind_"]).get_i32() == *COLLISION_KIND_HIT { + let object_id = (¶m_3["object_id_"]).get_u32(); + let opponent_boma = sv_battle_object::module_accessor(object_id); + if StatusModule::situation_kind(opponent_boma) == *SITUATION_KIND_AIR { + let opponent_object = utils::util::get_battle_object_from_accessor(opponent_boma); + VarModule::on_flag(opponent_object, vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); + StatusModule::set_status_kind_interrupt(opponent_boma, *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR); + } + } + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(CheckAttack, *FIGHTER_DEMON_STATUS_KIND_ATTACK_SQUAT_4, attack_squat_4_check_attack); +} \ No newline at end of file diff --git a/fighters/demon/src/status/attack_stand_1.rs b/fighters/demon/src/status/attack_stand_1.rs new file mode 100644 index 0000000000..169f96bb9b --- /dev/null +++ b/fighters/demon/src/status/attack_stand_1.rs @@ -0,0 +1,10 @@ +use super::*; + +unsafe extern "C" fn attack_stand_1_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::set_status_kind_interrupt(fighter.module_accessor, *FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_3); + 1.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_DEMON_STATUS_KIND_ATTACK_STAND_1, attack_stand_1_pre); +} \ No newline at end of file diff --git a/fighters/demon/src/status/attack_step_2s.rs b/fighters/demon/src/status/attack_step_2s.rs new file mode 100644 index 0000000000..871f0f6566 --- /dev/null +++ b/fighters/demon/src/status/attack_step_2s.rs @@ -0,0 +1,53 @@ +use super::*; + +unsafe extern "C" fn demon_attack_step_2s_main(fighter: &mut L2CFighterCommon) -> L2CValue { + MotionModule::change_motion( + fighter.module_accessor, + Hash40::new("attack_step_2s"), + 0.0, + 1.0, + false, + 0.0, + false, + false + ); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2b94de0d96), FIGHTER_LOG_ACTION_CATEGORY_ATTACK, FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_14); + ControlModule::reset_special_command(fighter.module_accessor, true); + MotionModule::set_trans_move_speed_no_scale(fighter.module_accessor, false); + let rage_system = WorkModule::is_flag(fighter.module_accessor, *FIGHTER_DEMON_INSTANCE_WORK_ID_FLAG_ENABLE_RAGE_SYSTEM); + WorkModule::set_flag(fighter.module_accessor, rage_system, *FIGHTER_DEMON_STATUS_ATTACK_STEP_FLAG_RAGE_SYSTEM); + + fighter.sub_shift_status_main(L2CValue::Ptr(demon_attack_step_2s_main_loop as *const () as _)) +} + +unsafe extern "C" fn demon_attack_step_2s_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); + } + + if VarModule::is_flag(fighter.battle_object, vars::demon::status::ATTACK_STEP2S_ENABLE_CANCEL) { + if fighter.is_cat_flag(Cat4::Command623NB) { + fighter.change_status(statuses::demon::CANCEL_STEP.into(), false.into()); + return 0.into(); + } + } + + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() { + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_ATTACK_STEP_FLAG_CANCEL); + return 0.into(); + } + } + + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + return 0.into(); + } + + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_DEMON_STATUS_KIND_ATTACK_STEP_2S, demon_attack_step_2s_main); +} \ No newline at end of file diff --git a/fighters/demon/src/status/cancel_step.rs b/fighters/demon/src/status/cancel_step.rs new file mode 100644 index 0000000000..8ce5105128 --- /dev/null +++ b/fighters/demon/src/status/cancel_step.rs @@ -0,0 +1,68 @@ +use super::*; + +unsafe extern "C" fn cancel_step_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_MOTION, + *GROUND_CORRECT_KIND_GROUND_CLIFF_STOP as u32, + GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_NONE as u64, + 0, + 0, + 0 + ); + 0.into() +} + +unsafe extern "C" fn cancel_step_main(fighter: &mut L2CFighterCommon) -> L2CValue { + MotionModule::change_motion( + fighter.module_accessor, + Hash40::new("cancel_step"), + 0.0, + 1.0, + false, + 0.0, + false, + false + ); + + sv_kinetic_energy!( + set_speed_mul, + fighter, + FIGHTER_KINETIC_ENERGY_ID_MOTION, + 0.75 + ); + + fighter.main_shift(cancel_step_main_loop) +} + +unsafe extern "C" fn cancel_step_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); + } + + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_SQUAT_WAIT.into(), false.into()); + } + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, statuses::demon::CANCEL_STEP, cancel_step_pre); + agent.status(Main, statuses::demon::CANCEL_STEP, cancel_step_main); +} \ No newline at end of file diff --git a/fighters/demon/src/status/catch.rs b/fighters/demon/src/status/catch.rs new file mode 100644 index 0000000000..cf2075d859 --- /dev/null +++ b/fighters/demon/src/status/catch.rs @@ -0,0 +1,21 @@ +use super::*; + +unsafe extern "C" fn catch_end(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_end_Catch() +} + +unsafe extern "C" fn catch_dash_end(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_end_CatchDash() +} + +unsafe extern "C" fn catch_turn_end(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_end_CatchTurn() +} + +pub fn install(agent: &mut Agent) { + agent.status(End, *FIGHTER_STATUS_KIND_CATCH, catch_end); + + agent.status(End, *FIGHTER_STATUS_KIND_CATCH_DASH, catch_dash_end); + + agent.status(End, *FIGHTER_STATUS_KIND_CATCH_TURN, catch_turn_end); +} \ No newline at end of file diff --git a/fighters/demon/src/status/landing.rs b/fighters/demon/src/status/landing.rs index 07c9175fcf..0e26f144f1 100644 --- a/fighters/demon/src/status/landing.rs +++ b/fighters/demon/src/status/landing.rs @@ -1,15 +1,11 @@ use super::*; -extern "Rust" { - fn fgc_landing_main(fighter: &mut L2CFighterCommon) -> L2CValue; -} - -// FIGHTER_STATUS_KIND_LANDING - -pub unsafe extern "C" fn landing_main(fighter: &mut L2CFighterCommon) -> L2CValue { - fgc_landing_main(fighter) +unsafe extern "C" fn demon_landing_init(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_landing_uniq_process_init(); + 0.into() } pub fn install(agent: &mut Agent) { - agent.status(Main, *FIGHTER_STATUS_KIND_LANDING, landing_main); + agent.status(Init, *FIGHTER_STATUS_KIND_LANDING, demon_landing_init); + } \ No newline at end of file diff --git a/fighters/demon/src/status/mod.rs b/fighters/demon/src/status/mod.rs index f3f82626eb..06892f5735 100644 --- a/fighters/demon/src/status/mod.rs +++ b/fighters/demon/src/status/mod.rs @@ -2,28 +2,88 @@ use super::*; use globals::*; // status script import +pub unsafe extern "C" fn demon_attack_loop_common(fighter: &mut L2CFighterCommon, status: L2CValue) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() { + return true.into(); + } + } + + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return true.into(); + } + + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(status, false.into()); + return true.into(); + } + + false.into() +} + mod wait; +mod squat_wait; +mod walk; mod dash; +mod dash_back; mod turn_dash; mod landing; mod landing_attack_air; mod down; -mod special_hi; mod attack; mod attack_combo; + +mod attack_s3; +mod attack_hi3; +mod attack_lw3; + +mod attack_stand_1; + +mod attack_squat_2; +mod attack_squat_4; + +// mod attack_step_2s; + mod attack_air; +mod special_hi; + +mod cancel_step; + +mod catch; + pub fn install(agent: &mut Agent) { wait::install(agent); + squat_wait::install(agent); + walk::install(agent); dash::install(agent); + dash_back::install(agent); turn_dash::install(agent); landing::install(agent); landing_attack_air::install(agent); down::install(agent); - special_hi::install(agent); attack::install(agent); attack_combo::install(agent); + + attack_s3::install(agent); + attack_hi3::install(agent); + attack_lw3::install(agent); + + attack_stand_1::install(agent); + + attack_squat_2::install(agent); + attack_squat_4::install(agent); + + // attack_step_2s::install(agent); + attack_air::install(agent); + + special_hi::install(agent); + + cancel_step::install(agent); + + catch::install(agent); } \ No newline at end of file diff --git a/fighters/demon/src/status/special_hi.rs b/fighters/demon/src/status/special_hi.rs index 0e18173093..5773beabce 100644 --- a/fighters/demon/src/status/special_hi.rs +++ b/fighters/demon/src/status/special_hi.rs @@ -97,7 +97,128 @@ unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2C 0.into() } +unsafe extern "C" fn special_hi_rise_main(fighter: &mut L2CFighterCommon) -> L2CValue { + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_SPECIAL_HI_FLAG_AIR); + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_DEMON_STATUS_SPECIAL_HI_FLAG_AIR); + } + + MotionModule::change_motion( + fighter.module_accessor, + Hash40::new("special_hi"), + 0.0, + 1.0, + false, + 0.0, + false, + false + ); + + GroundModule::set_passable_check(fighter.module_accessor, false); + + fighter.sub_set_ground_correct_by_situation(true.into()); + + if let Some(target) = smashline::api::get_target_function("lua2cpp_demon.nrs", 0x24170) { + let special_hi_rise_helper: fn(&mut L2CFighterCommon, L2CValue) = std::mem::transmute(target); + special_hi_rise_helper(fighter, true.into()); + } + + fighter.main_shift(special_hi_rise_main_loop) +} + +unsafe extern "C" fn special_hi_rise_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + // if CancelModule::is_enable_cancel(fighter.module_accessor) { + // if fighter.sub_wait_ground_check_common(false.into()).get_bool() + // || fighter.sub_air_check_fall_common().get_bool() { + // return 0.into(); + // } + // } + + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 0.into(); + } + + let landing_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_hi"), hash40("landing_frame")); + if fighter.global_table[CURRENT_FRAME].get_i32() > landing_frame { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + WorkModule::set_float(fighter.module_accessor, 24.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); + return 0.into(); + } + } + else { + StatusModule::set_keep_situation_air(fighter.module_accessor, true); + } + + if MotionModule::is_end(fighter.module_accessor) { + WorkModule::set_float(fighter.module_accessor, 24.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.change_status(FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_FALL.into(), false.into()); + return 0.into(); + } + + fighter.sub_set_ground_correct_by_situation(true.into()); + + if let Some(target) = smashline::api::get_target_function("lua2cpp_demon.nrs", 0x24170) { + let special_hi_rise_helper: fn(&mut L2CFighterCommon, L2CValue) = std::mem::transmute(target); + special_hi_rise_helper(fighter, false.into()); + } + + 0.into() +} + +unsafe extern "C" fn special_hi_fall_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_pre_fall_special() +} + +unsafe extern "C" fn special_hi_fall_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.clear_lua_stack(); + lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL); + let stable_x = sv_kinetic_energy::get_stable_speed_x(fighter.lua_state_agent); + fighter.clear_lua_stack(); + lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL); + let limit_x = sv_kinetic_energy::get_limit_speed_x(fighter.lua_state_agent); + + let fall_speed_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_hi"), hash40("fall_speed_x_mul")); + + let air_accel_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_mul"), 0); + + sv_kinetic_energy!( + controller_set_accel_x_mul, + fighter, + air_accel_x_mul * fall_speed_x_mul + ); + + let fall_max_speed_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_hi"), hash40("fall_max_speed_x_mul")); + + sv_kinetic_energy!( + set_stable_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + stable_x * fall_max_speed_x_mul, + 0.0 + ); + sv_kinetic_energy!( + set_limit_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + limit_x * fall_max_speed_x_mul, + 0.0 + ); + + fighter.status_fall_special() +} + +unsafe extern "C" fn special_hi_fall_end(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_end_fall_special() +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_main); + + agent.status(Main, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_RISE, special_hi_rise_main); + + agent.status(Pre, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_FALL, special_hi_fall_pre); + agent.status(Main, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_FALL, special_hi_fall_main); + agent.status(End, *FIGHTER_DEMON_STATUS_KIND_SPECIAL_HI_FALL, special_hi_fall_end); } \ No newline at end of file diff --git a/fighters/demon/src/status/squat_wait.rs b/fighters/demon/src/status/squat_wait.rs new file mode 100644 index 0000000000..930f3551c0 --- /dev/null +++ b/fighters/demon/src/status/squat_wait.rs @@ -0,0 +1,9 @@ +use super::*; + +unsafe extern "C" fn demon_squat_wait_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_SquatWait() +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_SQUAT_WAIT, demon_squat_wait_main); +} \ No newline at end of file diff --git a/fighters/demon/src/status/wait.rs b/fighters/demon/src/status/wait.rs index 1fcf67da91..de4bf7548a 100644 --- a/fighters/demon/src/status/wait.rs +++ b/fighters/demon/src/status/wait.rs @@ -1,45 +1,14 @@ use super::*; -// FIGHTER_STATUS_KIND_WAIT - -pub unsafe extern "C" fn wait_pre(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn demon_wait_pre(fighter: &mut L2CFighterCommon) -> L2CValue { fighter.status_pre_Wait() } -// vanilla script - -pub unsafe extern "C" fn wait_main(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.sub_wait_common(); - fighter.sub_wait_motion_mtrans(); - fighter.sub_shift_status_main(L2CValue::Ptr(fgc_wait_main_loop as *const () as _)) -} - -pub unsafe extern "C" fn fgc_wait_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.status_Wait_Main().get_bool() { - return 0.into(); - } - let lr = WorkModule::get_float(fighter.module_accessor, *FIGHTER_SPECIAL_COMMAND_USER_INSTANCE_WORK_ID_FLOAT_OPPONENT_LR_1ON1); - if lr != 0.0 && PostureModule::lr(fighter.module_accessor) != lr { - let stick_x_corrected = fighter.global_table[STICK_X].get_f32() * (PostureModule::lr(fighter.module_accessor) * -1.0); - let stick_y = fighter.global_table[STICK_Y].get_f32(); - let walk_stick_x = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("walk_stick_x")); - let squat_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("squat_stick_y")); - - if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_WALK) { - if walk_stick_x <= stick_x_corrected { - if squat_stick_y < stick_y { - fighter.change_status(FIGHTER_RYU_STATUS_KIND_WALK_BACK.into(), true.into()); - return 0.into(); - } - } - } - fighter.change_status(FIGHTER_RYU_STATUS_KIND_TURN_AUTO.into(), false.into()); - return 0.into(); - } - 0.into() +unsafe extern "C" fn demon_wait_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_Wait() } pub fn install(agent: &mut Agent) { - agent.status(Pre, *FIGHTER_STATUS_KIND_WAIT, wait_pre); - agent.status(Main, *FIGHTER_STATUS_KIND_WAIT, wait_main); + agent.status(Pre, *FIGHTER_STATUS_KIND_WAIT, demon_wait_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_WAIT, demon_wait_main); } \ No newline at end of file diff --git a/fighters/demon/src/status/walk.rs b/fighters/demon/src/status/walk.rs new file mode 100644 index 0000000000..86b79ec124 --- /dev/null +++ b/fighters/demon/src/status/walk.rs @@ -0,0 +1,14 @@ +use super::*; + +unsafe extern "C" fn demon_walk_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_pre_Walk() +} + +unsafe extern "C" fn demon_walk_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_Walk() +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_WALK, demon_walk_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_WALK, demon_walk_main); +} \ No newline at end of file diff --git a/fighters/diddy/Cargo.toml b/fighters/diddy/Cargo.toml index 2b52be03bd..f41c081a9b 100644 --- a/fighters/diddy/Cargo.toml +++ b/fighters/diddy/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/diddy/src/acmd/aerials.rs b/fighters/diddy/src/acmd/aerials.rs index 0285871054..caf924c33f 100644 --- a/fighters/diddy/src/acmd/aerials.rs +++ b/fighters/diddy/src/acmd/aerials.rs @@ -13,17 +13,17 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 75, 95, 0, 55, 3.5, 3.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 10.0, 75, 95, 0, 55, 3.5, 3.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 10.0, 75, 95, 0, 55, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneel"), 10.0, 75, 95, 0, 55, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 75, 100, 0, 16, 3.5, 3.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 12.0, 75, 100, 0, 16, 3.5, 3.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 12.0, 75, 100, 0, 16, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneel"), 12.0, 75, 100, 0, 16, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 60, 90, 0, 55, 3.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 7.0, 60, 90, 0, 55, 3.0, 2.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 7.0, 60, 90, 0, 55, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneel"), 7.0, 60, 90, 0, 55, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 60, 100, 0, 5, 3.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 9.0, 60, 100, 0, 5, 3.0, 2.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 60, 100, 0, 5, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneel"), 9.0, 60, 100, 0, 5, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 21.0); if is_excute(agent) { @@ -54,14 +54,14 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 12.0, 361, 98, 0, 35, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 361, 98, 0, 35, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footr"), 12.0, 361, 98, 0, 35, 3.5, 2.0, -0.5, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 13.0, 361, 100, 0, 10, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 13.0, 361, 100, 0, 10, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 13.0, 361, 100, 0, 10, 3.5, 2.0, -0.5, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 361, 95, 0, 35, 3.0, 0.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 361, 95, 0, 35, 3.0, 3.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 10.0, 361, 100, 0, 10, 3.0, 0.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 361, 100, 0, 10, 3.0, 3.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::clear(boma, 2, false); } frame(lua_state, 15.0); @@ -86,9 +86,9 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 11.0, 361, 104, 0, 30, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 12.0, 361, 104, 0, 30, 4.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 12.0, 361, 104, 0, 30, 4.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 11.0, 361, 100, 0, 20, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 11.0, 361, 100, 0, 20, 4.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 11.0, 361, 100, 0, 20, 4.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 9.0); if is_excute(agent) { diff --git a/fighters/diddy/src/acmd/ground.rs b/fighters/diddy/src/acmd/ground.rs index d46b7fbc1e..3480f1ed4b 100644 --- a/fighters/diddy/src/acmd/ground.rs +++ b/fighters/diddy/src/acmd/ground.rs @@ -10,6 +10,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 80, 100, 20, 0, 3.5, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 20, 2.5, 0.0, 3.5, 6.5, Some(0.0), Some(3.5), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 2.0); if is_excute(agent) { @@ -31,6 +32,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 85, 100, 20, 0, 3.5, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 20, 2.5, 0.0, 3.5, 6.5, Some(0.0), Some(3.5), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/diddy/src/acmd/other.rs b/fighters/diddy/src/acmd/other.rs index fc30933080..41bcbf8bfa 100644 --- a/fighters/diddy/src/acmd/other.rs +++ b/fighters/diddy/src/acmd/other.rs @@ -72,15 +72,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -90,10 +86,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealhil(agent: &mut L2CAgentBase) { diff --git a/fighters/diddy/src/acmd/throws.rs b/fighters/diddy/src/acmd/throws.rs index dcd5102934..2f55236577 100644 --- a/fighters/diddy/src/acmd/throws.rs +++ b/fighters/diddy/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(8.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 7.0, 4.3, Some(0.0), Some(7.0), Some(8.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -29,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.0, 4.0, Some(0.0), Some(6.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.0, 4.3, Some(0.0), Some(6.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-13.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.0, -4.3, Some(0.0), Some(6.0), Some(-13.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -64,20 +64,15 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 18.0, 21.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 18.0, 19.0); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 10.0, 45, 86, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 10.0, 45, 70, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 17.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); CHECK_FINISH_CAMERA(agent, 22, 18); - //FighterCutInManager::set_throw_finish_zoom_rate(boma, 2); - //FighterCutInManager::set_throw_finish_offset(boma, 8, 5, 0); - } - frame(lua_state, 17.0); - if is_excute(agent) { let release_position = Vector3f{ x:-2.5, y: 9.0, z: -13.0 }; ModelModule::set_joint_translate(boma, Hash40::new("throw"), &release_position, false, false); } diff --git a/fighters/diddy/src/acmd/tilts.rs b/fighters/diddy/src/acmd/tilts.rs index 06efd7ddae..9b1a33a19b 100644 --- a/fighters/diddy/src/acmd/tilts.rs +++ b/fighters/diddy/src/acmd/tilts.rs @@ -1,5 +1,47 @@ use super::*; +unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.0, 6.0); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("handr"), 10.0, 35, 100, 0, 10, 3.8, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handl"), 10.0, 35, 100, 0, 10, 3.8, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 35, 100, 0, 10, 4.0, 0.0, 6.0, 7.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 35, 100, 0, 10, 3.0, 0.0, 6.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear(boma, 2, false); + AttackModule::clear(boma, 3, false); + } + wait(lua_state, 1.0); + if is_excute(agent) { + ATK_POWER(agent, 0, 7); + ATK_POWER(agent, 1, 7); + } + wait(lua_state, 4.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 23.0); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 6.0, 5.0); + } + frame(lua_state, 28.0); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 3.0); + } + frame(lua_state, 33.0); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.0, 3.0); + } +} + unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -32,7 +74,11 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { } pub fn install(agent: &mut Agent) { + agent.acmd("game_attacks3", game_attacks3, Priority::Low); + agent.acmd("game_attacks3hi", game_attacks3, Priority::Low); + agent.acmd("game_attacks3lw", game_attacks3, Priority::Low); + agent.acmd("game_attackhi3", game_attackhi3, Priority::Low); agent.acmd("game_attacklw3", game_attacklw3, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/diddy/src/lib.rs b/fighters/diddy/src/lib.rs index 33d6d7f732..662ec762b5 100644 --- a/fighters/diddy/src/lib.rs +++ b/fighters/diddy/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/diddy/src/opff.rs b/fighters/diddy/src/opff.rs index 039ccedbac..ee1738fd3e 100644 --- a/fighters/diddy/src/opff.rs +++ b/fighters/diddy/src/opff.rs @@ -52,9 +52,14 @@ unsafe fn nspecial_cancels(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: // rather than having to wait until the end of the knockback animation unsafe fn up_special_knockback_canceling(fighter: &mut smash::lua2cpp::L2CFighterCommon) { if fighter.is_status_one_of(&[*FIGHTER_DIDDY_STATUS_KIND_SPECIAL_HI_CHARGE_DAMAGE, *FIGHTER_DIDDY_STATUS_KIND_SPECIAL_HI_UPPER_DAMAGE]) { + if StatusModule::is_changing(fighter.module_accessor) { + return; + } + if MotionModule::frame(fighter.module_accessor) >= (MotionModule::end_frame(fighter.module_accessor) - 1.0) && MotionModule::rate(fighter.module_accessor) != 0.0 { MotionModule::set_rate(fighter.module_accessor, 0.0); } + let hitstun = WorkModule::get_float(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLOAT_DAMAGE_REACTION_FRAME); if hitstun <= 0.0 { fighter.change_status_req(*FIGHTER_STATUS_KIND_DAMAGE_FALL, false); @@ -112,7 +117,7 @@ unsafe fn dash_attack_jump_cancels(fighter: &mut L2CFighterCommon, boma: &mut Ba if status_kind == *FIGHTER_STATUS_KIND_ATTACK_DASH && situation_kind == *SITUATION_KIND_AIR { if MotionModule::frame(boma) >= 21.0 { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, true); } } } diff --git a/fighters/diddy/src/status/special_hi.rs b/fighters/diddy/src/status/special_hi.rs index 358377725a..91bc39387c 100644 --- a/fighters/diddy/src/status/special_hi.rs +++ b/fighters/diddy/src/status/special_hi.rs @@ -66,7 +66,7 @@ unsafe extern "C" fn special_hi_charge_pre(fighter: &mut L2CFighterCommon) -> L2 // FIGHTER_DIDDY_STATUS_KIND_SPECIAL_HI_CHARGE_DAMAGE pub unsafe extern "C" fn special_hi_charge_damage_main(fighter: &mut L2CFighterCommon) -> L2CValue { - let ret = smashline::original_status(Main, fighter, *FIGHTER_DIDDY_STATUS_KIND_SPECIAL_HI_CHARGE)(fighter); + let ret = smashline::original_status(Main, fighter, *FIGHTER_DIDDY_STATUS_KIND_SPECIAL_HI_CHARGE_DAMAGE)(fighter); MotionModule::set_rate(fighter.module_accessor, 1.0); ret } diff --git a/fighters/diddy/src/status/special_s.rs b/fighters/diddy/src/status/special_s.rs index 6824e47558..91613918eb 100644 --- a/fighters/diddy/src/status/special_s.rs +++ b/fighters/diddy/src/status/special_s.rs @@ -7,6 +7,52 @@ pub unsafe extern "C" fn special_s_init(fighter: &mut L2CFighterCommon) -> L2CVa 0.into() } +pub unsafe extern "C" fn special_s_kick_main(fighter: &mut L2CFighterCommon) -> L2CValue { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_kick"), 0.0, 1.0, false, 0.0, false, false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + + fighter.main_shift(special_s_kick_main_loop) +} + +pub unsafe extern "C" fn special_s_kick_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.change_status(FIGHTER_DIDDY_STATUS_KIND_SPECIAL_S_KICK_LANDING.into(), false.into()); + return 0.into(); + } + if MotionModule::is_end(fighter.module_accessor) + || AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + fighter.change_status(FIGHTER_DIDDY_STATUS_KIND_SPECIAL_S_FLIP_FALL.into(), false.into()); + return 1.into(); + } + + return 0.into(); +} + +unsafe extern "C" fn special_s_flip_fall_main(fighter: &mut L2CFighterCommon) -> L2CValue { + // Reduce speed on shield + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 || prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0 { + app::KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_CONTROL, fighter.module_accessor); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + let shield_hit_end_speed_x = 0.5;//ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + shield_hit_end_speed_x * lr, + 0.0 + ); + } + + smashline::original_status(Main, fighter, *FIGHTER_DIDDY_STATUS_KIND_SPECIAL_S_FLIP_FALL)(fighter) +} + pub fn install(agent: &mut Agent) { agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_init); + agent.status(Main, *FIGHTER_DIDDY_STATUS_KIND_SPECIAL_S_KICK, special_s_kick_main); + agent.status(Main, *FIGHTER_DIDDY_STATUS_KIND_SPECIAL_S_FLIP_FALL, special_s_flip_fall_main); } \ No newline at end of file diff --git a/fighters/dolly/Cargo.toml b/fighters/dolly/Cargo.toml index 146f3248ca..45483e39d2 100644 --- a/fighters/dolly/Cargo.toml +++ b/fighters/dolly/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/dolly/src/acmd/other.rs b/fighters/dolly/src/acmd/other.rs index 5840a131ed..29dfe64eb3 100644 --- a/fighters/dolly/src/acmd/other.rs +++ b/fighters/dolly/src/acmd/other.rs @@ -74,16 +74,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -94,10 +90,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { diff --git a/fighters/dolly/src/acmd/specials/special_hi.rs b/fighters/dolly/src/acmd/specials/special_hi.rs index 709cec0114..dbc307827b 100644 --- a/fighters/dolly/src/acmd/specials/special_hi.rs +++ b/fighters/dolly/src/acmd/specials/special_hi.rs @@ -5,9 +5,6 @@ unsafe extern "C" fn game_specialhi1(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); FT_MOTION_RATE_RANGE(agent, 3.0, 6.0, 6.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } frame(lua_state, 4.5); if is_excute(agent) { agent.on_flag(*FIGHTER_DOLLY_STATUS_SPECIAL_HI_WORK_FLAG_REVERSE_LR); @@ -157,9 +154,6 @@ unsafe extern "C" fn game_specialhicommand(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); FT_MOTION_RATE_RANGE(agent, 3.0, 6.0, 6.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } frame(lua_state, 4.5); if is_excute(agent) { agent.on_flag(*FIGHTER_DOLLY_STATUS_SPECIAL_HI_WORK_FLAG_REVERSE_LR); diff --git a/fighters/dolly/src/acmd/specials/super_special.rs b/fighters/dolly/src/acmd/specials/super_special.rs index 7b8f6aa6c4..66527d0b4f 100644 --- a/fighters/dolly/src/acmd/specials/super_special.rs +++ b/fighters/dolly/src/acmd/specials/super_special.rs @@ -68,7 +68,7 @@ unsafe extern "C" fn effect_superspecialtriple(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { let lr = PostureModule::lr(boma); - EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("top"), 8.0 * lr, 10, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 8.0 * lr, 10, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, true); LAST_EFFECT_SET_COLOR(agent, 0.831, 0.686, 0.216); } frame(lua_state, 12.0); diff --git a/fighters/dolly/src/acmd/throws.rs b/fighters/dolly/src/acmd/throws.rs index bbe95ad5f1..3d7e278a61 100644 --- a/fighters/dolly/src/acmd/throws.rs +++ b/fighters/dolly/src/acmd/throws.rs @@ -5,11 +5,11 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 6.0); - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 6.0); if is_excute(agent) { CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); @@ -56,7 +56,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-13.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, -6.0, Some(0.0), Some(8.0), Some(-13.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -105,8 +105,6 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); - let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); MeterModule::watch_damage(agent.battle_object, false); MeterModule::add(agent.battle_object, 7.0 * MeterModule::damage_gain_mul(agent.battle_object)); } @@ -135,8 +133,6 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); - let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); MeterModule::watch_damage(agent.battle_object, false); MeterModule::add(agent.battle_object, 7.0 * MeterModule::damage_gain_mul(agent.battle_object)); } diff --git a/fighters/dolly/src/lib.rs b/fighters/dolly/src/lib.rs index 8805736c89..351fe691b1 100644 --- a/fighters/dolly/src/lib.rs +++ b/fighters/dolly/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/dolly/src/opff.rs b/fighters/dolly/src/opff.rs index d4a8d4dd20..15f9daadc9 100644 --- a/fighters/dolly/src/opff.rs +++ b/fighters/dolly/src/opff.rs @@ -124,6 +124,16 @@ unsafe fn hit_cancel_timer(fighter: &mut L2CFighterCommon, boma: &mut BattleObje } } +unsafe fn burn_knuckle_end_on_shield(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_DOLLY_STATUS_KIND_SPECIAL_F_ATTACK) { + // Skip to end on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) + && !fighter.is_in_hitlag() { + fighter.change_status(FIGHTER_DOLLY_STATUS_KIND_SPECIAL_F_END.into(), false.into()); + } + } +} + pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { inherit_final_cancel(fighter); disable_special_cancels_on_parry(fighter); @@ -132,6 +142,7 @@ pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectMod specials_ledgegrab_fix(fighter); super_special_cancels(fighter, boma, status_kind, situation_kind, motion_kind, frame); hit_cancel_timer(fighter, boma); + burn_knuckle_end_on_shield(fighter); } pub extern "C" fn dolly_meter(fighter: &mut smash::lua2cpp::L2CFighterCommon) { diff --git a/fighters/dolly/src/status/special_s.rs b/fighters/dolly/src/status/special_s.rs index 5f2ad3c3df..9cbbddd8b5 100644 --- a/fighters/dolly/src/status/special_s.rs +++ b/fighters/dolly/src/status/special_s.rs @@ -84,6 +84,30 @@ pub unsafe extern "C" fn special_f_attack_pre(fighter: &mut L2CFighterCommon) -> return false.into(); } +// FIGHTER_DOLLY_STATUS_KIND_SPECIAL_F_END + +unsafe extern "C" fn special_f_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + // Reduce speed on shield + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 || prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0 { + let shield_hit_end_speed_x = if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_f.shield_hit_ground_end_speed_x") + } else { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_f.shield_hit_air_end_speed_x") + }; + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + shield_hit_end_speed_x * lr, + 0.0 + ); + } + + smashline::original_status(Main, fighter, *FIGHTER_DOLLY_STATUS_KIND_SPECIAL_F_END)(fighter) +} + // FIGHTER_DOLLY_STATUS_KIND_SPECIAL_B pub unsafe extern "C" fn special_b_init(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -162,6 +186,7 @@ pub fn install(agent: &mut Agent) { agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_init); agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); agent.status(Pre, *FIGHTER_DOLLY_STATUS_KIND_SPECIAL_F_ATTACK, special_f_attack_pre); + agent.status(Main, *FIGHTER_DOLLY_STATUS_KIND_SPECIAL_F_END, special_f_end_main); agent.status(Init, *FIGHTER_DOLLY_STATUS_KIND_SPECIAL_S_COMMAND, special_s_command_init); agent.status(Init, *FIGHTER_DOLLY_STATUS_KIND_SPECIAL_B, special_b_init); agent.status(Init, *FIGHTER_DOLLY_STATUS_KIND_SPECIAL_B_COMMAND, special_b_command_init); diff --git a/fighters/donkey/Cargo.toml b/fighters/donkey/Cargo.toml index 94cc23addf..f65df8173b 100644 --- a/fighters/donkey/Cargo.toml +++ b/fighters/donkey/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -smash2 = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/donkey/src/acmd/other.rs b/fighters/donkey/src/acmd/other.rs index a5944a72a6..5395d97cea 100644 --- a/fighters/donkey/src/acmd/other.rs +++ b/fighters/donkey/src/acmd/other.rs @@ -44,7 +44,7 @@ unsafe extern "C" fn expression_landingheavy(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_landl"), 0, false, 0x50000000 /* default value */); slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - if !agent.is_prev_status(*FIGHTER_STATUS_KIND_ESCAPE_AIR) { + if !agent.is_prev_status_one_of(&[*FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_STATUS_KIND_DAMAGE_AIR]) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } @@ -93,15 +93,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -111,10 +107,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_itemheavyget(agent: &mut L2CAgentBase) { diff --git a/fighters/donkey/src/acmd/specials.rs b/fighters/donkey/src/acmd/specials.rs index 5f5c813655..92bd828c27 100644 --- a/fighters/donkey/src/acmd/specials.rs +++ b/fighters/donkey/src/acmd/specials.rs @@ -155,10 +155,10 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); WorkModule::on_flag(boma, *FIGHTER_DONKEY_STATUS_SPECIAL_S_FLAG_FALL_START); /* Ground-only */ - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 295, 50, 0, 40, 6.5, 0.0, 5.0, 10.5, Some(0.0), Some( 5.0), Some( 1.4), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bury"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 295, 50, 0, 40, 6.5, 0.0, 5.0, 10.5, Some(0.0), Some( 5.0), Some( 1.4), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 34, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bury"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); /* Air-only */ - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 295, 50, 0, 40, 5.0, 0.0, 5.0, 12.0, Some(0.0), Some( 5.0), Some( 1.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 295, 50, 0, 40, 9.0, 0.0, 11.0, 7.0, Some(0.0), Some(11.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 295, 50, 0, 40, 5.0, 0.0, 5.0, 12.0, Some(0.0), Some( 5.0), Some( 1.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 34, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 295, 50, 0, 40, 9.0, 0.0, 11.0, 7.0, Some(0.0), Some(11.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 34, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } frame(lua_state, 22.0); if is_excute(agent) { @@ -180,7 +180,9 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { } frame(lua_state, 19.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -3, 0, 1.5, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -3, 0, 1.5, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, false); + } } frame(lua_state, 20.0); if is_excute(agent) { @@ -402,7 +404,7 @@ unsafe extern "C" fn effect_specialairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_flash"), Hash40::new("top"), 5, 16, 9, 0, 0, 0, 0.8, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 5, 16, 9, 0, 0, 0, 0.8, true); } frame(lua_state, 18.0); if is_excute(agent) { @@ -454,7 +456,7 @@ unsafe extern "C" fn effect_specialairlwlanding(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_flash"), Hash40::new("top"), 5, 16, 9, 0, 0, 0, 0.8, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 5, 16, 9, 0, 0, 0, 0.8, true); } frame(lua_state, 18.0); if is_excute(agent) { diff --git a/fighters/donkey/src/acmd/throws.rs b/fighters/donkey/src/acmd/throws.rs index 2cfba250b7..7d287e6aae 100644 --- a/fighters/donkey/src/acmd/throws.rs +++ b/fighters/donkey/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.875); - frame(lua_state, 7.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 6.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(14.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 6.0, 0.0, 7.0, 2.5, Some(0.0), Some(7.0), Some(14.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -110,7 +109,7 @@ unsafe extern "C" fn game_throwfhi(agent: &mut L2CAgentBase) { let weight = WorkModule::get_param_float(boma.get_grabbed_opponent_boma(), hash40("weight"), 0); FT_MOTION_RATE_RANGE(agent, 1.0, 36.0, 39.0 + 18.0 * (weight / 100.0 - 1.0)); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 90, 50, 0, 90, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 90, 60, 0, 90, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 14.0); @@ -146,6 +145,26 @@ unsafe extern "C" fn game_throwflw(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 90, 20, 0, 77, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 13.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, -5, 32); + } + frame(lua_state, 14.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -283,6 +302,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_throwfhi", game_throwfhi, Priority::Low); agent.acmd("game_throwflw", game_throwflw, Priority::Low); + agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); agent.acmd("game_itemheavythrowf", game_itemheavythrowf, Priority::Low); diff --git a/fighters/donkey/src/lib.rs b/fighters/donkey/src/lib.rs index 248375e7f6..6e0afbede5 100644 --- a/fighters/donkey/src/lib.rs +++ b/fighters/donkey/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/donkey/src/opff.rs b/fighters/donkey/src/opff.rs index 2fefe8f3d6..0527923418 100644 --- a/fighters/donkey/src/opff.rs +++ b/fighters/donkey/src/opff.rs @@ -7,7 +7,7 @@ unsafe fn dash_attack_air_cancel(boma: &mut BattleObjectModuleAccessor) { if boma.is_status(*FIGHTER_STATUS_KIND_ATTACK_DASH) && boma.is_situation(*SITUATION_KIND_AIR) && MotionModule::frame(boma) >= 26.0 { - boma.check_jump_cancel(false, false); + boma.check_jump_cancel(false, false, true); } } diff --git a/fighters/duckhunt/Cargo.toml b/fighters/duckhunt/Cargo.toml index aa5905ceb9..912de790ab 100644 --- a/fighters/duckhunt/Cargo.toml +++ b/fighters/duckhunt/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/duckhunt/src/acmd/aerials.rs b/fighters/duckhunt/src/acmd/aerials.rs index 0c9c94133e..37697c3c52 100644 --- a/fighters/duckhunt/src/acmd/aerials.rs +++ b/fighters/duckhunt/src/acmd/aerials.rs @@ -161,27 +161,35 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 14.0, 8.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - // Air-only - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 255, 20, 0, 20, 4.5, 0.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 130, 20, 0, 20, 3.5, 0.0, -4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - // Ground-only - ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 275, 20, 0, 20, 4.5, 0.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 275, 20, 0, 20, 3.5, 0.0, -4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 365, 31, 0, 30, 5.5, 0.0, -1.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 365, 31, 0, 30, 4.5, 0.0, -3.5, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } - wait(lua_state, 2.0); + frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 19.0, 5.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 19.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 270, 60, 0, 34, 5.5, 0.0, 0.0, 3.5, Some(0.0), Some(5.0), Some(5.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + } frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 270, 60, 0, 34, 5.5, 0.0, -8.0, 0.0, Some(0.0), Some(-5.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 270, 60, 0, 34, 5.5, 0.0, -8.0, 0.0, Some(0.0), Some(2.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } - wait(lua_state, 2.0); + frame(lua_state, 21.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 270, 60, 0, 34, 5.5, 0.0, -8.0, 0.0, Some(0.0), Some(-2.0), Some(3.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + } + frame(lua_state, 22.0); if is_excute(agent) { AttackModule::clear_all(boma); } diff --git a/fighters/duckhunt/src/acmd/ground.rs b/fighters/duckhunt/src/acmd/ground.rs index 803d03e3dd..3954ad008f 100644 --- a/fighters/duckhunt/src/acmd/ground.rs +++ b/fighters/duckhunt/src/acmd/ground.rs @@ -18,7 +18,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 6.0); + frame(lua_state, 8.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } @@ -39,9 +39,12 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); + } + frame(lua_state, 10.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } - frame(lua_state, 9.0); + frame(lua_state, 16.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } diff --git a/fighters/duckhunt/src/acmd/other.rs b/fighters/duckhunt/src/acmd/other.rs index d41aea4624..7bbb92b269 100644 --- a/fighters/duckhunt/src/acmd/other.rs +++ b/fighters/duckhunt/src/acmd/other.rs @@ -73,15 +73,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -91,10 +87,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_fallspecial(agent: &mut L2CAgentBase) { @@ -111,6 +104,24 @@ unsafe extern "C" fn effect_fallspecial(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + + if is_excute(agent) { + GroundModule::select_cliff_hangdata(boma, 1); + } +} + +unsafe extern "C" fn game_jumpaerialback(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + + if is_excute(agent) { + GroundModule::select_cliff_hangdata(boma, 1); + } +} + unsafe extern "C" fn sound_appeals(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -157,6 +168,9 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_fallspecial", effect_fallspecial, Priority::Low); + agent.acmd("game_jumpaerialfront", game_jumpaerialfront, Priority::Low); + agent.acmd("game_jumpaerialback", game_jumpaerialback, Priority::Low); + agent.acmd("effect_appealsl", acmd_stub, Priority::Low); agent.acmd("effect_appealsr", acmd_stub, Priority::Low); agent.acmd("sound_appealsl", sound_appeals, Priority::Low); diff --git a/fighters/duckhunt/src/acmd/specials/special_hi.rs b/fighters/duckhunt/src/acmd/specials/special_hi.rs index 8d2f17dbf2..0030d19b9c 100644 --- a/fighters/duckhunt/src/acmd/specials/special_hi.rs +++ b/fighters/duckhunt/src/acmd/specials/special_hi.rs @@ -3,6 +3,9 @@ use super::*; unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + if is_excute(agent) { + GroundModule::select_cliff_hangdata(boma, 2); + } frame(lua_state, 8.0); if is_excute(agent) { VarModule::on_flag(boma.object(), vars::duckhunt::status::SPECIAL_HI_JUMP); @@ -77,6 +80,11 @@ unsafe extern "C" fn expression_specialhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + if is_excute(agent) { + // Uses special fall ledgegrab box + // due to similarity of animations + GroundModule::select_cliff_hangdata(boma, 4); + } frame(lua_state, 8.0); if is_excute(agent) { VarModule::on_flag(boma.object(), vars::duckhunt::status::SPECIAL_HI_JUMP); @@ -155,6 +163,9 @@ unsafe extern "C" fn expression_specialhi2(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + if is_excute(agent) { + GroundModule::select_cliff_hangdata(boma, 3); + } frame(lua_state, 6.0); if is_excute(agent) { DamageModule::add_damage(boma, 2.0, 0); diff --git a/fighters/duckhunt/src/acmd/throws.rs b/fighters/duckhunt/src/acmd/throws.rs index 6899a0566d..3164bf1e9e 100644 --- a/fighters/duckhunt/src/acmd/throws.rs +++ b/fighters/duckhunt/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 5.0/(5.0-1.0)); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.5), Some(9.70), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.5), Some(9.70), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-18.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -5.5, Some(0.0), Some(6.6), Some(-18.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -91,6 +90,10 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 80, 40, 0, 90, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 5.0); + FT_MOTION_RATE_RANGE(agent, 5.0, 20.0, 12.0); + frame(lua_state, 20.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 23.0); if is_excute(agent) { ATTACK_IGNORE_THROW(agent, 0, 0, Hash40::new("top"), 4.0, 50, 70, 0, 50, 7.0, 0.0, 4.0, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_THROW); diff --git a/fighters/duckhunt/src/can/acmd.rs b/fighters/duckhunt/src/can/acmd.rs index 21de93fb12..96d89f4d86 100644 --- a/fighters/duckhunt/src/can/acmd.rs +++ b/fighters/duckhunt/src/can/acmd.rs @@ -3,6 +3,7 @@ use super::*; unsafe extern "C" fn game_ready(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + CameraModule::set_enable_camera(boma, false, 0); if is_excute(agent) { VarModule::off_flag(agent.battle_object, vars::duckhunt_can::instance::KILLSHOT_EXPLODE); } diff --git a/fighters/duckhunt/src/lib.rs b/fighters/duckhunt/src/lib.rs index e9f12293c9..6d492bac17 100644 --- a/fighters/duckhunt/src/lib.rs +++ b/fighters/duckhunt/src/lib.rs @@ -38,6 +38,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/duckhunt/src/opff.rs b/fighters/duckhunt/src/opff.rs index f45824f959..f41d43bb6b 100644 --- a/fighters/duckhunt/src/opff.rs +++ b/fighters/duckhunt/src/opff.rs @@ -3,41 +3,42 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { - if !fighter.is_in_hitlag() - && !StatusModule::is_changing(fighter.module_accessor) - && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_S, - *FIGHTER_STATUS_KIND_SPECIAL_LW - ]) - && fighter.is_situation(*SITUATION_KIND_AIR) { - fighter.sub_air_check_dive(); - } -} - extern "Rust" { fn gimmick_flash(boma: &mut BattleObjectModuleAccessor); } unsafe fn gunman_timer(fighter: &mut L2CFighterCommon) { - let timer = VarModule::get_int(fighter.object(), vars::duckhunt::instance::SPECIAL_LW_GUNMAN_TIMER); - if timer != 0 { - VarModule::set_int(fighter.object(), vars::duckhunt::instance::SPECIAL_LW_GUNMAN_TIMER, (timer-1)); - } - if timer == 1 { + if VarModule::countdown_int(fighter.battle_object, vars::duckhunt::instance::SPECIAL_LW_GUNMAN_TIMER, 0) { gimmick_flash(fighter); } } -pub extern "C" fn duckhunt_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterCommon) { - unsafe { - common::opff::fighter_common_opff(fighter); - gunman_timer(fighter); - fastfall_specials(fighter); +unsafe fn fall_special_ledgegrab_box(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_STATUS_KIND_FALL_SPECIAL) { + GroundModule::select_cliff_hangdata(fighter.module_accessor, 4); } } +pub unsafe fn moveset(fighter: &mut smash::lua2cpp::L2CFighterCommon) { + gunman_timer(fighter); +} + +pub unsafe extern "C" fn duckhunt_frame_wrapper(fighter: &mut L2CFighterCommon) { + common::opff::fighter_common_opff(fighter); + duckhunt_frame(fighter); +} + +pub unsafe fn duckhunt_frame(fighter: &mut smash::lua2cpp::L2CFighterCommon) { + if let Some(info) = FrameInfo::update_and_get(fighter) { + moveset(fighter); + } +} + +pub unsafe extern "C" fn duckhunt_frame_wrapper_exec(fighter: &mut L2CFighterCommon) { + fall_special_ledgegrab_box(fighter); +} + pub fn install(agent: &mut Agent) { agent.on_line(Main, duckhunt_frame_wrapper); + agent.on_line(Exec, duckhunt_frame_wrapper_exec); } \ No newline at end of file diff --git a/fighters/duckhunt/src/status/attack_air.rs b/fighters/duckhunt/src/status/attack_air.rs new file mode 100644 index 0000000000..e40f57a0bd --- /dev/null +++ b/fighters/duckhunt/src/status/attack_air.rs @@ -0,0 +1,60 @@ +use super::*; + +pub unsafe extern "C" fn attack_air_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_attack_air(); + fighter.sub_shift_status_main(L2CValue::Ptr(attack_air_main_loop as *const () as _)) +} + +unsafe extern "C" fn status_AttackAir_Main(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.attack_air_common_strans().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) + && !VarModule::is_flag(fighter.object(), vars::duckhunt::instance::SPECIAL_HI_AERIAL_USED) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + if VarModule::is_flag(fighter.object(), vars::duckhunt::instance::SPECIAL_HI_AERIAL_USED) { + fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); + } + else { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + } + return 1.into(); + } + + return 0.into(); +} + +unsafe extern "C" fn attack_air_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if !status_AttackAir_Main(fighter).get_bool() { + fighter.sub_air_check_superleaf_fall_slowly(); + if !fighter.global_table[IS_STOPPING].get_bool() { + app::FighterUtil::check_cloud_through_out(fighter.module_accessor); + } + } + + false.into() +} + +pub unsafe extern "C" fn attack_air_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.object(), vars::duckhunt::instance::SPECIAL_HI_AERIAL_USED) { + if [ + *FIGHTER_STATUS_KIND_LANDING, + *FIGHTER_STATUS_KIND_LANDING_ATTACK_AIR, + ].contains(&fighter.global_table[STATUS_KIND].get_i32()) { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); + } + VarModule::off_flag(fighter.object(), vars::duckhunt::instance::SPECIAL_HI_AERIAL_USED); + } + + smashline::original_status(End, fighter, *FIGHTER_STATUS_KIND_ATTACK_AIR)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_AIR, attack_air_main); + agent.status(End, *FIGHTER_STATUS_KIND_ATTACK_AIR, attack_air_end); +} \ No newline at end of file diff --git a/fighters/duckhunt/src/status/landing.rs b/fighters/duckhunt/src/status/landing.rs new file mode 100644 index 0000000000..bd6ddef0aa --- /dev/null +++ b/fighters/duckhunt/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/duckhunt/src/status/mod.rs b/fighters/duckhunt/src/status/mod.rs index b9214149e8..600332a9f5 100644 --- a/fighters/duckhunt/src/status/mod.rs +++ b/fighters/duckhunt/src/status/mod.rs @@ -2,10 +2,12 @@ use super::*; use globals::*; // status script import +mod attack_air; mod attacks3; mod special_hi; mod special_n; mod special_s; +mod landing; unsafe extern "C" fn use_special_lw_callback(fighter: &mut L2CFighterCommon) -> L2CValue { if VarModule::get_int(fighter.battle_object, vars::duckhunt::instance::SPECIAL_LW_GUNMAN_TIMER) != 0 { @@ -33,8 +35,10 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { pub fn install(agent: &mut Agent) { agent.on_start(on_start); + attack_air::install(agent); attacks3::install(agent); special_hi::install(agent); special_n::install(agent); special_s::install(agent); + landing::install(agent); } \ No newline at end of file diff --git a/fighters/duckhunt/src/status/special_hi.rs b/fighters/duckhunt/src/status/special_hi.rs index 207dea9d20..c3e776185b 100644 --- a/fighters/duckhunt/src/status/special_hi.rs +++ b/fighters/duckhunt/src/status/special_hi.rs @@ -38,9 +38,11 @@ pub unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CV // shot 2 MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi_2"), 1.0, 1.0, false, 0.0, false, false); ControlModule::clear_command_one(fighter.module_accessor, 0, *FIGHTER_PAD_CMD_CAT1_SPECIAL_HI); + WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_AIR); } special_hi_set_physics(fighter, false); VarModule::on_flag(fighter.object(), vars::duckhunt::instance::SPECIAL_HI2_ENABLE); + fighter.main_shift(special_hi_main_loop) } @@ -107,6 +109,9 @@ unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2C return 1.into(); } } + if fighter.sub_transition_group_check_air_attack().get_bool() { + VarModule::on_flag(fighter.battle_object, vars::duckhunt::instance::SPECIAL_HI_AERIAL_USED); + } } return 0.into(); @@ -180,6 +185,11 @@ unsafe extern "C" fn special_hi_exit(fighter: &mut L2CFighterCommon) -> L2CValue let effect_handle = VarModule::get_int64(fighter.battle_object, vars::duckhunt::status::SPECIAL_HI_RETICLE_EFFECT_HANDLE); EffectModule::set_scale(fighter.module_accessor, effect_handle as u32, &Vector3f::zero()); EffectModule::kill_kind(fighter.module_accessor, Hash40::new("duckhunt_target"), true, true); + + if fighter.is_motion(Hash40::new("special_hi")) { + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); + } + return 0.into(); } diff --git a/fighters/duckhunt/src/status/special_n.rs b/fighters/duckhunt/src/status/special_n.rs index 09a1f920bd..51d5fd4c45 100644 --- a/fighters/duckhunt/src/status/special_n.rs +++ b/fighters/duckhunt/src/status/special_n.rs @@ -5,31 +5,13 @@ use super::*; pub unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); - MotionModule::change_motion( - fighter.module_accessor, - Hash40::new("special_air_n"), - 0.0, - 1.0, - false, - 0.0, - false, - false - ); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n"), 0.0, 1.0, false, 0.0, false, false); } else { GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - MotionModule::change_motion( - fighter.module_accessor, - Hash40::new("special_n"), - 0.0, - 1.0, - false, - 0.0, - false, - false - ); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n"), 0.0, 1.0, false, 0.0, false, false); } ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_DUCKHUNT_GENERATE_ARTICLE_RETICLE, Hash40::new("special_n"), true, -1.0); if !ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_DUCKHUNT_GENERATE_ARTICLE_CAN) { @@ -58,12 +40,7 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV } } if MotionModule::is_end(fighter.module_accessor) { - if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { - fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL, false); - } - else { - fighter.change_status_req(*FIGHTER_STATUS_KIND_WAIT, false); - } + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); return 0.into(); } if !StatusModule::is_changing(fighter.module_accessor) { @@ -75,12 +52,13 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV } else { GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_n"), -1.0, 1.0, 0.0, false, false); } } } - 0.into() + + return 0.into(); } pub fn install(agent: &mut Agent) { diff --git a/fighters/edge/Cargo.toml b/fighters/edge/Cargo.toml index 248034dbb5..9a553e61cf 100644 --- a/fighters/edge/Cargo.toml +++ b/fighters/edge/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -interpolation = "0.2.0" \ No newline at end of file +interpolation = "0.2.0" +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/edge/src/acmd/other.rs b/fighters/edge/src/acmd/other.rs index e0bd25a912..a7950017d3 100644 --- a/fighters/edge/src/acmd/other.rs +++ b/fighters/edge/src/acmd/other.rs @@ -82,15 +82,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -100,10 +96,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/edge/src/acmd/smashes.rs b/fighters/edge/src/acmd/smashes.rs index 553c6d2857..d1692007b1 100644 --- a/fighters/edge/src/acmd/smashes.rs +++ b/fighters/edge/src/acmd/smashes.rs @@ -236,8 +236,8 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { if WorkModule::is_flag(boma, *FIGHTER_EDGE_STATUS_ATTACK_LW4_WORK_FLAG_IS_HIT_FLOOR) { QUAKE(agent, *CAMERA_QUAKE_KIND_M); ControlModule::set_rumble(boma, Hash40::new("rbkind_nohit_attacks"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - ATTACK(agent, 0, 0, Hash40::new("top"), 16.5, 63, 68, 0, 85, 4.6, 0.0, 2.5, 23.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 63, 68, 0, 85, 8.8, 0.0, 6.5, 23.5, Some(0.0), Some(8.5), Some(23.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.5, 63, 68, 0, 85, 4.6, 0.0, 2.5, 23.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 63, 68, 0, 85, 8.8, 0.0, 6.5, 23.5, Some(0.0), Some(8.5), Some(23.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_NONE); ATTACK(agent, 2, 0, Hash40::new("swordl1"), 10.0, 48, 68, 0, 80, 1.5, -2.0, 0.0, 0.0, Some(8.0), Some(0.0), Some(0.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("swordl1"), 10.0, 48, 68, 0, 80, 1.5, 10.0, 0.0, 0.0, Some(19.0), Some(0.0), Some(0.8), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 4, 0, Hash40::new("swordl1"), 13.0, 48, 68, 0, 80, 1.5, 20.0, 0.0, 0.8, Some(24.0), Some(0.0), Some(1.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); diff --git a/fighters/edge/src/acmd/specials.rs b/fighters/edge/src/acmd/specials.rs index 849a7bc0c8..ca8e074feb 100644 --- a/fighters/edge/src/acmd/specials.rs +++ b/fighters/edge/src/acmd/specials.rs @@ -382,11 +382,6 @@ unsafe extern "C" fn game_speciallwhit(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) { - VarModule::on_flag(agent.object(), vars::edge::status::FLASH_HOLD); - } - } frame(lua_state, 7.0); FT_MOTION_RATE_RANGE(agent, 7.0, 20.0, 7.0); if is_excute(agent) { diff --git a/fighters/edge/src/acmd/throws.rs b/fighters/edge/src/acmd/throws.rs index 4d0eb25ec1..971688e077 100644 --- a/fighters/edge/src/acmd/throws.rs +++ b/fighters/edge/src/acmd/throws.rs @@ -5,11 +5,11 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 6.0); - frame(lua_state, 6.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 7.0); if is_excute(agent) { CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.5, 4.7, Some(0.0), Some(8.5), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); @@ -52,7 +52,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 7.0, -4.7, Some(0.0), Some(7.0), Some(-14.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 7.0, -5.7, Some(0.0), Some(7.0), Some(-14.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/edge/src/flash/status.rs b/fighters/edge/src/flash/status.rs index 7744734a87..75730e239a 100644 --- a/fighters/edge/src/flash/status.rs +++ b/fighters/edge/src/flash/status.rs @@ -13,7 +13,7 @@ unsafe extern "C" fn wait_main(weapon: &mut L2CWeaponCommon) -> L2CValue { } let life = ParamModule::get_int(edge, ParamType::Agent, "param_flash.life"); VarModule::set_int(weapon.battle_object, vars::edge_flash::status::LIFE, life); - if VarModule::is_flag(edge, vars::edge::status::FLASH_HOLD) { + if VarModule::is_flag(edge, vars::edge::status::SPECIAL_LW_HOLD) { let pos_x = PostureModule::pos_x(weapon.module_accessor); let pos_y = PostureModule::pos_y(weapon.module_accessor); let offset_x = ParamModule::get_float(edge, ParamType::Agent, "param_flash.hold_offset_x"); diff --git a/fighters/edge/src/lib.rs b/fighters/edge/src/lib.rs index abe68fb791..48d0b0ac49 100644 --- a/fighters/edge/src/lib.rs +++ b/fighters/edge/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/edge/src/status/mod.rs b/fighters/edge/src/status/mod.rs index 8876be00dd..cfe0d4f54b 100644 --- a/fighters/edge/src/status/mod.rs +++ b/fighters/edge/src/status/mod.rs @@ -2,10 +2,12 @@ use super::*; use globals::*; // status script import -mod special_n; mod special_hi; +mod special_lw; +mod special_n; pub fn install(agent: &mut Agent) { - special_n::install(agent); special_hi::install(agent); + special_lw::install(agent); + special_n::install(agent); } \ No newline at end of file diff --git a/fighters/edge/src/status/special_lw.rs b/fighters/edge/src/status/special_lw.rs new file mode 100644 index 0000000000..04868e2693 --- /dev/null +++ b/fighters/edge/src/status/special_lw.rs @@ -0,0 +1,50 @@ +use super::*; + +unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::edge::status::SPECIAL_LW_CHECK_HOLD); + fighter.change_motion_by_situation("special_lw", "special_air_lw", 0.0, 1.0, false, 0.0, false, false); + fighter.sub_set_special_start_common_kinetic_setting(hash40("param_special_lw").into()); + special_lw_set_kinetic(fighter, true.into()); + + fighter.main_shift(special_lw_main_loop) +} + +unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if ControlModule::check_button_release(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + VarModule::off_flag(fighter.battle_object, vars::edge::status::SPECIAL_LW_CHECK_HOLD); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_EDGE_STATUS_KIND_SPECIAL_LW_HIT.into(), false.into()); + } + fighter.sub_change_motion_by_situation(Hash40::new("special_lw").into(), Hash40::new("special_air_lw").into(), true.into()); + + return 0.into(); +} + +unsafe fn special_lw_set_kinetic(fighter: &mut L2CFighterCommon, param_1: L2CValue) { + if fighter.is_situation(*SITUATION_KIND_AIR) { + if !param_1.get_bool() && fighter.is_prev_situation(*SITUATION_KIND_AIR) { + return; + } + sv_kinetic_energy!(set_needs_set_param, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, false); + if KineticModule::is_enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL) { + sv_kinetic_energy!(set_needs_set_param, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, false); + } + } +} + +unsafe extern "C" fn special_lw_hit_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + // we are in exec, so this will pass on status frame 6 + if VarModule::is_flag(fighter.battle_object, vars::edge::status::SPECIAL_LW_CHECK_HOLD) + && fighter.check_hold_input(0, 5, Buttons::SpecialAll) { + VarModule::off_flag(fighter.battle_object, vars::edge::status::SPECIAL_LW_CHECK_HOLD); + VarModule::on_flag(fighter.battle_object, vars::edge::status::SPECIAL_LW_HOLD); + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_main); + agent.status(Exec, *FIGHTER_EDGE_STATUS_KIND_SPECIAL_LW_HIT, special_lw_hit_exec); +} \ No newline at end of file diff --git a/fighters/eflame/Cargo.toml b/fighters/eflame/Cargo.toml index 595c638459..68c24818bc 100644 --- a/fighters/eflame/Cargo.toml +++ b/fighters/eflame/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/eflame/src/acmd/ground.rs b/fighters/eflame/src/acmd/ground.rs index 58afcd630c..d5b44ed8aa 100644 --- a/fighters/eflame/src/acmd/ground.rs +++ b/fighters/eflame/src/acmd/ground.rs @@ -14,6 +14,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 8.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } diff --git a/fighters/eflame/src/acmd/other.rs b/fighters/eflame/src/acmd/other.rs index 044a804639..769d149bb4 100644 --- a/fighters/eflame/src/acmd/other.rs +++ b/fighters/eflame/src/acmd/other.rs @@ -55,15 +55,11 @@ unsafe extern "C" fn sound_dash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -73,10 +69,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/eflame/src/acmd/throws.rs b/fighters/eflame/src/acmd/throws.rs index a405a4f012..df1cc5e5ff 100644 --- a/fighters/eflame/src/acmd/throws.rs +++ b/fighters/eflame/src/acmd/throws.rs @@ -5,12 +5,11 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 2.0); - frame(lua_state, 2.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 2.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 7.0); if is_excute(agent) { CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 8.5, 4.0, Some(0.0), Some(8.5), Some(8.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); diff --git a/fighters/eflame/src/lib.rs b/fighters/eflame/src/lib.rs index 15022ce802..a5693bffe1 100644 --- a/fighters/eflame/src/lib.rs +++ b/fighters/eflame/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/elight/Cargo.toml b/fighters/elight/Cargo.toml index 8dc99dbefa..ba7dee5a9e 100644 --- a/fighters/elight/Cargo.toml +++ b/fighters/elight/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/elight/src/acmd/aerials.rs b/fighters/elight/src/acmd/aerials.rs index ea1b721470..1826e243ad 100644 --- a/fighters/elight/src/acmd/aerials.rs +++ b/fighters/elight/src/acmd/aerials.rs @@ -283,8 +283,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 8.0, 81, 75, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 81, 75, 0, 50, 3.5, 0.0, 3.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 6.0, 75, 75, 0, 50, 3.1, 0.0, 8.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 6.0, 75, 75, 0, 50, 2.7, 0.0, 12.4, -1.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 6.0, 76, 75, 0, 50, 3.1, 0.0, 8.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 6.0, 76, 75, 0, 50, 2.7, 0.0, 12.4, -1.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 16.0); if is_excute(agent) { diff --git a/fighters/elight/src/acmd/ground.rs b/fighters/elight/src/acmd/ground.rs index b976ce2ed3..87281f2d90 100644 --- a/fighters/elight/src/acmd/ground.rs +++ b/fighters/elight/src/acmd/ground.rs @@ -14,6 +14,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 8.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } diff --git a/fighters/elight/src/acmd/other.rs b/fighters/elight/src/acmd/other.rs index f37c23fc46..eb7795727a 100644 --- a/fighters/elight/src/acmd/other.rs +++ b/fighters/elight/src/acmd/other.rs @@ -57,16 +57,12 @@ unsafe extern "C" fn game_escapen(agent: &mut L2CAgentBase) { } unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -77,10 +73,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_justshieldoff(agent: &mut L2CAgentBase) { diff --git a/fighters/elight/src/acmd/specials.rs b/fighters/elight/src/acmd/specials.rs index e664b07712..cd929d9e9c 100644 --- a/fighters/elight/src/acmd/specials.rs +++ b/fighters/elight/src/acmd/specials.rs @@ -1070,6 +1070,7 @@ unsafe extern "C" fn game_specialsend(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_specialhistart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; + let boma = agent.boma(); frame(lua_state, 7.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("elight_sword_open"), Hash40::new("sword1"), 0, 0, 0, 0, 90, 0, 1, true); @@ -1087,7 +1088,9 @@ unsafe extern "C" fn effect_specialhistart(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), -1, 0, 0, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), -1, 0, 0, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, false); + } } } diff --git a/fighters/elight/src/acmd/throws.rs b/fighters/elight/src/acmd/throws.rs index 2a0fbee96a..e48d09ec75 100644 --- a/fighters/elight/src/acmd/throws.rs +++ b/fighters/elight/src/acmd/throws.rs @@ -3,7 +3,7 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 5.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } diff --git a/fighters/elight/src/lib.rs b/fighters/elight/src/lib.rs index 9c6e68b3f0..18fe9a59d6 100644 --- a/fighters/elight/src/lib.rs +++ b/fighters/elight/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/elight/src/status/landing.rs b/fighters/elight/src/status/landing.rs index 7a08937942..a32cfdadd6 100644 --- a/fighters/elight/src/status/landing.rs +++ b/fighters/elight/src/status/landing.rs @@ -1,6 +1,32 @@ use super::*; use globals::*; +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL + unsafe extern "C" fn landing_fall_special_end(fighter: &mut L2CFighterCommon) -> L2CValue { ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_ELIGHT_GENERATE_ARTICLE_BUNSHIN, ArticleOperationTarget(0)); @@ -8,5 +34,7 @@ unsafe extern "C" fn landing_fall_special_end(fighter: &mut L2CFighterCommon) -> } pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); agent.status(End, *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, landing_fall_special_end); } \ No newline at end of file diff --git a/fighters/elight/src/status/special_hi_jump.rs b/fighters/elight/src/status/special_hi_jump.rs index b3f39040d2..6334574d46 100644 --- a/fighters/elight/src/status/special_hi_jump.rs +++ b/fighters/elight/src/status/special_hi_jump.rs @@ -96,6 +96,7 @@ unsafe extern "C" fn special_hi_jump_end(fighter: &mut L2CFighterCommon) -> L2CV VarModule::on_flag(fighter.battle_object, vars::elight::status::SPECIAL_HI_FREEFALL); } VarModule::on_flag(fighter.battle_object, vars::elight::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); super::Set_Pyra_Up_Special_Cancel(fighter, true); 0.into() diff --git a/fighters/falco/Cargo.toml b/fighters/falco/Cargo.toml index 806c5653c8..86018957f9 100644 --- a/fighters/falco/Cargo.toml +++ b/fighters/falco/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/falco/src/acmd/aerials.rs b/fighters/falco/src/acmd/aerials.rs index 300409d66a..686cefebab 100644 --- a/fighters/falco/src/acmd/aerials.rs +++ b/fighters/falco/src/acmd/aerials.rs @@ -6,14 +6,14 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 4.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("legl"), 12.0, 361, 100, 0, 10, 4.5, -0.5, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 361, 100, 0, 10, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("legl"), 11.0, 361, 108, 0, 9, 4.5, -0.5, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 11.0, 361, 108, 0, 9, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } frame(lua_state, 8.0); FT_MOTION_RATE_RANGE(agent, 8.0, 31.0, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 361, 90, 0, 15, 4.25, -0.5, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 361, 90, 0, 15, 3.75, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 361, 99, 0, 14, 4.25, -0.5, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 361, 99, 0, 14, 3.75, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } frame(lua_state, 31.0); FT_MOTION_RATE_RANGE(agent, 31.0, 43.0, 18.0); @@ -70,134 +70,98 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 1.7); + FT_MOTION_RATE_RANGE(agent, 1.0, 3.0, 4.0); frame(lua_state, 3.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 366, 100, 33, 0, 5.5, 0.0, 11.0, 1.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 3.0, 366, 100, 33, 0, 4.0, 3.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 366, 100, 33, 0, 4.0, 3.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 3.0, 366, 100, 33, 0, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 366, 100, 33, 0, 5.5, 0.0, 11.0, 1.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 366, 100, 33, 0, 4.5, 3.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 2.0, 366, 100, 33, 0, 4.5, 3.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 2.0, 366, 100, 33, 0, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 365, 100, 33, 0, 4.5, 0.0, 11.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 4.0, 365, 100, 33, 0, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 10.0); if is_excute(agent) { AttackModule::clear_all(boma); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 366, 100, 33, 0, 5.5, 0.0, 11.0, 1.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 366, 100, 33, 0, 4.5, 3.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 2.0, 366, 100, 33, 0, 4.5, 3.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 2.0, 366, 100, 33, 0, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } - frame(lua_state, 14.0); - FT_MOTION_RATE(agent, 0.599); + frame(lua_state, 15.0); if is_excute(agent) { - AttackModule::clear_all(boma); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 50, 87, 0, 46, 4.5, 0.0, 11.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 7.0, 50, 87, 0, 46, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 19.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 50, 130, 0, 40, 3.0, 0.0, 10.0, 2.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 50, 130, 40, 0, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 4.0, 50, 130, 40, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 50, 130, 0, 40, 5.0, 0.0, 10.0, 6.0, Some(0.0), Some(11.0), Some(1.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 22.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 43.0); + frame(lua_state, 24.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } -unsafe extern "C" fn sound_attackairf(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 3.0); + frame(lua_state, 6.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_falco_attackair_n01")); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4.5, 10.0, 4, 15, 15, -120, 0.65, true); } - wait(lua_state, 4.0); + frame(lua_state, 12.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_falco_attackair_n01")); + EffectModule::kill_kind(boma, Hash40::new("sys_attack_arc_d"), false, false); } - wait(lua_state, 4.0); + frame(lua_state, 15.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_falco_attackair_n01")); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4.5, 9.5, 1.5, 0, 30, -120, 0.75, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + frame(lua_state, 20.0); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("sys_attack_arc_d"), false, false); } } -unsafe extern "C" fn game_landingairf(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { } -} - -unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), -2, 10, 3, -35, -4, -144, 1.2, true); - LAST_EFFECT_SET_RATE(agent, 1.0); - } - frame(lua_state, 2.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), -1, 4, -2, -30, -4, -144, 0.6, false); - LAST_EFFECT_SET_RATE(agent, 1.6); - } frame(lua_state, 3.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), -2, 6, 3, -20, -10, -144, 0.7, true); - LAST_EFFECT_SET_RATE(agent, 1.5); + PLAY_SE(agent, Hash40::new("se_falco_attackair_n01")); } - frame(lua_state, 4.0); + frame(lua_state, 12.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), -2, 8, 3, -33, -20, -144, 0.8, true); - LAST_EFFECT_SET_RATE(agent, 1.25); + PLAY_SE(agent, Hash40::new("se_falco_attackair_n01")); } - frame(lua_state, 5.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), -2, 10, 3, -35, -4, -144, 1.3, true); - LAST_EFFECT_SET_RATE(agent, 2); - } } unsafe extern "C" fn expression_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 2.0); + frame(lua_state, 5.0); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 7, false, 0 as u32); } - frame(lua_state, 3.0); + frame(lua_state, 6.0); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); } - frame(lua_state, 10.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 7, false, 0 as u32); - } - frame(lua_state, 18.0); + frame(lua_state, 14.0); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, 0 as u32); } - frame(lua_state, 19.0); + frame(lua_state, 15.0); if is_excute(agent) { - AttackModule::set_attack_reference_joint_id(boma, Hash40::new("arml"), app::AttackDirectionAxis(*ATTACK_DIRECTION_X), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y), app::AttackDirectionAxis(*ATTACK_DIRECTION_Z)); RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); } } +unsafe extern "C" fn game_landingairf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); +} + unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -213,9 +177,9 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 361, 110, 0, 0, 4.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("legr"), 9.0, 361, 110, 0, 0, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 361, 110, 0, 0, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 4.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 361, 100, 0, 0, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } frame(lua_state, 20.0); if is_excute(agent) { @@ -276,13 +240,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 0.620); frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 10.0, 110, 120, 0, 28, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 110, 120, 0, 28, 4.2, 6.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 12.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 8.0, 60, 115, 0, 34, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 60, 115, 0, 34, 4.2, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 8.5, 110, 120, 0, 35, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.5, 110, 120, 0, 35, 4.2, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); @@ -291,9 +250,6 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 24.0); FT_MOTION_RATE_RANGE(agent, 24.0, 30.0, 12.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - } frame(lua_state, 30.0); FT_MOTION_RATE(agent, 1.0); } @@ -351,10 +307,10 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_attackairn", expression_attackairn, Priority::Low); agent.acmd("game_attackairf", game_attackairf, Priority::Low); - agent.acmd("sound_attackairf", sound_attackairf, Priority::Low); - agent.acmd("game_landingairf", game_landingairf, Priority::Low); agent.acmd("effect_attackairf", effect_attackairf, Priority::Low); + agent.acmd("sound_attackairf", sound_attackairf, Priority::Low); agent.acmd("expression_attackairf", expression_attackairf, Priority::Low); + agent.acmd("game_landingairf", game_landingairf, Priority::Low); agent.acmd("game_attackairb", game_attackairb, Priority::Low); agent.acmd("sound_attackairb", sound_attackairb, Priority::Low); diff --git a/fighters/falco/src/acmd/other.rs b/fighters/falco/src/acmd/other.rs index 28df311508..0d972e12fa 100644 --- a/fighters/falco/src/acmd/other.rs +++ b/fighters/falco/src/acmd/other.rs @@ -82,16 +82,12 @@ unsafe extern "C" fn sound_passivewalljump(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_escapeair(agent: &mut L2CAgentBase) { @@ -112,10 +108,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_escapeairslide(agent: &mut L2CAgentBase) { diff --git a/fighters/falco/src/acmd/smashes.rs b/fighters/falco/src/acmd/smashes.rs index 2aa7ce3197..975a13f46b 100644 --- a/fighters/falco/src/acmd/smashes.rs +++ b/fighters/falco/src/acmd/smashes.rs @@ -87,40 +87,24 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("kneer"), 4.0, 110, 15, 0, 50, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 4.0, 110, 15, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 4.0, 130, 15, 0, 50, 4.0, 7.7, -1.3, -1.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 4.0, 110, 100, 100, 0, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("legr"), 4.0, 95, 100, 100, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("kneer"), 4.0, 127, 100, 100, 0, 4.0, 7.7, -1.3, -1.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 6, 0, Hash40::new("top"), 4.0, 127, 100, 100, 0, 5.5, 0.0, 5.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 80, 158, 0, 16, 5.0, 7.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 80, 158, 0, 16, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 9.0, 80, 158, 0, 16, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 80, 158, 0, 16, 5.5, 0.0, 5.5, 7.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - wait(lua_state, 1.0); + frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 4.0, 367, 15, 0, 50, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 4.0, 367, 15, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 4.0, 367, 100, 40, 0, 3.5, 7.0, -1.3, -1.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::clear(boma, 3, false); - AttackModule::clear(boma, 4, false); - AttackModule::clear(boma, 5, false); } - wait(lua_state, 5.0); + frame(lua_state, 12.0); if is_excute(agent) { - HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); - AttackModule::clear_all(boma); - ATTACK(agent, 0, 1, Hash40::new("kneel"), 13.0, 80, 105, 0, 28, 5.0, 7.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 1, Hash40::new("kneel"), 13.0, 80, 105, 0, 28, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 1, Hash40::new("legl"), 13.0, 80, 105, 0, 28, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 1, Hash40::new("kneel"), 9.0, 80, 158, 0, 16, 5.0, 7.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 1, Hash40::new("kneel"), 9.0, 80, 158, 0, 16, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 1, Hash40::new("legl"), 9.0, 80, 158, 0, 16, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - wait(lua_state, 7.0); + frame(lua_state, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); } } @@ -131,15 +115,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } - frame(lua_state, 3.0); + frame(lua_state, 8.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); - } - frame(lua_state, 8.0); - if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 25, 78, 0, 20, 4.3, 0.0, 1.7, 9.1, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 25, 78, 0, 20, 4.3, 0.0, 1.7, -12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 361, 78, 0, 20, 3.5, 0.0, 1.7, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); diff --git a/fighters/falco/src/acmd/specials.rs b/fighters/falco/src/acmd/specials.rs index fcffc79171..720875eb80 100644 --- a/fighters/falco/src/acmd/specials.rs +++ b/fighters/falco/src/acmd/specials.rs @@ -114,8 +114,8 @@ unsafe extern "C" fn game_specialairsend(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { } } - - unsafe extern "C" fn game_specialhihold(agent: &mut L2CAgentBase) { + +unsafe extern "C" fn game_specialhihold(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 5.0); diff --git a/fighters/falco/src/acmd/throws.rs b/fighters/falco/src/acmd/throws.rs index a1276df7d8..2065d0a5a5 100644 --- a/fighters/falco/src/acmd/throws.rs +++ b/fighters/falco/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("trans"), 4.1, 0.0, 7.2, 0.0, Some(0.0), Some(7.2), Some(9.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("trans"), 4.1, 0.0, 7.2, 4.1, Some(0.0), Some(7.2), Some(9.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("trans"), 4.1, 0.0, 6.0, 4.0, Some(0.0), Some(6.0), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("trans"), 4.1, 0.0, 6.0, 4.1, Some(0.0), Some(6.0), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("trans"), 4.1, 0.0, 7.2, -4.0, Some(0.0), Some(7.2), Some(-14.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("trans"), 4.1, 0.0, 7.2, -4.1, Some(0.0), Some(7.2), Some(-14.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -63,11 +62,178 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 50, 135, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 50, 112, 0, 44, 5.76, 0.0, 10.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, 9, 3); + } + frame(lua_state, 11.0); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{ x: 0.0, y: 7.0, z: 18.0 }, false, false); + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + AttackModule::clear_all(boma); + } + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 35.0, 24.0); + frame(lua_state, 35.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 8, 4.5, -10, 20, 210, 0.7, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.7); + } + frame(lua_state, 10.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_a"), Hash40::new("top"), -4, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + EFFECT_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 1, 9, 7, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true, 0.75); + } + frame(lua_state, 13.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 0, 12, 8, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); + } +} + +unsafe extern "C" fn sound_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + PLAY_SEQUENCE(agent, Hash40::new("seq_falco_rnd_attack")); + } +} + +unsafe extern "C" fn expression_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + lua_args!(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, *CAMERA_QUAKE_KIND_NONE); + smash::app::sv_animcmd::FT_ATTACK_ABS_CAMERA_QUAKE(lua_state); + agent.clear_lua_stack(); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 10.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_M); + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } +} + +unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let scale = PostureModule::scale(boma); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 35, 50, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 8.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); + // CHECK_FINISH_CAMERA(agent, 7, 8); + // lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 1.3); + // lua_bind::FighterCutInManager::set_throw_finish_offset(singletons::FighterCutInManager(), Vector3f{x: 2.0, y: 2.0, z: 0.0}); + } + frame(lua_state, 9.0); + if is_excute(agent) { + REVERSE_LR(agent); + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER, false, -1); + } + frame(lua_state, 18.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER_BULLET, false, -1); + } + frame(lua_state, 37.0); + if is_excute(agent) { + ArticleModule::set_visibility_whole(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER, false, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } +} + +unsafe extern "C" fn effect_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 14.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 0, 14, -13, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 18.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_a"), Hash40::new("top"), -4, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("falco_blaster_bullet_b"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("falco_blaster_shot"), Hash40::new("haver"), 0, 1.2, 4.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.7); + } +} + +unsafe extern "C" fn sound_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } + frame(lua_state, 18.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_falco_special_n01")); + } +} + +unsafe extern "C" fn expression_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 5.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 6, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 9.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_M); + } + frame(lua_state, 10.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("blaster") as i64, hash40("blaster_hide") as i64); + } + frame(lua_state, 18.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_beams"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 37.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("blaster") as i64, hash40("blaster_normal") as i64); + } +} + unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 90, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 90, 74, 0, 81, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 6.0); @@ -76,12 +242,19 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{ x: 0.0, y: 15.0, z: 2.0 }, false, false); + } + frame(lua_state, 8.0); + FT_MOTION_RATE_RANGE(agent, 8.0, 13.0, 3.0); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{ x: 0.0, y: 20.0, z: 0.0 }, false, false); let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } frame(lua_state, 13.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ArticleModule::generate_article(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER, false, -1); } @@ -95,9 +268,173 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("falco_blaster_bullet_hi"), Hash40::new("haver"), 0, 1.2, 4.3, 0, 180, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT_FOLLOW(agent, Hash40::new("falco_blaster_shot"), Hash40::new("haver"), 0, 1.2, 4.3, 0, 0, 120, 1, true); + LAST_EFFECT_SET_RATE(agent, 1.3); + } +} + +unsafe extern "C" fn sound_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } + frame(lua_state, 20.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_falco_special_n01")); + } +} + +unsafe extern "C" fn expression_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 7.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_M); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 6, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 13.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("blaster") as i64, hash40("blaster_hide") as i64); + } + frame(lua_state, 21.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_beams"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 37.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("blaster") as i64, hash40("blaster_normal") as i64); + } +} + +unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 50, 110, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 13.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER, false, -1); + } + frame(lua_state, 26.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER_BULLET, false, -1); + // CHECK_FINISH_CAMERA(agent, 2, 0); + // lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 1.2); + // lua_bind::FighterCutInManager::set_throw_finish_offset(singletons::FighterCutInManager(), Vector3f{x: 0.0, y: 0.0, z: 0.0}); + } + frame(lua_state, 33.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } + frame(lua_state, 48.0); + if is_excute(agent) { + ArticleModule::set_visibility_whole(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER, false, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } +} + +unsafe extern "C" fn effect_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 12.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), -6.5, 0, 4, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 2); + } + frame(lua_state, 23.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("falco_blaster_bullet_lw"), Hash40::new("haver"), 0, 1.2, 4.3, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("falco_blaster_shot"), Hash40::new("haver"), 0, 1.2, 4.3, 0, 0, 0, 0.7, true); + } + frame(lua_state, 26.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("falco_blaster_bullet_lw"), false, false); + } +} + +unsafe extern "C" fn sound_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 15.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } + wait(lua_state, 5.0); + if is_excute(agent) { + PLAY_DOWN_SE(agent, Hash40::new("se_common_down_soil_s")); + PLAY_SE(agent, Hash40::new("se_common_kick_hit_m")); + } + frame(lua_state, 26.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_falco_special_n01")); + } +} + +unsafe extern "C" fn expression_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 6, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 13.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("blaster") as i64, hash40("blaster_hide") as i64); + } + frame(lua_state, 18.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_M); + } + frame(lua_state, 26.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_beams"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 48.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("blaster") as i64, hash40("blaster_normal") as i64); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + + agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("effect_throwf", effect_throwf, Priority::Low); + agent.acmd("sound_throwf", sound_throwf, Priority::Low); + agent.acmd("expression_throwf", expression_throwf, Priority::Low); + + agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("effect_throwb", effect_throwb, Priority::Low); + agent.acmd("sound_throwb", sound_throwb, Priority::Low); + agent.acmd("expression_throwb", expression_throwb, Priority::Low); + agent.acmd("game_throwhi", game_throwhi, Priority::Low); + agent.acmd("effect_throwhi", effect_throwhi, Priority::Low); + agent.acmd("sound_throwhi", sound_throwhi, Priority::Low); + agent.acmd("expression_throwhi", expression_throwhi, Priority::Low); + + agent.acmd("game_throwlw", game_throwlw, Priority::Low); + agent.acmd("effect_throwlw", effect_throwlw, Priority::Low); + agent.acmd("sound_throwlw", sound_throwlw, Priority::Low); + agent.acmd("expression_throwlw", expression_throwlw, Priority::Low); } \ No newline at end of file diff --git a/fighters/falco/src/acmd/tilts.rs b/fighters/falco/src/acmd/tilts.rs index 312b02be14..dce5363b3d 100644 --- a/fighters/falco/src/acmd/tilts.rs +++ b/fighters/falco/src/acmd/tilts.rs @@ -5,13 +5,13 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.2, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 3.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 9.0, 361, 100, 0, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.2, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 8.0, 361, 109, 0, 0, 3.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 8.0, 361, 109, 0, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 3.0); if is_excute(agent) { - AttackModule::clear_all(boma); + AttackModule::clear_all(boma); } } @@ -20,14 +20,14 @@ unsafe extern "C" fn game_attacks3hi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.2, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 3.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 9.0, 361, 100, 0, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.2, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 8.0, 361, 109, 0, 0, 3.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 8.0, 361, 109, 0, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } wait(lua_state, 3.0); if is_excute(agent) { - AttackModule::clear_all(boma); + AttackModule::clear_all(boma); } } @@ -36,14 +36,14 @@ unsafe extern "C" fn game_attacks3lw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.2, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 3.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 9.0, 361, 100, 0, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.2, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 8.0, 361, 109, 0, 0, 3.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 8.0, 361, 109, 0, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 3.0); if is_excute(agent) { - AttackModule::clear_all(boma); + AttackModule::clear_all(boma); } } @@ -51,23 +51,19 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - if is_excute(agent){ - FT_MOTION_RATE(agent,1.400) - } + FT_MOTION_RATE(agent, 1.4); frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.000) - } - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 135, 100, 100, 0, 5.0, 0.0, 9.0, 9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 135, 100, 90, 0, 6.0, 0.0, 9.0, 9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.5, 135, 100, 90, 0, 5.5, 0.0, 9.0, 9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 135, 100, 100, 0, 5.0, 0.0, 9.0, 9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 135, 100, 90, 0, 6.0, 0.0, 9.0, 9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 135, 100, 90, 0, 5.5, 0.0, 9.0, 9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 3.5, 95, 100, 50, 0, 6.0, -1.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 3.5, 95, 100, 50, 0, 5.0, 1.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 3.5, 367, 100, 40, 0, 5.5, 5.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 3.0, 95, 100, 50, 0, 6.0, -1.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 3.0, 95, 100, 50, 0, 5.0, 1.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 367, 100, 40, 0, 5.5, 5.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 10.0); if is_excute(agent) { @@ -75,19 +71,17 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 7.5, 80, 136, 0, 34, 6.0, -1.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 7.5, 80, 136, 0, 34, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 7.5, 80, 136, 0, 34, 5.0, 6.2, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 7.0, 80, 144, 0, 33, 6.0, -1.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 7.0, 80, 144, 0, 33, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 7.0, 80, 144, 0, 33, 5.0, 6.2, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 17.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.0); AttackModule::clear_all(boma); } - frame(lua_state,18.0); - if is_excute(agent){ - FT_MOTION_RATE(agent, 1.200) - } + frame(lua_state, 18.0); + FT_MOTION_RATE(agent, 1.2); } unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { @@ -96,7 +90,7 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); FT_MOTION_RATE(agent, 3.0/(6.0-1.0)); frame(lua_state, 8.0); - FT_MOTION_RATE(agent, 1.000); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 10.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("tail2"), 11.0, 75, 140, 0, 25, 3.5, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_TAIL); diff --git a/fighters/falco/src/blaster_bullet/acmd.rs b/fighters/falco/src/blaster_bullet/acmd.rs index 9eb5cfd8fb..8a47a05be2 100644 --- a/fighters/falco/src/blaster_bullet/acmd.rs +++ b/fighters/falco/src/blaster_bullet/acmd.rs @@ -3,48 +3,57 @@ use super::*; unsafe extern "C" fn game_fly(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + PostureModule::set_scale(boma, 0.75, true); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 1.5, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-0.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 2.0, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-0.5), 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); AttackModule::enable_safe_pos(boma); } wait(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 1.5, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-3.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 2.0, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-3.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); } wait(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 1.5, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 2.0, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-5.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); } wait(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 1.5, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 2.0, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-7.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); } wait(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 1.5, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 55, 5, 0, 2.0, 0.0, 0.0, 0.5, Some(0.0), Some(0.0), Some(-9.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); } } +unsafe extern "C" fn game_flythrowb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + frame(lua_state, 3.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 50, 80, 0, 60, 7.5, 0.0, 0.0, 4.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 50, 80, 0, 60, 7.5, 0.0, 0.0, 8.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); + } +} + unsafe extern "C" fn game_flythrowhi(agent: &mut L2CAgentBase) { if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 90, 80, 0, 60, 5.0, 0.0, 0.0, 4.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 90, 80, 0, 60, 5.0, 0.0, 0.0, 8.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 65, 80, 0, 60, 7.5, 0.0, 0.0, 4.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 65, 80, 0, 60, 7.5, 0.0, 0.0, 8.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); } } -unsafe extern "C" fn game_flythrowb(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_flythrowlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; - frame(lua_state, 3.0); + let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 50, 80, 0, 60, 5.0, 0.0, 0.0, 4.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 50, 80, 0, 60, 5.0, 0.0, 0.0, 8.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 50, 80, 0, 60, 7.5, 0.0, 0.0, 4.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 50, 80, 0, 60, 7.5, 0.0, 0.0, 8.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FALCO_BLASTER, *ATTACK_REGION_ENERGY); } } pub fn install(agent: &mut Agent) { agent.acmd("game_fly", game_fly, Priority::Low); - - agent.acmd("game_flythrowhi", game_flythrowhi, Priority::Low); - agent.acmd("game_flythrowb", game_flythrowb, Priority::Low); + agent.acmd("game_flythrowhi", game_flythrowhi, Priority::Low); + agent.acmd("game_flythrowlw", game_flythrowb, Priority::Low); } diff --git a/fighters/falco/src/lib.rs b/fighters/falco/src/lib.rs index 51ab638a94..2a0a8fb32f 100644 --- a/fighters/falco/src/lib.rs +++ b/fighters/falco/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/falco/src/opff.rs b/fighters/falco/src/opff.rs index 06678f5ffc..6fb6acd9be 100644 --- a/fighters/falco/src/opff.rs +++ b/fighters/falco/src/opff.rs @@ -3,10 +3,9 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; - -unsafe fn laser_land_cancel(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat2: i32, stick_y: f32) { - if status_kind == *FIGHTER_STATUS_KIND_SPECIAL_N { - boma.check_land_cancel(None); +unsafe fn laser_land_cancel(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_N) { + fighter.check_land_cancel(None); } } @@ -17,24 +16,6 @@ unsafe fn firebird_startup_ledgegrab(fighter: &mut L2CFighterCommon) { } } -unsafe fn aim_throw_lasers(boma: &mut BattleObjectModuleAccessor) { - let frame = boma.motion_frame(); - let lr = PostureModule::lr(boma); - - if boma.is_motion(Hash40::new("throw_hi")) - && 13.0 <= frame - && frame < 23.0 { - let rot = Vector3f::new(0.0, boma.stick_x() * lr * -20.0, 0.0); - boma.set_joint_rotate("clavicler", rot); - } - else if boma.is_motion(Hash40::new("throw_b")) - && 9.0 <= frame - && frame < 21.0 { - let rot = Vector3f::new(0.0, boma.stick_y() * -20.0, 0.0); - boma.set_joint_rotate("shoulderr", rot); - } -} - unsafe fn check_special_lw_hit(fighter: &mut L2CFighterCommon) { if fighter.is_flag(0x200000e0) // FIGHTER_FALCO_INSTANCE_WORK_ID_FLAG_REFLECTOR && (!fighter.is_status(statuses::falco::SPECIAL_LW_HIT) || fighter.motion_frame() > 10.0) { @@ -42,6 +23,22 @@ unsafe fn check_special_lw_hit(fighter: &mut L2CFighterCommon) { } } +unsafe fn check_special_lw_parried(fighter: &mut L2CFighterCommon) { + if fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, + statuses::falco::SPECIAL_LW_LOOP, + statuses::falco::SPECIAL_LW_END, + statuses::falco::SPECIAL_LW_HIT + ]) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY) { + VarModule::on_flag(fighter.battle_object, vars::falco::instance::SPECIAL_LW_DISABLE_JC); + if !fighter.is_status(statuses::falco::SPECIAL_LW_END) + && !fighter.is_in_hitlag() { + fighter.change_status(statuses::falco::SPECIAL_LW_END.into(), false.into()); + } + } +} + unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) @@ -56,12 +53,12 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } } -pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { +pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - laser_land_cancel(boma, status_kind, situation_kind, cat[1], stick_y); + laser_land_cancel(fighter); firebird_startup_ledgegrab(fighter); - aim_throw_lasers(boma); check_special_lw_hit(fighter); + check_special_lw_parried(fighter); fastfall_specials(fighter); } @@ -74,7 +71,7 @@ pub extern "C" fn falco_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterCo pub unsafe fn falco_frame(fighter: &mut smash::lua2cpp::L2CFighterCommon) { if let Some(info) = FrameInfo::update_and_get(fighter) { - moveset(fighter, &mut *info.boma, info.id, info.cat, info.status_kind, info.situation_kind, info.motion_kind.hash, info.stick_x, info.stick_y, info.facing, info.frame); + moveset(fighter, &mut *info.boma); } } diff --git a/fighters/falco/src/status/special_lw.rs b/fighters/falco/src/status/special_lw.rs index 60b2eaf480..f4ad7f7d24 100644 --- a/fighters/falco/src/status/special_lw.rs +++ b/fighters/falco/src/status/special_lw.rs @@ -83,6 +83,7 @@ pub unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CV else { VarModule::set_int(fighter.battle_object, vars::falco::status::SPECIAL_LW_STOP_Y_FRAME, 0); } + VarModule::off_flag(fighter.battle_object, vars::falco::instance::SPECIAL_LW_DISABLE_JC); special_lw_motion_helper(fighter); fighter.main_shift(special_lw_main_loop) } @@ -90,7 +91,8 @@ pub unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CV unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.global_table[CURRENT_FRAME].get_i32() > 2 // Allows for jump cancel on frame 4 in game && !fighter.is_in_hitlag() - && fighter.check_jump_cancel(false, false) { + && !VarModule::is_flag(fighter.battle_object, vars::falco::instance::SPECIAL_LW_DISABLE_JC) + && fighter.check_jump_cancel(false, false, false) { return 0.into(); } @@ -246,7 +248,8 @@ unsafe extern "C" fn special_lw_loop_main(fighter: &mut L2CFighterCommon) -> L2C unsafe extern "C" fn special_lw_loop_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.check_jump_cancel(false, false) { + if !VarModule::is_flag(fighter.battle_object, vars::falco::instance::SPECIAL_LW_DISABLE_JC) + && fighter.check_jump_cancel(false, false, false) { return 0.into(); } @@ -394,7 +397,8 @@ unsafe extern "C" fn special_lw_end_main(fighter: &mut L2CFighterCommon) -> L2CV unsafe extern "C" fn special_lw_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.check_jump_cancel(false, false) { + if !VarModule::is_flag(fighter.battle_object, vars::falco::instance::SPECIAL_LW_DISABLE_JC) + && fighter.check_jump_cancel(false, false, false) { return 0.into(); } @@ -476,7 +480,8 @@ pub unsafe extern "C" fn special_lw_hit_main(fighter: &mut L2CFighterCommon) -> unsafe extern "C" fn special_lw_hit_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if MotionModule::is_end(fighter.module_accessor) { - if fighter.check_jump_cancel(false, false) { + if !VarModule::is_flag(fighter.battle_object, vars::falco::instance::SPECIAL_LW_DISABLE_JC) + && fighter.check_jump_cancel(false, false, false) { return 0.into(); } if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { diff --git a/fighters/fox/Cargo.toml b/fighters/fox/Cargo.toml index 15c6dafc5c..43ef09971f 100644 --- a/fighters/fox/Cargo.toml +++ b/fighters/fox/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/fox/src/acmd/aerials.rs b/fighters/fox/src/acmd/aerials.rs index 274d5a56bb..6a56efea8a 100644 --- a/fighters/fox/src/acmd/aerials.rs +++ b/fighters/fox/src/acmd/aerials.rs @@ -6,15 +6,15 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 4.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("hip"), 12.0, 361, 100, 0, 10, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 361, 100, 0, 10, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 12.0, 361, 100, 0, 10, 3.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 11.0, 361, 108, 0, 9, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 11.0, 361, 108, 0, 9, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 11.0, 361, 108, 0, 9, 3.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 361, 90, 0, 15, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 361, 90, 0, 15, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 361, 90, 0, 15, 3.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 361, 99, 0, 14, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 361, 99, 0, 14, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 361, 99, 0, 14, 3.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 31.0); if is_excute(agent) { @@ -184,14 +184,14 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 15.0, 361, 100, 0, 0, 4.5, 3.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 15.0, 361, 100, 0, 0, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 361, 100, 0, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 13.0, 361, 113, 0, 0, 4.5, 3.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 13.0, 361, 113, 0, 0, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 361, 113, 0, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 8.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.5, 3.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 361, 100, 0, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 20.0); @@ -246,9 +246,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("tail1"), 5.0, 92, 130, 30, 0, 4.2, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("tail2"), 5.0, 92, 130, 30, 0, 4.2, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("tail3"), 5.0, 92, 130, 30, 0, 4.2, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("tail1"), 3.0, 92, 130, 30, 0, 4.2, 0.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("tail2"), 3.0, 92, 130, 30, 0, 4.2, 0.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 2, 0, Hash40::new("tail3"), 3.0, 92, 130, 30, 0, 4.2, 0.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); } wait(lua_state, 2.0); if is_excute(agent) { @@ -258,7 +258,7 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneer"), 10.0, 85, 125, 0, 40, 3.9, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("footr"), 10.0, 85, 125, 0, 40, 4.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 10.0, 85, 125, 0, 40, 4.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 10.0, 85, 125, 0, 40, 4.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); if is_excute(agent) { @@ -280,7 +280,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("hip"), 2.0, 290, 100, 30, 0, 4.1, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footl"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 7.0); if is_excute(agent){ @@ -289,7 +289,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("hip"), 2.0, 290, 100, 30, 0, 4.1, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footl"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 10.0); if is_excute(agent){ @@ -298,7 +298,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("hip"), 2.0, 290, 100, 30, 0, 4.1, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footl"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 13.0); if is_excute(agent){ @@ -307,7 +307,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("hip"), 2.0, 290, 100, 30, 0, 4.1, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footl"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 16.0); if is_excute(agent){ @@ -316,7 +316,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 17.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("hip"), 2.0, 290, 100, 30, 0, 4.1, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footl"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 19.0); if is_excute(agent){ @@ -325,7 +325,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 20.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("hip"), 2.0, 290, 100, 30, 0, 4.1, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footl"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 22.0); if is_excute(agent){ @@ -334,7 +334,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 23.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("hip"), 2.0, 290, 100, 30, 0, 4.1, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("footl"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 2.0, 290, 100, 30, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.1, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 25.0); if is_excute(agent){ diff --git a/fighters/fox/src/acmd/other.rs b/fighters/fox/src/acmd/other.rs index 0a9cfee10b..7cea1efdb1 100644 --- a/fighters/fox/src/acmd/other.rs +++ b/fighters/fox/src/acmd/other.rs @@ -81,28 +81,23 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); + frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 29.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/fox/src/acmd/smashes.rs b/fighters/fox/src/acmd/smashes.rs index ba1ef39157..1f62db0855 100644 --- a/fighters/fox/src/acmd/smashes.rs +++ b/fighters/fox/src/acmd/smashes.rs @@ -8,23 +8,24 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 6.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.3); if is_excute(agent) { JostleModule::set_team(boma, 1); - sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.3); } frame(lua_state, 13.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneer"), 15.0, 361, 105, 0, 10, 3.7, 4.1, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 15.0, 361, 105, 0, 10, 3.1, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 15.0, 361, 105, 0, 10, 2.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 15.0, 361, 105, 0, 10, 3.1, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 15.0, 361, 105, 0, 10, 2.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneer"), 12.0, 361, 100, 0, 2, 3.5, 4.1, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 12.0, 361, 100, 0, 2, 3.1, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 12.0, 361, 100, 0, 2, 2.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 12.0, 361, 100, 0, 2, 3.1, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 12.0, 361, 100, 0, 2, 2.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); JostleModule::set_team(boma, 0); @@ -134,16 +135,18 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { if is_excute(agent) { HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); ATTACK(agent, 0, 0, Hash40::new("kneer"), 15.0, 25, 65, 0, 20, 4.6, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneel"), 15.0, 25, 65, 0, 20, 4.6, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("kneer"), 12.0, 361, 65, 0, 20, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 3, 0, Hash40::new("kneel"), 12.0, 361, 65, 0, 20, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::set_attack_height_all(boma, AttackHeight(*ATTACK_HEIGHT_LOW), false); } - wait(lua_state, 4.0); + wait(lua_state, 1.0); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + } + wait(lua_state, 3.0); if is_excute(agent) { - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); AttackModule::clear_all(boma); } } diff --git a/fighters/fox/src/acmd/specials.rs b/fighters/fox/src/acmd/specials.rs index 4207716011..934bd48a9e 100644 --- a/fighters/fox/src/acmd/specials.rs +++ b/fighters/fox/src/acmd/specials.rs @@ -42,7 +42,7 @@ unsafe extern "C" fn game_specialhihold(agent: &mut L2CAgentBase) { frame(lua_state, 20.0); for _ in 0..7 { if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 105, 20, 0, 20, 8.25, 0.0, 7.5, 0.0, None, None, None, 0.8, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 105, 20, 0, 20, 8.25, 0.0, 6.5, 0.0, None, None, None, 0.8, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } wait(lua_state, 1.0); if is_excute(agent) { diff --git a/fighters/fox/src/acmd/throws.rs b/fighters/fox/src/acmd/throws.rs index e3df36b755..b7310c483e 100644 --- a/fighters/fox/src/acmd/throws.rs +++ b/fighters/fox/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +32,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(10.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -55,7 +55,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { frame(lua_state, 12.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(-15.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -6.0, Some(0.0), Some(7.0), Some(-15.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -66,6 +66,34 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 45, 135, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 45, 112, 0, 49, 5.5, 0.0, 6.0, 18.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, 23, 4); + } + frame(lua_state, 11.0); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{ x: 0.0, y: 7.0, z: 18.0 }, false, false); + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + AttackModule::clear_all(boma); + } + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 35.0, 24.0); + frame(lua_state, 35.0); + FT_MOTION_RATE(agent, 1.0); +} + unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -120,21 +148,19 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - FT_MOTION_RATE(agent, 8.0/(5.0-1.0)); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 2.0, 90, 110, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); frame(lua_state, 6.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 2, 20); - //FighterCutInManager::set_throw_finish_zoom_rate(boma, 1.6); - //FighterCutInManager::set_throw_finish_offset(boma, 0, 4, 0); } frame(lua_state, 7.0); if is_excute(agent) { - ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } frame(lua_state, 15.0); if is_excute(agent) { @@ -155,14 +181,14 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { ArticleModule::generate_article(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER_BULLET, false, 0); } frame(lua_state, 27.0); - FT_MOTION_RATE(agent, 7.0/(31.0-27.0)); + FT_MOTION_RATE_RANGE(agent, 27.0, 48.0, 12.0); if is_excute(agent) { if ArticleModule::is_exist(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER){ ArticleModule::change_motion(boma, *FIGHTER_FOX_GENERATE_ARTICLE_BLASTER, smash::phx::Hash40::new("close"), false, 0.0); } } - frame(lua_state, 31.0); - FT_MOTION_RATE(agent, 0.8); + frame(lua_state, 48.0); + FT_MOTION_RATE(agent, 1.0); } pub fn install(agent: &mut Agent) { @@ -171,5 +197,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchturn", game_catchturn, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); } \ No newline at end of file diff --git a/fighters/fox/src/acmd/tilts.rs b/fighters/fox/src/acmd/tilts.rs index 7107c9c910..e98e8e60c6 100644 --- a/fighters/fox/src/acmd/tilts.rs +++ b/fighters/fox/src/acmd/tilts.rs @@ -5,9 +5,9 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.5, 0.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.5, 5.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.5, 0.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.5, 5.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 8.0, 361, 109, 0, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 4.0); if is_excute(agent) { @@ -20,9 +20,9 @@ unsafe extern "C" fn game_attacks3hi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.5, 0.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.5, 5.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.5, 0.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.5, 5.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 8.0, 361, 109, 0, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } wait(lua_state, 4.0); @@ -36,9 +36,9 @@ unsafe extern "C" fn game_attacks3lw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.5, 0.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 0, 3.5, 5.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.5, 0.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 361, 109, 0, 0, 3.5, 5.0, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 8.0, 361, 109, 0, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 4.0); @@ -75,13 +75,10 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { frame(lua_state, 2.5); FT_MOTION_RATE_RANGE(agent, 2.5, 3.0, 1.0); if is_excute(agent) { - // ground - ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 110, 130, 0, 30, 5.0, 4.0, -0.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - // air - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 84, 130, 0, 30, 5.0, 4.0, -0.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - // both - ATTACK(agent, 2, 0, Hash40::new("kneer"), 7.0, 80, 130, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("legr"), 7.0, 80, 130, 0, 30, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 8.0, 110, 143, 0, 29, 5.0, 4.0, -0.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 84, 143, 0, 29, 5.0, 4.0, -0.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.0, 80, 143, 0, 29, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("legr"), 6.0, 80, 143, 0, 29, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 3.0); FT_MOTION_RATE(agent, 1.0); @@ -133,9 +130,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("tail1"), 10.0, 70, 125, 0, 25, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("tail2"), 10.0, 80, 125, 0, 25, 3.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("tail2"), 10.0, 90, 125, 0, 25, 4.0, 6.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("tail1"), 9.0, 70, 137, 0, 24, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("tail2"), 9.0, 80, 137, 0, 24, 3.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 2, 0, Hash40::new("tail2"), 9.0, 90, 137, 0, 24, 4.0, 6.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 9.0); diff --git a/fighters/fox/src/lib.rs b/fighters/fox/src/lib.rs index bfb731b631..e1ba121fc2 100644 --- a/fighters/fox/src/lib.rs +++ b/fighters/fox/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/fox/src/opff.rs b/fighters/fox/src/opff.rs index dd6c4e6ccf..d4387da90f 100644 --- a/fighters/fox/src/opff.rs +++ b/fighters/fox/src/opff.rs @@ -3,21 +3,37 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -unsafe fn laser_landcancel(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat2: i32, stick_y: f32) { - if status_kind == *FIGHTER_STATUS_KIND_SPECIAL_N { - boma.check_land_cancel(None); +unsafe fn laser_land_cancel(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_N) { + fighter.check_land_cancel(None); } } // Fox Shine Jump Cancels unsafe fn shine_jump_cancel(fighter: &mut L2CFighterCommon) { + // disables jump cancels when parried between statuses if fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, *FIGHTER_FOX_STATUS_KIND_SPECIAL_LW_LOOP, - *FIGHTER_FOX_STATUS_KIND_SPECIAL_LW_END]) - && !fighter.is_in_hitlag() - { - fighter.check_jump_cancel(false, false); + *FIGHTER_FOX_STATUS_KIND_SPECIAL_LW_END, + *FIGHTER_FOX_STATUS_KIND_SPECIAL_LW_HIT + ]) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY) { + VarModule::on_flag(fighter.battle_object, vars::fox::instance::SPECIAL_LW_DISABLE_JC); + if !fighter.is_status(*FIGHTER_FOX_STATUS_KIND_SPECIAL_LW_END) + && !fighter.is_in_hitlag() { + fighter.change_status(FIGHTER_FOX_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); } + } + + if fighter.is_status_one_of(&[ + *FIGHTER_FOX_STATUS_KIND_SPECIAL_LW_LOOP, + *FIGHTER_FOX_STATUS_KIND_SPECIAL_LW_END + ]) + && !fighter.is_in_hitlag() + && !VarModule::is_flag(fighter.battle_object, vars::fox::instance::SPECIAL_LW_DISABLE_JC) { + fighter.check_jump_cancel(false, false, false); + } } // Utaunt cancel into Fire Fox @@ -36,13 +52,6 @@ unsafe fn firefox_startup_ledgegrab(fighter: &mut L2CFighterCommon) { } } -unsafe fn frame_data(boma: &mut BattleObjectModuleAccessor, motion_kind: u64, frame: f32) { - if motion_kind == hash40("throw_hi") - && frame >= 10.0 { - MotionModule::set_rate(boma, 1.8); - } -} - unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) @@ -56,12 +65,11 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } } -pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { - laser_landcancel(boma, status_kind, situation_kind, cat[1], stick_y); +pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, motion_kind: u64, frame: f32) { + laser_land_cancel(fighter); shine_jump_cancel(fighter); utaunt_cancel_fire_fox(boma, frame); firefox_startup_ledgegrab(fighter); - frame_data(boma, motion_kind, frame); fastfall_specials(fighter); } @@ -74,7 +82,7 @@ pub extern "C" fn fox_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterComm pub unsafe fn fox_frame(fighter: &mut smash::lua2cpp::L2CFighterCommon) { if let Some(info) = FrameInfo::update_and_get(fighter) { - moveset(fighter, &mut *info.boma, info.id, info.cat, info.status_kind, info.situation_kind, info.motion_kind.hash, info.stick_x, info.stick_y, info.facing, info.frame); + moveset(fighter, &mut *info.boma, info.motion_kind.hash, info.frame); } } diff --git a/fighters/fox/src/status/special_lw.rs b/fighters/fox/src/status/special_lw.rs index 917df1222a..0f55c29637 100644 --- a/fighters/fox/src/status/special_lw.rs +++ b/fighters/fox/src/status/special_lw.rs @@ -40,6 +40,7 @@ pub unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CV else { WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_FOX_REFLECTOR_STATUS_WORK_ID_INT_STOP_Y_FRAME); } + VarModule::off_flag(fighter.battle_object, vars::fox::instance::SPECIAL_LW_DISABLE_JC); special_lw_motion_helper(fighter); fighter.main_shift(special_lw_main_loop) } @@ -47,7 +48,8 @@ pub unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CV unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.global_table[CURRENT_FRAME].get_i32() > 2 // Allows for jump cancel on frame 4 in game && !fighter.is_in_hitlag() - && fighter.check_jump_cancel(false, false) { + && !VarModule::is_flag(fighter.battle_object, vars::fox::instance::SPECIAL_LW_DISABLE_JC) + && fighter.check_jump_cancel(false, false, false) { return 0.into(); } @@ -222,7 +224,8 @@ pub unsafe extern "C" fn special_lw_hit_main(fighter: &mut L2CFighterCommon) -> unsafe extern "C" fn special_lw_hit_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if MotionModule::is_end(fighter.module_accessor) { - if fighter.check_jump_cancel(false, false) { + if !VarModule::is_flag(fighter.battle_object, vars::fox::instance::SPECIAL_LW_DISABLE_JC) + && fighter.check_jump_cancel(false, false, false) { return 0.into(); } if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { diff --git a/fighters/gamewatch/Cargo.toml b/fighters/gamewatch/Cargo.toml index 3148bedd4b..68f328bfbe 100644 --- a/fighters/gamewatch/Cargo.toml +++ b/fighters/gamewatch/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -smash_rs = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } \ No newline at end of file +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/gamewatch/src/acmd/aerials.rs b/fighters/gamewatch/src/acmd/aerials.rs index ea9b2e1f1e..8d8990ab77 100644 --- a/fighters/gamewatch/src/acmd/aerials.rs +++ b/fighters/gamewatch/src/acmd/aerials.rs @@ -25,8 +25,8 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 22, 0, 34, 4.0, 0.0, 13.0, -1.0, Some(0.0), Some(13.0), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 367, 22, 0, 34, 4.0, 0.0, 9.5, -1.0, Some(0.0), Some(9.5), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 235, 100, 39, 0, 4.0, 0.0, 18.6, -2.2, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 235, 100, 39, 0, 4.0, 0.0, 19.4, 4.4, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 235, 100, 39, 0, 3.5, 0.0, 18.6, -2.2, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 235, 100, 39, 0, 3.5, 0.0, 19.4, 4.4, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } frame(lua_state, 11.0); if is_excute(agent) { @@ -36,8 +36,8 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 367, 22, 0, 34, 4.25, 0.0, 13.0, -1.0, Some(0.0), Some(13.0), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 367, 22, 0, 34, 4.25, 0.0, 9.5, -1.0, Some(0.0), Some(9.5), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 215, 100, 39, 0, 4.0, 0.0, 17.4, -8.55, Some(0.0), Some(17.7), Some(-7.5), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 225, 100, 39, 0, 4.0, 0.0, 20.2, 10.8, Some(0.0), Some(20.6), Some(9.6), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 215, 100, 39, 0, 3.5, 0.0, 17.4, -8.55, Some(0.0), Some(17.7), Some(-7.5), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 225, 100, 39, 0, 3.5, 0.0, 20.2, 10.8, Some(0.0), Some(20.6), Some(9.6), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } frame(lua_state, 16.0); if is_excute(agent) { @@ -47,8 +47,8 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 367, 22, 0, 34, 4.75, 0.0, 13.0, -1.0, Some(0.0), Some(13.0), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 367, 22, 0, 34, 4.75, 0.0, 9.5, -1.0, Some(0.0), Some(9.5), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 155, 100, 39, 0, 4.25, 0.0, 11.0, -9.15, Some(0.0), Some(12.0), Some(-8.95), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 160, 100, 39, 0, 4.25, 0.0, 12.4, 12.8, Some(0.0), Some(13.6), Some(12.6), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 155, 100, 39, 0, 3.75, 0.0, 11.0, -9.15, Some(0.0), Some(12.0), Some(-8.95), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 160, 100, 39, 0, 3.75, 0.0, 12.4, 12.8, Some(0.0), Some(13.6), Some(12.6), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } frame(lua_state, 21.0); if is_excute(agent) { @@ -58,8 +58,8 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 50, 106, 0, 45, 2.0, 0.0, 11.0, 3.0, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 50, 106, 0, 45, 8.5, 0.0, 9.0, 1.8, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 7.3, 40, 128, 0, 45, 4.5, 0.0, 2.9, 12.3, Some(0.0), Some(1.5), Some(12.3), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 7.3, 40, 128, 0, 45, 4.5, 0.0, 2.9, -8.75, Some(0.0), Some(1.5), Some(-8.75), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 7.3, 56, 93, 0, 45, 4.0, 0.0, 2.9, 12.3, Some(0.0), Some(1.5), Some(12.3), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 7.3, 56, 93, 0, 45, 4.0, 0.0, 2.9, -8.75, Some(0.0), Some(1.5), Some(-8.75), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } frame(lua_state, 25.0); if is_excute(agent) { diff --git a/fighters/gamewatch/src/acmd/ground.rs b/fighters/gamewatch/src/acmd/ground.rs index 6a71447cc5..d579a5b7e0 100644 --- a/fighters/gamewatch/src/acmd/ground.rs +++ b/fighters/gamewatch/src/acmd/ground.rs @@ -13,7 +13,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 83, 50, 0, 20, 3.8, 0.0, 5.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 83, 50, 0, 20, 4.3, 0.0, 5.2, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 361, 15, 0, 20, 2.5, 0.0, 3.0, 6.0, Some(0.0), Some(3.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); AttackModule::set_down_only(boma, 2, false); } diff --git a/fighters/gamewatch/src/acmd/other.rs b/fighters/gamewatch/src/acmd/other.rs index e4ddf9d199..2cb3e22692 100644 --- a/fighters/gamewatch/src/acmd/other.rs +++ b/fighters/gamewatch/src/acmd/other.rs @@ -59,15 +59,11 @@ unsafe extern "C" fn sound_appealhir(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -77,10 +73,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_down(agent: &mut L2CAgentBase) { diff --git a/fighters/gamewatch/src/acmd/specials/special_s.rs b/fighters/gamewatch/src/acmd/specials/special_s.rs index d2736ad5a0..a07aa69f81 100644 --- a/fighters/gamewatch/src/acmd/specials/special_s.rs +++ b/fighters/gamewatch/src/acmd/specials/special_s.rs @@ -43,8 +43,8 @@ unsafe extern "C" fn game_specials3(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_GAMEWATCH_STATUS_SPECIAL_S_FLAG_FIX_PANEL); VisibilityModule::set_default_int64(boma, hash40("panel") as i64); - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 140, 50, 0, 45, 6.0, 0.0, 10.6, 8.9, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 43, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 140, 50, 0, 45, 4.0, 0.0, 6.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 43, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 140, 50, 0, 45, 6.0, 0.0, 10.6, 8.9, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 140, 50, 0, 45, 4.0, 0.0, 6.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_OBJECT); } frame(lua_state, 24.0); if is_excute(agent) { diff --git a/fighters/gamewatch/src/acmd/throws.rs b/fighters/gamewatch/src/acmd/throws.rs index 6d8ad74d3e..7cb764268d 100644 --- a/fighters/gamewatch/src/acmd/throws.rs +++ b/fighters/gamewatch/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 5.0, 0.0, Some(0.0), Some(5.0), Some(9.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 5.0, 4.5, Some(0.0), Some(5.0), Some(9.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -228,7 +227,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{x: 0.0, y: -5.0, z: -9.912}, false, false); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::on_flag(opponent_boma.object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); } frame(lua_state, 41.0); FT_MOTION_RATE(agent, 0.5); diff --git a/fighters/gamewatch/src/lib.rs b/fighters/gamewatch/src/lib.rs index 991c7855e6..591261102e 100644 --- a/fighters/gamewatch/src/lib.rs +++ b/fighters/gamewatch/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/gamewatch/src/status/landing.rs b/fighters/gamewatch/src/status/landing.rs new file mode 100644 index 0000000000..003751e87f --- /dev/null +++ b/fighters/gamewatch/src/status/landing.rs @@ -0,0 +1,42 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL + +unsafe extern "C" fn landing_fall_special_init(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Init, fighter, *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL)(fighter); + if fighter.is_prev_status(*FIGHTER_STATUS_KIND_SPECIAL_N) { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("landing_heavy"), -1.0, 1.0, 0.0); + } + + return ret; +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); + agent.status(Init, *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, landing_fall_special_init); +} \ No newline at end of file diff --git a/fighters/gamewatch/src/status/landing_fall_special.rs b/fighters/gamewatch/src/status/landing_fall_special.rs deleted file mode 100644 index 2b365c4761..0000000000 --- a/fighters/gamewatch/src/status/landing_fall_special.rs +++ /dev/null @@ -1,14 +0,0 @@ -use super::*; - -unsafe extern "C" fn landing_fall_special_init(fighter: &mut L2CFighterCommon) -> L2CValue { - let ret = smashline::original_status(Init, fighter, *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL)(fighter); - if fighter.is_prev_status(*FIGHTER_STATUS_KIND_SPECIAL_N) { - MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("landing_heavy"), -1.0, 1.0, 0.0); - } - - return ret; -} - -pub fn install(agent: &mut Agent) { - agent.status(Init, *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, landing_fall_special_init); -} \ No newline at end of file diff --git a/fighters/gamewatch/src/status/mod.rs b/fighters/gamewatch/src/status/mod.rs index a397aeb765..f3df818c66 100644 --- a/fighters/gamewatch/src/status/mod.rs +++ b/fighters/gamewatch/src/status/mod.rs @@ -1,7 +1,7 @@ use super::*; use globals::*; -mod landing_fall_special; +mod landing; mod special_hi; mod special_hi_open; //mod special_n; @@ -98,7 +98,7 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { pub fn install(agent: &mut Agent) { agent.on_start(on_start); - landing_fall_special::install(agent); + landing::install(agent); special_hi::install(agent); special_hi_open::install(agent); //special_n::install(agent); diff --git a/fighters/gamewatch/src/status/special_hi.rs b/fighters/gamewatch/src/status/special_hi.rs index 66200d6e03..a62d71d727 100644 --- a/fighters/gamewatch/src/status/special_hi.rs +++ b/fighters/gamewatch/src/status/special_hi.rs @@ -55,6 +55,7 @@ unsafe fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { unsafe extern "C" fn special_hi_exit(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::on_flag(fighter.battle_object, vars::gamewatch::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); return 0.into(); } diff --git a/fighters/gamewatch/src/status/special_s.rs b/fighters/gamewatch/src/status/special_s.rs index f6245a9907..c402d7913b 100644 --- a/fighters/gamewatch/src/status/special_s.rs +++ b/fighters/gamewatch/src/status/special_s.rs @@ -1,5 +1,5 @@ use super::*; -use smash_rs; +use smash2; unsafe extern "C" fn special_s_init(fighter: &mut L2CFighterCommon) -> L2CValue { let prev_kind = WorkModule::get_int(fighter.module_accessor, *FIGHTER_GAMEWATCH_INSTANCE_WORK_ID_INT_SPECIAL_S_PREV_KIND); @@ -88,7 +88,7 @@ unsafe extern "C" fn special_s_init(fighter: &mut L2CFighterCommon) -> L2CValue unsafe extern "C" fn special_s_exec(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.is_motion_one_of(&[Hash40::new("special_s_4"), Hash40::new("special_air_s_4")]) { if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) && !fighter.is_in_hitlag() { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, false); } } @@ -103,13 +103,13 @@ unsafe extern "C" fn special_s_check_attack(fighter: &mut L2CFighterCommon, para let opponent_boma = sv_battle_object::module_accessor(object_id); if StatusModule::situation_kind(opponent_boma) == *SITUATION_KIND_AIR { let opponent_object = utils::util::get_battle_object_from_accessor(opponent_boma); - VarModule::on_flag(opponent_object, vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::on_flag(opponent_object, vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); StatusModule::set_status_kind_interrupt(opponent_boma, *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR); } } } } - + return 0.into(); } diff --git a/fighters/ganon/Cargo.toml b/fighters/ganon/Cargo.toml index e83c00c086..a88f6a8704 100644 --- a/fighters/ganon/Cargo.toml +++ b/fighters/ganon/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/ganon/src/acmd/aerials.rs b/fighters/ganon/src/acmd/aerials.rs index 56bcaaebb3..7f5f080b33 100644 --- a/fighters/ganon/src/acmd/aerials.rs +++ b/fighters/ganon/src/acmd/aerials.rs @@ -10,36 +10,32 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 4.0, 65, 62, 0, 55, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("hip"), 4.0, 367, 66, 0, 27, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 4.0, 75, 62, 0, 55, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 4.0, 367, 66, 0, 27, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneer"), 4.0, 75, 62, 0, 55, 5.0, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("kneer"), 4.0, 367, 66, 0, 27, 5.0, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 6.0, 65, 68, 0, 45, 5.0, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 70, 68, 0, 45, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 6.0, 75, 68, 0, 45, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); } - wait(lua_state, 6.0); - FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 13.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 20.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneel"), 10.0, 361, 114, 0, 34, 5.0, 5.5, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 361, 114, 0, 34, 5.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("hip"), 10.0, 361, 114, 0, 34, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); } - wait(lua_state, 4.0); + frame(lua_state, 24.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneel"), 6.0, 361, 96, 0, 34, 4.0, 5.5, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneel"), 6.0, 361, 96, 0, 34, 4.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("hip"), 6.0, 361, 96, 0, 34, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); } - wait(lua_state, 5.0); + frame(lua_state, 28.0); if is_excute(agent) { AttackModule::clear_all(boma); } - wait(lua_state, 4.0); + frame(lua_state, 33.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -69,9 +65,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 18.0, 361, 97, 0, 20, 4.0, -2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 18.0, 361, 97, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handr"), 18.0, 361, 97, 0, 20, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 17.0, 361, 90, 0, 40, 4.0, -2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 17.0, 361, 90, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handr"), 17.0, 361, 90, 0, 40, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } wait(lua_state, 5.0); if is_excute(agent) { @@ -111,15 +107,15 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 361, 93, 0, 40, 4.5, 0.0, 12.6, -5.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 361, 93, 0, 40, 4.5, 0.0, 10.4, -10.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 16.5, 361, 93, 0, 40, 5.0, 0.0, 9.1, -15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 361, 93, 0, 40, 5.0, 0.0, 9.1, -15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 361, 90, 0, 30, 4.5, 0.0, 10.4, -10.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 361, 90, 0, 30, 4.5, 0.0, 12.85, -4.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 45, 90, 0, 30, 4.0, 0.0, 12.6, -5.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 45, 90, 0, 30, 4.0, 0.0, 10.4, -10.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 45, 90, 0, 30, 4.5, 0.0, 9.1, -15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 45, 100, 0, 20, 4.5, 0.0, 9.1, -15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 45, 100, 0, 20, 4.0, 0.0, 10.4, -10.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 45, 100, 0, 20, 4.0, 0.0, 12.85, -4.1, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); } frame(lua_state, 18.0); @@ -138,17 +134,12 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("top"), -2.5, 14.7, -4.3, 35, 140, 50, 1.3, false); - // EFFECT_FOLLOW(agent, Hash40::new("ganon_engokua"), Hash40::new("handl"), 0, 0, 0, 0, 0, 0, 0.3, false); } frame(lua_state, 10.0); if is_excute(agent) { EFFECT_FOLLOW_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 9, -17, 0, 0, 0, 1.5, true, 0.9); EFFECT_FOLLOW(agent, Hash40::new("sys_hit_elec_s"), Hash40::new("handl"), 0, 0, 0, 0, 0, 0, 0.3, false); } - // frame(lua_state, 13.0); - // if is_excute(agent) { - // EFFECT_OFF_KIND(agent, Hash40::new("ganon_engokua"), false, true); - // } } unsafe extern "C" fn effect_landingairb(agent: &mut L2CAgentBase) { @@ -171,18 +162,18 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 7.5, 21.0, 13.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("legl"), 13.0, 361, 100, 0, 35, 4.8, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 361, 100, 0, 35, 5.8, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 361, 100, 0, 35, 5.25, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 11.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("legl"), 12.0, 30, 80, 0, 30, 4.8, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 30, 80, 0, 30, 5.8, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 30, 80, 0, 30, 5.25, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 15.0); if is_excute(agent) { AttackModule::clear(boma, 2, false); ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 0, 70, 0, 20, 4.8, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 7.0, 0, 70, 0, 20, 5.8, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 7.0, 0, 70, 0, 20, 5.25, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 19.0); FT_MOTION_RATE_RANGE(agent, 19.0, 31.0, 14.0); @@ -195,6 +186,23 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.5); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 16, -0.5, 0, 30, 90, 1.25, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 16, -0.5, 0, 110, 90, 1.25, true); + } + frame(lua_state, 19.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("sys_attack_arc_d"), false, false); + } +} + unsafe extern "C" fn expression_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -247,6 +255,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_landingairb", effect_landingairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); + agent.acmd("effect_attackairhi", effect_attackairhi, Priority::Low); agent.acmd("expression_attackairhi", expression_attackairhi, Priority::Low); agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); diff --git a/fighters/ganon/src/acmd/other.rs b/fighters/ganon/src/acmd/other.rs index 79818c191a..c45bd380e6 100644 --- a/fighters/ganon/src/acmd/other.rs +++ b/fighters/ganon/src/acmd/other.rs @@ -124,16 +124,12 @@ unsafe extern "C" fn game_appeallwl(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -144,10 +140,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/ganon/src/acmd/smashes.rs b/fighters/ganon/src/acmd/smashes.rs index b6a5f366f0..55c527b280 100644 --- a/fighters/ganon/src/acmd/smashes.rs +++ b/fighters/ganon/src/acmd/smashes.rs @@ -25,10 +25,10 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { } frame(lua_state, 29.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 22.0, 40, 96, 0, 45, 5.0, 0.0, 6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 22.0, 40, 96, 0, 45, 5.0, 0.0, 14.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 22.0, 40, 96, 0, 45, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("armr"), 22.0, 40, 96, 0, 45, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 22.0, 45, 90, 0, 40, 5.0, 0.0, 6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 22.0, 45, 90, 0, 40, 5.0, 0.0, 14.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 22.0, 45, 90, 0, 40, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("armr"), 22.0, 45, 90, 0, 40, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } frame(lua_state, 33.0); @@ -88,11 +88,11 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 22.0, 85, 85, 0, 40, 5.0, 0.0, 6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 22.0, 78, 85, 0, 40, 5.0, 0.0, 14.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 19.0, 75, 93, 0, 40, 5.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 20.0, 85, 90, 0, 40, 5.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 19.0, 80, 90, 0, 40, 5.0, 0.0, 6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 19.0, 80, 90, 0, 40, 5.0, 0.0, 14.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } - wait(lua_state, 9.0); + wait(lua_state, 7.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -156,10 +156,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 160, 90, 90, 0, 3.0, 0.0, 4.0, 11.0, Some(0.0), Some(4.0), Some(6.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 175, 92, 95, 0, 3.0, 0.0, 4.0, 19.0, Some(0.0), Some(4.0), Some(6.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 147, 90, 90, 0, 4.0, 0.0, 4.0, 11.0, Some(0.0), Some(4.0), Some(6.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 150, 92, 95, 0, 4.0, 0.0, 4.0, 19.0, Some(0.0), Some(4.0), Some(6.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 160, 90, 90, 0, 3.0, 0.0, 4.0, 11.0, Some(0.0), Some(4.0), Some(6.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 175, 92, 95, 0, 3.0, 0.0, 4.0, 19.0, Some(0.0), Some(4.0), Some(6.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 147, 90, 90, 0, 4.0, 0.0, 4.0, 11.0, Some(0.0), Some(4.0), Some(6.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 150, 92, 95, 0, 4.0, 0.0, 4.0, 19.0, Some(0.0), Some(4.0), Some(6.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } wait(lua_state, 4.0); if is_excute(agent) { @@ -168,7 +168,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 35.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 35, 88, 0, 61, 5.0, 0.0, 4.8, -21.0, Some(0.0), Some(4.8), Some(-6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 9, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 60, 110, 0, 50, 5.0, 0.0, 4.8, -21.0, Some(0.0), Some(4.8), Some(-6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 9, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 4.0); if is_excute(agent) { diff --git a/fighters/ganon/src/acmd/specials.rs b/fighters/ganon/src/acmd/specials.rs index c05090316c..72f60648d0 100644 --- a/fighters/ganon/src/acmd/specials.rs +++ b/fighters/ganon/src/acmd/specials.rs @@ -336,7 +336,9 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } } frame(lua_state, 13.0); if is_excute(agent) { diff --git a/fighters/ganon/src/acmd/throws.rs b/fighters/ganon/src/acmd/throws.rs index ce40e3c5e5..353a1ac265 100644 --- a/fighters/ganon/src/acmd/throws.rs +++ b/fighters/ganon/src/acmd/throws.rs @@ -4,15 +4,12 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.875); - frame(lua_state, 7.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 8.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 9.0, 0.0, Some(0.0), Some(9.0), Some(10.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 9.0, 5.0, Some(0.0), Some(9.0), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -32,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 9.0, 4.0, Some(0.0), Some(9.0), Some(11.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 9.0, 5.0, Some(0.0), Some(9.0), Some(11.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -52,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 9.0, -4.0, Some(0.0), Some(9.0), Some(-15.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 9.0, -5.0, Some(0.0), Some(9.0), Some(-15.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -70,15 +67,69 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 43, 100, 0, 68, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 80, 100, 0, 30, 5.0, 4.8, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 5.0, 80, 100, 0, 30, 2.4, 2.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 5.0, 80, 100, 0, 30, 2.4, -0.8, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_catch_only_all(boma, true, false); + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 80, 143, 0, 62, 5.0, 4.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 5.0, 80, 143, 0, 62, 2.4, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 5.0, 80, 143, 0, 62, 2.4, -0.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); CHECK_FINISH_CAMERA(agent, 17, 9); } - frame(lua_state, 13.0); + frame(lua_state, 12.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("handr"), -1, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.6); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc"), Hash40::new("top"), -3, 17, 2.5, 0, -45, 50, 0.85, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); + } +} + +unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 50, 120, 0, 30, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 11.0); + if is_excute(agent) { + REVERSE_LR(agent); + } + frame(lua_state, 12.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("footr"), 5.0, 70, 100, 0, 30, 4.8, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 5.0, 70, 100, 0, 30, 4.3, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 5.0, 70, 100, 0, 30, 3.7, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, 22, 20); + } + frame(lua_state, 14.0); if is_excute(agent) { let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); @@ -92,14 +143,14 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 95, 105, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 90, 110, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 140, 100, 0, 30, 4.3, 4.8, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 10.0, 140, 100, 0, 30, 3.8, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 10.0, 140, 100, 0, 30, 3.7, -0.8, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 140, 100, 0, 30, 4.3, 4.8, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 5.0, 140, 100, 0, 30, 3.8, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 5.0, 140, 100, 0, 30, 3.7, -0.8, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, -1, 28); } @@ -117,14 +168,14 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 72, 45, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 76, 45, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 22.0); + frame(lua_state, 19.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 11, 0); } - frame(lua_state, 23.0); + frame(lua_state, 20.0); if is_excute(agent) { let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); @@ -139,7 +190,10 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchturn", game_catchturn, Priority::Low); agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("effect_throwf", effect_throwf, Priority::Low); + agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); diff --git a/fighters/ganon/src/acmd/tilts.rs b/fighters/ganon/src/acmd/tilts.rs index b342d70d31..5e967bed7f 100644 --- a/fighters/ganon/src/acmd/tilts.rs +++ b/fighters/ganon/src/acmd/tilts.rs @@ -331,8 +331,8 @@ unsafe extern "C" fn game_attacklw32(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 48, 100, 0, 85, 4.0, 0.0, 3.0, -5.0, Some(0.0), Some(3.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 48, 100, 0, 85, 3.0, 0.0, 9.0, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 48, 120, 0, 65, 4.0, 0.0, 3.0, -5.0, Some(0.0), Some(3.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 48, 120, 0, 65, 3.0, 0.0, 9.0, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 4.0); if is_excute(agent) { diff --git a/fighters/ganon/src/lib.rs b/fighters/ganon/src/lib.rs index 4f04447f5b..cee58977ef 100644 --- a/fighters/ganon/src/lib.rs +++ b/fighters/ganon/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/ganon/src/opff.rs b/fighters/ganon/src/opff.rs index b87690c291..ecab270979 100644 --- a/fighters/ganon/src/opff.rs +++ b/fighters/ganon/src/opff.rs @@ -20,7 +20,8 @@ use globals::*; unsafe fn special_hi_landing(fighter: &mut L2CFighterCommon) { if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) && StatusModule::is_situation_changed(fighter.module_accessor) - && fighter.is_situation(*SITUATION_KIND_GROUND) { + && fighter.is_situation(*SITUATION_KIND_GROUND) + && fighter.motion_frame() >= 14.0 { fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); } } diff --git a/fighters/ganon/src/status/special_lw.rs b/fighters/ganon/src/status/special_lw.rs index 205a148c4d..f668edaf39 100644 --- a/fighters/ganon/src/status/special_lw.rs +++ b/fighters/ganon/src/status/special_lw.rs @@ -32,6 +32,75 @@ unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue 0.into() } +unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.off_flag(*FIGHTER_GANON_STATUS_WORK_ID_FLAG_GANON_KICK_SP_BRAKE); + fighter.off_flag(*FIGHTER_GANON_STATUS_WORK_ID_FLAG_GANON_KICK_CLIFF_CHECK); + fighter.off_flag(*FIGHTER_GANON_STATUS_WORK_ID_FLAG_GANON_KICK_WALL_CHECK); + fighter.off_flag(*FIGHTER_GANON_STATUS_WORK_ID_FLAG_GANON_KICK_FALL_ONOFF); + let hit_reduct_count = fighter.get_param_int("param_special_lw", "hit_reduct_count"); + fighter.set_int(hit_reduct_count, *FIGHTER_GANON_STATUS_WORK_ID_INT_GANON_KICK_REDUCTION_LEFT); + fighter.set_float(1.0, *FIGHTER_GANON_STATUS_WORK_ID_FLOAT_GANON_KICK_SPEED_COEFFICIENT); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.set_int(*SITUATION_KIND_GROUND, *FIGHTER_GANON_STATUS_WORK_ID_INT_GANON_KICK_START_SITUATION); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw"), 0.0, 1.0, false, 0.0, false, false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); + fighter.set_situation(SITUATION_KIND_GROUND.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + } + else { + fighter.set_int(*SITUATION_KIND_AIR, *FIGHTER_GANON_STATUS_WORK_ID_INT_GANON_KICK_START_SITUATION); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw"), 0.0, 1.0, false, 0.0, false, false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + + fighter.main_shift(special_lw_main_loop) +} + +unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_GANON_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); + return 0.into(); + } + if fighter.get_int(*FIGHTER_GANON_STATUS_WORK_ID_INT_GANON_KICK_START_SITUATION) == *SITUATION_KIND_GROUND { + // Skip to end on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + fighter.change_status(FIGHTER_GANON_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); + return 0.into(); + } + let touch_flag = if fighter.lr() <= 0.0 { *GROUND_TOUCH_FLAG_LEFT } else { *GROUND_TOUCH_FLAG_RIGHT }; + if GroundModule::is_touch(fighter.module_accessor, touch_flag as u32) { + if fighter.is_flag(*FIGHTER_GANON_STATUS_WORK_ID_FLAG_GANON_KICK_WALL_CHECK) { + fighter.change_status(FIGHTER_GANON_STATUS_KIND_SPECIAL_LW_WALL_END.into(), false.into()); + return 0.into(); + } + } + } + else { + if GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) { + if fighter.is_flag(*FIGHTER_GANON_STATUS_WORK_ID_FLAG_GANON_KICK_WALL_CHECK) { + fighter.change_status(FIGHTER_GANON_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); + return 0.into(); + } + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); + fighter.set_situation(SITUATION_KIND_GROUND.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + } + + return 0.into(); +} + // FIGHTER_GANON_STATUS_KIND_SPECIAL_LW_END unsafe extern "C" fn special_lw_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -52,11 +121,28 @@ unsafe extern "C" fn special_lw_end_main(fighter: &mut L2CFighterCommon) -> L2CV WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_GANON_STATUS_WORK_ID_INT_GANON_KICK_START_SITUATION); } + // Reduce speed on shield + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if start_situation == *SITUATION_KIND_GROUND + && end_situation == *FIGHTER_GANON_KICK_END_SITUATION_GG + && prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 || prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0 { + let shield_hit_end_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lw.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_MOTION, + shield_hit_end_speed_x * lr, + 0.0 + ); + } + ret } pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_main); agent.status(Main, *FIGHTER_GANON_STATUS_KIND_SPECIAL_LW_END, special_lw_end_main); } diff --git a/fighters/gaogaen/Cargo.toml b/fighters/gaogaen/Cargo.toml index 8a30fdafa8..16c07a6899 100644 --- a/fighters/gaogaen/Cargo.toml +++ b/fighters/gaogaen/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/gaogaen/src/acmd/aerials.rs b/fighters/gaogaen/src/acmd/aerials.rs index af490c6f3d..c6fd39ffce 100644 --- a/fighters/gaogaen/src/acmd/aerials.rs +++ b/fighters/gaogaen/src/acmd/aerials.rs @@ -9,15 +9,15 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 64, 100, 0, 37, 9.0, 0.0, 6.2, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 64, 100, 0, 37, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("head"), 10.0, 64, 100, 0, 37, 3.75, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 64, 90, 0, 34, 9.0, 0.0, 6.2, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 12.0, 64, 90, 0, 34, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("head"), 12.0, 64, 90, 0, 34, 3.75, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_BODY); } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 69, 100, 0, 34, 6.5, 0.0, 6.2, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 69, 100, 0, 34, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("head"), 9.0, 69, 100, 0, 34, 3.75, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 69, 90, 0, 34, 6.5, 0.0, 6.2, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 69, 90, 0, 34, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("head"), 9.0, 69, 90, 0, 34, 3.75, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } frame(lua_state, 26.0); if is_excute(agent) { @@ -38,23 +38,24 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 10.0, 50, 73, 0, 55, 4.5, 0.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("hip"), 10.0, 50, 73, 0, 55, 4.5, -3.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 13.0, 361, 101, 0, 30, 5.5, -11.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 10.0, 50, 91, 0, 35, 4.5, 0.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("hip"), 10.0, 50, 91, 0, 35, 4.5, -3.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 13.0, 361, 101, 0, 30, 5.0, -11.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 35, 90, 0, 36, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("hip"), 9.0, 35, 90, 0, 36, 4.0, -3.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 9.0, 35, 90, 0, 36, 4.5, -11.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 38, 70, 0, 38, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("hip"), 9.0, 38, 70, 0, 38, 4.0, -3.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 9.0, 38, 70, 0, 38, 4.5, -11.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame (lua_state, 15.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 19.0); - FT_MOTION_RATE(agent, 0.75); + FT_MOTION_RATE_RANGE(agent, 19.0, 30.0, 7.0); frame(lua_state, 30.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -92,8 +93,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 65, 79, 0, 58, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 11.0, 71, 79, 0, 58, 5.0, 6.4, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 65, 88, 0, 50, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 11.0, 71, 88, 0, 50, 5.0, 6.4, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 12.0); FT_MOTION_RATE(agent, 1.0/(12.75-12.0)); diff --git a/fighters/gaogaen/src/acmd/ground.rs b/fighters/gaogaen/src/acmd/ground.rs index 251b8b2ff9..400839637e 100644 --- a/fighters/gaogaen/src/acmd/ground.rs +++ b/fighters/gaogaen/src/acmd/ground.rs @@ -4,12 +4,14 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 78, 38, 0, 26, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 78, 38, 0, 26, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("handl"), 3.0, 78, 38, 0, 26, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); - // jablock + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 25, 3.0, 0.0, 3.5, 4.0, Some(0.0), Some(3.5), Some(11.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 3.0); if is_excute(agent) { @@ -17,11 +19,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { } wait(lua_state, 4.0); if is_excute(agent) { - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { - agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } else { - ComboModule::reset(boma); - } + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } @@ -38,8 +36,9 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("legr"), 3.0, 78, 38, 0, 26, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("kneer"), 3.0, 78, 38, 0, 26, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("kneer"), 3.0, 78, 38, 0, 26, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - // jablock + // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 20, 0, 25, 3.0, 0.0, 3.5, 4.0, Some(0.0), Some(3.5), Some(7.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); } wait(lua_state, 3.0); if is_excute(agent) { @@ -47,11 +46,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { } wait(lua_state, 4.0); if is_excute(agent) { - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { - agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } else { - ComboModule::reset(boma); - } + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } @@ -60,12 +55,10 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("bust"), 7.0, 361, 88, 0, 40, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); - ATTACK(agent, 1, 0, Hash40::new("waist"), 7.0, 361, 88, 0, 40, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 7.0, 361, 88, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); - ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 7.0, 361, 88, 0, 40, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); - ATTACK(agent, 4, 0, Hash40::new("arml"), 7.0, 361, 88, 0, 40, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); - ATTACK(agent, 5, 0, Hash40::new("arml"), 7.0, 361, 88, 0, 40, 4.5, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); + ATTACK(agent, 0, 0, Hash40::new("bust"), 7.0, 35, 50, 0, 66, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); + ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 7.0, 35, 50, 0, 66, 4.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); + ATTACK(agent, 2, 0, Hash40::new("arml"), 7.0, 35, 50, 0, 66, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); + ATTACK(agent, 3, 0, Hash40::new("arml"), 7.0, 35, 50, 0, 66, 4.5, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); } wait(lua_state, 5.0); if is_excute(agent) { diff --git a/fighters/gaogaen/src/acmd/other.rs b/fighters/gaogaen/src/acmd/other.rs index 091d30335e..8b57218b51 100644 --- a/fighters/gaogaen/src/acmd/other.rs +++ b/fighters/gaogaen/src/acmd/other.rs @@ -83,16 +83,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -103,10 +99,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { diff --git a/fighters/gaogaen/src/acmd/specials.rs b/fighters/gaogaen/src/acmd/specials.rs deleted file mode 100644 index 20af328094..0000000000 --- a/fighters/gaogaen/src/acmd/specials.rs +++ /dev/null @@ -1,1008 +0,0 @@ -use super::*; - -unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 5.0); - if is_excute(agent) { - shield!(agent, *MA_MSC_CMD_REFLECTOR, *COLLISION_KIND_REFLECTOR, 0, hash40("top"), 9.0, 0.0, 10.0, 7.0, 0.0, 10.0, -7.0, 0.0, 0.0, 1, false, 0.0, *FIGHTER_REFLECTOR_GROUP_HOMERUNBAT); - ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 45, 45, 0, 85, 5.8, 0.0, 11.0, 4.0, Some(0.0), Some(11.0), Some(8.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 45, 48, 0, 80, 5.4, 0.0, 11.0, -4.0, Some(0.0), Some(11.0), Some(-4.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 45, 48, 0, 80, 4.6, 0.0, 8.0, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { - HIT_NODE(agent, Hash40::new("body"), *HIT_STATUS_INVINCIBLE); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_INVINCIBLE); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_INVINCIBLE); - } - else { - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_INVINCIBLE); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_INVINCIBLE); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_INVINCIBLE); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_INVINCIBLE); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_INVINCIBLE); - } - } - frame(lua_state, 7.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_N_FLAG_START_ROTATION); - } - frame(lua_state, 8.0); - if is_excute(agent) { - HIT_RESET_ALL(agent); - AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_size(boma, 0, 0.1); - AttackModule::set_size(boma, 1, 0.1); - AttackModule::set_size(boma, 2, 0.1); - } - frame(lua_state, 9.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 45, 50, 0, 85, 4.2, 0.0, 11.0, 4.0, Some(0.0), Some(11.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 40, 0, 80, 3.8, 0.0, 11.0, -2.0, Some(0.0), Some(11.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 11.0); - if is_excute(agent) { - AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_size(boma, 0, 0.1); - AttackModule::set_size(boma, 1, 0.1); - AttackModule::set_size(boma, 2, 0.1); - } - frame(lua_state, 15.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 17.0); - if is_excute(agent) { - AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_size(boma, 0, 0.1); - AttackModule::set_size(boma, 1, 0.1); - AttackModule::set_size(boma, 2, 0.1); - } - frame(lua_state, 23.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 25.0); - if is_excute(agent) { - AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_size(boma, 0, 0.1); - AttackModule::set_size(boma, 1, 0.1); - AttackModule::set_size(boma, 2, 0.1); - } - frame(lua_state, 29.0); - if is_excute(agent) { - shield!(agent, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, 0, *FIGHTER_REFLECTOR_GROUP_HOMERUNBAT); - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 31.0); - if is_excute(agent) { - AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_size(boma, 0, 0.1); - AttackModule::set_size(boma, 1, 0.1); - AttackModule::set_size(boma, 2, 0.1); - } - frame(lua_state, 37.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 39.0); - if is_excute(agent) { - AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_size(boma, 0, 0.1); - AttackModule::set_size(boma, 1, 0.1); - AttackModule::set_size(boma, 2, 0.1); - } - frame(lua_state, 42.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 45.0); - if is_excute(agent) { - AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_size(boma, 0, 0.1); - AttackModule::set_size(boma, 1, 0.1); - AttackModule::set_size(boma, 2, 0.1); - } - frame(lua_state, 50.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 52.0); - if is_excute(agent) { - AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); - AttackModule::set_size(boma, 0, 0.1); - AttackModule::set_size(boma, 1, 0.1); - AttackModule::set_size(boma, 2, 0.1); - } - frame(lua_state, 56.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 58.0); - if is_excute(agent) { - HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_N_FLAG_END_ROTATION); - } - frame(lua_state, 85.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_N_FLAG_REQUEST_GRAVITY_DEFAULT); - } -} - -unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.8); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_MOVE_START); - VarModule::off_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB); - VarModule::off_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB); - VarModule::off_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB); - } - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 12.0); - if is_excute(agent) { - if ControlModule::get_stick_y(boma) < -0.5 { - VarModule::on_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB); - VarModule::on_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB); - } - else if ControlModule::get_stick_y(boma) > 0.5 { - VarModule::on_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB); - VarModule::on_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB); - } - } - frame(lua_state, 15.0); - FT_MOTION_RATE(agent, 2.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // Spawn the special windboxes if performing OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 70, 100, 1, 0, 4.0, 0.0, 4.0, 2.0, Some(0.0), Some(4.0), Some(5.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, true, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - AttackModule::set_down_only(boma, 0, true); - } - } - } - frame(lua_state, 16.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - GrabModule::set_rebound(boma, true); - } - frame(lua_state, 17.0); - FT_MOTION_RATE_RANGE(agent, 17.0, 35.0, 17.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // Spawn the air grab/OTG grab box - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 4.0, 2.0, Some(0.0), Some(4.0), Some(8.0), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_GA); - } - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - CATCH(agent, 0, Hash40::new("top"), 7.0, 0.0, 15.0, 0.0, Some(0.0), Some(15.0), Some(6.0), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_A); - } - } - // If the regular grab, then just spawn the grab box - else { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 2.0, Some(0.0), Some(8.0), Some(8.0), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_GA); - } - } - frame(lua_state, 35.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - if !VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); - } - GrabModule::set_rebound(boma, false); - HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); - } - frame(lua_state, 36.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); - } - } - frame(lua_state, 39.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_MOVE_END); - } - frame(lua_state, 44.0); - FT_MOTION_RATE(agent, 0.8); - frame(lua_state, 67.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); - } - frame(lua_state, 74.0); - FT_MOTION_RATE(agent, 1.0); -} - -unsafe extern "C" fn effect_specialsstart(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 4.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 9, 10, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, true); - } - frame(lua_state, 12.0); - if is_excute(agent) { - // OTG/Anti-air grab effects - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("bust"), 0.0, 0, 0, 0, 0, 0, 0.25, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("arml"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("arml"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("armr"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("armr"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - - EFFECT_FOLLOW(agent, Hash40::new("gaogaen_belt_fire_appeal"), Hash40::new("feeler"), 0, 3, 0, 0, 0, 0, 0.7, true); - LAST_EFFECT_SET_RATE(agent, 1.1); - } - // Anti-air grab - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("bust"), 0.0, 0, 0, 0, 0, 0, 0.25, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("arml"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("arml"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("armr"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("armr"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - - EFFECT_FOLLOW(agent, Hash40::new("gaogaen_belt_fire_appeal"), Hash40::new("feeler"), 0, 3, 0, 0, 0, 0, 0.7, true); - LAST_EFFECT_SET_COLOR(agent, 0.25, 0.5, 3.0); - LAST_EFFECT_SET_RATE(agent, 1.1); - } - } - } - frame(lua_state, 16.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 6, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 18.0); - for _ in 0..8{ - if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - // OTG/Anti-air grab effects - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("bust"), 0.0, 0, 0, 0, 0, 0, 0.25, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("arml"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("arml"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("armr"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("armr"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - } - // Anti-air grab - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("bust"), 0.0, 0, 0, 0, 0, 0, 0.3, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("arml"), 1.0, 0, 0, 0, 0, 0, 0.35, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("arml"), 7.0, 0, 0, 0, 0, 0, 0.4, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("armr"), 1.0, 0, 0, 0, 0, 0, 0.35, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("armr"), 7.0, 0, 0, 0, 0, 0, 0.4, true); - } - } - } - wait(lua_state, 2.0); - } -} - -unsafe extern "C" fn game_specialairsstart(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - VarModule::on_flag(boma.object(), vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); - } - frame(lua_state, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_MOVE_START); - } - FT_MOTION_RATE(agent, 0.8); - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 1); - frame(lua_state, 15.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 350, 100, 30, 0, 5.0, 0.0, 7.0, 2.0, Some(0.0), Some(7.0), Some(5.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - } - frame(lua_state, 16.0); - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 350, 100, 30, 0, 5.0, 0.0, 7.0, 2.0, Some(0.0), Some(7.0), Some(5.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FEB, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - } - frame(lua_state, 17.0); - if is_excute(agent) { - GrabModule::set_rebound(boma, true); - } - frame(lua_state, 18.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 2.0, Some(0.0), Some(8.0), Some(8.0), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_G); - CATCH(agent, 1, Hash40::new("top"), 2.5, 0.0, 8.0, 2.0, Some(0.0), Some(8.0), Some(9.5), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_GA); - } - frame(lua_state, 35.0); - if is_excute(agent) { - grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); - GrabModule::set_rebound(boma, false); - } - frame(lua_state, 39.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_MOVE_END); - } - frame(lua_state, 41.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } - frame(lua_state, 44.0); - FT_MOTION_RATE(agent, 0.8); - frame(lua_state, 67.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); - } - frame(lua_state, 74.0); - FT_MOTION_RATE(agent, 1); -} - -unsafe extern "C" fn game_specialsthrow(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 6.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); - } - frame(lua_state, 20.0); - FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 37.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_THROW_ROPE); - } - frame(lua_state, 60.0); - FT_MOTION_RATE(agent, 1); - frame(lua_state, 95.0); -} - -unsafe extern "C" fn effect_specialsthrow(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 4.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_catch"), Hash40::new("sys_catch"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.9, true, *EF_FLIP_YZ); - // OTG/Anti-air grab effects - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("bust"), 0.0, 0, 0, 0, 0, 0, 0.25, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("arml"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("arml"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("armr"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("armr"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - } - // Anti-air grab - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("bust"), 0.0, 0, 0, 0, 0, 0, 0.3, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("arml"), 1.0, 0, 0, 0, 0, 0, 0.35, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("arml"), 7.0, 0, 0, 0, 0, 0, 0.4, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("armr"), 1.0, 0, 0, 0, 0, 0, 0.35, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("armr"), 7.0, 0, 0, 0, 0, 0, 0.4, true); - } - } - } - frame(lua_state, 22.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 14, -8, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 0.6); - LAST_EFFECT_SET_COLOR(agent, 3.0, 0.5, 0.5); - } - else { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 14, -8, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 0.6); - LAST_EFFECT_SET_COLOR(agent, 0.5, 1.0, 3.0); - } - } - } - frame(lua_state, 31.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -2, 0, 0, 0, 180, 0, 0.8, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 32.0); - for _ in 0..4 { - if is_excute(agent) { - // OTG/Anti-air grab effects - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("bust"), 0.0, 0, 0, 0, 0, 0, 0.25, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("arml"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("arml"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("armr"), 1.0, 0, 0, 0, 0, 0, 0.3, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("armr"), 7.0, 0, 0, 0, 0, 0, 0.35, true); - } - // Anti-air grab - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("bust"), 0.0, 0, 0, 0, 0, 0, 0.3, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("arml"), 1.0, 0, 0, 0, 0, 0, 0.35, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("arml"), 7.0, 0, 0, 0, 0, 0, 0.4, true); - - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("armr"), 1.0, 0, 0, 0, 0, 0, 0.35, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_aura"), Hash40::new("armr"), 7.0, 0, 0, 0, 0, 0, 0.4, true); - } - } - } - wait(lua_state, 4.0); - } -} - -unsafe extern "C" fn game_specialslariat(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); - // OTG/Anti-air grab throw boxes - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 15, 0, 0, 80, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - // Anti-air grab - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 80, 10, 0, 100, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - } - // Regular grab - else{ - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 145, 474, 0, 20, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - AttackModule::set_force_reaction(boma, 0, true, true); - WorkModule::set_float(boma, 9.0, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLOAT_LARIAT_HIT_FRAME); - } - frame(lua_state, 9.0); - if is_excute(agent) { - // OTG/Anti-air grab hitboxes - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 15.0, 15, 0, 0, 80, 7.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, true, 2, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - } - // Anti-air grab - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 15.0, 105, 35, 0, 88, 7.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 2, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - } - } - // Regular grab - else{ - ATTACK(agent, 0, 0, Hash40::new("arml"), 20.0, 145, 40, 0, 88, 7.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 2, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - } - } - frame(lua_state, 14.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_DAMAGE_CUT); - } - frame(lua_state, 20.0); - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) - || VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - FT_MOTION_RATE_RANGE(agent, 20.0, 50.0, 26.0); - } - if is_excute(agent) { - AttackModule::clear_all(boma); - REVERSE_LR(agent); - } - frame(lua_state, 50.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_ENABLE_GRAVITY); - } - frame(lua_state, 58.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - } -} - -unsafe extern "C" fn game_specialairslariat(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 145, 474, 0, 20, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - AttackModule::set_force_reaction(boma, 0, true, true); - WorkModule::set_float(boma, 9.0, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLOAT_LARIAT_HIT_FRAME); - } - frame(lua_state, 9.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 20.0, 145, 40, 0, 88, 7.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 2, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 14.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_DAMAGE_CUT); - } - frame(lua_state, 20.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - REVERSE_LR(agent); - } - frame(lua_state, 50.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_ENABLE_GRAVITY); - } - frame(lua_state, 58.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - } -} - -unsafe extern "C" fn game_specialsshoulder(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 179, 0, 0, 80, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - // Anti-air grab - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 103, 10, 0, 90, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - } - // Regular grab - else{ - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 100, 100, 0, 72, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - AttackModule::set_force_reaction(boma, 0, true, true); - } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - // OTG/Anti-air grab hitboxes - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { - // OTG grab - if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 105, 34, 0, 128, 6.0, 0.0, 6.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 1, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BODY); - } - // Anti-air grab - else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 105, 34, 0, 128, 6.0, 0.0, 6.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 1, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BODY); - } - } - // Regular grab - else{ - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 105, 34, 0, 128, 6.0, 0.0, 6.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 1, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); - } - } - frame(lua_state, 18.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_DAMAGE_CUT); - } - frame(lua_state, 20.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - REVERSE_LR(agent); - } - frame(lua_state, 42.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_ENABLE_GRAVITY); - } - frame(lua_state, 45.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - } - frame(lua_state, 52.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); - } -} - -unsafe extern "C" fn game_specialairsshoulder(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 100, 100, 0, 72, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - AttackModule::set_force_reaction(boma, 0, true, true); - } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 105, 34, 0, 128, 6.0, 0.0, 6.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 1, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); - } - frame(lua_state, 18.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_DAMAGE_CUT); - } - frame(lua_state, 20.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - REVERSE_LR(agent); - } - frame(lua_state, 42.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_ENABLE_GRAVITY); - } - frame(lua_state, 45.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - } - frame(lua_state, 52.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); - } -} - -unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - VarModule::on_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END); - } - frame(lua_state, 4.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); - } - frame(lua_state, 6.0); - if is_excute(agent) { - SA_SET(agent, *SITUATION_KIND_AIR); - } - frame(lua_state, 7.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 9.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); - } - frame(lua_state, 11.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 81, 1, 0, 82, 7.0, 0.0, 9.0, 2.0, None, None, None, 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 87, 1, 0, 81, 7.0, 0.0, 9.0, 2.0, Some(0.0), Some(9.0), Some(6.0), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 80, 1, 0, 80, 4.5, 0.0, 11.5, 2.0, Some(0.0), Some(11.5), Some(3.5), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 78, 1, 0, 90, 2.5, 0.0, 4.5, 0.0, Some(0.0), Some(4.5), Some(5.5), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("top"), 4.0, 90, 1, 0, 91, 7.0, 0.0, 9.0, 2.5, Some(0.0), Some(9.0), Some(6.0), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_force_reaction(boma, 0, true, false); - AttackModule::set_force_reaction(boma, 1, true, false); - AttackModule::set_force_reaction(boma, 2, true, false); - AttackModule::set_force_reaction(boma, 3, true, false); - AttackModule::set_force_reaction(boma, 4, true, false); - } - frame(lua_state, 13.0); - FT_MOTION_RATE(agent, 0.9); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - AttackModule::clear(boma, 2, false); - AttackModule::clear(boma, 3, false); - AttackModule::clear(boma, 4, false); - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 66, 5, 0, 58, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 66, 5, 0, 58, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 15.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 45, 5, 0, 49, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 45, 5, 0, 49, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 16.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 30, 5, 0, 34, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 30, 5, 0, 34, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 20.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 5, 5, 0, 30, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 5, 5, 0, 30, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 25.0); - if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { - FT_MOTION_RATE(agent, 1.5); - } - frame(lua_state, 26.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn game_specialairhistart(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - VarModule::on_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END); - } - frame(lua_state, 3.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } - frame(lua_state, 4.0); - FT_MOTION_RATE_RANGE(agent, 4.0, 6.0, 4.0); - frame(lua_state, 6.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - SA_SET(agent, *SITUATION_KIND_AIR); - } - frame(lua_state, 7.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 9.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); - } - frame(lua_state, 11.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 81, 1, 0, 82, 7.0, 0.0, 9.0, 2.0, None, None, None, 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 87, 1, 0, 81, 7.0, 0.0, 9.0, 2.0, Some(0.0), Some(9.0), Some(6.0), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 80, 1, 0, 80, 4.5, 0.0, 11.5, 2.0, Some(0.0), Some(11.5), Some(3.5), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 78, 1, 0, 90, 2.5, 0.0, 4.5, 0.0, Some(0.0), Some(4.5), Some(5.5), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("top"), 4.0, 90, 1, 0, 91, 7.0, 0.0, 9.0, 2.5, Some(0.0), Some(9.0), Some(6.0), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 13.0); - if is_excute(agent) { - // HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - // HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - FT_MOTION_RATE(agent, 0.9); - AttackModule::clear(boma, 2, false); - AttackModule::clear(boma, 3, false); - AttackModule::clear(boma, 4, false); - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 66, 5, 0, 58, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 66, 5, 0, 58, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 15.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 45, 5, 0, 49, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 45, 5, 0, 49, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 16.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 30, 5, 0, 34, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 30, 5, 0, 34, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 20.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 5, 5, 0, 30, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 5, 5, 0, 30, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 25.0); - if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { - FT_MOTION_RATE(agent, 1.25); - } - frame(lua_state, 26.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn effect_specialairhistart(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("gaogaen_belt_fire2"), Hash40::new("feeler"), 0, 3, 0, 0, 0, 0, 1, true); - } - frame(lua_state, 11.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("gaogaen_chop_arc"), Hash40::new("gaogaen_chop_arc"), Hash40::new("trans"), 7, 14.5, -2, -111, -28, 77, 1.2, true, *EF_FLIP_YZ); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("gaogaen_chop_arc"), Hash40::new("gaogaen_chop_arc"), Hash40::new("trans"), 7, 14.5, 0, -48, 23, 71, 1.2, true, *EF_FLIP_YZ); - } - frame(lua_state, 12.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("gaogaen_chop_line_start"), Hash40::new("trans"), 0, 22, 0, 0, 0, 0, 1, true); - } -} - -unsafe extern "C" fn game_specialairhiturn(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - boma.select_cliff_hangdata_from_name("special_hi_rise"); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } - frame(lua_state, 1.0); - if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { - FT_MOTION_RATE_RANGE(agent, 1.0, 3.0, 5.0); - } - else { - FT_MOTION_RATE(agent, 1.0); - } - frame(lua_state, 3.0); - if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { - FT_MOTION_RATE_RANGE(agent, 3.0, 6.0, 6.0); - } - else { - FT_MOTION_RATE(agent, 1.0); - } - frame(lua_state, 6.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { - VarModule::off_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END); - VarModule::on_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL); - KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - let accel_x_mul = ParamModule::get_float(boma.object(), ParamType::Agent, "param_special_hi.fall_special_accel_x_mul"); - let speed_x_max_mul = ParamModule::get_float(boma.object(), ParamType::Agent, "param_special_hi.fall_special_speed_x_max_mul"); - WorkModule::set_float(boma, accel_x_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_MUL_FALL_X_ACCEL); - WorkModule::set_float(boma, speed_x_max_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_FALL_SPECIAL, true); - } - else { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_HI_FLAG_FALL_TYPE_CHECK); - } - } -} - -unsafe extern "C" fn effect_specialairhiturn(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 7.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 8, 5, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); - } - } -} - -unsafe extern "C" fn game_specialairhifall(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 2.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 70, 100, 0, 50, 7.0, 0.0, 12.0, 1.0, Some(0.0), Some(7.0), Some(3.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 3.0); - if is_excute(agent) { - FT_MOTION_RATE(agent, 0.423); - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_HI_FLAG_DISABLE_OPPONENT_PASSIVE); - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 175, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 54, 48, 0, 135, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(3.0), Some(4.5), 1.15, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 14.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 100, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 21.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 80, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 28.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 60, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 36.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 40, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } -} - -unsafe extern "C" fn game_specialhibound(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 0, 0, Hash40::new("top"), 10.8, 361, 72, 0, 89, 8.0, 0.0, 4.0, 8.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.5, 361, 80, 0, 85, 9.0, 0.0, 5.5, 10.5, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 16.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } -} - -unsafe extern "C" fn game_speciallwstart(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.25); - frame(lua_state, 8.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_LW_FLAG_STANCE_START); - } - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.5); - frame(lua_state, 21.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_LW_FLAG_STANCE_END); - } - frame(lua_state, 28.0); - FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 32.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); - } - frame(lua_state, 46.0); - FT_MOTION_RATE(agent, 1.0); -} - -pub fn install(agent: &mut Agent) { - agent.acmd("game_specialn", game_specialn, Priority::Low); - agent.acmd("game_specialairn", game_specialn, Priority::Low); - - agent.acmd("game_specialsstart", game_specialsstart, Priority::Low); - agent.acmd("effect_specialsstart", effect_specialsstart, Priority::Low); - agent.acmd("game_specialairsstart", game_specialairsstart, Priority::Low); - agent.acmd("game_specialsthrow", game_specialsthrow, Priority::Low); - agent.acmd("game_specialairsthrow", game_specialsthrow, Priority::Low); - agent.acmd("effect_specialsthrow", effect_specialsthrow, Priority::Low); - agent.acmd("game_specialslariat", game_specialslariat, Priority::Low); - agent.acmd("game_specialairslariat", game_specialairslariat, Priority::Low); - agent.acmd("game_specialsshoulder", game_specialsshoulder, Priority::Low); - agent.acmd("game_specialairsshoulder", game_specialairsshoulder, Priority::Low); - - agent.acmd("game_specialhistart", game_specialhistart, Priority::Low); - agent.acmd("game_specialairhistart", game_specialairhistart, Priority::Low); - agent.acmd("effect_specialairhistart", effect_specialairhistart, Priority::Low); - agent.acmd("game_specialairhiturn", game_specialairhiturn, Priority::Low); - agent.acmd("effect_specialairhiturn", effect_specialairhiturn, Priority::Low); - agent.acmd("game_specialairhifall", game_specialairhifall, Priority::Low); - agent.acmd("game_specialhibound", game_specialhibound, Priority::Low); - - agent.acmd("game_speciallwstart", game_speciallwstart, Priority::Low); - agent.acmd("game_specialairlwstart", game_speciallwstart, Priority::Low); -} \ No newline at end of file diff --git a/fighters/gaogaen/src/acmd/specials/mod.rs b/fighters/gaogaen/src/acmd/specials/mod.rs new file mode 100644 index 0000000000..f6f3a64c27 --- /dev/null +++ b/fighters/gaogaen/src/acmd/specials/mod.rs @@ -0,0 +1,13 @@ +use super::*; + +mod special_hi; +mod special_lw; +mod special_n; +mod special_s; + +pub fn install(agent: &mut Agent) { + special_hi::install(agent); + special_lw::install(agent); + special_n::install(agent); + special_s::install(agent); +} \ No newline at end of file diff --git a/fighters/gaogaen/src/acmd/specials/special_hi.rs b/fighters/gaogaen/src/acmd/specials/special_hi.rs new file mode 100644 index 0000000000..7e957e3d77 --- /dev/null +++ b/fighters/gaogaen/src/acmd/specials/special_hi.rs @@ -0,0 +1,279 @@ +use super::*; + +unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + VarModule::on_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END); + } + frame(lua_state, 4.0); + if is_excute(agent) { + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); + } + frame(lua_state, 6.0); + if is_excute(agent) { + SA_SET(agent, *SITUATION_KIND_AIR); + } + frame(lua_state, 7.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 9.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); + } + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 81, 1, 0, 82, 7.0, 0.0, 9.0, 2.0, None, None, None, 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 87, 1, 0, 81, 7.0, 0.0, 9.0, 2.0, Some(0.0), Some(9.0), Some(6.0), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 80, 1, 0, 80, 4.5, 0.0, 11.5, 2.0, Some(0.0), Some(11.5), Some(3.5), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 78, 1, 0, 90, 2.5, 0.0, 4.5, 0.0, Some(0.0), Some(4.5), Some(5.5), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 4.0, 90, 1, 0, 91, 7.0, 0.0, 9.0, 2.5, Some(0.0), Some(9.0), Some(6.0), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_force_reaction(boma, 0, true, false); + AttackModule::set_force_reaction(boma, 1, true, false); + AttackModule::set_force_reaction(boma, 2, true, false); + AttackModule::set_force_reaction(boma, 3, true, false); + AttackModule::set_force_reaction(boma, 4, true, false); + } + frame(lua_state, 13.0); + FT_MOTION_RATE(agent, 0.9); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + AttackModule::clear(boma, 2, false); + AttackModule::clear(boma, 3, false); + AttackModule::clear(boma, 4, false); + ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 66, 5, 0, 58, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 66, 5, 0, 58, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 45, 5, 0, 49, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 45, 5, 0, 49, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 16.0); + if is_excute(agent) { + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 30, 5, 0, 34, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 30, 5, 0, 34, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 20.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 5, 5, 0, 30, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 5, 5, 0, 30, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 25.0); + if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { + FT_MOTION_RATE(agent, 1.5); + } + frame(lua_state, 26.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn game_specialairhistart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + VarModule::on_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END); + } + frame(lua_state, 3.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + } + frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 6.0, 4.0); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + SA_SET(agent, *SITUATION_KIND_AIR); + } + frame(lua_state, 7.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 9.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); + } + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 81, 1, 0, 82, 7.0, 0.0, 9.0, 2.0, None, None, None, 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 87, 1, 0, 81, 7.0, 0.0, 9.0, 2.0, Some(0.0), Some(9.0), Some(6.0), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 80, 1, 0, 80, 4.5, 0.0, 11.5, 2.0, Some(0.0), Some(11.5), Some(3.5), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 78, 1, 0, 90, 2.5, 0.0, 4.5, 0.0, Some(0.0), Some(4.5), Some(5.5), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("top"), 4.0, 90, 1, 0, 91, 7.0, 0.0, 9.0, 2.5, Some(0.0), Some(9.0), Some(6.0), 1.4, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 13.0); + if is_excute(agent) { + // HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + // HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + FT_MOTION_RATE(agent, 0.9); + AttackModule::clear(boma, 2, false); + AttackModule::clear(boma, 3, false); + AttackModule::clear(boma, 4, false); + ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 66, 5, 0, 58, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 66, 5, 0, 58, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 45, 5, 0, 49, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 45, 5, 0, 49, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 16.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 30, 5, 0, 34, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 30, 5, 0, 34, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 20.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 5, 5, 0, 30, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 5, 5, 0, 30, 3.0, 1.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.7, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 25.0); + if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { + FT_MOTION_RATE(agent, 1.25); + } + frame(lua_state, 26.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_specialairhistart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("gaogaen_belt_fire2"), Hash40::new("feeler"), 0, 3, 0, 0, 0, 0, 1, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("gaogaen_chop_arc"), Hash40::new("gaogaen_chop_arc"), Hash40::new("trans"), 7, 14.5, -2, -111, -28, 77, 1.2, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("gaogaen_chop_arc"), Hash40::new("gaogaen_chop_arc"), Hash40::new("trans"), 7, 14.5, 0, -48, 23, 71, 1.2, true, *EF_FLIP_YZ); + } + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("gaogaen_chop_line_start"), Hash40::new("trans"), 0, 22, 0, 0, 0, 0, 1, true); + } +} + +unsafe extern "C" fn game_specialairhiturn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + boma.select_cliff_hangdata_from_name("special_hi_rise"); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + frame(lua_state, 1.0); + if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { + FT_MOTION_RATE_RANGE(agent, 1.0, 3.0, 5.0); + } + else { + FT_MOTION_RATE(agent, 1.0); + } + frame(lua_state, 3.0); + if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { + FT_MOTION_RATE_RANGE(agent, 3.0, 6.0, 6.0); + } + else { + FT_MOTION_RATE(agent, 1.0); + } + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + if VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { + VarModule::off_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END); + VarModule::on_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL); + KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + let accel_x_mul = ParamModule::get_float(boma.object(), ParamType::Agent, "param_special_hi.fall_special_accel_x_mul"); + let speed_x_max_mul = ParamModule::get_float(boma.object(), ParamType::Agent, "param_special_hi.fall_special_speed_x_max_mul"); + WorkModule::set_float(boma, accel_x_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_MUL_FALL_X_ACCEL); + WorkModule::set_float(boma, speed_x_max_mul, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); + StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_FALL_SPECIAL, true); + } + else { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_HI_FLAG_FALL_TYPE_CHECK); + } + } +} + +unsafe extern "C" fn effect_specialairhiturn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + if !VarModule::is_flag(boma.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 8, 5, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } + } +} + +unsafe extern "C" fn game_specialairhifall(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 70, 100, 0, 50, 7.0, 0.0, 12.0, 1.0, Some(0.0), Some(7.0), Some(3.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 3.0); + if is_excute(agent) { + FT_MOTION_RATE(agent, 0.423); + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_HI_FLAG_DISABLE_OPPONENT_PASSIVE); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 175, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 54, 48, 0, 135, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(3.0), Some(4.5), 1.15, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 14.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 100, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 21.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 80, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 28.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 60, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 36.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 312, 100, 40, 0, 6.0, 0.0, 8.0, 2.0, Some(0.0), Some(6.0), Some(3.5), 1.15, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + } +} + +unsafe extern "C" fn game_specialhibound(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 361, 77, 0, 80, 8.0, 0.0, 4.0, 8.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.5, 361, 90, 0, 75, 9.0, 0.0, 5.5, 10.5, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_PUNCH); + } + wait(lua_state, 4.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 16.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialhistart", game_specialhistart, Priority::Low); + agent.acmd("game_specialairhistart", game_specialairhistart, Priority::Low); + agent.acmd("effect_specialairhistart", effect_specialairhistart, Priority::Low); + + agent.acmd("game_specialairhiturn", game_specialairhiturn, Priority::Low); + agent.acmd("effect_specialairhiturn", effect_specialairhiturn, Priority::Low); + + agent.acmd("game_specialairhifall", game_specialairhifall, Priority::Low); + + agent.acmd("game_specialhibound", game_specialhibound, Priority::Low); +} \ No newline at end of file diff --git a/fighters/gaogaen/src/acmd/specials/special_lw.rs b/fighters/gaogaen/src/acmd/specials/special_lw.rs new file mode 100644 index 0000000000..6c092febbd --- /dev/null +++ b/fighters/gaogaen/src/acmd/specials/special_lw.rs @@ -0,0 +1,32 @@ +use super::*; + +unsafe extern "C" fn game_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.25); + frame(lua_state, 8.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_LW_FLAG_STANCE_START); + } + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.5); + frame(lua_state, 21.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_LW_FLAG_STANCE_END); + } + frame(lua_state, 28.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 32.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); + } + frame(lua_state, 46.0); + FT_MOTION_RATE(agent, 1.0); +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_speciallwstart", game_speciallwstart, Priority::Low); + agent.acmd("game_specialairlwstart", game_speciallwstart, Priority::Low); +} \ No newline at end of file diff --git a/fighters/gaogaen/src/acmd/specials/special_n.rs b/fighters/gaogaen/src/acmd/specials/special_n.rs new file mode 100644 index 0000000000..5a68ec8a8d --- /dev/null +++ b/fighters/gaogaen/src/acmd/specials/special_n.rs @@ -0,0 +1,166 @@ +use super::*; + +unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + shield!(agent, *MA_MSC_CMD_REFLECTOR, *COLLISION_KIND_REFLECTOR, 0, hash40("top"), 9.0, 0.0, 10.0, 7.0, 0.0, 10.0, -7.0, 0.0, 0.0, 1, false, 0.0, *FIGHTER_REFLECTOR_GROUP_HOMERUNBAT); + ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 45, 45, 0, 85, 5.8, 0.0, 11.0, 4.0, Some(0.0), Some(11.0), Some(8.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 45, 48, 0, 80, 5.4, 0.0, 11.0, -4.0, Some(0.0), Some(11.0), Some(-4.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 45, 48, 0, 80, 4.6, 0.0, 8.0, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { + HIT_NODE(agent, Hash40::new("body"), *HIT_STATUS_INVINCIBLE); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_INVINCIBLE); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_INVINCIBLE); + } + else { + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_INVINCIBLE); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_INVINCIBLE); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_INVINCIBLE); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_INVINCIBLE); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_INVINCIBLE); + } + } + frame(lua_state, 7.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_N_FLAG_START_ROTATION); + } + frame(lua_state, 8.0); + if is_excute(agent) { + HIT_RESET_ALL(agent); + AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 0, 0.1); + AttackModule::set_size(boma, 1, 0.1); + AttackModule::set_size(boma, 2, 0.1); + } + frame(lua_state, 9.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 45, 50, 0, 85, 4.2, 0.0, 11.0, 4.0, Some(0.0), Some(11.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 40, 0, 80, 3.8, 0.0, 11.0, -2.0, Some(0.0), Some(11.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 11.0); + if is_excute(agent) { + AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 0, 0.1); + AttackModule::set_size(boma, 1, 0.1); + AttackModule::set_size(boma, 2, 0.1); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 17.0); + if is_excute(agent) { + AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 0, 0.1); + AttackModule::set_size(boma, 1, 0.1); + AttackModule::set_size(boma, 2, 0.1); + } + frame(lua_state, 23.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 25.0); + if is_excute(agent) { + AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 0, 0.1); + AttackModule::set_size(boma, 1, 0.1); + AttackModule::set_size(boma, 2, 0.1); + } + frame(lua_state, 29.0); + if is_excute(agent) { + shield!(agent, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, 0, *FIGHTER_REFLECTOR_GROUP_HOMERUNBAT); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 31.0); + if is_excute(agent) { + AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 0, 0.1); + AttackModule::set_size(boma, 1, 0.1); + AttackModule::set_size(boma, 2, 0.1); + } + frame(lua_state, 37.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 39.0); + if is_excute(agent) { + AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 0, 0.1); + AttackModule::set_size(boma, 1, 0.1); + AttackModule::set_size(boma, 2, 0.1); + } + frame(lua_state, 42.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 45.0); + if is_excute(agent) { + AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 0, 0.1); + AttackModule::set_size(boma, 1, 0.1); + AttackModule::set_size(boma, 2, 0.1); + } + frame(lua_state, 50.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 52.0); + if is_excute(agent) { + AttackModule::set_target_category(boma, 0, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 1, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_target_category(boma, 2, *COLLISION_CATEGORY_MASK_NO_IF as u32); + AttackModule::set_size(boma, 0, 0.1); + AttackModule::set_size(boma, 1, 0.1); + AttackModule::set_size(boma, 2, 0.1); + } + frame(lua_state, 56.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 45, 50, 0, 85, 4.2, 0.0, 10.0, 4.0, Some(0.0), Some(10.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 45, 40, 0, 80, 3.8, 0.0, 10.0, -2.0, Some(0.0), Some(10.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 45, 40, 0, 80, 4.2, 0.0, 8.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -4, 0.0, 15, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 58.0); + if is_excute(agent) { + HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); + AttackModule::clear_all(boma); + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_N_FLAG_END_ROTATION); + } + frame(lua_state, 85.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_N_FLAG_REQUEST_GRAVITY_DEFAULT); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialn", game_specialn, Priority::Low); + agent.acmd("game_specialairn", game_specialn, Priority::Low); +} \ No newline at end of file diff --git a/fighters/gaogaen/src/acmd/specials/special_s.rs b/fighters/gaogaen/src/acmd/specials/special_s.rs new file mode 100644 index 0000000000..4147ebbc10 --- /dev/null +++ b/fighters/gaogaen/src/acmd/specials/special_s.rs @@ -0,0 +1,278 @@ +use super::*; + +unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.8); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_MOVE_START); + VarModule::off_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB); + VarModule::off_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB); + VarModule::off_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB); + } + frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 12.0); + if is_excute(agent) { + if ControlModule::get_stick_y(boma) < -0.5 { + VarModule::on_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB); + VarModule::on_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB); + } + else if ControlModule::get_stick_y(boma) > 0.5 { + VarModule::on_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB); + VarModule::on_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB); + } + } + frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 2.0); + if is_excute(agent) { + if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { + // Spawn the special windboxes if performing OTG grab + if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { + let offset = if agent.is_situation(*SITUATION_KIND_GROUND) { 4.0 } else { 3.0 }; + ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 70, 100, 1, 0, 4.0, 0.0, offset, 2.0, Some(0.0), Some(offset), Some(5.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, true, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + AttackModule::set_down_only(boma, 0, true); + } + } + } + frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + GrabModule::set_rebound(boma, true); + } + frame(lua_state, 17.0); + FT_MOTION_RATE_RANGE(agent, 17.0, 35.0, 17.0); + if is_excute(agent) { + if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { + // Spawn the air grab/OTG grab box + let (low_offset, size_high, collision_mask) = if agent.is_situation(*SITUATION_KIND_GROUND) + { (4.0, 5.5, *COLLISION_SITUATION_MASK_GA) } else { (3.0, 3.5, *COLLISION_SITUATION_MASK_G) }; + if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, low_offset, 2.0, Some(0.0), Some(low_offset), Some(8.0), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, collision_mask); + } + else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { + CATCH(agent, 0, Hash40::new("top"), size_high, 0.0, 15.0, 0.0, Some(0.0), Some(15.0), Some(6.0), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_A); + } + } + // If the regular grab, then just spawn the grab box + else { + if agent.is_situation(*SITUATION_KIND_GROUND) { + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 2.0, Some(0.0), Some(8.0), Some(8.0), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_GA); + } + else { + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 2.0, Some(0.0), Some(8.0), Some(8.0), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_G); + CATCH(agent, 1, Hash40::new("top"), 2.5, 0.0, 8.0, 2.0, Some(0.0), Some(8.0), Some(9.5), *FIGHTER_STATUS_KIND_SWING_GAOGAEN_CATCHED, *COLLISION_SITUATION_MASK_A); + } + } + } + frame(lua_state, 35.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + if !VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); + } + GrabModule::set_rebound(boma, false); + HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); + } + frame(lua_state, 36.0); + if is_excute(agent) { + if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); + } + } + frame(lua_state, 39.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_MOVE_END); + } + frame(lua_state, 41.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_AIR) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + } + } + frame(lua_state, 44.0); + FT_MOTION_RATE(agent, 0.8); + frame(lua_state, 67.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); + } + frame(lua_state, 74.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialsstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 9, 10, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 12.0); + if is_excute(agent) { + // OTG/Anti-air grab effects + if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { + // OTG grab + if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { + EFFECT_FOLLOW(agent, Hash40::new("gaogaen_belt_fire_appeal"), Hash40::new("feeler"), 0, 3, 0, 0, 0, 0, 0.6, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + // Anti-air grab + else if VarModule::is_flag(boma.object(), vars::gaogaen::instance::SPECIAL_S_HIGH_GRAB) { + EFFECT_FOLLOW(agent, Hash40::new("gaogaen_belt_fire_appeal"), Hash40::new("feeler"), 0, 3, 0, 0, 0, 0, 0.6, true); + LAST_EFFECT_SET_COLOR(agent, 0.25, 0.5, 3.0); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + } + } + frame(lua_state, 16.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 6, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 18.0); + for _ in 0..8{ + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + } + wait(lua_state, 2.0); + } +} + +unsafe extern "C" fn game_specialsthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.75); + frame(lua_state, 6.0); + if is_excute(agent) { + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); + } + frame(lua_state, 20.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 37.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_THROW_ROPE); + } + frame(lua_state, 60.0); + FT_MOTION_RATE(agent, 1); + frame(lua_state, 95.0); +} + +unsafe extern "C" fn effect_specialsthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_catch"), Hash40::new("sys_catch"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.9, true, *EF_FLIP_YZ); + } + frame(lua_state, 31.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -2, 0, 0, 0, 180, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn game_specialslariat(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); + if agent.is_flag(*FIGHTER_GAOGAEN_INSTANCE_WORK_ID_FLAG_IS_REVENGE) + || agent.is_situation(*SITUATION_KIND_AIR) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 145, 474, 0, 20, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + else { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 179, 0, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + AttackModule::set_force_reaction(boma, 0, true, true); + WorkModule::set_float(boma, 9.0, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLOAT_LARIAT_HIT_FRAME); + } + frame(lua_state, 9.0); + if is_excute(agent) { + if agent.is_flag(*FIGHTER_GAOGAEN_INSTANCE_WORK_ID_FLAG_IS_REVENGE) + || agent.is_situation(*SITUATION_KIND_AIR) { + ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 145, 40, 0, 88, 7.0, 0.0, 8.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 50, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + } + else { + ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 105, 34, 0, 88, 7.0, 0.0, 8.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_BODY); + } + } + frame(lua_state, 14.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_DAMAGE_CUT); + } + frame(lua_state, 20.0); + FT_MOTION_RATE_RANGE(agent, 20.0, 50.0, 23.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + REVERSE_LR(agent); + } + frame(lua_state, 50.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_ENABLE_GRAVITY); + } + frame(lua_state, 58.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + } +} + +unsafe extern "C" fn game_specialsshoulder(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 98, 68, 0, 68, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + AttackModule::set_force_reaction(boma, 0, true, true); + } + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.75); + frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 98, 34, 0, 128, 9.0, 0.0, 10.0, -5.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BODY); + } + frame(lua_state, 18.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_DAMAGE_CUT); + } + frame(lua_state, 20.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + REVERSE_LR(agent); + } + frame(lua_state, 42.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_FLAG_ENABLE_GRAVITY); + } + frame(lua_state, 43.0); + if is_excute(agent) { + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + } + frame(lua_state, 52.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_GAOGAEN_STATUS_SPECIAL_S_WORK_ID_FLAG_AIR_CONTROL); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialsstart", game_specialsstart, Priority::Low); + agent.acmd("game_specialairsstart", game_specialsstart, Priority::Low); + agent.acmd("effect_specialsstart", effect_specialsstart, Priority::Low); + agent.acmd("effect_specialairsstart", effect_specialsstart, Priority::Low); + + agent.acmd("game_specialsthrow", game_specialsthrow, Priority::Low); + agent.acmd("game_specialairsthrow", game_specialsthrow, Priority::Low); + agent.acmd("effect_specialsthrow", effect_specialsthrow, Priority::Low); + agent.acmd("effect_specialairsthrow", effect_specialsthrow, Priority::Low); + + agent.acmd("game_specialslariat", game_specialslariat, Priority::Low); + agent.acmd("game_specialairslariat", game_specialslariat, Priority::Low); + + agent.acmd("game_specialsshoulder", game_specialsshoulder, Priority::Low); + agent.acmd("game_specialairsshoulder", game_specialsshoulder, Priority::Low); +} \ No newline at end of file diff --git a/fighters/gaogaen/src/acmd/throws.rs b/fighters/gaogaen/src/acmd/throws.rs index f4bc95ce3b..5030844360 100644 --- a/fighters/gaogaen/src/acmd/throws.rs +++ b/fighters/gaogaen/src/acmd/throws.rs @@ -307,7 +307,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { if !VarModule::is_flag(boma.object(), vars::common::instance::IS_HEAVY_ATTACK) { ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{x: 2.439, y: -6.660, z: -5.0}, false, false); let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::on_flag(opponent_boma.object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); } ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); } diff --git a/fighters/gaogaen/src/acmd/tilts.rs b/fighters/gaogaen/src/acmd/tilts.rs index 297b588089..ce1cb249db 100644 --- a/fighters/gaogaen/src/acmd/tilts.rs +++ b/fighters/gaogaen/src/acmd/tilts.rs @@ -5,9 +5,9 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 12.0, 31, 88, 0, 54, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 11, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 12.0, 31, 88, 0, 54, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 11, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handl"), 14.0, 31, 82, 0, 55, 4.0, 1.8, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 11, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 12.0, 32, 88, 0, 50, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 12.0, 32, 88, 0, 50, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handl"), 14.0, 32, 83, 0, 50, 4.0, 1.8, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 15.0); if is_excute(agent) { @@ -64,8 +64,8 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("head"), 9.0, 86, 55, 0, 90, 4.8, 1.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("bust"), 9.0, 86, 55, 0, 90, 3.6, 1.8, 0.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("head"), 9.0, 86, 68, 0, 75, 4.8, 1.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("bust"), 9.0, 86, 68, 0, 75, 3.6, 1.8, 0.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } frame(lua_state, 8.0); @@ -74,8 +74,8 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("head"), 9.0, 94, 55, 0, 90, 4.8, 1.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("bust"), 9.0, 94, 55, 0, 90, 3.6, 1.8, 0.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("head"), 9.0, 94, 68, 0, 75, 4.8, 1.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("bust"), 9.0, 94, 68, 0, 75, 3.6, 1.8, 0.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } frame(lua_state, 12.0); @@ -104,9 +104,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 89, 42, 0, 90, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 93, 42, 0, 90, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 97, 42, 0, 80, 4.5, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 10.0, 89, 42, 0, 85, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 93, 42, 0, 85, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 10.0, 97, 42, 0, 75, 4.5, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 10.0); diff --git a/fighters/gaogaen/src/lib.rs b/fighters/gaogaen/src/lib.rs index 5eabf0f167..3ece64186e 100644 --- a/fighters/gaogaen/src/lib.rs +++ b/fighters/gaogaen/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/gaogaen/src/opff.rs b/fighters/gaogaen/src/opff.rs index b617b381e0..88c1051b70 100644 --- a/fighters/gaogaen/src/opff.rs +++ b/fighters/gaogaen/src/opff.rs @@ -3,7 +3,7 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -// Handles double jump reset, cancel at the apex, and early activation of the dive +// Handles cancel at the apex unsafe fn cross_chop_techniques(fighter: &mut L2CFighterCommon) { if (fighter.is_motion_one_of(&[Hash40::new("special_hi"), Hash40::new("special_air_hi_start")]) && MotionModule::frame(fighter.module_accessor) > 21.0) || (fighter.is_motion(Hash40::new("special_air_hi_turn"))) { @@ -11,12 +11,6 @@ unsafe fn cross_chop_techniques(fighter: &mut L2CFighterCommon) { VarModule::off_flag(fighter.object(), vars::gaogaen::status::SPECIAL_HI_RISE_END); } } - if fighter.is_status(*FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_FALL) - && StatusModule::is_changing(fighter.module_accessor) { - if fighter.get_num_used_jumps() == fighter.get_jump_count_max() { - WorkModule::set_int(fighter.module_accessor, fighter.get_jump_count_max() - 1, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - } - } } // Incineroar Fthrow Movement @@ -116,7 +110,7 @@ unsafe fn command_grab_joint_rotate(boma: &mut BattleObjectModuleAccessor, rotat } unsafe fn alolan_whip_special_grabs(fighter: &mut L2CFighterCommon) { - if fighter.is_motion(Hash40::new("special_s_start")) { + if fighter.is_motion_one_of(&[Hash40::new("special_s_start"), Hash40::new("special_air_s_start")]) { if VarModule::is_flag(fighter.object(), vars::gaogaen::instance::SPECIAL_S_ALTERNATE_GRAB) { // OTG Grab if VarModule::is_flag(fighter.object(), vars::gaogaen::instance::SPECIAL_S_LOW_GRAB) { @@ -193,24 +187,24 @@ unsafe fn cross_chop_ledgegrab(fighter: &mut L2CFighterCommon) { } unsafe fn jab_tilt_cancels(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if CancelModule::is_enable_cancel(boma) - || boma.is_in_hitlag() { - return; - } - - if StatusModule::status_kind(boma) == *FIGHTER_STATUS_KIND_ATTACK - && fighter.is_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO) { - if boma.is_cat_flag(Cat1::AttackS3) && !boma.is_cat_flag(Cat1::AttackS4) { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_S3,false); - } - if boma.is_cat_flag(Cat1::AttackHi3) && !boma.is_cat_flag(Cat1::AttackHi4) { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_HI3,false); + if fighter.is_status(*FIGHTER_STATUS_KIND_ATTACK) { + if CancelModule::is_enable_cancel(boma) + || boma.is_in_hitlag() { + return; } - if boma.is_cat_flag(Cat1::AttackLw3) && !boma.is_cat_flag(Cat1::AttackLw4) { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_LW3,false); + if fighter.is_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { + if boma.is_cat_flag(Cat1::AttackS3) && !boma.is_cat_flag(Cat1::AttackS4) { + StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_S3, false); + } + if boma.is_cat_flag(Cat1::AttackHi3) && !boma.is_cat_flag(Cat1::AttackHi4) { + StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_HI3, false); + } + if boma.is_cat_flag(Cat1::AttackLw3) && !boma.is_cat_flag(Cat1::AttackLw4) { + StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_LW3, false); + } } } - } unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { diff --git a/fighters/gaogaen/src/status/mod.rs b/fighters/gaogaen/src/status/mod.rs index b380d27d2d..304a5743b9 100644 --- a/fighters/gaogaen/src/status/mod.rs +++ b/fighters/gaogaen/src/status/mod.rs @@ -7,7 +7,26 @@ mod special_n; mod special_hi; mod special_lw; +unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + // Re-enables the ability to use sideB when connecting to ground or cliff + if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) + || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { + VarModule::off_flag(fighter.battle_object, vars::gaogaen::instance::SPECIAL_HI_ENABLE_FREEFALL); + } + + return 0.into(); +} + +unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { + // set the callbacks on fighter init + fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); + + VarModule::off_flag(fighter.battle_object, vars::gaogaen::instance::SPECIAL_HI_ENABLE_FREEFALL); +} + pub fn install(agent: &mut Agent) { + agent.on_start(on_start); + attack_lw4::install(agent); special_n::install(agent); special_hi::install(agent); diff --git a/fighters/gaogaen/src/status/special_hi.rs b/fighters/gaogaen/src/status/special_hi.rs index 67d5975786..89ffb95d1e 100644 --- a/fighters/gaogaen/src/status/special_hi.rs +++ b/fighters/gaogaen/src/status/special_hi.rs @@ -30,6 +30,77 @@ unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } +// unsafe extern "C" fn special_hi_end(fighter: &mut L2CFighterCommon) -> L2CValue { +// special_hi_check_exit(fighter); +// return smashline::original_status(End, fighter, *FIGHTER_STATUS_KIND_SPECIAL_HI)(fighter); +// } + +// unsafe extern "C" fn special_hi_turn_end(fighter: &mut L2CFighterCommon) -> L2CValue { +// special_hi_check_exit(fighter); +// return smashline::original_status(End, fighter, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_TURN)(fighter); +// } + +unsafe extern "C" fn special_hi_fall_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if !VarModule::is_flag(fighter.battle_object, vars::gaogaen::instance::SPECIAL_HI_ENABLE_FREEFALL) { + if fighter.get_num_used_jumps() == fighter.get_jump_count_max() { + // if air jump has been used, restore it and enable exit check logic + WorkModule::set_int(fighter.module_accessor, fighter.get_jump_count_max() - 1, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + VarModule::on_flag(fighter.battle_object, vars::gaogaen::instance::SPECIAL_HI_ENABLE_FREEFALL); + } + } + + return smashline::original_status(Main, fighter, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_FALL)(fighter); +} + +unsafe extern "C" fn special_hi_fall_end(fighter: &mut L2CFighterCommon) -> L2CValue { + special_hi_check_exit(fighter); + return smashline::original_status(End, fighter, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_FALL)(fighter); +} + +unsafe extern "C" fn special_hi_loop_end(fighter: &mut L2CFighterCommon) -> L2CValue { + special_hi_check_exit(fighter); + return smashline::original_status(End, fighter, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_LOOP)(fighter); +} + +unsafe fn special_hi_check_exit(fighter: &mut L2CFighterCommon) { + if !(&[ + *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_TURN, + *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_FALL, + *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_LOOP, + *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_END, + ]).contains(&StatusModule::status_kind_next(fighter.module_accessor)) { + if VarModule::is_flag(fighter.battle_object, vars::gaogaen::instance::SPECIAL_HI_ENABLE_FREEFALL) { + // if the jump has been restored from the dive, take it away again + WorkModule::set_int(fighter.module_accessor, fighter.get_jump_count_max(), *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + } + VarModule::on_flag(fighter.battle_object, vars::gaogaen::instance::SPECIAL_HI_ENABLE_FREEFALL); + } +} + +unsafe extern "C" fn special_hi_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + // if VarModule::is_flag(fighter.battle_object, vars::gaogaen::instance::SPECIAL_HI_ENABLE_FREEFALL) { + // KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_MOTION, fighter.module_accessor); + // KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_GRAVITY, fighter.module_accessor); + // StatusModule::set_status_kind_interrupt(fighter.module_accessor, *FIGHTER_STATUS_KIND_FALL_SPECIAL); + // return 1.into(); + // } + + // prevent future jump restoration this airtime + VarModule::on_flag(fighter.battle_object, vars::gaogaen::instance::SPECIAL_HI_ENABLE_FREEFALL); + + return smashline::original_status(Pre, fighter, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_END)(fighter); +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); + + //agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_end); + //agent.status(End, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_TURN, special_hi_turn_end); + + agent.status(Main, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_FALL, special_hi_fall_main); + agent.status(End, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_FALL, special_hi_fall_end); + + agent.status(End, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_LOOP, special_hi_loop_end); + + agent.status(Pre, *FIGHTER_GAOGAEN_STATUS_KIND_SPECIAL_HI_END, special_hi_end_pre); } \ No newline at end of file diff --git a/fighters/gekkouga/Cargo.toml b/fighters/gekkouga/Cargo.toml index f831b5d463..6c63777ceb 100644 --- a/fighters/gekkouga/Cargo.toml +++ b/fighters/gekkouga/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/gekkouga/src/acmd/aerials.rs b/fighters/gekkouga/src/acmd/aerials.rs index af46c0c02e..ab1f1c8e0b 100644 --- a/fighters/gekkouga/src/acmd/aerials.rs +++ b/fighters/gekkouga/src/acmd/aerials.rs @@ -33,9 +33,9 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 12.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact_air"), Hash40::new("top"), -0.0, 8, 0, 0, 0, 0, 1.57, true); + EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact_air"), Hash40::new("top"), -0.0, 8, 0, 0, 0, 0, 1.2, true); EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), -0.0, 8, 0, 0, 0, 0, 1.0, true); - LAST_EFFECT_SET_RATE(agent, 0.5); + LAST_EFFECT_SET_RATE(agent, 0.72); } } @@ -52,9 +52,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 9.0, 60, 80, 0, 50, 3.5, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 60, 80, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 60, 80, 0, 50, 3.7, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 9.0, 52, 100, 0, 30, 3.5, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 52, 100, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 52, 100, 0, 30, 3.7, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("haver"), 14.0, 45, 103, 0, 30, 4.25, 0.0, -7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 4, 0, Hash40::new("haver"), 14.0, 45, 103, 0, 30, 3.5, 0.0, -11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } @@ -104,14 +104,9 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - // Air-only hitboxes - ATTACK(agent, 0, 0, Hash40::new("footr"), 3.0, 367, 100, 0, 0, 5.5, 0.0, -1.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 35, 100, 100, 0, 4.3, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 3.0, 35, 100, 130, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - // Ground-only hitboxes - ATTACK(agent, 3, 0, Hash40::new("footr"), 3.0, 80, 100, 80, 0, 5.5, 0.0, -1.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneer"), 3.0, 75, 100, 110, 0, 4.3, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("legr"), 3.0, 65, 100, 140, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 2.5, 365, 100, 40, 0, 5.0, 0.0, -1.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.5, 365, 100, 40, 0, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 2.5, 365, 100, 40, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 1.0); if is_excute(agent) { @@ -119,14 +114,9 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - // Air-only hitboxes - ATTACK(agent, 0, 0, Hash40::new("footr"), 2.5, 365, 100, 0, 0, 5.5, 0.0, -1.5, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.5, 40, 100, 105, 0, 4.3, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 2.5, 35, 100, 140, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - // Ground-only hitboxes - ATTACK(agent, 3, 0, Hash40::new("footr"), 2.5, 80, 100, 80, 0, 5.5, 0.0, -1.5, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneer"), 2.5, 75, 100, 100, 0, 4.3, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("legr"), 2.5, 65, 100, 130, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 2.5, 365, 100, 40, 0, 5.0, 0.0, -1.5, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.5, 365, 100, 40, 0, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 2.5, 365, 100, 40, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 1.0); if is_excute(agent) { @@ -134,9 +124,9 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("footr"), 6.0, 55, 90, 0, 60, 5.8, 0.0, -1.5, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 6.0, 55, 90, 0, 60, 5.0, 0.0, -1.5, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 55, 90, 0, 60, 4.5, -1.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 6.0, 55, 90, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 6.0, 55, 90, 0, 60, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 4.0); if is_excute(agent) { @@ -158,11 +148,10 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { //Air-only - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 366, 100, 0, 30, 5.0, 0.0, 24.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 366, 100, 0, 30, 5.0, 0.0, 19.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 365, 64, 0, 30, 5.0, 0.0, 19.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); //Ground-only - ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 365, 100, 0, 30, 5.0, 0.0, 24.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.0, 365, 100, 0, 30, 5.0, 0.0, 19.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 365, 64, 0, 30, 5.0, 0.0, 19.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 366, 64, 0, 30, 5.0, 0.0, 24.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 19.0); if is_excute(agent) { @@ -170,8 +159,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 23.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 75, 140, 0, 40, 6.0, 0.0, 24.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 75, 140, 0, 40, 6.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 72, 140, 0, 18, 6.0, 0.0, 24.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 72, 140, 0, 18, 6.0, 0.0, 18.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 27.0); if is_excute(agent) { @@ -204,9 +193,9 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { SET_SPEED_EX(agent, 0, -5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); /* Ground-only */ - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 270, 95, 0, 21, 4.3, 0.0, 0.1, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 270, 95, 0, 21, 5.2, 0.0, 0.1, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); /* Air-only */ - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 270, 80, 0, 21, 4.3, 0.0, 0.1, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 270, 80, 0, 21, 5.2, 0.0, 0.1, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); /* Item-only */ ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 59, 75, 0, 68, 5.2, 0.0, 0.1, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } diff --git a/fighters/gekkouga/src/acmd/ground.rs b/fighters/gekkouga/src/acmd/ground.rs index af59c074d8..3d07ea7143 100644 --- a/fighters/gekkouga/src/acmd/ground.rs +++ b/fighters/gekkouga/src/acmd/ground.rs @@ -5,14 +5,14 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 60, 30, 0, 30, 2.0, 0.0, 7.3, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 70, 30, 0, 30, 2.0, 0.0, 7.3, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 80, 30, 0, 30, 2.2, 0.0, 7.3, 13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 80, 30, 0, 30, 2.2, 0.0, 7.3, 13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - // Locking hitbox + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 60, 30, 0, 22, 2.0, 0.0, 7.3, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 70, 30, 0, 22, 2.0, 0.0, 7.3, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 80, 30, 0, 22, 2.2, 0.0, 7.3, 13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 2.2, 0.0, 3.5, 7.0, Some(0.0), Some(3.5), Some(13.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); } - wait(lua_state, 1.0); + wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -27,11 +27,12 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 60, 50, 0, 30, 2.5, 0.0, 7.5, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 70, 50, 0, 30, 2.8, 0.0, 7.5, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 90, 50, 0, 30, 3.0, 0.0, 7.5, 16.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - // Locking hitbox + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 60, 40, 0, 22, 2.5, 0.0, 7.5, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 70, 40, 0, 22, 2.8, 0.0, 7.5, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 90, 40, 0, 22, 3.0, 0.0, 7.5, 16.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 3.0, 0.0, 3.5, 8.0, Some(0.0), Some(3.5), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 2.0); if is_excute(agent) { @@ -48,9 +49,43 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 120, 0, 40, 3.0, 0.0, 7.5, 8.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 120, 0, 40, 3.4, 0.0, 7.5, 12.5, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 361, 120, 0, 40, 4.0, 0.0, 7.5, 18.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn game_attack100end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 45, 120, 0, 50, 4.2, 0.0, 7.5, 9.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 45, 120, 0, 50, 4.8, 0.0, 7.5, 13.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 45, 120, 0, 50, 4.8, 0.0, 7.5, 16.5, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + FT_MOTION_RATE(agent, 1.5); + frame(lua_state, 26.0); + FT_MOTION_RATE(agent, 1.15); +} + unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.2); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.75); frame(lua_state, 8.0); @@ -100,6 +135,8 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); agent.acmd("game_attack12", game_attack12, Priority::Low); + agent.acmd("game_attack13", game_attack13, Priority::Low); + agent.acmd("game_attack100end", game_attack100end, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); diff --git a/fighters/gekkouga/src/acmd/other.rs b/fighters/gekkouga/src/acmd/other.rs index 876b138994..955a8720f9 100644 --- a/fighters/gekkouga/src/acmd/other.rs +++ b/fighters/gekkouga/src/acmd/other.rs @@ -104,15 +104,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -122,10 +118,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/gekkouga/src/acmd/throws.rs b/fighters/gekkouga/src/acmd/throws.rs index abf8374abb..43fbf19e79 100644 --- a/fighters/gekkouga/src/acmd/throws.rs +++ b/fighters/gekkouga/src/acmd/throws.rs @@ -4,16 +4,12 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 3.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 9.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.6, 0.0, 6.0, 0.0, Some(0.0), Some(6.0), Some(17.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.6, 0.0, 6.0, 3.6, Some(0.0), Some(6.0), Some(16.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -24,6 +20,15 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_catch(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("gekkouga_catch"), Hash40::new("top"), 0.0, 2.5, 12, 0, 0, 0, 1, true); + } +} + unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -53,7 +58,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.6, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-24.55), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.6, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-22.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -85,6 +90,20 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); } +unsafe extern "C" fn sound_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 11.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_gekkouga_rnd_attack")); + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } +} + unsafe extern "C" fn expression_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -98,6 +117,44 @@ unsafe extern "C" fn expression_throwf(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 88, 106, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 15.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, 10, 13); + } + frame(lua_state, 16.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + +unsafe extern "C" fn sound_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 11.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_gekkouga_rnd_attack")); + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } +} + unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -125,11 +182,17 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); + agent.acmd("effect_catch", effect_catch, Priority::Low); + agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("sound_throwf", sound_throwf, Priority::Low); agent.acmd("expression_throwf", expression_throwf, Priority::Low); + agent.acmd("game_throwhi", game_throwhi, Priority::Low); + agent.acmd("sound_throwhi", sound_throwhi, Priority::Low); + agent.acmd("game_throwlw", game_throwlw, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/gekkouga/src/acmd/tilts.rs b/fighters/gekkouga/src/acmd/tilts.rs index ea7eb8fca9..db5a2126ff 100644 --- a/fighters/gekkouga/src/acmd/tilts.rs +++ b/fighters/gekkouga/src/acmd/tilts.rs @@ -28,7 +28,7 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), 0.0, 8.5, 18.5, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), 0.0, 8.5, 18.5, 0, 0, 0, 0.9, true); FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } } @@ -61,7 +61,7 @@ unsafe extern "C" fn effect_attacks3hi(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), 0.0, 13.5, 15.5, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), 0.0, 13.5, 15.5, 0, 0, 0, 0.9, true); FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } } @@ -95,7 +95,7 @@ unsafe extern "C" fn effect_attacks3lw(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), 0.0, 3.5, 15.5, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), 0.0, 3.5, 15.5, 0, 0, 0, 0.9, true); FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } } @@ -105,12 +105,14 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("s_tongue5"), 7.0, 80, 72, 0, 69, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("s_tongue7"), 7.0, 80, 72, 0, 69, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("s_tongue9"), 7.0, 80, 72, 0, 69, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_HEAD); + HIT_NODE(agent, Hash40::new("s_tongue5"), *HIT_STATUS_NORMAL); + ATTACK(agent, 0, 0, Hash40::new("s_tongue5"), 7.0, 80, 72, 0, 69, 4.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("s_tongue7"), 7.0, 80, 72, 0, 69, 4.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("s_tongue9"), 7.0, 80, 72, 0, 69, 4.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_HEAD); } frame(lua_state, 14.0); if is_excute(agent) { + HIT_NODE(agent, Hash40::new("s_tongue5"), *HIT_STATUS_OFF); AttackModule::clear_all(boma); } } @@ -171,9 +173,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 6.0, 65, 80, 0, 62, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 6.0, 77, 80, 0, 62, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 7.0, 85, 59, 0, 66, 5.0, 6.0, -1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("legl"), 6.0, 65, 92, 0, 52, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 6.0, 75, 92, 0, 52, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 7.0, 85, 66, 0, 60, 4.0, 6.0, -1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_PUNCH); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 5.0); @@ -196,7 +198,7 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), 0.0, 2.0, 15.0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("gekkouga_water_impact"), Hash40::new("top"), 0.0, 2.0, 15.0, 0, 0, 0, 0.7, true); } } diff --git a/fighters/gekkouga/src/lib.rs b/fighters/gekkouga/src/lib.rs index 5916f0f1bf..2acb5a7272 100644 --- a/fighters/gekkouga/src/lib.rs +++ b/fighters/gekkouga/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/gekkouga/src/opff.rs b/fighters/gekkouga/src/opff.rs index c0ba67f656..e25ccaae90 100644 --- a/fighters/gekkouga/src/opff.rs +++ b/fighters/gekkouga/src/opff.rs @@ -3,43 +3,10 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -unsafe fn max_water_shuriken_dc(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat1: i32, frame: f32) { - if status_kind == *FIGHTER_GEKKOUGA_STATUS_KIND_SPECIAL_N_MAX_SHOT { - if frame > 12.0 { - boma.check_dash_cancel(); - } - } -} - -// Greninja Shadow Sneak Smash Attack Cancel -// unsafe fn shadow_sneak_smash_attack_cancel(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat1: i32, frame: f32) { -// if status_kind == *FIGHTER_GEKKOUGA_STATUS_KIND_SPECIAL_S_ATTACK { -// if boma.status_frame() < 6 { -// if situation_kind == *SITUATION_KIND_GROUND { -// if boma.is_cat_flag(Cat1::AttackS4) { -// StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_S4_START, false); -// } -// if boma.is_cat_flag(Cat1::AttackHi4) { -// StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_HI4_START, false); -// } -// if boma.is_cat_flag(Cat1::AttackLw4) { -// StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_LW4_START, false); -// } -// } -// } -// } -// } - -// Dair Jump Cancel -unsafe fn dair_jc(boma: &mut BattleObjectModuleAccessor, situation_kind: i32, cat1: i32, motion_kind: u64, frame: f32) { - if motion_kind == hash40("attack_air_lw") { - if !boma.is_in_hitlag() { - if frame > 31.0 { - if situation_kind == *SITUATION_KIND_AIR { - boma.check_jump_cancel(false, false); - } - } - } +unsafe fn max_water_shuriken_dc(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_GEKKOUGA_STATUS_KIND_SPECIAL_N_MAX_SHOT) + && fighter.status_frame() > 12 { + fighter.check_dash_cancel(); } } @@ -91,64 +58,38 @@ pub unsafe fn substitute_teleport_check(fighter: &mut L2CFighterCommon) { let doll_pos = *GroundModule::get_rhombus(doll_module_accessor, true).add(1); let doll_pos_x = doll_pos.x; let doll_pos_y = doll_pos.y; - //println!("Greninja Pos: {}, {}", pos_x, pos_y); - //println!("Doll Pos: {}, {}", doll_pos_x, doll_pos_y); + let doll_top_pos = *GroundModule::get_rhombus(doll_module_accessor, true); + let doll_top_pos_x = doll_top_pos.x; + let doll_top_pos_y = doll_top_pos.y; let mut angle = (doll_pos_y - pos_y).atan2(doll_pos_x - pos_x).to_degrees(); - // println!("angle: {}", angle); let distance = sv_math::vec2_distance(pos_x, pos_y, doll_pos_x, doll_pos_y); - // println!("distance: {}", distance); let can_teleport = distance <= 80.0; VarModule::set_flag(fighter.battle_object, vars::gekkouga::instance::SPECIAL_LW_CAN_TELEPORT, can_teleport); - if distance >= 20.0 { - let mut eff_handle = VarModule::get_int(fighter.battle_object, vars::gekkouga::instance::SPECIAL_LW_MARKER_EFF_HANDLE) as u32; - let guide_pos = teleport_guide_pos(fighter, angle.into()); - if !EffectModule::is_exist_effect(fighter.module_accessor, eff_handle) { - eff_handle = EffectModule::req( - fighter.module_accessor, - Hash40::new("sys_direction2"), - &Vector3f{x: guide_pos.x, y: guide_pos.y, z: 0.0}, - &Vector3f{x: 0.0, y: 0.0, z: 0.0}, - 1.0, - 0, - -1, - false, - 0 - ) as u32; - VarModule::set_int(fighter.battle_object, vars::gekkouga::instance::SPECIAL_LW_MARKER_EFF_HANDLE, eff_handle as i32); - } - else { - EffectModule::set_pos(fighter.module_accessor, eff_handle, &Vector3f{x: guide_pos.x, y: guide_pos.y, z: 0.0}); - } - EffectModule::set_rot(fighter.module_accessor, eff_handle, &Vector3f{x: 0.0, y: 0.0, z: angle - 90.0}); - - if can_teleport { - let team_color = FighterUtil::get_team_color(fighter.module_accessor); - let effect_team_color = FighterUtil::get_effect_team_color(EColorKind(team_color as i32), Hash40::new("direction_effect_color")); - let mut r = effect_team_color.x(); - let mut g = effect_team_color.y(); - let mut b = effect_team_color.z(); - if !WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_LW) - || WorkModule::is_flag(fighter.module_accessor, *FIGHTER_GEKKOUGA_INSTANCE_WORK_ID_FLAG_SPECIAL_LW_SAVE_SPEED) { - r += 0.22; - g += 0.22; - b += 0.22; - } - EffectModule::set_rgb(fighter.module_accessor, eff_handle, r, g, b); - } - else { - EffectModule::set_rgb(fighter.module_accessor, eff_handle, 0.7, 0.7, 0.7); - } + let mut eff_handle = VarModule::get_int(fighter.battle_object, vars::gekkouga::instance::SPECIAL_LW_MARKER_EFF_HANDLE) as u32; + if !EffectModule::is_exist_effect(fighter.module_accessor, eff_handle) { + eff_handle = EffectModule::req( + fighter.module_accessor, + Hash40::new("sys_direction"), + &Vector3f{x: doll_top_pos_x, y: doll_top_pos_y + 5.0, z: 0.0}, + &Vector3f::new(135.0, 0.0, 0.0), + 0.7, + 0, + -1, + false, + 0 + ) as u32; + VarModule::set_int(fighter.battle_object, vars::gekkouga::instance::SPECIAL_LW_MARKER_EFF_HANDLE, eff_handle as i32); } else { - let eff_handle = VarModule::get_int(fighter.battle_object, vars::gekkouga::instance::SPECIAL_LW_MARKER_EFF_HANDLE) as u32; - if EffectModule::is_exist_effect(fighter.module_accessor, eff_handle) { - EffectModule::kill(fighter.module_accessor, eff_handle, true, true); - VarModule::set_int(fighter.battle_object, vars::gekkouga::instance::SPECIAL_LW_MARKER_EFF_HANDLE, 0); - } + EffectModule::set_pos(fighter.module_accessor, eff_handle, &Vector3f{x: doll_top_pos_x, y: doll_top_pos_y + 5.0, z: 0.0}); } + let team_color = FighterUtil::get_team_color(fighter.module_accessor); + let mut effect_team_color = FighterUtil::get_effect_team_color(EColorKind(team_color as i32), Hash40::new("direction_effect_color")); + let color_add = if can_teleport { 0.0 } else { 0.22 }; + EffectModule::set_rgb(fighter.module_accessor, eff_handle, effect_team_color.x() + color_add, effect_team_color.y() + color_add, effect_team_color.z() + color_add); } else { let eff_handle = VarModule::get_int(fighter.battle_object, vars::gekkouga::instance::SPECIAL_LW_MARKER_EFF_HANDLE) as u32; @@ -160,10 +101,8 @@ pub unsafe fn substitute_teleport_check(fighter: &mut L2CFighterCommon) { } } -pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { - max_water_shuriken_dc(boma, status_kind, situation_kind, cat[0], frame); - // shadow_sneak_smash_attack_cancel(boma, status_kind, situation_kind, cat[0], frame); - //dair_jc(boma, situation_kind, cat[0], motion_kind, frame); +pub unsafe fn moveset(fighter: &mut L2CFighterCommon) { + max_water_shuriken_dc(fighter); fastfall_specials(fighter); substitute_teleport_check(fighter); } @@ -177,7 +116,7 @@ pub extern "C" fn gekkouga_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighte pub unsafe fn gekkouga_frame(fighter: &mut smash::lua2cpp::L2CFighterCommon) { if let Some(info) = FrameInfo::update_and_get(fighter) { - moveset(fighter, &mut *info.boma, info.id, info.cat, info.status_kind, info.situation_kind, info.motion_kind.hash, info.stick_x, info.stick_y, info.facing, info.frame); + moveset(fighter); } } diff --git a/fighters/iceclimber/Cargo.toml b/fighters/iceclimber/Cargo.toml index ac409e4cf8..18f5564291 100644 --- a/fighters/iceclimber/Cargo.toml +++ b/fighters/iceclimber/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/iceclimber/src/acmd/ground.rs b/fighters/iceclimber/src/acmd/ground.rs index 3519f00aa6..e07cbf381d 100644 --- a/fighters/iceclimber/src/acmd/ground.rs +++ b/fighters/iceclimber/src/acmd/ground.rs @@ -9,30 +9,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 45, 100, 0, 0, 3.0, 0.0, 5.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 45, 100, 0, 0, 3.5, 0.0, 5.0, 12.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 45, 100, 0, 0, 3.5, 0.0, 5.0, 12.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 3.5, 3.0, 4.0, 6.0, Some(-3.0), Some(4.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); - } - wait(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 10.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } -} - -unsafe extern "C" fn game_attack11_nana(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 4.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 45, 100, 0, 0, 2.5, 3.0, 5.0, 7.0, Some(-3.0), Some(5.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 45, 100, 0, 0, 3.0, 3.0, 5.0, 10.0, Some(-3.0), Some(5.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 45, 100, 0, 0, 3.5, 3.0, 5.0, 13.0, Some(-3.0), Some(5.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 45, 100, 0, 0, 3.5, 3.0, 5.0, 13.0, Some(-3.0), Some(5.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); - // Locking hitbox - ATTACK(agent, 4, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 3.5, 0.0, 4.0, 6.0, Some(0.0), Some(4.0), Some(12.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HAMMER); + AttackModule::set_down_only(boma, 4, true); } wait(lua_state, 2.0); if is_excute(agent) { @@ -64,7 +43,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); - agent.acmd("game_attack11_nana", game_attack11_nana, Priority::Low); + agent.acmd("game_attack11_nana", game_attack11, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); agent.acmd("game_attackdash_nana", game_attackdash, Priority::Low); diff --git a/fighters/iceclimber/src/acmd/other.rs b/fighters/iceclimber/src/acmd/other.rs index 95969aa0e5..b1136dfbac 100644 --- a/fighters/iceclimber/src/acmd/other.rs +++ b/fighters/iceclimber/src/acmd/other.rs @@ -119,15 +119,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -137,10 +133,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { diff --git a/fighters/iceclimber/src/acmd/throws.rs b/fighters/iceclimber/src/acmd/throws.rs index 118f0494fa..37a23aeca8 100644 --- a/fighters/iceclimber/src/acmd/throws.rs +++ b/fighters/iceclimber/src/acmd/throws.rs @@ -5,11 +5,11 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 6.0); if is_excute(agent) { CATCH(agent, 0, Hash40::new("top"), 3.75, 0.0, 5.75, 3.5, Some(0.0), Some(5.75), Some(6.75), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); @@ -90,7 +90,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.75, 0.0, 5.0, -5.0, Some(0.0), Some(5.0), Some(-13.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.75, 0.0, 5.0, -6.0, Some(0.0), Some(5.0), Some(-13.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -150,23 +150,19 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 80, 120, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 72, 120, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - // scale attack startup based on opponent weight - let weight = WorkModule::get_param_float(boma.get_grabbed_opponent_boma(), hash40("weight"), 0); - FT_MOTION_RATE(agent, ((weight/100.00) * 32.0) / 36.0); } frame(lua_state, 36.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.0); CHECK_FINISH_CAMERA(agent, 10, 4); - // FighterCutInManager::set_throw_finish_zoom_rate(boma, 1.5); - // FighterCutInManager::set_throw_finish_offset(boma, 0, 0, 0); } frame(lua_state, 37.0); + FT_MOTION_RATE(agent, 17.0/(49.0 - 37.0)); if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{ x: 0.0, y: 4.0, z: 15.0 }, false, false); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); - FT_MOTION_RATE(agent, 17.0/(49.0 - 37.0)); } } @@ -238,7 +234,7 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 45, 60, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 42, 60, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 24.0); @@ -246,11 +242,10 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 60, 0, 50, 5.0, 0.0, 6.5, 10.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HAMMER); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 16, 9); - // FighterCutInManager::set_throw_finish_zoom_rate(boma, 1.5); - // FighterCutInManager::set_throw_finish_offset(boma, 0, 0, 0); } frame(lua_state, 25.0); if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{ x: 0.0, y: 10.0, z: 20.0 }, false, false); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); } @@ -307,26 +302,23 @@ unsafe extern "C" fn expression_throwf_nana(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + FT_MOTION_RATE(agent, 28.0/20.0); if is_excute(agent) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 88, 26, 0, 120, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - FT_MOTION_RATE(agent, 28.0/20.0); } frame(lua_state, 20.0); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.0); - } + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 25.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("havel"), 3.0, 70, 60, 0, 75, 5.0, 0.0, 6.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HAMMER); ATTACK(agent, 1, 0, Hash40::new("havel"), 3.0, 70, 60, 0, 75, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HAMMER); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 2, 19); - // FighterCutInManager::set_throw_finish_zoom_rate(boma, 1.5); - // FighterCutInManager::set_throw_finish_offset(boma, 0, 0, 0); } frame(lua_state, 27.0); if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{ x: 0.0, y: 19.0, z: 0.0 }, false, false); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); } @@ -402,11 +394,10 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { frame(lua_state, 17.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 18, 10); - // FighterCutInManager::set_throw_finish_zoom_rate(boma, 1.5); - // FighterCutInManager::set_throw_finish_offset(boma, 0, 0, 0); } frame(lua_state, 18.0); if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f{ x: 0.0, y: 4.0, z: -24.0 }, false, false); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); } } diff --git a/fighters/iceclimber/src/lib.rs b/fighters/iceclimber/src/lib.rs index 690fa5c04e..f731c96c30 100644 --- a/fighters/iceclimber/src/lib.rs +++ b/fighters/iceclimber/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/iceclimber/src/status/mod.rs b/fighters/iceclimber/src/status/mod.rs index c5ad651a6f..a116f1cd45 100644 --- a/fighters/iceclimber/src/status/mod.rs +++ b/fighters/iceclimber/src/status/mod.rs @@ -37,39 +37,39 @@ unsafe extern "C" fn special_hi_fail_pre(fighter: &mut L2CFighterCommon) -> L2CV return 0.into(); } -pub unsafe extern "C" fn throw_nana(fighter: &mut L2CFighterCommon) -> L2CValue { - let is_near_cliff = GroundModule::is_near_cliff(fighter.boma(), 30.0, 30.0); - let pos = *PostureModule::pos(fighter.module_accessor); - let is_under_platform = GroundModule::ray_check( - fighter.module_accessor, - &Vector2f{ x: pos.x, y: pos.y + 38.0}, - &Vector2f{ x: 0.0, y: -26.0}, - true - ) == 1; - let motion = if is_near_cliff { - // TODO: this check assumes that the direction of ledge is always outwards, - // and that the mathematical origin is contained within the stage. - // It will fail if grabbing from a platform that's past ledge, - // or if grabbing on a stage that has been shifted far horizontally in lvd. - if PostureModule::lr(fighter.boma()) == GroundModule::get_center_pos(fighter.boma()).signum() { - Hash40::new("throw_f") - } else { - Hash40::new("throw_b") - } - } else if is_under_platform { - Hash40::new("throw_hi") - } else { - let selected = app::sv_math::rand(hash40("fighter"), 100); - match selected { - 0..=49 => Hash40::new("throw_f"), +pub fn install_popo(agent: &mut Agent) { + agent.status(Exit, *FIGHTER_POPO_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_exit); +} + +/// NANA + +unsafe extern "C" fn select_throw_motion(fighter: &mut L2CFighterCommon) -> Hash40 { + let (mag, rad ) = fighter.stick_polar(); + + // if not holding the stick, it's random + if mag.abs() == 0.0 { + let rand = app::sv_math::rand(hash40("fighter"), 4); + return match rand { + 0 => Hash40::new("throw_f"), + 1 => Hash40::new("throw_b"), + 2 => Hash40::new("throw_hi"), _ => Hash40::new("throw_lw") } - }; + } - // change into the selected motion - MotionModule::change_motion(fighter.boma(), motion, 0.0, 1.0, false, 0.0, false, false); + // else, use the stick position + let lr = PostureModule::lr(fighter.boma()); + return match rad { + r if r.sin() > r.cos().abs() => Hash40::new("throw_hi"), + r if r.sin() < -r.cos().abs() => Hash40::new("throw_lw"), + r if r.cos() * lr > 0.0 => Hash40::new("throw_f"), + _ => Hash40::new("throw_b"), + } +} - // shift into the L2CFighterCommon's throw impl (instead of nana's default, modified impl) +pub unsafe extern "C" fn throw_nana(fighter: &mut L2CFighterCommon) -> L2CValue { + let motion = select_throw_motion(fighter); + MotionModule::change_motion(fighter.boma(), motion, 0.0, 1.0, false, 0.0, false, false); fighter.sub_shift_status_main(L2CValue::Ptr(L2CFighterCommon_status_Throw_Main as *const () as _)) } @@ -88,6 +88,21 @@ unsafe extern "C" fn nana_catch_wait_main_loop(fighter: &mut L2CFighterCommon) - return true.into(); } +unsafe extern "C" fn nana_catch_attack_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::set_status_kind_interrupt(fighter.module_accessor, *FIGHTER_STATUS_KIND_THROW); + return true.into(); +} + +unsafe extern "C" fn nana_catch_attack_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_shift_status_main(L2CValue::Ptr(nana_catch_wait_main_loop as *const () as _)) +} + +unsafe extern "C" fn nana_catch_attack_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + MotionModule::set_frame(fighter.module_accessor, MotionModule::end_frame(fighter.module_accessor), true); + fighter.change_status(FIGHTER_STATUS_KIND_THROW.into(), false.into()); + return true.into(); +} + unsafe extern "C" fn popo_status_kind_throw_nana_pre(fighter: &mut L2CFighterCommon) -> L2CValue { MotionModule::set_frame(fighter.module_accessor, MotionModule::end_frame(fighter.module_accessor), true); StatusModule::set_status_kind_interrupt(fighter.module_accessor, *FIGHTER_STATUS_KIND_WAIT); @@ -104,16 +119,14 @@ unsafe extern "C" fn popo_status_kind_throw_nana_main_loop(fighter: &mut L2CFigh return true.into(); } -pub fn install_popo(agent: &mut Agent) { - agent.status(Exit, *FIGHTER_POPO_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_exit); -} - pub fn install_nana(agent: &mut Agent) { agent.status(Exit, *FIGHTER_POPO_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_exit); agent.status(Pre, *FIGHTER_POPO_STATUS_KIND_SPECIAL_HI_FAIL, special_hi_fail_pre); agent.status(Main, *FIGHTER_STATUS_KIND_THROW, throw_nana); agent.status(Pre, *FIGHTER_STATUS_KIND_CATCH_WAIT, nana_catch_wait_pre); agent.status(Main, *FIGHTER_STATUS_KIND_CATCH_WAIT, nana_catch_wait_main); + agent.status(Pre, *FIGHTER_STATUS_KIND_CATCH_ATTACK, nana_catch_attack_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_CATCH_ATTACK, nana_catch_attack_main); agent.status(Pre, *FIGHTER_POPO_STATUS_KIND_THROW_NANA, popo_status_kind_throw_nana_pre); agent.status(Main, *FIGHTER_POPO_STATUS_KIND_THROW_NANA, popo_status_kind_throw_nana_main); } \ No newline at end of file diff --git a/fighters/ike/Cargo.toml b/fighters/ike/Cargo.toml index cf1feef3f1..52e971573b 100644 --- a/fighters/ike/Cargo.toml +++ b/fighters/ike/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/ike/src/acmd/aerials.rs b/fighters/ike/src/acmd/aerials.rs index 8ff6c96f40..a0ce4d7105 100644 --- a/fighters/ike/src/acmd/aerials.rs +++ b/fighters/ike/src/acmd/aerials.rs @@ -81,11 +81,11 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 9.5); FT_MOTION_RATE(agent, 3.0/(13.2-9.5)); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("claviclec"), 14.0, 361, 105, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 14.0, 361, 105, 0, 25, 2.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 15.0, 361, 105, 0, 25, 3.8, 0.0, 2.5, -1.8, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword"), 14.0, 361, 105, 0, 25, 3.8, 0.0, 7.0, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword"), 10.0, 35, 105, 0, 20, 3.8, 0.0, 11.5, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("claviclec"), 14.0, 361, 105, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 14.0, 361, 105, 0, 25, 2.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 15.0, 361, 105, 0, 25, 3.8, 0.0, 2.5, -1.8, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword"), 14.0, 361, 105, 0, 25, 3.8, 0.0, 7.0, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword"), 10.0, 35, 105, 0, 20, 3.8, 0.0, 11.5, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); } frame(lua_state, 13.3); FT_MOTION_RATE(agent, 1.0/(14.0-13.2)); @@ -151,10 +151,10 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 2.0/(10.0-7.1)); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("claviclec"), 15.0, 361, 100, 0, 30, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 15.0, 361, 100, 0, 30, 2.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 17.0, 361, 100, 0, 30, 3.8, 0.0, 2.5, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword"), 15.0, 361, 100, 0, 30, 3.8, 0.0, 7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword"), 12.0, 35, 100, 0, 30, 3.8, 0.0, 11.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 15.0, 361, 100, 0, 30, 2.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 17.0, 361, 100, 0, 30, 3.8, 0.0, 2.5, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword"), 15.0, 361, 100, 0, 30, 3.8, 0.0, 7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword"), 12.0, 35, 100, 0, 30, 3.8, 0.0, 11.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); } frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0/(11.0-10.0)); @@ -197,11 +197,11 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("claviclec"), 14.0, 70, 100, 0, 45, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 14.0, 70, 100, 0, 45, 2.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 16.0, 70, 100, 0, 45, 3.8, 0.0, 2.5, -1.8, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword"), 14.0, 70, 100, 0, 45, 3.8, 0.0, 7.0, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword"), 12.0, 60, 100, 0, 45, 3.8, 0.0, 11.5, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("claviclec"), 14.0, 70, 94, 0, 45, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 14.0, 70, 94, 0, 45, 2.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 16.0, 70, 94, 0, 45, 3.8, 0.0, 2.5, -1.8, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword"), 14.0, 70, 94, 0, 45, 3.8, 0.0, 7.0, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword"), 12.0, 55, 85, 0, 38, 3.8, 0.0, 11.5, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); } frame(lua_state, 20.0); FT_MOTION_RATE_RANGE(agent, 20.0, 37.0, 14.0); diff --git a/fighters/ike/src/acmd/ground.rs b/fighters/ike/src/acmd/ground.rs index 719561a6de..46eaf41257 100644 --- a/fighters/ike/src/acmd/ground.rs +++ b/fighters/ike/src/acmd/ground.rs @@ -82,19 +82,19 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.1); frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("claviclec"), 12.0, 361, 75, 0, 50, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 12.0, 361, 75, 0, 50, 2.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 14.0, 361, 75, 0, 50, 3.8, 0.0, 2.5, -1.8 ,None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword"), 12.0, 361, 75, 0, 50, 3.8, 0.0, 7.0, -1.8 ,None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword"), 10.0, 35, 75, 0, 50, 3.8, 0.0, 11.5, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("claviclec"), 12.0, 30, 75, 0, 50, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 12.0, 30, 75, 0, 50, 2.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 14.0, 30, 75, 0, 50, 3.8, 0.0, 2.5, -1.8 ,None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword"), 12.0, 30, 75, 0, 50, 3.8, 0.0, 7.0, -1.8 ,None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword"), 10.0, 35, 75, 0, 50, 3.8, 0.0, 11.5, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); } frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("claviclec"), 9.0, 361, 75, 0, 30, 2.2, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 361, 75, 0, 30, 2.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 10.0, 361, 75, 0, 30, 3.5, 0.0, 2.5, -1.5, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword"), 9.0, 361, 75, 0, 30, 3.5, 0.0, 7.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword"), 7.0, 35, 75, 0, 30, 3.5, 0.0, 11.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("claviclec"), 9.0, 30, 75, 0, 30, 2.2, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 30, 75, 0, 30, 2.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 10.0, 30, 75, 0, 30, 3.5, 0.0, 2.5, -1.5, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword"), 9.0, 30, 75, 0, 30, 3.5, 0.0, 7.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword"), 7.0, 35, 75, 0, 30, 3.5, 0.0, 11.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_IKE, *ATTACK_REGION_SWORD); } frame(lua_state, 23.0); if is_excute(agent) { diff --git a/fighters/ike/src/acmd/other.rs b/fighters/ike/src/acmd/other.rs index 3c2396eaf5..ee02f17a4d 100644 --- a/fighters/ike/src/acmd/other.rs +++ b/fighters/ike/src/acmd/other.rs @@ -165,15 +165,11 @@ unsafe extern "C" fn game_appeallw(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -183,10 +179,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/ike/src/acmd/specials.rs b/fighters/ike/src/acmd/specials.rs index a52f11447e..7ba343e74b 100644 --- a/fighters/ike/src/acmd/specials.rs +++ b/fighters/ike/src/acmd/specials.rs @@ -105,10 +105,10 @@ unsafe extern "C" fn sound_specialsdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let rng = app::sv_math::rand(smash::hash40("fighter"), 2); - let sound = if rng == 0 { "vc_ike_special_s01" } else { "vc_ike_attack05" }; + let sound = if rng == 0 { "vc_ike_special_s01" } else { "vc_ike_special_s02" }; if is_excute(agent) { if VarModule::is_flag(boma.object(), vars::ike::status::SPECIAL_S_INSTAKILL){ - PLAY_SE(agent, Hash40::new("vc_ike_appeal02")); + PLAY_SE(agent, Hash40::new("vc_ike_special_s03")); } else{ PLAY_SE(agent, Hash40::new(sound)); @@ -407,8 +407,8 @@ unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { frame(lua_state, 30.0); FT_MOTION_RATE(agent, 6.0 / 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 1.0, 367, 100, 50, 0, 4.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 6, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 1.0, 367, 100, 50, 0, 4.0, 0.0, 10.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 6, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 1.0, 367, 100, 60, 0, 4.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 6, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 1.0, 367, 100, 60, 0, 4.0, 0.0, 10.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 6, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } frame(lua_state, 41.0); if is_excute(agent) { diff --git a/fighters/ike/src/acmd/throws.rs b/fighters/ike/src/acmd/throws.rs index af2c2307f9..c9bf2b366a 100644 --- a/fighters/ike/src/acmd/throws.rs +++ b/fighters/ike/src/acmd/throws.rs @@ -5,14 +5,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 5.0/(7.0-1.0)); - frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(11.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 5.1, Some(0.0), Some(8.0), Some(11.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +32,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(10.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 4.1, Some(0.0), Some(8.0), Some(10.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +52,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-13.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, -4.1, Some(0.0), Some(8.0), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -70,25 +70,30 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 55, 105, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 2.5); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, -2.0, 7.0), false, false); + } + frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, -3.0, 7.0), false, false); + } + frame(lua_state, 4.0); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, -3.0, 7.0), false, false); + } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("footr"), 3.0, 361, 150, 0, 30, 5.0, 1.0, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 361, 150, 0, 30, 4.0, 1.1, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 3.0, 361, 150, 0, 30, 5.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 361, 150, 0, 30, 4.0, 1.1, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 26, 16); //FighterCutInManager::set_throw_finish_zoom_rate(boma, 1.2); } frame(lua_state, 6.0); - if is_excute(agent) { - let release_position = Vector3f{ x:0.0, y: 4.5, z: 17.0 }; - ModelModule::set_joint_translate(boma, Hash40::new("throw"), &release_position, false, false); - } - frame(lua_state, 7.0); - if is_excute(agent) { - let release_position = Vector3f{ x:0.0, y: 4.5, z: 17.0 }; - ModelModule::set_joint_translate(boma, Hash40::new("throw"), &release_position, false, false); - } - frame(lua_state, 8.0); if is_excute(agent) { let release_position = Vector3f{ x:0.0, y: 4.5, z: 17.0 }; ModelModule::set_joint_translate(boma, Hash40::new("throw"), &release_position, false, false); diff --git a/fighters/ike/src/acmd/tilts.rs b/fighters/ike/src/acmd/tilts.rs index 3204db8369..c01fcce1d9 100644 --- a/fighters/ike/src/acmd/tilts.rs +++ b/fighters/ike/src/acmd/tilts.rs @@ -99,12 +99,17 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 10.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_ike_sword_hdr"), Hash40::new("tex_ike_sword2"), 6, Hash40::new("sword"), 0, 1, 0, Hash40::new("sword"), 0, 16.2, 0, true, Hash40::new("ike_sword"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + EFFECT_FOLLOW(agent, Hash40::new("ike_sword"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_ike_sword_hdr"), Hash40::new("tex_ike_sword2"), 6, Hash40::new("sword"), 0, 1, 0, Hash40::new("sword"), 0, 16.2, 0, true, Hash40::new("null"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); } frame(lua_state, 18.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 5); } + frame(lua_state, 24.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("ike_sword"), true, true); + } frame(lua_state, 29.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); diff --git a/fighters/ike/src/lib.rs b/fighters/ike/src/lib.rs index 3e13e442e5..e7f84c3983 100644 --- a/fighters/ike/src/lib.rs +++ b/fighters/ike/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/ike/src/status/special_s.rs b/fighters/ike/src/status/special_s.rs index d9bedb7b4f..c329bb5c1d 100644 --- a/fighters/ike/src/status/special_s.rs +++ b/fighters/ike/src/status/special_s.rs @@ -147,7 +147,7 @@ unsafe extern "C" fn ike_special_s_dash_main_loop(fighter: &mut L2CFighterCommon if !VarModule::is_flag(fighter.battle_object, vars::ike::status::SPECIAL_S_INSTAKILL) && (fighter.is_situation(*SITUATION_KIND_GROUND) || VarModule::is_flag(fighter.battle_object, vars::ike::status::SPECIAL_S_GROUND_START)) { VarModule::set_float(fighter.battle_object, vars::common::instance::JUMP_SPEED_MAX_MUL, 1.346); // 1.75 max jump speed out of Quick Draw - fighter.check_jump_cancel(true, false); + fighter.check_jump_cancel(true, false, true); } // attack cancel diff --git a/fighters/ike/src/sword/acmd.rs b/fighters/ike/src/sword/acmd.rs index 8682cf00b6..57f8067279 100644 --- a/fighters/ike/src/sword/acmd.rs +++ b/fighters/ike/src/sword/acmd.rs @@ -30,6 +30,30 @@ unsafe extern "C" fn effect_appeallw(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + // frame(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("haver"), 2.0, 90, 100, 90, 0, 5.0, 0.0, 4.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_PART, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 2.0, 90, 100, 90, 0, 5.0, 0.0, 10.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_PART, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + frame(lua_state, 22.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + ATTACK(agent, 0, 0, Hash40::new("haver"), 1.0, 90, 100, 40, 0, 5.0, 0.0, 7.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_PART, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 1.0, 90, 100, 40, 0, 5.0, 0.0, 7.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_PART, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + frame(lua_state, 23.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 25.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *WEAPON_IKE_SWORD_STATUS_SPECIAL_HI_WORK_ID_FLAG_HAVE); + } +} + unsafe extern "C" fn effect_specialhi2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -38,13 +62,21 @@ unsafe extern "C" fn effect_specialhi2(agent: &mut L2CAgentBase) { } frame(lua_state, 1.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_ike_quickdraw"), Hash40::new("tex_ike_sword2"), 5, Hash40::new("haver"), 0.0, 1.0, 0.0, Hash40::new("haver"), 0.0, 16.2, 0.0, true, Hash40::new("ike_sword"), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + EFFECT_FOLLOW(agent, Hash40::new("ike_tenku_sword"), Hash40::new("haver"), 0, 6.2, 0, 0, 0, 0, 1, true); } -} + frame(lua_state, 26.0); + EFFECT_OFF_KIND(agent, Hash40::new("ike_tenku_sword"), true, true); + frame(lua_state, 26.0); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_ike_quickdraw"), Hash40::new("tex_ike_sword2"), 5, Hash40::new("haver"), 0.0, 1.0, 0.0, Hash40::new("haver"), 0.0, 16.2, 0.0, true, Hash40::new("ike_sword"), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); +} pub fn install(agent: &mut Agent) { agent.acmd("game_appeallw", game_appeallw, Priority::Low); agent.acmd("effect_appeallw", effect_appeallw, Priority::Low); + + agent.acmd("game_specialhi2", game_specialhi2, Priority::Low); agent.acmd("effect_specialhi2", effect_specialhi2, Priority::Low); + + agent.acmd("game_specialairhi2", game_specialhi2, Priority::Low); agent.acmd("effect_specialairhi2", effect_specialhi2, Priority::Low); } \ No newline at end of file diff --git a/fighters/ike/src/sword/mod.rs b/fighters/ike/src/sword/mod.rs index 60629a8fdf..dfdb4e4f6c 100644 --- a/fighters/ike/src/sword/mod.rs +++ b/fighters/ike/src/sword/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod status; pub fn install() { let agent = &mut Agent::new("ike_sword"); acmd::install(agent); + status::install(agent); agent.install(); } diff --git a/fighters/ike/src/sword/status.rs b/fighters/ike/src/sword/status.rs new file mode 100644 index 0000000000..3f4b805a83 --- /dev/null +++ b/fighters/ike/src/sword/status.rs @@ -0,0 +1,29 @@ +use super::*; + +unsafe extern "C" fn special_hi_2_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { + // let correct = if PostureModule::scale(weapon.module_accessor) > 1.0 { + // *GROUND_CORRECT_KIND_NONE + // } + // else { + // *GROUND_CORRECT_KIND_AIR + // }; + StatusModule::init_settings( + weapon.module_accessor, + SituationKind(*SITUATION_KIND_NONE), + *WEAPON_KINETIC_TYPE_IKE_SWORD_SPECIAL_HI, + // correct as u32, + *GROUND_CORRECT_KIND_NONE as u32, + GroundCliffCheckKind(0), + false, + *WEAPON_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *WEAPON_STATUS_WORK_KEEP_FLAG_ALL_INT, + *WEAPON_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *WEAPON_IKE_SWORD_STATUS_KIND_SPECIAL_HI_2, special_hi_2_pre); +} \ No newline at end of file diff --git a/fighters/inkling/Cargo.toml b/fighters/inkling/Cargo.toml index 1b15f889fb..6ce106bfa8 100644 --- a/fighters/inkling/Cargo.toml +++ b/fighters/inkling/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/inkling/src/acmd/aerials.rs b/fighters/inkling/src/acmd/aerials.rs index eb6f75dc5c..6997aaa932 100644 --- a/fighters/inkling/src/acmd/aerials.rs +++ b/fighters/inkling/src/acmd/aerials.rs @@ -192,10 +192,10 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 12.0, 270, 55, 0, 30, 3.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 270, 55, 0, 30, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 270, 55, 0, 30, 4.5, 0.0, 1.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - for i in 2..=5 { - AttackModule::set_ink_value(boma, i, 75.0); - AttackModule::set_optional_hit_sound(boma, i, Hash40::new("se_common_water_hit_l")); - } + AttackModule::set_ink_value(boma, 1, 75.0); + AttackModule::set_ink_value(boma, 2, 75.0); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_water_hit_l")); + AttackModule::set_optional_hit_sound(boma, 2, Hash40::new("se_common_water_hit_l")); } frame(lua_state, 18.0); FT_MOTION_RATE(agent, 1.2); @@ -203,6 +203,10 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 9.0, 65, 100, 0, 10, 3.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 65, 100, 0, 10, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 65, 100, 0, 10, 4.5, 0.0, 0.5, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + AttackModule::set_ink_value(boma, 1, 25.0); + AttackModule::set_ink_value(boma, 2, 25.0); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_water_hit_m")); + AttackModule::set_optional_hit_sound(boma, 2, Hash40::new("se_common_water_hit_m")); } frame(lua_state, 24.0); FT_MOTION_RATE(agent, 1.0); @@ -215,6 +219,29 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handr"), 6.5, 0, -2, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("inkling_attack_arc"), Hash40::new("top"), 0, 6, 0, 91, -6, -48, 0.95, true); + } + if is_excute(agent) { + LAST_PARTICLE_SET_COLOR(agent, WorkModule::get_float(boma, *FIGHTER_INKLING_INSTANCE_WORK_ID_FLOAT_INK_R), WorkModule::get_float(boma, *FIGHTER_INKLING_INSTANCE_WORK_ID_FLOAT_INK_G), WorkModule::get_float(boma, *FIGHTER_INKLING_INSTANCE_WORK_ID_FLOAT_INK_B)); + } + if is_excute(agent) { + LAST_EFFECT_SET_RATE(agent, 2); + } + frame(lua_state, 16.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, -3, 1.5, 0, 0, 0, 1.45, true); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); @@ -227,4 +254,5 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_attackairhi", expression_attackairhi, Priority::Low); agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); + agent.acmd("effect_attackairlw", effect_attackairlw, Priority::Low); } \ No newline at end of file diff --git a/fighters/inkling/src/acmd/ground.rs b/fighters/inkling/src/acmd/ground.rs index 1edac547db..6d2509535e 100644 --- a/fighters/inkling/src/acmd/ground.rs +++ b/fighters/inkling/src/acmd/ground.rs @@ -5,14 +5,17 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 2.5, 81, 100, 22, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 81, 100, 22, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 2.5, 81, 100, 22, 0, 3.25, 4.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.5, 361, 20, 0, 15, 2.5, 0.0, 3.0, 12.0, Some(0.0), Some(3.0), Some(3.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 2.5, 81, 100, 22, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 2.5, 81, 100, 22, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 2.5, 81, 100, 22, 0, 3.25, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 2.5, 361, 20, 0, 15, 2.5, 0.0, 3.0, 12.0, Some(0.0), Some(3.0), Some(3.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 8.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } @@ -22,21 +25,21 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 2.5, 80, 100, 25, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.5, 80, 100, 25, 0, 3.25, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footr"), 2.5, 80, 100, 25, 0, 3.75, 1.0, -2.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.5, 80, 100, 25, 0, 2.5, 0.0, 3.0, 13.0, Some(0.0), Some(3.0), Some(3.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("legr"), 2.5, 80, 100, 25, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.5, 80, 100, 25, 0, 3.25, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 2.5, 80, 100, 25, 0, 3.75, 1.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 2.5, 80, 100, 25, 0, 2.5, 0.0, 3.0, 13.0, Some(0.0), Some(3.0), Some(3.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 5.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 8.0); + frame(lua_state, 10.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } - frame(lua_state, 11.0); + frame(lua_state, 13.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } @@ -47,9 +50,9 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 4.0, 50, 90, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 4.0, 50, 90, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footl"), 4.0, 50, 90, 0, 40, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 4.0, 50, 90, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 4.0, 50, 90, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 4.0, 50, 90, 0, 40, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 7.0); if is_excute(agent) { diff --git a/fighters/inkling/src/acmd/other.rs b/fighters/inkling/src/acmd/other.rs index 4b98ae92ad..869a0a1660 100644 --- a/fighters/inkling/src/acmd/other.rs +++ b/fighters/inkling/src/acmd/other.rs @@ -51,7 +51,6 @@ unsafe extern "C" fn sound_dash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_INKLING_INSTANCE_WORK_ID_FLAG_NO_FLIP_SQUID); } @@ -94,10 +93,7 @@ unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { if is_excute(agent) { ArticleModule::set_visibility_whole(boma, *FIGHTER_INKLING_GENERATE_ARTICLE_SQUID, false, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -141,10 +137,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { VisibilityModule::set_whole(boma, true); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + frame(lua_state, 43.0); if is_excute(agent) { ArticleModule::set_visibility_whole(boma, *FIGHTER_INKLING_GENERATE_ARTICLE_SQUID, false, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); diff --git a/fighters/inkling/src/acmd/throws.rs b/fighters/inkling/src/acmd/throws.rs index 9b53acc03e..ab7e151eb6 100644 --- a/fighters/inkling/src/acmd/throws.rs +++ b/fighters/inkling/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 5.0, Some(0.0), Some(6.6), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -109,7 +109,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-14.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -5.5, Some(0.0), Some(6.6), Some(-14.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -176,6 +176,10 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 45, 97, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 2.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); if is_excute(agent) { ArticleModule::set_visibility_whole(boma, *FIGHTER_INKLING_GENERATE_ARTICLE_SQUID, true, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); diff --git a/fighters/inkling/src/lib.rs b/fighters/inkling/src/lib.rs index e67bb0c354..3d053bc989 100644 --- a/fighters/inkling/src/lib.rs +++ b/fighters/inkling/src/lib.rs @@ -38,6 +38,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/inkling/src/opff.rs b/fighters/inkling/src/opff.rs index 71df3ff684..284202843a 100644 --- a/fighters/inkling/src/opff.rs +++ b/fighters/inkling/src/opff.rs @@ -33,8 +33,7 @@ unsafe fn splatter_vfx(boma: &mut BattleObjectModuleAccessor) { } else if boma.is_motion(Hash40::new("attack_air_lw")) { if AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT) - && boma.motion_frame() < 17.0 - && (2..=5).contains(&VarModule::get_int(boma.object(), vars::common::instance::LAST_ATTACK_HITBOX_ID)) { + && (1..=2).contains(&VarModule::get_int(boma.object(), vars::common::instance::LAST_ATTACK_HITBOX_ID)) { let pos = Vector3f{ x: 0.0, y: -6.5, z: 0.0 }; let rot = Vector3f{ x: 0.0, y: 90.0, z: 0.0 }; let handle = EffectModule::req_on_joint(boma, Hash40::new("inkling_blaster_muzzle"), Hash40::new("top"), &pos, &rot, 1.0, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0) as u32; @@ -51,7 +50,7 @@ unsafe fn roller_jump_cancel(boma: &mut BattleObjectModuleAccessor) { if boma.is_status(*FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_END) && boma.is_situation(*SITUATION_KIND_GROUND) && boma.status_frame() > 10 { - boma.check_jump_cancel(true, false); + boma.check_jump_cancel(true, false, true); } if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_S) && boma.is_situation(*SITUATION_KIND_AIR) diff --git a/fighters/inkling/src/roller/acmd.rs b/fighters/inkling/src/roller/acmd.rs index deba22b53b..00bf854281 100644 --- a/fighters/inkling/src/roller/acmd.rs +++ b/fighters/inkling/src/roller/acmd.rs @@ -4,8 +4,8 @@ unsafe extern "C" fn game_specialswalk(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 4.0, 60, 80, 0, 60, 3.6, 0.5, 3.8, 0.0, Some(0.5), Some(3.8), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("neck"), 4.0, 60, 80, 0, 60, 3.6, 0.5, 3.8, 0.0, Some(0.5), Some(3.8), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("neck"), 4.0, 60, 80, 0, 60, 3.6, 0.5, 3.8, 0.0, Some(0.5), Some(3.8), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("neck"), 4.0, 60, 80, 0, 60, 3.6, 0.5, 3.8, 0.0, Some(0.5), Some(3.8), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); AttackModule::set_ink_value(boma, 0, 60.0); AttackModule::set_ink_value(boma, 1, 60.0); } @@ -15,8 +15,8 @@ unsafe extern "C" fn game_specialswalknoink(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 2.0, 50, 50, 0, 50, 3.0, 0.5, 3.8, 0.0, Some(0.5), Some(3.8), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("neck"), 2.0, 50, 50, 0, 50, 3.8, 0.5, 3.8, 0.0, Some(0.5), Some(3.8), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("neck"), 2.0, 50, 50, 0, 50, 3.0, 0.5, 3.8, 0.0, Some(0.5), Some(3.8), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("neck"), 2.0, 50, 50, 0, 50, 3.8, 0.5, 3.8, 0.0, Some(0.5), Some(3.8), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } } @@ -25,15 +25,15 @@ unsafe extern "C" fn game_specialsdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 8.0, 60, 90, 0, 25, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bury"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("neck"), 8.0, 80, 80, 0, 95, 3.0, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("neck"), 8.0, 60, 90, 0, 25, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bury"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("neck"), 8.0, 80, 80, 0, 95, 3.0, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); AttackModule::set_ink_value(boma, 0, 120.0); AttackModule::set_ink_value(boma, 1, 120.0); } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 8.0, 80, 80, 0, 95, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("neck"), 8.0, 80, 80, 0, 95, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("neck"), 8.0, 80, 80, 0, 95, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("neck"), 8.0, 80, 80, 0, 95, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); AttackModule::set_ink_value(boma, 0, 100.0); AttackModule::set_ink_value(boma, 1, 100.0); } @@ -44,8 +44,8 @@ unsafe extern "C" fn game_specialairsdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 8.0, 75, 60, 0, 100, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("neck"), 8.0, 75, 60, 0, 100, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("neck"), 8.0, 75, 60, 0, 100, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("neck"), 8.0, 75, 60, 0, 100, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); AttackModule::set_ink_value(boma, 0, 100.0); AttackModule::set_ink_value(boma, 1, 100.0); } @@ -56,8 +56,8 @@ unsafe extern "C" fn game_specialsdashnoink(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 5.0, 50, 80, 0, 60, 3.0, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("neck"), 5.0, 50, 80, 0, 60, 3.0, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("neck"), 5.0, 50, 80, 0, 60, 3.0, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("neck"), 5.0, 50, 80, 0, 60, 3.0, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } } @@ -65,8 +65,8 @@ unsafe extern "C" fn game_specialsrun(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 11.0, 75, 80, 0, 90, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("neck"), 11.0, 75, 80, 0, 90, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("neck"), 11.0, 75, 80, 0, 90, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("neck"), 11.0, 75, 80, 0, 90, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); AttackModule::set_ink_value(boma, 0, 100.0); AttackModule::set_ink_value(boma, 1, 100.0); } @@ -76,8 +76,8 @@ unsafe extern "C" fn game_specialsrunnoink(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 8.0, 50, 80, 0, 60, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("neck"), 8.0, 50, 80, 0, 60, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("neck"), 8.0, 50, 80, 0, 60, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("neck"), 8.0, 50, 80, 0, 60, 3.6, 0.5, 3.8, 5.0, Some(0.5), Some(3.8), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 40, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_ink_hit"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } } diff --git a/fighters/inkling/src/squid/acmd.rs b/fighters/inkling/src/squid/acmd.rs index ca22febf25..d2e787e3ae 100644 --- a/fighters/inkling/src/squid/acmd.rs +++ b/fighters/inkling/src/squid/acmd.rs @@ -27,6 +27,17 @@ unsafe extern "C" fn effect_specialhilanding(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 1.0); +} + pub fn install(agent: &mut Agent) { agent.acmd("effect_specialhilanding", effect_specialhilanding, Priority::Low); + + agent.acmd("game_throwb", game_throwb, Priority::Low); } \ No newline at end of file diff --git a/fighters/inkling/src/status/special_s.rs b/fighters/inkling/src/status/special_s.rs index be2fcd4d44..4f38f2db83 100644 --- a/fighters/inkling/src/status/special_s.rs +++ b/fighters/inkling/src/status/special_s.rs @@ -1,6 +1,22 @@ use super::*; use globals::*; +// FIGHTER_STATUS_KIND_SPECIAL_S + +unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_S)(fighter); + + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + return ret; + } + + // Gives Inkling a slight hop on sideB start + let speed_y = 0.75; + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, speed_y, 0.0, 0.0, 0.0); + + ret +} + // FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_WALK pub unsafe extern "C" fn special_s_walk_main(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -8,7 +24,30 @@ pub unsafe extern "C" fn special_s_walk_main(fighter: &mut L2CFighterCommon) -> if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { VarModule::on_flag(fighter.battle_object, vars::inkling::instance::DISABLE_SPECIAL_S); } - smashline::original_status(Main, fighter, *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_WALK)(fighter) + + smashline::original_status(Main, fighter, *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_WALK)(fighter); + + fighter.sub_shift_status_main(L2CValue::Ptr(special_s_walk_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_s_walk_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + let current_frame = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INKLING_STATUS_SPECIAL_S_WORK_INT_ALL_FRAME); + let enable_finish_frame = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INKLING_STATUS_SPECIAL_S_WORK_INT_ENABLE_FINISH_FRAME); + + if current_frame >= enable_finish_frame + && (fighter.is_cat_flag(Cat2::CommonGuard) + || fighter.is_cat_flag(Cat1::AttackN) + || fighter.is_cat_flag(Cat1::SpecialAny)) { + fighter.change_status(FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + return 0.into(); + } + + if let Some(target) = smashline::api::get_target_function("lua2cpp_inkling.nrs", 0x28790) { + let og_special_s_walk_main_loop: fn(&mut L2CFighterCommon) -> L2CValue = std::mem::transmute(target); + return og_special_s_walk_main_loop(fighter); + } + + 0.into() } // FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_RUN @@ -18,7 +57,30 @@ pub unsafe extern "C" fn special_s_run_main(fighter: &mut L2CFighterCommon) -> L if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { VarModule::on_flag(fighter.battle_object, vars::inkling::instance::DISABLE_SPECIAL_S); } - smashline::original_status(Main, fighter, *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_RUN)(fighter) + + smashline::original_status(Main, fighter, *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_RUN)(fighter); + + fighter.sub_shift_status_main(L2CValue::Ptr(special_s_run_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_s_run_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + let current_frame = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INKLING_STATUS_SPECIAL_S_WORK_INT_ALL_FRAME); + let enable_finish_frame = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INKLING_STATUS_SPECIAL_S_WORK_INT_ENABLE_FINISH_FRAME); + + if current_frame >= enable_finish_frame + && (fighter.is_cat_flag(Cat2::CommonGuard) + || fighter.is_cat_flag(Cat1::AttackN) + || fighter.is_cat_flag(Cat1::SpecialAny)) { + fighter.change_status(FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + return 0.into(); + } + + if let Some(target) = smashline::api::get_target_function("lua2cpp_inkling.nrs", 0x24250) { + let og_special_s_run_main_loop: fn(&mut L2CFighterCommon) -> L2CValue = std::mem::transmute(target); + return og_special_s_run_main_loop(fighter); + } + + 0.into() } // special_s_jump_end_init @@ -33,6 +95,7 @@ pub unsafe extern "C" fn special_s_jump_end_init(fighter: &mut L2CFighterCommon) } pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); agent.status(Main, *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_WALK, special_s_walk_main); agent.status(Main, *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_RUN, special_s_run_main); agent.status(Init, *FIGHTER_INKLING_STATUS_KIND_SPECIAL_S_JUMP_END, special_s_jump_end_init); diff --git a/fighters/jack/Cargo.toml b/fighters/jack/Cargo.toml index aa97025249..356b357800 100644 --- a/fighters/jack/Cargo.toml +++ b/fighters/jack/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/jack/src/acmd/aerials.rs b/fighters/jack/src/acmd/aerials.rs index af729880d7..b458e4e390 100644 --- a/fighters/jack/src/acmd/aerials.rs +++ b/fighters/jack/src/acmd/aerials.rs @@ -4,7 +4,7 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 8.0/(10.0-1.0)); + FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 8.0); frame(lua_state, 5.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); @@ -13,33 +13,34 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 52, 87, 0, 47, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 9.0, 52, 87, 0, 47, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 52, 87, 0, 47, 3.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 9.0, 52, 87, 0, 47, 3.0, -1.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("knife"), 9.0, 52, 87, 0, 47, 4.0, 0.0, 2.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { ATTACK(agent, 3, 1, Hash40::new("throw"), 3.0, 52, 139, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); } } - frame(lua_state, 21.0); + frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 361, 76, 0, 31, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 7.0, 361, 76, 0, 31, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("knife"), 7.0, 361, 76, 0, 31, 3.5, 0.0, 2.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 3, 1, Hash40::new("throw"), 2.0, 361, 139, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 47, 80, 0, 31, 3.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 7.0, 47, 80, 0, 31, 3.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("knife"), 7.0, 47, 80, 0, 31, 3.5, 0.0, 2.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + ATTACK(agent, 3, 1, Hash40::new("throw"), 2.0, 47, 139, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } } - frame(lua_state, 28.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 21.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + FT_MOTION_RATE_RANGE(agent, 21.0, 51.0, 23.0); } else { - FT_MOTION_RATE(agent, 15.0/(51.0-28.0)); + FT_MOTION_RATE_RANGE(agent, 21.0, 51.0, 18.0); } if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 52.0); + frame(lua_state, 51.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -56,7 +57,7 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { EFFECT_FOLLOW(agent, Hash40::new("jack_doyle_attack_arc3"), Hash40::new("top"), 0, 9, 0, 0, 180, -90, 0.7, true); } } @@ -65,13 +66,35 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { EFFECT_FOLLOW(agent, Hash40::new("jack_knife_front"), Hash40::new("knife"), 0, 0, 0, 0, 0, 0, 1, true); LAST_EFFECT_SET_RATE(agent, 0.4); } - frame(lua_state, 25.0); + frame(lua_state, 16.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("jack_knife_front"), true, true); + EFFECT_OFF_KIND(agent, Hash40::new("jack_knife_front"), false, false); } - frame(lua_state, 30.0); + frame(lua_state, 21.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 0); + AFTER_IMAGE_OFF(agent, 3); + EFFECT_OFF_KIND(agent, Hash40::new("jack_doyle_attack_arc3"), true, true); + } +} + +unsafe extern "C" fn sound_attackairn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 10.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_jack_attackair_n01")); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + PLAY_SE(agent, Hash40::new("se_jack_attackair_n01_doyle")); + } + } + frame(lua_state, 11.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_jack_rnd_attack_s")); + } + frame(lua_state, 21.0); + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_jack_attackair_n01")); + STOP_SE(agent, Hash40::new("se_jack_attackair_n01_doyle")); } } @@ -94,11 +117,16 @@ unsafe extern "C" fn expression_attackairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_landingairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_n"), 0); - let landing_frame_arsene = landing_frame_joker + 3.0; - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_n"), 0); + let landing_frame_add = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_doyle.landing_attack_air_n_add"); + let landing_frame_arsene = landing_frame_joker + landing_frame_add; FT_MOTION_RATE(agent, landing_frame_arsene/landing_frame_joker); } + frame(lua_state, 3.0); + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_jack_attackair_n01")); + } } unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { @@ -109,9 +137,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 5.0/(9.0-7.0)); + FT_MOTION_RATE_RANGE(agent, 7.0, 9.0, 5.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { // Air-only ATTACK(agent, 0, 0, Hash40::new("hip"), 4.0, 366, 100, 48, 0, 3.5, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("legr"), 4.0, 366, 100, 48, 0, 3.5, 3.2, 0.0, 0.0, Some(3.2), Some(-0.5), Some(1.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); @@ -121,7 +149,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { ATTACK(agent, 4, 0, Hash40::new("legr"), 4.0, 82, 35, 0, 35, 3.5, 3.2, 0.0, 0.0, Some(3.2), Some(-0.5), Some(1.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 5, 0, Hash40::new("kneer"), 4.0, 80, 35, 0, 35, 4.0, 4.2, -0.7, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - else{ + else { // Air-only ATTACK(agent, 0, 0, Hash40::new("hip"), 4.0, 366, 100, 48, 0, 3.5, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("legr"), 4.0, 366, 100, 48, 0, 3.5, 3.2, 0.0, 0.0, Some(3.2), Some(-0.5), Some(1.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); @@ -139,21 +167,21 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 361, 110, 0, 58, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("legl"), 9.0, 361, 110, 0, 58, 3.5, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 361, 110, 0, 58, 4.0, 4.4, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 110, 0, 58, 3.5, 0.0, 17.0, 0.0, Some(0.0), Some(16.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); } - else{ + else { ATTACK(agent, 0, 0, Hash40::new("hip"), 6.0, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("legl"), 6.0, 361, 125, 0, 40, 3.5, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("kneel"), 6.0, 361, 125, 0, 40, 4.0, 4.4, -0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } } frame(lua_state, 17.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - FT_MOTION_RATE(agent, 27.0/(39.0-17.0)); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + FT_MOTION_RATE_RANGE(agent, 17.0, 39.0, 27.0); } if is_excute(agent) { AttackModule::clear_all(boma); @@ -162,12 +190,6 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 31.0); - if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - } - } frame(lua_state, 39.0); FT_MOTION_RATE(agent, 1.0); } @@ -175,9 +197,10 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_landingairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_f"), 0); - let landing_frame_arsene = landing_frame_joker + 5.0; - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_f"), 0); + let landing_frame_add = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_doyle.landing_attack_air_f_add"); + let landing_frame_arsene = landing_frame_joker + landing_frame_add; FT_MOTION_RATE(agent, landing_frame_arsene/landing_frame_joker); } } @@ -190,46 +213,34 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 6.0); - FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 4.0, 0.0, 10.5, -12.5, Some(0.0), Some(15.0), Some(-12.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 4.0, 0.0, 7.5, -10.0, Some(0.0), Some(5.5), Some(-8.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 4.0, 0.0, 7.5, -10.0, Some(0.0), Some(5.5), Some(-8.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("shoulderr"), 14.0, 45, 87, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("armr"), 14.0, 45, 87, 0, 58, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 4.0, 0.0, 10.5, -12.5, Some(0.0), Some(15.0), Some(-12.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 6, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 4.0, 0.0, 16.5, -12.0, Some(0.0), Some(20.5), Some(-9.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 45, 82, 0, 58, 4.5, 0.0, 10.5, -13.0, Some(0.0), Some(15.0), Some(-13.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 45, 82, 0, 58, 4.5, 0.0, 8.0, -10.5, Some(0.0), Some(5.0), Some(-8.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 15.0, 45, 82, 0, 58, 4.5, 0.0, 17.0, -12.5, Some(0.0), Some(21.0), Some(-8.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); } - else{ - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 11.0, 45, 90, 0, 50, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 11.0, 45, 90, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("knife"), 11.0, 43, 90, 0, 50, 4.0, 0.0, 2.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + else { + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 9.0, 46, 90, 0, 50, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 46, 90, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("knife"), 9.0, 46, 90, 0, 50, 4.0, 0.0, 2.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } frame(lua_state, 8.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 5.0, 0.0, 10.5, -12.5, Some(0.0), Some(15.0), Some(-12.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 5.0, 0.0, 7.5, -10.0, Some(0.0), Some(5.5), Some(-8.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 5.0, 0.0, 7.5, -10.0, Some(0.0), Some(5.5), Some(-8.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 5.0, 0.0, 10.5, -12.5, Some(0.0), Some(15.0), Some(-12.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 6, 0, Hash40::new("top"), 14.0, 45, 87, 0, 58, 5.0, 0.0, 16.5, -12.0, Some(0.0), Some(20.5), Some(-9.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 11.0, 43, 95, 0, 50, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 11.0, 43, 95, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("knife"), 11.0, 43, 95, 0, 50, 3.5, 0.0, 3.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 29.0/(32.0-9.0)); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { AttackModule::clear_all(boma); } - else{ - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 11.0, 43, 95, 0, 50, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 11.0, 43, 95, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("knife"), 11.0, 43, 95, 0, 50, 3.0, 0.0, 3.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } } - frame(lua_state, 10.0); + frame(lua_state, 12.0); + FT_MOTION_RATE_RANGE(agent, 12.0, 32.0, 25.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -237,6 +248,8 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 32.0); + FT_MOTION_RATE(agent, 1.0); } @@ -248,28 +261,24 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_jack_sword1"), Hash40::new("tex_jack_sword2"), 4, Hash40::new("knife"), 0.0, 0.25, 0.15, Hash40::new("knife"), 0.0, 5.8, 0.0, true, Hash40::new("jack_knife"), Hash40::new("knife"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); } frame(lua_state, 6.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("jack_smash_arc"), Hash40::new("top"), -7, 13, -2.5, 0, 130, 115, 0.8, true); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("jack_knife_front"), Hash40::new("knife"), 0, 0, 0, 0, 180, 0, 1, true); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { + EFFECT_FOLLOW(agent, Hash40::new("jack_smash_arc"), Hash40::new("top"), -7, 13, -0.5, 0, 130, 115, 0.8, true); LAST_EFFECT_SET_RATE(agent, 1.6); } else { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("jack_smash_arc"), Hash40::new("top"), 7, 13, -2.5, 0, 130, 65, 0.8, true); - LAST_EFFECT_SET_RATE(agent, 1.6); - } + EFFECT_FOLLOW(agent, Hash40::new("jack_smash_arc"), Hash40::new("top"), 7, 13, -0.5, 0, 130, 65, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 1.6); } } } - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("jack_knife_front"), Hash40::new("knife"), 0, 0, 0, 0, 180, 0, 1, true); - } - frame(lua_state, 7.0); + frame(lua_state, 8.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("jack_knife_front"), true, true); } - frame(lua_state, 11.0); + frame(lua_state, 12.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 0); } @@ -294,12 +303,11 @@ unsafe extern "C" fn expression_attackairb(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_landingairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_b"), 0); - let landing_frame_arsene = landing_frame_joker + 5.0; - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ - FT_MOTION_RATE(agent, landing_frame_arsene/landing_frame_joker); - } + let landing_frame_add = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_doyle.landing_attack_air_b_add"); + let landing_frame_arsene = landing_frame_joker + landing_frame_add; + FT_MOTION_RATE(agent, landing_frame_arsene/landing_frame_joker); } } @@ -309,14 +317,14 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - //Air only - ATTACK(agent, 0, 0, Hash40::new("kneer"), 1.5, 367, 87, 0, 44, 4.0, 4.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 1.5, 367, 87, 0, 44, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 1.5, 367, 87, 0, 44, 4.0, 1.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - //Ground only - ATTACK(agent, 3, 0, Hash40::new("kneer"), 1.5, 367, 30, 0, 33, 4.0, 4.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneer"), 1.5, 367, 30, 0, 33, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("legr"), 1.5, 367, 30, 0, 33, 4.0, 1.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + // Ground only + ATTACK(agent, 0, 0, Hash40::new("kneer"), 1.5, 80, 30, 0, 33, 4.0, 4.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 1.5, 80, 30, 0, 33, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 1.5, 80, 30, 0, 33, 4.0, 1.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + // Air only + ATTACK(agent, 3, 0, Hash40::new("kneer"), 1.5, 366, 87, 0, 44, 4.0, 4.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("kneer"), 1.5, 366, 87, 0, 44, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("legr"), 1.5, 366, 87, 0, 44, 4.0, 1.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 19.0); if is_excute(agent) { @@ -324,21 +332,20 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 20.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 10.0, 80, 106, 0, 50, 5.0, 4.5, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 80, 106, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 10.0, 80, 106, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 80, 106, 0, 50, 5.0, 0.0, 20.0, 1.5, Some(0.0), Some(24.0), Some(0.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + ATTACK(agent, 0, 0, Hash40::new("kneer"), 7.0, 80, 141, 0, 46, 5.0, 4.5, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 80, 141, 0, 46, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 7.0, 80, 141, 0, 46, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); } - else{ + else { ATTACK(agent, 0, 0, Hash40::new("kneer"), 4.0, 80, 130, 0, 53, 5.0, 4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneer"), 4.0, 80, 130, 0, 53, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("legr"), 4.0, 80, 130, 0, 53, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } } frame(lua_state, 23.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - FT_MOTION_RATE(agent, 21.0/(40.0-23.0)); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + FT_MOTION_RATE_RANGE(agent, 23.0, 40.0, 22.0); } if is_excute(agent) { AttackModule::clear_all(boma); @@ -352,9 +359,10 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_landingairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_hi"), 0); - let landing_frame_arsene = landing_frame_joker + 3.0; - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_hi"), 0); + let landing_frame_add = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_doyle.landing_attack_air_hi_add"); + let landing_frame_arsene = landing_frame_joker + landing_frame_add; FT_MOTION_RATE(agent, landing_frame_arsene/landing_frame_joker); } } @@ -363,22 +371,21 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 8.0/(12.0-1.0)); + FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 8.0); frame(lua_state, 4.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0/(12.5-12.0)); + FT_MOTION_RATE(agent, 2.0); frame(lua_state, 12.5); - FT_MOTION_RATE(agent, 1.0/(13.0-12.5)); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 367, 64, 0, 37, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 5.0, 367, 64, 0, 37, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("knife"), 5.0, 367, 64, 0, 37, 4.0, 0.0, 2.3, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } - else{ + else { ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 10.0, 361, 100, 0, 40, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("knife"), 10.0, 361, 100, 0, 40, 4.0, 0.0, 2.3, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); @@ -388,7 +395,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 15.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { AttackModule::clear(boma, 0, false); AttackModule::clear(boma, 1, false); ATTACK(agent, 2, 0, Hash40::new("knife"), 10.0, 38, 50, 0, 47, 4.0, 0.0, 2.3, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); @@ -399,17 +406,17 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 3, false); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { AttackModule::clear_all(boma); } - else{ + else { ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 325, 75, 0, 25, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("knife"), 7.0, 325, 75, 0, 25, 3.5, 0.0, 2.3, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } frame(lua_state, 20.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - FT_MOTION_RATE(agent, 47.0/(47.0-9.0)); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + FT_MOTION_RATE_RANGE(agent, 20.0, 47.0, 32.0); } if is_excute(agent) { AttackModule::clear_all(boma); @@ -418,12 +425,8 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 29.0); - if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - } - } + frame(lua_state, 47.0); + FT_MOTION_RATE(agent, 1.0); } @@ -439,26 +442,19 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { EFFECT_FOLLOW(agent, Hash40::new("jack_knife_front"), Hash40::new("knife"), 0, 0, 0, 0, 0, 0, 1, true); } frame(lua_state, 14.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("jack_doyle_attack_line"), Hash40::new("top"), 0, 6, 0, 90, 0, 0, 1.3, true); - LAST_EFFECT_SET_RATE(agent, 1.3); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("jack_doyle_attack_line2"), Hash40::new("top"), 0, 6, 0, 90, 0, 0, 1.3, true); - } - else { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("jack_doyle_attack_line"), Hash40::new("top"), 0, 6, 0, 90, 0, 0, 1.3, true); - LAST_EFFECT_SET_RATE(agent, 1.3); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("jack_doyle_attack_line2"), Hash40::new("top"), 0, 6, 0, 90, 0, 0, 1.3, true); - } - } + if is_excute(agent) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + EFFECT_FOLLOW(agent, Hash40::new("jack_doyle_attack_line"), Hash40::new("top"), 0, 6, 0, 90, 0, 0, 1.3, true); + LAST_EFFECT_SET_RATE(agent, 1.3); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("jack_doyle_attack_line2"), Hash40::new("top"), 0, 6, 0, 90, 0, 0, 1.3, true); } } frame(lua_state, 15.0); if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, -7, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_RATE(agent, 1.5); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, -5, 1, 0, 0, 0, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + } } frame(lua_state, 16.0); if is_excute(agent) { @@ -507,9 +503,10 @@ unsafe extern "C" fn expression_attackairlw(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_landingairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_lw"), 0); - let landing_frame_arsene = landing_frame_joker + 5.0; - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + let landing_frame_joker = WorkModule::get_param_float(boma, hash40("landing_attack_air_frame_lw"), 0); + let landing_frame_add = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_doyle.landing_attack_air_lw_add"); + let landing_frame_arsene = landing_frame_joker + landing_frame_add; FT_MOTION_RATE(agent, landing_frame_arsene/landing_frame_joker); } } @@ -517,6 +514,7 @@ unsafe extern "C" fn game_landingairlw(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); agent.acmd("effect_attackairn", effect_attackairn, Priority::Low); + agent.acmd("sound_attackairn", sound_attackairn, Priority::Low); agent.acmd("expression_attackairn", expression_attackairn, Priority::Low); agent.acmd("game_landingairn", game_landingairn, Priority::Low); @@ -535,4 +533,4 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_attackairlw", effect_attackairlw, Priority::Low); agent.acmd("expression_attackairlw", expression_attackairlw, Priority::Low); agent.acmd("game_landingairlw", game_landingairlw, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/jack/src/acmd/ground.rs b/fighters/jack/src/acmd/ground.rs index c00d450ff4..66274874a3 100644 --- a/fighters/jack/src/acmd/ground.rs +++ b/fighters/jack/src/acmd/ground.rs @@ -3,23 +3,64 @@ use super::*; unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 4.0, 4.0); frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 30, 0, 32, 3.0, 0.0, 5.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 30, 0, 32, 3.0, 0.0, 5.5, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 361, 30, 0, 32, 4.0, 0.0, 7.5, 12.5, Some(0.0), Some(7.5), Some(15.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 4, 1, Hash40::new("top"), 1.0, 361, 30, 0, 33, 3.0, 0.0, 7.5, 7.5, Some(0.0), Some(7.5), Some(10.8), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 5, 1, Hash40::new("top"), 1.0, 361, 30, 0, 33, 3.0, 0.0, 7.5, 10.8, Some(0.0), Some(7.5), Some(14.7), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 75, 30, 0, 25, 3.0, 0.0, 5.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 75, 30, 0, 25, 3.0, 0.0, 5.5, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 75, 30, 0, 25, 4.0, 0.0, 7.5, 12.5, Some(0.0), Some(7.5), Some(15.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 15, 2.5, 0.0, 3.5, 7.0, Some(0.0), Some(3.5), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + ATTACK(agent, 4, 1, Hash40::new("top"), 1.0, 75, 30, 0, 33, 3.0, 0.0, 7.5, 7.5, Some(0.0), Some(7.5), Some(10.8), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 5, 1, Hash40::new("top"), 1.0, 75, 30, 0, 33, 3.0, 0.0, 7.5, 10.8, Some(0.0), Some(7.5), Some(14.7), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); } + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 8.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } +unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_jack_sword1"), Hash40::new("tex_jack_sword2"), 4, Hash40::new("knife"), 0, 0.25, 0.15, Hash40::new("knife"), 0, 5.8, 0, true, Hash40::new("jack_knife"), Hash40::new("knife"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + EFFECT_FOLLOW(agent, Hash40::new("jack_doyle_magic_arc"), Hash40::new("top"), 0, 10, 3, 99, 80, 73, 0.65, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + } + // frame(lua_state, 3.0); + // if is_excute(agent) { + // } + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("jack_knife_front"), Hash40::new("knife"), 0, 0, 0, 0, 180, 0, 1, true); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + EFFECT(agent, Hash40::new("jack_doyle_attack_flash"), Hash40::new("top"), 0, 7, 15, 0, 0, 0, 0.25, 0, 0, 0, 0, 0, 0, true); + } + } + frame(lua_state, 8.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 3); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("jack_knife_front"), true, true); + } +} + unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -27,8 +68,8 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 75, 30, 0, 25, 3.0, 0.0, 6.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 75, 30, 0, 25, 3.0, 0.0, 6.0, 13.0, Some(0.0), Some(8.0), Some(14.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 75, 30, 0, 25, 3.0, 0.0, 8.0, 18.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 75, 30, 0, 25, 3.0, 0.0, 8.0, 18.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { ATTACK(agent, 4, 1, Hash40::new("top"), 1.0, 75, 30, 0, 25, 2.5, 0.0, 8.0, 10.5, Some(0.0), Some(8.0), Some(15.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); ATTACK(agent, 5, 1, Hash40::new("top"), 1.0, 75, 30, 0, 25, 2.5, 0.0, 8.0, 15.0, Some(0.0), Some(8.0), Some(18.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); } @@ -37,7 +78,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 10.0); + frame(lua_state, 12.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } @@ -48,15 +89,15 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 80, 0, 60, 3.0, 0.0, 8.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 361, 80, 0, 60, 3.0, 0.0, 8.0, 13.5, Some(0.0), Some(8.0), Some(14.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("knife"), 5.0, 361, 80, 0, 60, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 45, 105, 0, 40, 3.0, 0.0, 8.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 45, 105, 0, 40, 3.0, 0.0, 8.0, 13.5, Some(0.0), Some(8.0), Some(14.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("knife"), 5.0, 45, 105, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { ATTACK(agent, 3, 1, Hash40::new("top"), 1.6, 361, 135, 0, 65, 3.5, 0.0, 8.0, 11.0, Some(0.0), Some(8.0), Some(14.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); } } frame(lua_state, 6.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { FT_MOTION_RATE(agent, 27.0/(28.0-6.0)); } if is_excute(agent) { @@ -72,7 +113,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 7.0); } - else{ + else { FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 5.0); } frame(lua_state, 7.0); @@ -122,21 +163,21 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 7.0); if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, -1.5, 0, 0, 0, 0.8, 0, 0, 1.5, 0, 0, 0, false); LAST_EFFECT_SET_RATE(agent, 1); } } frame(lua_state, 8.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { EFFECT_FOLLOW(agent, Hash40::new("jack_doyle_attack_line"), Hash40::new("top"), 0, 4, -2, 0, 0, 0, 0.8, true); LAST_EFFECT_SET_RATE(agent, 0.8); if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { EFFECT_FOLLOW(agent, Hash40::new("jack_attack_line2"), Hash40::new("top"), 7, 2, -2, 0, 0, 0, 0.8, true); LAST_EFFECT_SET_RATE(agent, 0.8); } - else{ + else { EFFECT_FOLLOW(agent, Hash40::new("jack_attack_line2"), Hash40::new("top"), -7, 2, -2, 0, 0, 0, 0.8, true); LAST_EFFECT_SET_RATE(agent, 0.8); } @@ -144,31 +185,50 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { LANDING_EFFECT(agent, Hash40::new("sys_sliding_smoke"), Hash40::new("top"), 6, 0, -2.5, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); LAST_EFFECT_SET_RATE(agent, 1.2); } } frame(lua_state, 12.0); if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 8, 0, -2.5, 0, 0, 0, 0.45, 0, 0, 1.5, 0, 0, 0, false); } } frame(lua_state, 15.0); if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 7, 0, -2.5, 0, 0, 0, 0.35, 0, 0, 1.5, 0, 0, 0, false); } } frame(lua_state, 22.0); if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 5, 0, -2.5, 0, 0, 0, 0.35, 0, 0, 1.5, 0, 0, 0, false); } } } +unsafe extern "C" fn sound_attackdash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + SET_PLAY_INHIVIT(agent, Hash40::new("se_jack_squat"), 60); + } + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_jack_rnd_attack_m")); + } + frame(lua_state, 7.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_jack_attackhard_l01")); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + PLAY_SE(agent, Hash40::new("se_jack_attackhard_l01_doyle")); + } + } +} + unsafe extern "C" fn expression_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -192,10 +252,13 @@ unsafe extern "C" fn expression_attackdash(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); + agent.acmd("effect_attack11", effect_attack11, Priority::Low); + agent.acmd("game_attack12", game_attack12, Priority::Low); agent.acmd("game_attack13", game_attack13, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); + agent.acmd("sound_attackdash", sound_attackdash, Priority::Low); agent.acmd("expression_attackdash", expression_attackdash, Priority::Low); } \ No newline at end of file diff --git a/fighters/jack/src/acmd/other.rs b/fighters/jack/src/acmd/other.rs index 99d644bc7e..99dfbbcdb9 100644 --- a/fighters/jack/src/acmd/other.rs +++ b/fighters/jack/src/acmd/other.rs @@ -77,15 +77,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -95,10 +91,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_attacklw3(agent: &mut L2CAgentBase) { diff --git a/fighters/jack/src/acmd/smashes.rs b/fighters/jack/src/acmd/smashes.rs index a27cfc5850..da96278536 100644 --- a/fighters/jack/src/acmd/smashes.rs +++ b/fighters/jack/src/acmd/smashes.rs @@ -8,54 +8,44 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 8.0/(15.5-7.0)); - frame(lua_state, 15.5); - FT_MOTION_RATE(agent, 1.0/(16.0-15.5)); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 5.0, 0.0, 8.5, 10.0, Some(0.0), Some(11.5), Some(10.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 3.0, 0.0, 14.0, 15.5, Some(0.0), Some(8.0), Some(15.5), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 3.0, 0.0, 12.0, 17.0, Some(0.0), Some(10.0), Some(17.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 5.0, 0.0, 8.5, 10.0, Some(0.0), Some(11.5), Some(10.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); - ATTACK(agent, 4, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 3.0, 0.0, 14.0, 15.5, Some(0.0), Some(8.0), Some(15.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); - ATTACK(agent, 5, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 3.0, 0.0, 12.0, 17.0, Some(0.0), Some(10.0), Some(17.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); - } - else { + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + FT_MOTION_RATE_RANGE(agent, 7.0, 15.5, 8.0); + frame(lua_state, 15.5); + FT_MOTION_RATE(agent, 2.0); + if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 14.0, 361, 112, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 14.0, 361, 112, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("knife"), 14.0, 361, 112, 0, 40, 4.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 14.0, 361, 112, 0, 40, 4.0, 0.0, 13.6, 8.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - } - frame(lua_state, 16.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - AttackModule::clear(boma, 3, false); } + frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 1.0); } - frame(lua_state, 17.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 5.0, 0.0, 8.5, 10.0, Some(0.0), Some(9.5), Some(10.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 3.0, 0.0, 14.0, 15.5, Some(0.0), Some(6.0), Some(15.5), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 3.0, 0.0, 12.0, 17.0, Some(0.0), Some(9.0), Some(17.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 5.0, 0.0, 8.5, 10.0, Some(0.0), Some(10.5), Some(10.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); - ATTACK(agent, 4, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 3.0, 0.0, 14.0, 15.5, Some(0.0), Some(6.0), Some(15.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); - ATTACK(agent, 5, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 3.0, 0.0, 12.0, 17.0, Some(0.0), Some(10.0), Some(17.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); + else { + FT_MOTION_RATE_RANGE(agent, 7.0, 16.0, 8.0); + frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 5.0, 0.0, 8.5, 10.0, Some(0.0), Some(11.5), Some(10.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 3.0, 0.0, 14.0, 15.5, Some(0.0), Some(8.0), Some(15.5), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 361, 120, 0, 40, 3.0, 0.0, 12.0, 17.0, Some(0.0), Some(10.0), Some(17.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 5.0, 0.0, 8.5, 10.0, Some(0.0), Some(11.5), Some(10.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); + ATTACK(agent, 4, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 3.0, 0.0, 14.0, 15.5, Some(0.0), Some(8.0), Some(15.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); + ATTACK(agent, 5, 1, Hash40::new("top"), 3.0, 361, 180, 0, 50, 3.0, 0.0, 12.0, 17.0, Some(0.0), Some(10.0), Some(17.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_NONE); } } frame(lua_state, 18.0); if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { AttackModule::clear_all(boma); } } frame(lua_state, 19.0); - FT_MOTION_RATE(agent, 42.0/(57.0-19.0)); + FT_MOTION_RATE_RANGE(agent, 19.0, 57.0, 42.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 57.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn expression_attacks4(agent: &mut L2CAgentBase) { @@ -84,53 +74,110 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 2.0); - FT_MOTION_RATE(agent, 3.0/(7.0-2.0)); + FT_MOTION_RATE_RANGE(agent, 2.0, 7.0, 3.0); frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 8.0); - FT_MOTION_RATE(agent, 3.0/(12.0-8.0)); - frame(lua_state, 12.0); + FT_MOTION_RATE_RANGE(agent, 8.0, 13.0, 3.0); + frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 83, 116, 0, 43, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("knife"), 12.0, 83, 116, 0, 43, 4.0, 0.0, 2.5, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 0, 0, Hash40::new("knife"), 12.0, 83, 122, 0, 43, 5.0, 0.0, 4.0, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 12.0, 83, 122, 0, 43, 4.5, -1.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 83, 122, 0, 43, 5.5, 0.0, 7.0, 3.0, Some(0.0), Some(12.0), Some(6.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 1, Hash40::new("knife"), 3.0, 83, 180, 0, 59, 5.0, 0.0, 4.0, 2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 1, Hash40::new("armr"), 3.0, 83, 180, 0, 59, 4.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 1, Hash40::new("top"), 3.0, 83, 180, 0, 59, 5.0, 0.0, 7.0, 3.0, Some(0.0), Some(12.0), Some(6.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 83, 112, 0, 43, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("knife"), 12.0, 83, 112, 0, 43, 4.0, 0.0, 2.5, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + ATTACK(agent, 0, 0, Hash40::new("knife"), 12.0, 83, 118, 0, 43, 5.0, 0.0, 4.0, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 12.0, 83, 118, 0, 43, 4.5, -1.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 1, Hash40::new("knife"), 3.0, 83, 180, 0, 59, 5.0, 0.0, 4.0, 2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 1, Hash40::new("armr"), 3.0, 83, 180, 0, 59, 4.5, -1.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); } } + frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 18.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + FT_MOTION_RATE_RANGE(agent, 18.0, 60.0, 47.0); + } + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 60.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("knife"), 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 10.0); + if is_excute(agent) { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_jack_sword3"), Hash40::new("tex_jack_sword2"), 4, Hash40::new("knife"), 0, 0.25, 0.15, Hash40::new("knife"), 0, 5.8, 0, true, Hash40::new("jack_knife"), Hash40::new("knife"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + } + frame(lua_state, 11.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } frame(lua_state, 13.0); if is_excute(agent) { - AttackModule::clear(boma, 2, false); - AttackModule::clear(boma, 5, false); + EFFECT_FOLLOW(agent, Hash40::new("jack_knife_front2"), Hash40::new("knife"), 0, 0, 0, 0, 180, 0, 1, true); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { + EFFECT_FOLLOW(agent, Hash40::new("jack_smash_arc2"), Hash40::new("top"), -4, 19, -1, 0, 15, 80, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + else { + EFFECT_FOLLOW(agent, Hash40::new("jack_smash_arc2"), Hash40::new("top"), 4, 19, -1, 0, 15, 100, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + } + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("jack_knife_front2"), true, true); } - frame(lua_state, 14.0); + frame(lua_state, 21.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 0); + } + frame(lua_state, 29.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 83, 122, 0, 43, 5.0, 0.0, 28.0, 1.0, Some(0.0), Some(16.0), Some(9.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 1, Hash40::new("top"), 3.0, 83, 180, 0, 59, 5.0, 0.0, 28.0, 1.0, Some(0.0), Some(16.0), Some(9.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_attackhi4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_common_smash_start_02")); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + STOP_SE(agent, Hash40::new("se_jack_smash_doyle_tame_loop")); } } - frame(lua_state, 15.0); + frame(lua_state, 10.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 83, 122, 0, 43, 5.0, 0.0, 28.0, 1.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 1, Hash40::new("top"), 3.0, 83, 180, 0, 59, 5.0, 0.0, 28.0, 1.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + if !WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + PLAY_SE(agent, Hash40::new("se_jack_smash_h01")); } } - frame(lua_state, 18.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - FT_MOTION_RATE(agent, 47.0/(60.0-18.0)); + frame(lua_state, 11.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_jack_rnd_attack_l")); } + frame(lua_state, 13.0); if is_excute(agent) { - AttackModule::clear_all(boma); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + PLAY_SE(agent, Hash40::new("se_jack_smash_h01")); + PLAY_SE(agent, Hash40::new("se_jack_smash_h01_doyle")); + } } } @@ -158,7 +205,7 @@ unsafe extern "C" fn expression_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 11.0); + frame(lua_state, 13.0); if is_excute(agent) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_NONE, 3); RUMBLE_HIT(agent, Hash40::new("rbkind_slashl"), 0); @@ -185,35 +232,41 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 32, 106, 0, 30, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 13.0, 32, 106, 0, 30, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("knife"), 13.0, 32, 106, 0, 30, 4.0, 0.0, 2.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { ATTACK(agent, 0, 0, Hash40::new("knife"), 13.0, 32, 108, 0, 30, 4.0, 0.0, 2.0, 1.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 13.0, 32, 108, 0, 30, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("armr"), 13.0, 32, 108, 0, 30, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 32, 108, 0, 30, 4.0, 0.0, 6.5, 6.5, Some(0.0), Some(4.0), Some(15.5), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 4, 1, Hash40::new("top"), 2.0, 38, 250, 0, 44, 4.0, 0.0, 6.5, 6.5, Some(0.0), Some(4.0), Some(15.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); } - + } + frame(lua_state, 14.0); + if is_excute(agent) { + AttackModule::set_size(boma, 3, 0.0); + AttackModule::set_size(boma, 4, 0.0); } frame(lua_state, 16.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 30, 106, 0, 35, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 12.0, 30, 106, 0, 35, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("knife"), 13.0, 30, 106, 0, 35, 4.0, 0.0, 2.0, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { ATTACK(agent, 0, 0, Hash40::new("knife"), 13.0, 30, 108, 0, 35, 4.0, 0.0, 2.0, 1.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 13.0, 30, 108, 0, 35, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("armr"), 13.0, 30, 108, 0, 35, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 30, 108, 0, 35, 4.0, 0.0, 6.0, -8.0, Some(0.0), Some(3.0), Some(-15.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 1, Hash40::new("top"), 2.0, 30, 250, 0, 44, 4.0, 0.0, 6.0, -8.0, Some(0.0), Some(3.0), Some(-15.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 30, 108, 0, 35, 4.0, 0.0, 6.0, -8.0, Some(0.0), Some(4.0), Some(-15.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 1, Hash40::new("top"), 2.0, 30, 250, 0, 44, 4.0, 0.0, 6.0, -8.0, Some(0.0), Some(4.0), Some(-15.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); } } wait(lua_state, 2.0); if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - FT_MOTION_RATE(agent, 40.0/(54.0-18.0)); + FT_MOTION_RATE_RANGE(agent, 18.0, 54.0, 40.0); } if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 54.0); + FT_MOTION_RATE(agent, 1.0); } pub fn install(agent: &mut Agent) { @@ -221,6 +274,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_attacks4", expression_attacks4, Priority::Low); agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); + agent.acmd("effect_attackhi4", effect_attackhi4, Priority::Low); + agent.acmd("sound_attackhi4", sound_attackhi4, Priority::Low); agent.acmd("expression_attackhi4", expression_attackhi4, Priority::Low); agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); diff --git a/fighters/jack/src/acmd/specials.rs b/fighters/jack/src/acmd/specials.rs deleted file mode 100644 index a9252c2439..0000000000 --- a/fighters/jack/src/acmd/specials.rs +++ /dev/null @@ -1,318 +0,0 @@ -use super::*; - -unsafe extern "C" fn game_specialairndown(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - for _ in 0..20 { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 50, 80, 0, 25, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-15.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -2, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.2, 45, 0, 0, 29, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(-2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.2, 55, 0, 0, 29, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.2, 45, 0, 0, 29, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); - } - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 50, 80, 0, 25, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-15.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -2, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.2, 45, 0, 0, 29, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(-2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.2, 55, 0, 0, 29, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.2, 45, 0, 0, 29, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); - } - } - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - wait(lua_state, 6.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE){ - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.6, 50, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-17.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 45, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 55, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 45, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); - } - } - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - wait(lua_state, 6.0); - } -} - -unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, false, 0); - ArticleModule::change_motion(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, Hash40::new("special_hi"), false, 0.0); - } - frame(lua_state, 8.0); - if is_excute(agent) { - WorkModule::on_flag(boma, /*Flag*/ *FIGHTER_JACK_STATUS_SPECIAL_HI_FLAG_REVERSE_LR); - } - frame(lua_state, 19.0); - if is_excute(agent) { - ArticleModule::change_status(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, *WEAPON_JACK_WIREROPE_STATUS_KIND_EXTEND, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - AreaModule::reset_area(boma, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); - ENABLE_AREA(agent, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); - AreaModule::reset_area(boma, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); - ENABLE_AREA(agent, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); - } - frame(lua_state, 20.0); - if is_excute(agent) { - SEARCH(agent, 0, 0, Hash40::new("throw"), 3.0, 1.5, 1.5, 0.7, Some(1.5), Some(-15.0), Some(-6.4), *COLLISION_KIND_MASK_HSR, *HIT_STATUS_MASK_NORMAL, 0, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_BODY, false); - SEARCH(agent, 1, 0, Hash40::new("throw"), 4.5, 1.5, 1.5, 0.7, None, None, None, *COLLISION_KIND_MASK_HSR, *HIT_STATUS_MASK_NORMAL, 0, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_BODY, false); - SEARCH(agent, 2, 0, Hash40::new("throw"), 4.5, 1.2, 1.5, 0.7, None, None, None, *COLLISION_KIND_MASK_HSR, *HIT_STATUS_MASK_NORMAL, 0, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_BODY, false); - } - frame(lua_state, 21.0); - if is_excute(agent) { - AttackModule::clear(boma, 1, false); - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR, 0); - } - frame(lua_state, 22.0); - if is_excute(agent) { - SET_SEARCH_SIZE_EXIST(agent, 2, 8); - } - frame(lua_state, 23.0); - if is_excute(agent) { - UNABLE_AREA(agent, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); - } - frame(lua_state, 24.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 27.0); - if is_excute(agent) { - ArticleModule::change_status(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, *WEAPON_JACK_WIREROPE_STATUS_KIND_BACK, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); - UNABLE_AREA(agent, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); - } -} - -unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - boma.off_flag(*FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_SPECIAL_AIR_HI_HOP); - ArticleModule::generate_article(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, false, 0); - } - frame(lua_state, 8.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_HI_FLAG_REVERSE_LR); - } - frame(lua_state, 12.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); - WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_HANG_IMMIDIATE); - } - frame(lua_state, 13.0); - if is_excute(agent) { - GroundModule::select_cliff_hangdata(boma, *FIGHTER_JACK_CLIFF_HANG_DATA_AIR_LASSO as u32); - WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_HANG_IMMIDIATE); - } - frame(lua_state, 15.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); - } - frame(lua_state, 19.0); - if is_excute(agent) { - ArticleModule::change_status(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, *WEAPON_JACK_WIREROPE_STATUS_KIND_EXTEND, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - // AreaModule::reset_area(boma, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); - // ENABLE_AREA(fighter, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); - // AreaModule::reset_area(boma, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); - // ENABLE_AREA(fighter, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); - } - frame(lua_state, 20.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("throw"), 10.0, 70, 60, 0, 60, 4.5, 1.5, 2.0, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 70,60, 0, 60, 4.5, 0.0, 22.0, 3.2, Some(0.0), Some(38.0), Some(10.6), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - - } - frame(lua_state, 21.0); - if is_excute(agent) { - AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 0, Hash40::new("throw"), 10.0, 255, 15, 0, 70, 4.5, 1.5, 2.0, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR, 0); - } - frame(lua_state, 22.0); - if is_excute(agent) { - SET_SEARCH_SIZE_EXIST(agent, 2, 8); - } - frame(lua_state, 23.0); - if is_excute(agent) { - // UNABLE_AREA(fighter, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); - } - frame(lua_state, 24.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 25.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); - } - frame(lua_state, 26.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 27.0); - if is_excute(agent) { - ArticleModule::change_status(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, *WEAPON_JACK_WIREROPE_STATUS_KIND_BACK, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); - // UNABLE_AREA(fighter, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); - } - frame(lua_state, 45.0); - if is_excute(agent) { - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { - CancelModule::enable_cancel(boma); - } - else { - VarModule::on_flag(agent.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); - } - } -} - -unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 20.0); - if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("jack_wire_line"), Hash40::new("throw"), 0, 0, 0, 115.5, 0, -1, 0.6, true); - } - } - else { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("jack_wire_line"), Hash40::new("throw"), 0, 0, 0, 115.5, 0, 1, 0.6, true); - } - } - frame(lua_state, 21.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 1, true); - } - frame(lua_state, 26.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("sys_smash_flash"), -1); - EFFECT_OFF_KIND(agent, Hash40::new("jack_wire_line"), false, true); - } -} - -unsafe extern "C" fn game_specialairhif(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 37.0, 16.0); - if is_excute(agent) { - ArticleModule::change_motion(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WING, Hash40::new("special_hi2_f"), false, 0.0); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - ATTACK(agent, 0, 0, Hash40::new("hip"), 6.0, 75, 10, 0, 80, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); - } - frame(lua_state, 37.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_HI2_FLAG_APPEAR_DOYLE); - } -} - -unsafe extern "C" fn game_specialairhiendf(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 1.0); - if is_excute(agent) { - KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } - wait(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - KineticModule::mul_speed(boma, &Vector3f::new(0.75, 0.5, 1.0), *FIGHTER_KINETIC_ENERGY_ID_STOP); - } - wait(lua_state, 6.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } - frame(lua_state, 10.0); - if is_excute(agent) { - KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } -} - -unsafe extern "C" fn effect_speciallwstart(agent: &mut L2CAgentBase) { - frame(agent.lua_state_agent, 7.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("jack_counter_mask_fire2"), Hash40::new("mask"), 0, 0, 0, 0, 0, 0, 1, true); - } -} - -unsafe extern "C" fn sound_speciallwstart(agent: &mut L2CAgentBase) { - frame(agent.lua_state_agent, 3.0); - if is_excute(agent) { - PLAY_SEQUENCE(agent, Hash40::new("seq_jack_rnd_special_l01")); - } -} - -unsafe extern "C" fn expression_speciallwstart(agent: &mut L2CAgentBase) { - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - ItemModule::set_have_item_visibility(agent.module_accessor, false, 0); - } -} - -unsafe extern "C" fn game_speciallwend(agent: &mut L2CAgentBase) { - frame(agent.lua_state_agent, 1.0); - FT_MOTION_RATE(agent, 0.5); -} - -unsafe extern "C" fn effect_speciallwend(agent: &mut L2CAgentBase) { - frame(agent.lua_state_agent, 1.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("jack_counter_mask_fire2"), false, false); - } -} - -pub fn install(agent: &mut Agent) { - agent.acmd("game_specialairndown", game_specialairndown, Priority::Low); - - agent.acmd("game_specialhi", game_specialhi, Priority::Low); - agent.acmd("game_specialairhi", game_specialairhi, Priority::Low); - agent.acmd("effect_specialairhi", effect_specialairhi, Priority::Low); - - agent.acmd("game_specialairhif", game_specialairhif, Priority::Low); - agent.acmd("game_specialairhib", game_specialairhif, Priority::Low); - agent.acmd("game_specialairhiendf", game_specialairhiendf, Priority::Low); - agent.acmd("game_specialairhiendb", game_specialairhiendf, Priority::Low); - - agent.acmd("game_speciallwstart", acmd_stub, Priority::Low); - agent.acmd("effect_speciallwstart", effect_speciallwstart, Priority::Low); - agent.acmd("sound_speciallwstart", sound_speciallwstart, Priority::Low); - agent.acmd("expression_speciallwstart", expression_speciallwstart, Priority::Low); - - agent.acmd("game_specialairlwstart", acmd_stub, Priority::Low); - agent.acmd("effect_specialairlwstart", effect_speciallwstart, Priority::Low); - agent.acmd("sound_specialairlwstart", sound_speciallwstart, Priority::Low); - agent.acmd("expression_specialairlwstart", expression_speciallwstart, Priority::Low); - - agent.acmd("game_speciallwend", game_speciallwend, Priority::Low); - agent.acmd("effect_speciallwend", effect_speciallwend, Priority::Low); - - agent.acmd("game_specialairlwend", game_speciallwend, Priority::Low); - agent.acmd("effect_specialairlwend", effect_speciallwend, Priority::Low); -} diff --git a/fighters/jack/src/acmd/specials/mod.rs b/fighters/jack/src/acmd/specials/mod.rs new file mode 100644 index 0000000000..ddcf5da401 --- /dev/null +++ b/fighters/jack/src/acmd/specials/mod.rs @@ -0,0 +1,11 @@ +use super::*; + +mod special_hi; +mod special_lw; +mod special_n; + +pub fn install(agent: &mut Agent) { + special_hi::install(agent); + special_lw::install(agent); + special_n::install(agent); +} \ No newline at end of file diff --git a/fighters/jack/src/acmd/specials/special_hi.rs b/fighters/jack/src/acmd/specials/special_hi.rs new file mode 100644 index 0000000000..8bc052027b --- /dev/null +++ b/fighters/jack/src/acmd/specials/special_hi.rs @@ -0,0 +1,238 @@ +use super::*; + +unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, false, 0); + ArticleModule::change_motion(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, Hash40::new("special_hi"), false, 0.0); + } + frame(lua_state, 8.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_HI_FLAG_REVERSE_LR); + } + frame(lua_state, 19.0); + if is_excute(agent) { + ArticleModule::change_status(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, *WEAPON_JACK_WIREROPE_STATUS_KIND_EXTEND, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + // AreaModule::reset_area(boma, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); + // ENABLE_AREA(agent, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); + // AreaModule::reset_area(boma, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); + // ENABLE_AREA(agent, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); + } + frame(lua_state, 20.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("throw"), 10.0, 70, 60, 0, 60, 4.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 70, 60, 0, 60, 4.5, 0.0, 22.0, 1.7, Some(0.0), Some(38.0), Some(9.1), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + } + frame(lua_state, 21.0); + if is_excute(agent) { + AttackModule::clear(boma, 1, false); + } + frame(lua_state, 22.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + SEARCH(agent, 0, 0, Hash40::new("throw"), 5.5, 1.5, 1.5, 0.7, None, None, None, *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_NORMAL, 0, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_BODY, false); + SEARCH(agent, 1, 0, Hash40::new("top"), 5.0, 0.0, 60.0, 19.5, Some(0.0), Some(77.0), Some(27.25), *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_NORMAL, 0, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_BODY, false); + } + } + frame(lua_state, 23.0); + if is_excute(agent) { + //UNABLE_AREA(agent, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); + SearchModule::clear(boma, 1); + } + frame(lua_state, 27.0); + if is_excute(agent) { + ArticleModule::change_status(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, *WEAPON_JACK_WIREROPE_STATUS_KIND_BACK, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); + //UNABLE_AREA(agent, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); + } +} + +unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + boma.off_flag(*FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_SPECIAL_AIR_HI_HOP); + ArticleModule::generate_article(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, false, 0); + } + frame(lua_state, 8.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_HI_FLAG_REVERSE_LR); + } + frame(lua_state, 12.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); + WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_HANG_IMMIDIATE); + } + frame(lua_state, 13.0); + if is_excute(agent) { + GroundModule::select_cliff_hangdata(boma, *FIGHTER_JACK_CLIFF_HANG_DATA_AIR_LASSO as u32); + WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_HANG_IMMIDIATE); + } + frame(lua_state, 15.0); + if is_excute(agent) { + WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); + } + frame(lua_state, 19.0); + if is_excute(agent) { + ArticleModule::change_status(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, *WEAPON_JACK_WIREROPE_STATUS_KIND_EXTEND, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + // AreaModule::reset_area(boma, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); + // ENABLE_AREA(fighter, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); + // AreaModule::reset_area(boma, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); + // ENABLE_AREA(fighter, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); + } + frame(lua_state, 20.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("throw"), 10.0, 70, 60, 0, 60, 4.5, 1.5, 2.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 70, 60, 0, 60, 4.5, 0.0, 22.0, 3.2, Some(0.0), Some(38.0), Some(10.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + } + frame(lua_state, 21.0); + if is_excute(agent) { + AttackModule::clear(boma, 1, false); + ATTACK(agent, 0, 0, Hash40::new("throw"), 10.0, 262, 28, 0, 45, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR, 0); + } + frame(lua_state, 22.0); + if is_excute(agent) { + //SET_SEARCH_SIZE_EXIST(agent, 2, 8); + } + frame(lua_state, 23.0); + if is_excute(agent) { + // UNABLE_AREA(fighter, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH_ADD); + } + frame(lua_state, 24.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 25.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); + } + frame(lua_state, 26.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 27.0); + if is_excute(agent) { + ArticleModule::change_status(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, *WEAPON_JACK_WIREROPE_STATUS_KIND_BACK, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); + // UNABLE_AREA(fighter, *FIGHTER_JACK_AREA_KIND_ITEM_CATCH); + } + frame(lua_state, 45.0); + if is_excute(agent) { + if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + CancelModule::enable_cancel(boma); + } + else { + VarModule::on_flag(agent.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); + } + } +} + +unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 20.0); + if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("jack_wire_line"), Hash40::new("throw"), 0, 0, 0, 115.5, 0, -1, 0.6, true); + } + } + else { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("jack_wire_line"), Hash40::new("throw"), 0, 0, 0, 115.5, 0, 1, 0.6, true); + } + } + frame(lua_state, 21.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 0.7, true); + } + frame(lua_state, 26.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("sys_smash_flash"), -1); + EFFECT_OFF_KIND(agent, Hash40::new("jack_wire_line"), false, true); + } +} + +unsafe extern "C" fn game_specialhithrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, false, -1); + ArticleModule::change_motion(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, Hash40::new("special_hi_throw"), false, -1.0); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 80, 40, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 4.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, -20, 10); + } + frame(lua_state, 6.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } + frame(lua_state, 8.0); + if is_excute(agent) { + ArticleModule::remove_exist(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WIREROPE, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } + frame(lua_state, 20.0); + FT_MOTION_RATE_RANGE(agent, 20.0, 25.0, 7.0); + frame(lua_state, 25.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn game_specialairhif(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 37.0, 16.0); + if is_excute(agent) { + ArticleModule::change_motion(boma, *FIGHTER_JACK_GENERATE_ARTICLE_WING, Hash40::new("special_hi2_f"), false, 0.0); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + ATTACK(agent, 0, 0, Hash40::new("hip"), 6.0, 75, 10, 0, 80, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + } + frame(lua_state, 37.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_HI2_FLAG_APPEAR_DOYLE); + } +} + +unsafe extern "C" fn game_specialairhiendf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 1.0); + if is_excute(agent) { + KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + KineticModule::mul_speed(boma, &Vector3f::new(0.75, 0.5, 1.0), *FIGHTER_KINETIC_ENERGY_ID_STOP); + } + wait(lua_state, 6.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + } + frame(lua_state, 10.0); + if is_excute(agent) { + KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialhi", game_specialhi, Priority::Low); + agent.acmd("game_specialairhi", game_specialairhi, Priority::Low); + agent.acmd("effect_specialairhi", effect_specialairhi, Priority::Low); + + agent.acmd("game_specialhithrow", game_specialhithrow, Priority::Low); + + agent.acmd("game_specialairhif", game_specialairhif, Priority::Low); + agent.acmd("game_specialairhib", game_specialairhif, Priority::Low); + agent.acmd("game_specialairhiendf", game_specialairhiendf, Priority::Low); + agent.acmd("game_specialairhiendb", game_specialairhiendf, Priority::Low); +} \ No newline at end of file diff --git a/fighters/jack/src/acmd/specials/special_lw.rs b/fighters/jack/src/acmd/specials/special_lw.rs new file mode 100644 index 0000000000..28bd9ec895 --- /dev/null +++ b/fighters/jack/src/acmd/specials/special_lw.rs @@ -0,0 +1,52 @@ +use super::*; + +unsafe extern "C" fn effect_speciallwstart(agent: &mut L2CAgentBase) { + frame(agent.lua_state_agent, 7.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("jack_counter_mask_fire2"), Hash40::new("mask"), 0, 0, 0, 0, 0, 0, 1, true); + } +} + +unsafe extern "C" fn sound_speciallwstart(agent: &mut L2CAgentBase) { + frame(agent.lua_state_agent, 3.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_jack_rnd_special_l01")); + } +} + +unsafe extern "C" fn expression_speciallwstart(agent: &mut L2CAgentBase) { + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(agent.module_accessor, false, 0); + } +} + +unsafe extern "C" fn game_speciallwend(agent: &mut L2CAgentBase) { + frame(agent.lua_state_agent, 1.0); + FT_MOTION_RATE(agent, 0.5); +} + +unsafe extern "C" fn effect_speciallwend(agent: &mut L2CAgentBase) { + frame(agent.lua_state_agent, 1.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("jack_counter_mask_fire2"), false, false); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_speciallwstart", acmd_stub, Priority::Low); + agent.acmd("effect_speciallwstart", effect_speciallwstart, Priority::Low); + agent.acmd("sound_speciallwstart", sound_speciallwstart, Priority::Low); + agent.acmd("expression_speciallwstart", expression_speciallwstart, Priority::Low); + + agent.acmd("game_specialairlwstart", acmd_stub, Priority::Low); + agent.acmd("effect_specialairlwstart", effect_speciallwstart, Priority::Low); + agent.acmd("sound_specialairlwstart", sound_speciallwstart, Priority::Low); + agent.acmd("expression_specialairlwstart", expression_speciallwstart, Priority::Low); + + agent.acmd("game_speciallwend", game_speciallwend, Priority::Low); + agent.acmd("effect_speciallwend", effect_speciallwend, Priority::Low); + + agent.acmd("game_specialairlwend", game_speciallwend, Priority::Low); + agent.acmd("effect_specialairlwend", effect_speciallwend, Priority::Low); +} \ No newline at end of file diff --git a/fighters/jack/src/acmd/specials/special_n.rs b/fighters/jack/src/acmd/specials/special_n.rs new file mode 100644 index 0000000000..78b5874cb5 --- /dev/null +++ b/fighters/jack/src/acmd/specials/special_n.rs @@ -0,0 +1,749 @@ +use super::*; + +unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 12.0); + if is_excute(agent) { + if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { + let y_offset = if agent.is_motion(Hash40::new("jack_special_n")) { 5.0 } else if agent.is_motion(Hash40::new("jack_special_n_2")) { 4.0 } else { 4.5 }; + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 75, 0, 9, 2.5, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(20.0), 0.75, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 50, 0, 5, 2.5, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(36.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.5, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(84.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + } + else { + let y_offset = if agent.is_motion(Hash40::new("special_n")) { 11.0 } else if agent.is_motion(Hash40::new("special_n_2")) { 8.5 } else { 9.0 }; + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 75, 0, 9, 2.5, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(20.0), 0.75, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 50, 0, 5, 2.5, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(36.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.5, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(84.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + } + } + if is_excute(agent) { + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + if agent.is_situation(*SITUATION_KIND_GROUND) { + frame(lua_state, 26.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BUTTON_RAPID); + } + frame(lua_state, 27.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_JUMP); + } + frame(lua_state, 31.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + } + frame(lua_state, 34.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } + else { + frame(lua_state, 14.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_TRIGGER); + } + frame(lua_state, 17.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 21.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + } + frame(lua_state, 26.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BUTTON_RAPID); + } + frame(lua_state, 31.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + } + frame(lua_state, 34.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } +} + +unsafe extern "C" fn game_specialn_ex(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let y_offset = if agent.is_motion(Hash40::new("special_n2")) { 11.0 } else if agent.is_motion(Hash40::new("special_n2_2")) { 8.5 } else { 9.0 }; + frame(lua_state, 12.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 50, 0, 60, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 50, 0, 1, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(36.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(89.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 18.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 0, 0, 0, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 361, 0, 0, 0, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(36.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(89.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 24.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 0, 0, 0, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 361, 0, 0, 0, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(36.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.8, 0.0, y_offset, 9.0, Some(0.0), Some(y_offset), Some(89.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + if agent.is_situation(*SITUATION_KIND_GROUND) { + frame(lua_state, 31.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BUTTON_RAPID); + } + frame(lua_state, 32.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_JUMP); + } + frame(lua_state, 36.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + } + frame(lua_state, 39.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } + else { + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + } + frame(lua_state, 28.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BUTTON_RAPID); + } + frame(lua_state, 31.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + } + frame(lua_state, 34.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } +} + +unsafe extern "C" fn game_specialnescapeb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + JostleModule::set_status(boma, false); + } + frame(lua_state, 17.0); + if is_excute(agent) { + JostleModule::set_status(boma, true); + } + frame(lua_state, 22.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 75, 0, 5, 2.5, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(14.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 50, 0, 1, 2.5, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(26.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.5, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(69.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + } + if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 75, 0, 5, 2.5, 0.0, 4.0, 9.0, Some(0.0), Some(4.0), Some(14.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 50, 0, 1, 2.5, 0.0, 4.0, 9.0, Some(0.0), Some(4.0), Some(26.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.5, 0.0, 4.0, 9.0, Some(0.0), Some(4.0), Some(69.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + } + } + if is_excute(agent) { + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + if agent.is_situation(*SITUATION_KIND_GROUND) { + frame(lua_state, 39.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 42.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } + else { + frame(lua_state, 32.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + } + frame(lua_state, 36.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_TRIGGER); + } + frame(lua_state, 39.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 42.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } +} + +unsafe extern "C" fn game_specialnescapeb_ex(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + JostleModule::set_status(boma, false); + } + frame(lua_state, 17.0); + if is_excute(agent) { + JostleModule::set_status(boma, true); + } + frame(lua_state, 22.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 75, 0, 5, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 50, 0, 1, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(26.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(69.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 28.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 0, 0, 0, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 361, 0, 0, 0, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(26.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(69.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 34.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 75, 0, 5, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 361, 50, 0, 1, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(26.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.8, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(69.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + if agent.is_situation(*SITUATION_KIND_GROUND) { + frame(lua_state, 43.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 45.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } + else { + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + } + frame(lua_state, 38.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_TRIGGER); + } + frame(lua_state, 40.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 42.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } +} + +unsafe extern "C" fn game_specialnescapef(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + JostleModule::set_status(boma, false); + } + frame(lua_state, 13.0); + if is_excute(agent) { + JostleModule::set_status(boma, true); + } + frame(lua_state, 20.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 67, 0, 30, 2.5, 0.0, 8.5, 9.0, Some(0.0), Some(8.5), Some(14.0), 0.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 45, 0, 4, 2.5, 0.0, 8.5, 9.0, Some(0.0), Some(8.5), Some(36.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 0, 0, 0, 2.5, 0.0, 8.5, 9.0, Some(0.0), Some(8.5), Some(84.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + } + if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 67, 0, 30, 2.5, 0.0, 4.5, 9.0, Some(0.0), Some(4.5), Some(14.0), 0.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 45, 0, 4, 2.5, 0.0, 4.5, 9.0, Some(0.0), Some(4.5), Some(36.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 0, 0, 0, 2.5, 0.0, 4.5, 9.0, Some(0.0), Some(4.5), Some(84.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + } + } + if is_excute(agent) { + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + if agent.is_situation(*SITUATION_KIND_GROUND) { + frame(lua_state, 33.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 36.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } + else { + frame(lua_state, 30.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_TRIGGER); + } + frame(lua_state, 31.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + } + frame(lua_state, 33.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 36.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } +} + +unsafe extern "C" fn game_specialnescapef_ex(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + JostleModule::set_status(boma, false); + } + frame(lua_state, 13.0); + if is_excute(agent) { + JostleModule::set_status(boma, true); + } + frame(lua_state, 20.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 30, 120, 0, 30, 2.5, 0.0, 10.5, 9.0, Some(0.0), Some(10.5), Some(69.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 8, 4); + } + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 361, 50, 0, 50, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 50, 0, 4, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(36.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 0, 0, 0, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(89.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 26.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 0, 0, 0, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 361, 0, 0, 0, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(36.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(89.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 32.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 0, 0, 0, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(20.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 361, 0, 0, 0, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(36.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.8, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(89.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + if agent.is_situation(*SITUATION_KIND_GROUND) { + frame(lua_state, 40.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 41.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } + else { + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_ENABLE_CONTROL_ENERGY); + } + frame(lua_state, 34.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BUTTON_RAPID); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_TRIGGER); + } + frame(lua_state, 36.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_NEXT_STATUS); + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_CHECK_BARRAGE_BUTTON_ON); + } + frame(lua_state, 38.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_JACK_STATUS_SPECIAL_N_FLAG_UNABLE_SPECIAL_N); + } + } +} + +unsafe extern "C" fn game_specialnjump(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + KineticModule::add_speed(boma, &Vector3f{x: 0.75, y: 0.4, z: 0.0}); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 365, 70, 0, 10, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 365, 70, 0, 10, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 2.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.5, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.5, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.5, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 17.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 365, 70, 0, 10, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -1, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 365, 70, 0, 10, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -1, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 2.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.5, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.5, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.5, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 24.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 365, 70, 0, 10, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -1, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 50, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 365, 70, 0, 10, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -1, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 50, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 2.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.5, 50, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.5, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.5, 365, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + KineticModule::add_speed(boma, &Vector3f{x: 0.0, y: -0.8, z: 0.0}); + } + frame(lua_state, 31.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 125, 70, 0, 50, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, -1, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 90, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 45, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 45, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 1, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 2, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 125, 70, 0, 60, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-22.0), Some(0.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, -1, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 90, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 45, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 45, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(9.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 1, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 2, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn game_specialairndown(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + for _ in 0..20 { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 50, 80, 0, 25, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-15.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -2, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.2, 45, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(-2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.2, 55, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.2, 45, 0, 0, 0, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 50, 80, 0, 25, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-15.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -2, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.2, 45, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(-2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.2, 55, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.2, 45, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-45.0), Some(2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 6.0); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.6, 50, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-17.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 45, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(-2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.8, 55, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.8, 45, 0, 0, 0, 4.0, 0.0, 0.0, 0.0, Some(0.0), Some(-50.0), Some(2.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 5, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 5, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 3, 5, 4); + } + } + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_63_bullet"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 6.0); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialn1", game_specialn, Priority::Low); + agent.acmd("game_specialn2", game_specialn, Priority::Low); + agent.acmd("game_specialn3", game_specialn, Priority::Low); + agent.acmd("game_specialairn1", game_specialn, Priority::Low); + agent.acmd("game_specialairn2", game_specialn, Priority::Low); + agent.acmd("game_specialairn3", game_specialn, Priority::Low); + + agent.acmd("game_specialn1_ex", game_specialn_ex, Priority::Low); + agent.acmd("game_specialn2_ex", game_specialn_ex, Priority::Low); + agent.acmd("game_specialn3_ex", game_specialn_ex, Priority::Low); + agent.acmd("game_specialairn1_ex", game_specialn_ex, Priority::Low); + agent.acmd("game_specialairn2_ex", game_specialn_ex, Priority::Low); + agent.acmd("game_specialairn3_ex", game_specialn_ex, Priority::Low); + + agent.acmd("game_specialnescapeb", game_specialnescapeb, Priority::Low); + agent.acmd("game_specialairnescapeb", game_specialnescapeb, Priority::Low); + + agent.acmd("game_specialnescapebex", game_specialnescapeb_ex, Priority::Low); + agent.acmd("game_specialairnescapebex", game_specialnescapeb_ex, Priority::Low); + + agent.acmd("game_specialnescapef", game_specialnescapef, Priority::Low); + agent.acmd("game_specialairnescapef", game_specialnescapef, Priority::Low); + + agent.acmd("game_specialnescapefex", game_specialnescapef_ex, Priority::Low); + agent.acmd("game_specialairnescapefex", game_specialnescapef_ex, Priority::Low); + + agent.acmd("game_specialnjump", game_specialnjump, Priority::Low); + + agent.acmd("game_specialairndown", game_specialairndown, Priority::Low); +} \ No newline at end of file diff --git a/fighters/jack/src/acmd/throws.rs b/fighters/jack/src/acmd/throws.rs index dfdc98f2eb..daad932631 100644 --- a/fighters/jack/src/acmd/throws.rs +++ b/fighters/jack/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.1, 0.0, Some(0.0), Some(8.1), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 8.1, 4.7, Some(0.0), Some(8.1), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(10.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -7.0, Some(0.0), Some(6.6), Some(-16.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 6.6, -9.0, Some(0.0), Some(6.6), Some(-16.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -63,13 +62,54 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 45, 65, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 6.0, 7.0); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 8.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, 15, 0); + } + frame(lua_state, 9.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + +unsafe extern "C" fn sound_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_jack_throw_f01")); + } + frame(lua_state, 10.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_jack_rnd_attack_s")); + } +} + unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 134, 85, 0, 52, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 117, 48, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 6.0, 6.0); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 13.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, -7, 0); @@ -83,10 +123,59 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 90, 91, 0, 62, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 15.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, 3, 10); + } + frame(lua_state, 16.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + +unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 79, 95, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 22.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, 12.8, 0); + } + frame(lua_state, 23.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } + frame(lua_state, 25.0); + FT_MOTION_RATE(agent, 0.8); + frame(lua_state, 40.0); + FT_MOTION_RATE(agent, 1.0); +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("sound_throwf", sound_throwf, Priority::Low); + agent.acmd("game_throwb", game_throwb, Priority::Low); -} + agent.acmd("game_throwhi", game_throwhi, Priority::Low); + agent.acmd("game_throwlw", game_throwlw, Priority::Low); +} \ No newline at end of file diff --git a/fighters/jack/src/acmd/tilts.rs b/fighters/jack/src/acmd/tilts.rs index 7f9298b6f2..f6477efb44 100644 --- a/fighters/jack/src/acmd/tilts.rs +++ b/fighters/jack/src/acmd/tilts.rs @@ -18,7 +18,7 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("knife"), 5.0, 40, 110, 0, 45, 3.5, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 40, 110, 0, 45, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 5.0, 40, 110, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { AttackModule::set_size(boma, 2, 0.0); ATTACK(agent, 0, 0, Hash40::new("knife"), 10.0, 40, 65, 0, 60, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 40, 65, 0, 60, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); @@ -26,7 +26,7 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { } } frame(lua_state, 18.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { FT_MOTION_RATE_RANGE(agent, 18.0, 35.0, 19.0); } if is_excute(agent) { @@ -52,7 +52,7 @@ unsafe extern "C" fn game_attacks3hi(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("knife"), 5.0, 40, 110, 0, 45, 3.5, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 40, 110, 0, 45, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 5.0, 40, 110, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { AttackModule::set_size(boma, 2, 0.0); ATTACK(agent, 0, 0, Hash40::new("knife"), 10.0, 45, 65, 0, 60, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 45, 65, 0, 60, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); @@ -60,7 +60,7 @@ unsafe extern "C" fn game_attacks3hi(agent: &mut L2CAgentBase) { } } frame(lua_state, 18.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { FT_MOTION_RATE_RANGE(agent, 18.0, 35.0, 19.0); } if is_excute(agent) { @@ -86,7 +86,7 @@ unsafe extern "C" fn game_attacks3lw(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("knife"), 5.0, 40, 105, 0, 45, 3.5, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 40, 105, 0, 45, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 5.0, 40, 105, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { AttackModule::set_size(boma, 2, 0.0); ATTACK(agent, 0, 0, Hash40::new("knife"), 10.0, 35, 61, 0, 60, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 35, 61, 0, 60, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); @@ -94,7 +94,7 @@ unsafe extern "C" fn game_attacks3lw(agent: &mut L2CAgentBase) { } } frame(lua_state, 18.0); - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { FT_MOTION_RATE_RANGE(agent, 18.0, 35.0, 19.0); } if is_excute(agent) { @@ -111,21 +111,21 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 115, 100, 100, 0, 3.5, 0.0, 12.5, 8.5, Some(0.0), Some(3.9), Some(2.4), 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 115, 100, 100, 0, 2.5, -1.0, 0.0, 0.0, Some(1.0), Some(0.0), Some(0.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 122, 100, 100, 0, 3.5, 0.0, 12.5, 8.5, Some(0.0), Some(3.9), Some(2.4), 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 118, 100, 100, 0, 2.5, -1.0, 0.0, 0.0, Some(1.0), Some(0.0), Some(0.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 115, 100, 80, 0, 3.5, 0.0, 24.6, 1.6, Some(0.0), Some(18.5), Some(8.5), 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 150, 100, 80, 0, 3.5, 0.0, 24.6, 1.6, Some(0.0), Some(18.5), Some(8.5), 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 13.0); if is_excute(agent) { AttackModule::clear_all(boma); ATTACK(agent, 0, 0, Hash40::new("knife"), 5.0, 90, 116, 0, 75, 5.0, 0.0, 1.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 90, 116, 0, 75, 3.0, 0.0, 20.5, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 90, 116, 0, 75, 3.5, 0.0, 15.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { ATTACK(agent, 2, 1, Hash40::new("knife"), 5.0, 90, 144, 0, 55, 5.0, 0.0, 1.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 1, Hash40::new("top"), 5.0, 90, 144, 0, 55, 3.0, 0.0, 20.5, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 1, Hash40::new("top"), 5.0, 90, 144, 0, 55, 3.5, 0.0, 15.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); } } frame(lua_state, 22.0); @@ -156,10 +156,8 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { AFTER_IMAGE_OFF(agent, 0); EFFECT_OFF_KIND(agent, Hash40::new("jack_knife_front"), false, true); EFFECT_FOLLOW(agent, Hash40::new("jack_knife_spin"), Hash40::new("knife"), 0, 0, 0, 0, 0, 0, 1, true); - } - if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { - if is_excute(agent) { - EFFECT(agent, Hash40::new("jack_doyle_lightning"), Hash40::new("top"), 0, 25, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + if WorkModule::is_flag(boma, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { + EFFECT(agent, Hash40::new("jack_doyle_lightning"), Hash40::new("top"), 0, 25, 0, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, true); } } frame(lua_state, 22.0); @@ -199,14 +197,16 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 39, 35, 0, 60, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(2.0), Some(18.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 0, 0, 0, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-1.0), Some(26.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-4.0), Some(34.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 361, 0, 20, 0, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-1.0), Some(26.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); - FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); - } + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 39, 43, 0, 59, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(2.0), Some(18.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 0, 0, 0, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-1.0), Some(26.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-4.0), Some(34.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 7.0, 361, 20, 0, 20, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-1.0), Some(26.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 3, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + AttackModule::set_down_only(boma, 3, true); + } frame(lua_state, 10.0); if is_excute(agent) { AttackModule::clear_all(boma); @@ -278,13 +278,15 @@ unsafe extern "C" fn game_attacklw3_ex(agent: &mut L2CAgentBase) { } frame(lua_state, 24.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 39, 50, 0, 60, 2.5, 0.0, 7.0, 5.0, Some(0.0), Some(2.0), Some(18.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 39, 61, 0, 58, 2.5, 0.0, 7.0, 5.0, Some(0.0), Some(2.0), Some(18.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 0, 0, 0, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-1.0), Some(26.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 0, 0, 0, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-4.0), Some(34.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 361, 0, 20, 0, 2.0, 0.0, 7.0, 5.0, Some(0.0), Some(-1.0), Some(26.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_jack_bullet"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_JACK_SHOT, *ATTACK_REGION_OBJECT); FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 0, 4, 4); FT_SHOOTING_ATTACK_GROUND_CHECK_NEW(agent, 1, 4, 4); FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 2, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + FT_SHOOTING_ATTACK_GROUND_CHECK_NEW_arg5(agent, 3, 4, 4, Hash40::new("jack_gun_hit2"), Hash40::new("se_jack_special_n02")); + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 26.0); if is_excute(agent) { diff --git a/fighters/jack/src/lib.rs b/fighters/jack/src/lib.rs index bedca640ef..35cb2a6432 100644 --- a/fighters/jack/src/lib.rs +++ b/fighters/jack/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/jack/src/opff.rs b/fighters/jack/src/opff.rs index e0659955e4..6a337c0456 100644 --- a/fighters/jack/src/opff.rs +++ b/fighters/jack/src/opff.rs @@ -8,9 +8,8 @@ unsafe fn wings_of_rebellion_cancel(fighter: &mut L2CFighterCommon) { *FIGHTER_JACK_STATUS_KIND_SPECIAL_HI2_RUSH, *FIGHTER_JACK_STATUS_KIND_SPECIAL_HI2_END ]) - && fighter.is_situation(*SITUATION_KIND_AIR) - && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) - && !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) + && !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) && !fighter.is_in_hitlag() { if fighter.check_aerial_cancel() || fighter.check_airdodge_cancel() { @@ -21,28 +20,6 @@ unsafe fn wings_of_rebellion_cancel(fighter: &mut L2CFighterCommon) { } } -// Joker Aerial Grappling Hook stall -unsafe fn aerial_grappling_hook_stall(boma: &mut BattleObjectModuleAccessor) { - if boma.is_motion(Hash40::new("special_air_hi_throw")) { - if boma.motion_frame() < 37.0 { - KineticModule::unable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - } - else { - KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - } - } -} - -// Joker Grappling Hook Spike Cancel -unsafe fn grappling_hook_spike_cancel(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) - && fighter.is_situation(*SITUATION_KIND_AIR) - && AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) - && !boma.is_in_hitlag() { - MotionModule::set_rate(boma, 2.0); - } -} - /// Gets the last damage dealt and adds it to rebel's guage unsafe fn damage_to_meter(fighter: &mut L2CFighterCommon) { if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_JACK_INSTANCE_WORK_ID_FLAG_DOYLE) { @@ -72,8 +49,7 @@ unsafe fn arsene_dtilt_motion_change(fighter: &mut L2CFighterCommon) { unsafe fn training_mode_full_meter(fighter: &mut L2CFighterCommon) { if app::smashball::is_training_mode() && fighter.is_status(*FIGHTER_STATUS_KIND_APPEAL) - && fighter.is_button_on(Buttons::Guard) - { + && fighter.is_button_on(Buttons::Guard) { app::FighterSpecializer_Jack::add_rebel_gauge(fighter.module_accessor, app::FighterEntryID(fighter.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID)), 100.0); } } @@ -83,16 +59,7 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { && !StatusModule::is_changing(fighter.module_accessor) && fighter.is_status_one_of(&[ *FIGHTER_STATUS_KIND_SPECIAL_S, - *FIGHTER_STATUS_KIND_SPECIAL_HI, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - *FIGHTER_JACK_STATUS_KIND_SPECIAL_HI_THROW, *FIGHTER_JACK_STATUS_KIND_SPECIAL_HI2_END, - *FIGHTER_JACK_STATUS_KIND_SPECIAL_LW_HOLD, - *FIGHTER_JACK_STATUS_KIND_SPECIAL_LW_END, - *FIGHTER_JACK_STATUS_KIND_SPECIAL_LW_ATTACK, - *FIGHTER_JACK_STATUS_KIND_SPECIAL_LW_ENDURE, - *FIGHTER_JACK_STATUS_KIND_SPECIAL_LW2_COUNTER, - *FIGHTER_JACK_STATUS_KIND_SPECIAL_LW2_REFLECTOR ]) && fighter.is_situation(*SITUATION_KIND_AIR) { fighter.sub_air_check_dive(); @@ -101,8 +68,6 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { wings_of_rebellion_cancel(fighter); - aerial_grappling_hook_stall(boma); - grappling_hook_spike_cancel(fighter, boma); fastfall_specials(fighter); damage_to_meter(fighter); arsene_dtilt_motion_change(fighter); diff --git a/fighters/jack/src/status/mod.rs b/fighters/jack/src/status/mod.rs index b5ec196236..78e75dfbde 100644 --- a/fighters/jack/src/status/mod.rs +++ b/fighters/jack/src/status/mod.rs @@ -2,11 +2,11 @@ use super::*; use globals::*; // status script import -pub mod special_lw; -pub mod summon; pub mod dispatch; -pub mod special_hi2; pub mod fall; +pub mod special_hi; +pub mod special_lw; +pub mod summon; unsafe fn set_move_customizer(fighter: &mut L2CFighterCommon, customizer: unsafe extern "C" fn(&mut L2CFighterCommon) -> L2CValue) { if fighter.global_table["move_customizer_set"].get_bool() { @@ -77,7 +77,7 @@ pub fn install(agent: &mut Agent) { agent.on_start(on_start); dispatch::install(agent); - summon::install(agent); - special_hi2::install(agent); fall::install(agent); + special_hi::install(agent); + summon::install(agent); } \ No newline at end of file diff --git a/fighters/jack/src/status/special_hi2.rs b/fighters/jack/src/status/special_hi.rs similarity index 79% rename from fighters/jack/src/status/special_hi2.rs rename to fighters/jack/src/status/special_hi.rs index dacdb25fba..2f6be4bdcd 100644 --- a/fighters/jack/src/status/special_hi2.rs +++ b/fighters/jack/src/status/special_hi.rs @@ -1,5 +1,14 @@ use super::*; +pub unsafe extern "C" fn special_hi_check_attack(fighter: &mut L2CFighterCommon, param_2: &L2CValue, param_3: &L2CValue) -> L2CValue { + // Aerial Grappling Hook cancel + if fighter.is_situation(*SITUATION_KIND_AIR) && !fighter.is_in_hitlag() { + MotionModule::set_rate(fighter.module_accessor, 2.0); + } + + return 0.into(); +} + // FIGHTER_JACK_STATUS_KIND_SPECIAL_HI2_RUSH unsafe extern "C" fn special_hi2_rush_exec(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -33,6 +42,7 @@ unsafe extern "C" fn special_hi2_end_pre(fighter: &mut L2CFighterCommon) -> L2CV } pub fn install(agent: &mut Agent) { + agent.status(CheckAttack, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_check_attack); agent.status(Exec, *FIGHTER_JACK_STATUS_KIND_SPECIAL_HI2_RUSH, special_hi2_rush_exec); agent.status(Pre, *FIGHTER_JACK_STATUS_KIND_SPECIAL_HI2_END, special_hi2_end_pre); } \ No newline at end of file diff --git a/fighters/kamui/Cargo.toml b/fighters/kamui/Cargo.toml index 49b28d7991..6c46eb6baf 100644 --- a/fighters/kamui/Cargo.toml +++ b/fighters/kamui/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -interpolation = "0.2.0" \ No newline at end of file +interpolation = "0.2.0" +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/kamui/src/acmd/aerials.rs b/fighters/kamui/src/acmd/aerials.rs index f92bf3d066..94b5d3fbf4 100644 --- a/fighters/kamui/src/acmd/aerials.rs +++ b/fighters/kamui/src/acmd/aerials.rs @@ -288,9 +288,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); FT_MOTION_RATE_RANGE(agent, 6.0, 10.5, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 58, 78, 0, 34, 3.0, -1.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 58, 78, 0, 34, 3.0, -1.0, 0.0, -1.25, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 58, 78, 0, 34, 3.0, -1.0, 4.0, -1.25, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 60, 78, 0, 34, 3.0, -1.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 60, 78, 0, 34, 3.0, -1.0, 0.0, -1.25, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 60, 78, 0, 34, 3.0, -1.0, 4.0, -1.25, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("haver"), 12.0, 70, 95, 0, 46, 3.0, -1.0, 10.1, -1.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); AttackModule::set_optional_hit_sound(boma, 2, Hash40::new("se_common_fire_m")); @@ -395,8 +395,7 @@ unsafe extern "C" fn effect_landingairlw(agent: &mut L2CAgentBase) { EFFECT_OFF_KIND(agent, Hash40::new("kamui_counter_splash"), false, true); EFFECT_OFF_KIND(agent, Hash40::new("kamui_transform_splash_end"), false, true); EFFECT_FLW_POS(agent, Hash40::new("kamui_transform_splash_end"), Hash40::new("neck"), 2, 0, 0, 0, 0, 0, 1, true); - LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true); + LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } } diff --git a/fighters/kamui/src/acmd/ground.rs b/fighters/kamui/src/acmd/ground.rs index 4d6aaac737..1198559bc4 100644 --- a/fighters/kamui/src/acmd/ground.rs +++ b/fighters/kamui/src/acmd/ground.rs @@ -10,15 +10,15 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 60, 25, 0, 25, 4.5, 0.0, 9.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 25, 0, 25, 2.2, 0.0, 10.5, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 60, 25, 0, 25, 1.8, 8.0, 0.0, 0.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 60, 100, 35, 0, 4.5, 0.0, 9.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 20, 0, 2.2, 0.0, 10.5, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 60, 100, 20, 0, 1.8, 8.0, 0.0, 0.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 10, 0, 25, 2.5, 0.0, 3.5, 6.0, Some(0.0), Some(3.5), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); AttackModule::set_down_only (boma, 3, false); } wait(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("arml"), 4.0, 85, 55, 0, 20, 1.8, 13.0, 0.0, 0.4, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("arml"), 4.0, 85, 55, 0, 25, 1.8, 13.0, 0.0, 0.4, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); AttackModule::set_add_reaction_frame(boma, 2, 2.0, false); } wait(lua_state, 1.0); @@ -31,27 +31,49 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + WorkModule::on_flag(boma, *FIGHTER_KAMUI_INSTANCE_WORK_ID_FLAG_REQ_EFEECT_TRANSFORM_WIND); + } + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("kamui_attack_line_atk11"), Hash40::new("arml"), 4.5, 0, 0, 0, 90, 0, 0.5, true); + } + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 19, 8.75, 2, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 17.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_KAMUI_INSTANCE_WORK_ID_FLAG_OFF_EFEECT_TRANSFORM_WIND); + } +} + unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 2.0, 60, 22, 0, 28, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 2.0, 60, 22, 0, 28, 3.25, -1.0, 3.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 2.0, 60, 22, 0, 28, 2.25, -1.0, 10.75, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 2.0, 60, 22, 0, 28, 3.25, -1.0, 7.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("haver"), 2.0, 60, 22, 0, 28, 3.0, -1.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.0, 64, 22, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 2.0, 64, 22, 0, 35, 3.25, -1.0, 3.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 2.0, 79, 22, 0, 35, 2.25, -1.0, 10.75, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 2.0, 79, 22, 0, 35, 3.25, -1.0, 7.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("haver"), 2.0, 90, 22, 0, 30, 3.0, -1.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 7.0); if is_excute(agent) { AttackModule::clear_all(boma); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } - frame(lua_state, 8.0); + frame(lua_state, 11.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } - frame(lua_state, 10.0); + frame(lua_state, 20.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } @@ -85,11 +107,11 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 50, 150, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 50, 150, 0, 35, 3.25, 0.0, 3.5, -1.5, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 4.0, 50, 150, 0, 35, 2.25, 0.0, 10.75, -0.5, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 4.0, 50, 150, 0, 35, 3.25, 0.0, 7.5, -1.5, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("haver"), 4.0, 50, 150, 0, 35, 3.0, 0.0, 0.0, -1.5, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 50, 150, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 50, 150, 0, 35, 3.25, 0.0, 3.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 4.0, 50, 150, 0, 35, 2.25, 0.0, 10.75, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 4.0, 50, 150, 0, 35, 3.25, 0.0, 7.5, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("haver"), 4.0, 50, 150, 0, 35, 3.0, 0.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 8.0); if is_excute(agent) { @@ -144,6 +166,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); + agent.acmd("effect_attack11", effect_attack11, Priority::Low); agent.acmd("game_attack12", game_attack12, Priority::Low); agent.acmd("effect_attack12", effect_attack12, Priority::Low); diff --git a/fighters/kamui/src/acmd/other.rs b/fighters/kamui/src/acmd/other.rs index 1cb05efbc0..e2ec06e60b 100644 --- a/fighters/kamui/src/acmd/other.rs +++ b/fighters/kamui/src/acmd/other.rs @@ -83,15 +83,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -101,10 +97,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { diff --git a/fighters/kamui/src/acmd/specials.rs b/fighters/kamui/src/acmd/specials.rs index 5bec278252..b1be7c9b61 100644 --- a/fighters/kamui/src/acmd/specials.rs +++ b/fighters/kamui/src/acmd/specials.rs @@ -20,7 +20,7 @@ unsafe extern "C" fn game_specialnend1(agent: &mut L2CAgentBase) { let bkb = Lerp::lerp(&base_bkb, &max_bkb, &lerp); let kbg = Lerp::lerp(&base_kbg, &max_kbg, &lerp); let size = Lerp::lerp(&base_size, &max_size, &lerp); - ATTACK(agent, 0, 0, Hash40::new("havel"), damage, 48, kbg, 0, bkb, size, 0.0, -3.0, 0.0, Some(0.0), Some(3.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 0, 0, Hash40::new("havel"), damage, 45, kbg, 0, bkb, size, 0.0, -3.0, 0.0, Some(0.0), Some(3.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); } } frame(lua_state, 10.0); @@ -62,10 +62,10 @@ unsafe extern "C" fn game_specialnend2(agent: &mut L2CAgentBase) { let kbg = Lerp::lerp(&base_kbg, &max_kbg, &lerp); let size = Lerp::lerp(&base_size, &max_size, &lerp); if WorkModule::is_flag(article_boma, *WEAPON_KAMUI_DRAGONHAND_INSTANCE_WORK_ID_FLAG_IS_KAMUI) { - ATTACK(agent, 0, 0, Hash40::new("top"), damage, 48, kbg, 0, bkb, size, 0.0, 9.0, 22.0, Some(0.0), Some(9.0), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 0, 0, Hash40::new("top"), damage, 45, kbg, 0, bkb, size, 0.0, 9.0, 22.0, Some(0.0), Some(9.0), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); } else { - ATTACK(agent, 0, 0, Hash40::new("top"), damage, 48, kbg, 0, bkb, size, 0.0, 8.9, 22.0, Some(0.0), Some(8.9), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 0, 0, Hash40::new("top"), damage, 45, kbg, 0, bkb, size, 0.0, 8.9, 22.0, Some(0.0), Some(8.9), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); } } } diff --git a/fighters/kamui/src/acmd/throws.rs b/fighters/kamui/src/acmd/throws.rs index bc192d1693..a3e8a7aefb 100644 --- a/fighters/kamui/src/acmd/throws.rs +++ b/fighters/kamui/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.5, 0.0, Some(0.0), Some(7.5), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.5, 4.0, Some(0.0), Some(7.5), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -29,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 4.0, Some(0.0), Some(6.0), Some(10.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 4.5, Some(0.0), Some(6.0), Some(10.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-14.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-12.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/kamui/src/lib.rs b/fighters/kamui/src/lib.rs index 929cbbc242..47dabde3ac 100644 --- a/fighters/kamui/src/lib.rs +++ b/fighters/kamui/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/ken/Cargo.toml b/fighters/ken/Cargo.toml index 9d9ce09990..34fe73a1f5 100644 --- a/fighters/ken/Cargo.toml +++ b/fighters/ken/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/ken/src/acmd/other.rs b/fighters/ken/src/acmd/other.rs index b8561fbfc4..7144eb9e57 100644 --- a/fighters/ken/src/acmd/other.rs +++ b/fighters/ken/src/acmd/other.rs @@ -64,15 +64,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -82,10 +78,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { boma.on_flag(*FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_guarddamage(agent: &mut L2CAgentBase) { diff --git a/fighters/ken/src/acmd/specials/special_command.rs b/fighters/ken/src/acmd/specials/special_command.rs index 7b4dcf8706..fa418b0bfe 100644 --- a/fighters/ken/src/acmd/specials/special_command.rs +++ b/fighters/ken/src/acmd/specials/special_command.rs @@ -100,7 +100,7 @@ unsafe extern "C" fn game_attackcommand3(agent: &mut L2CAgentBase) { frame(lua_state, 15.0); if is_excute(agent) { MeterModule::watch_damage(agent.battle_object, true); - ATTACK(agent, 0, 1, Hash40::new("kneer"), 12.0 * dmg, 30, 80, 0, 35, 3.0, 6.3, 0.0, 0.0, Some(2.0), Some(0.0), Some(0.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KEN_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 1, Hash40::new("kneer"), 12.0 * dmg, 30, 80, 0, 35, 3.0, 6.3, 0.0, 0.0, Some(2.0), Some(0.0), Some(0.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 16, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KEN_KICK, *ATTACK_REGION_KICK); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.25); AttackModule::set_attack_height_all(boma, AttackHeight(*ATTACK_HEIGHT_HIGH), false); } diff --git a/fighters/ken/src/acmd/throws.rs b/fighters/ken/src/acmd/throws.rs index 9c1006289d..f62211ffff 100644 --- a/fighters/ken/src/acmd/throws.rs +++ b/fighters/ken/src/acmd/throws.rs @@ -21,14 +21,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 9.0, 0.0, Some(0.0), Some(9.0), Some(7.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 9.0, 4.2, Some(0.0), Some(9.0), Some(9.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -68,7 +67,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-13.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, -6.0, Some(0.0), Some(8.0), Some(-13.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/ken/src/lib.rs b/fighters/ken/src/lib.rs index 6016f2eca8..407237fd53 100644 --- a/fighters/ken/src/lib.rs +++ b/fighters/ken/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/ken/src/status/special_s.rs b/fighters/ken/src/status/special_s.rs index 7b76bf81ab..13f7f93a50 100644 --- a/fighters/ken/src/status/special_s.rs +++ b/fighters/ken/src/status/special_s.rs @@ -283,7 +283,7 @@ unsafe extern "C" fn special_s_loop_main_loop(fighter: &mut L2CFighterCommon) -> pub unsafe extern "C" fn special_s_loop_exec(fighter: &mut L2CFighterCommon) -> L2CValue { // reduce speed on hitting shield - if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) { + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { let strength = fighter.get_int(*FIGHTER_RYU_STATUS_WORK_ID_SPECIAL_COMMON_INT_STRENGTH); let speed_x = if fighter.is_situation(*SITUATION_KIND_GROUND) { if VarModule::is_flag(fighter.battle_object, vars::shotos::instance::EX_SPECIAL_USED) { diff --git a/fighters/kirby/Cargo.toml b/fighters/kirby/Cargo.toml index 6504604bd4..0a806b42b6 100644 --- a/fighters/kirby/Cargo.toml +++ b/fighters/kirby/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/kirby/src/acmd/copy.rs b/fighters/kirby/src/acmd/copy.rs index 4e9909ea2f..fa6c9f62d7 100644 --- a/fighters/kirby/src/acmd/copy.rs +++ b/fighters/kirby/src/acmd/copy.rs @@ -1,5 +1,7 @@ use super::*; +mod brave; +mod buddy; mod chrom; mod daisy; mod diddy; @@ -16,6 +18,7 @@ mod luigi; mod mario; mod mariod; mod mewtwo; +mod miifighter; mod miigunner; mod palutena; mod pfushigisou; @@ -32,6 +35,8 @@ mod trail; mod wolf; pub fn install(agent: &mut Agent) { + brave::install(agent); + buddy::install(agent); chrom::install(agent); daisy::install(agent); diddy::install(agent); @@ -48,6 +53,7 @@ pub fn install(agent: &mut Agent) { mario::install(agent); mariod::install(agent); mewtwo::install(agent); + miifighter::install(agent); miigunner::install(agent); palutena::install(agent); pfushigisou::install(agent); diff --git a/fighters/kirby/src/acmd/copy/brave.rs b/fighters/kirby/src/acmd/copy/brave.rs new file mode 100644 index 0000000000..83f18ddc83 --- /dev/null +++ b/fighters/kirby/src/acmd/copy/brave.rs @@ -0,0 +1,93 @@ +use super::*; + +unsafe extern "C" fn sound_bravespecialn1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let rng = app::sv_math::rand(smash::hash40("fighter"), 2); + let sound = if rng == 0 { "vc_kirby_copy_brave_02" } else { "vc_kirby_copy_brave_05" }; + + frame(lua_state, 1.0); + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_brave_special_n01")); + } + } + frame(lua_state, 8.0); + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_brave_special_n02")); + PLAY_SE(agent, Hash40::new(sound)); + } + } + else { + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_brave_special_n01")); + PLAY_SE(agent, Hash40::new("se_brave_miss")); + } + } +} + + +unsafe extern "C" fn sound_bravespecialn2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let rng = app::sv_math::rand(smash::hash40("fighter"), 2); + let sound = if rng == 0 { "vc_kirby_copy_brave_03" } else { "vc_kirby_copy_brave_06" }; + + frame(lua_state, 1.0); + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_brave_special_n01")); + } + } + frame(lua_state, 11.0); + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_brave_special_n03")); + PLAY_SE(agent, Hash40::new(sound)); + } + } + else { + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_brave_special_n01")); + PLAY_SE(agent, Hash40::new("se_brave_miss")); + } + } +} + +unsafe extern "C" fn sound_bravespecialn3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let rng = app::sv_math::rand(smash::hash40("fighter"), 2); + let sound = if rng == 0 { "vc_kirby_copy_brave_04" } else { "vc_kirby_copy_brave_07" }; + + frame(lua_state, 1.0); + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_brave_special_n07")); + STOP_SE(agent, Hash40::new("se_brave_special_n04")); + } + } + frame(lua_state, 17.0); + if WorkModule::is_flag(boma, *FIGHTER_BRAVE_STATUS_SPECIAL_N_FLAG_SUCCESS_SP) { + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_brave_special_n05")); + PLAY_SE(agent, Hash40::new(sound)); + } + } + else { + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_brave_special_n04")); + PLAY_SE(agent, Hash40::new("se_brave_miss")); + } + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("sound_bravespecialn1", sound_bravespecialn1, Priority::Low); + agent.acmd("sound_bravespecialairn1", sound_bravespecialn1, Priority::Low); + agent.acmd("sound_bravespecialn2", sound_bravespecialn2, Priority::Low); + agent.acmd("sound_bravespecialairn2", sound_bravespecialn2, Priority::Low); + agent.acmd("sound_bravespecialn3", sound_bravespecialn3, Priority::Low); + agent.acmd("sound_bravespecialairn3", sound_bravespecialn3, Priority::Low); +} \ No newline at end of file diff --git a/fighters/kirby/src/acmd/copy/buddy.rs b/fighters/kirby/src/acmd/copy/buddy.rs index 73147aed03..26d0eda3ca 100644 --- a/fighters/kirby/src/acmd/copy/buddy.rs +++ b/fighters/kirby/src/acmd/copy/buddy.rs @@ -1,259 +1,183 @@ use super::*; -// unsafe fn will_bayonet(agent: &mut L2CAgentBase) -> bool { -// let boma = agent.boma(); -// let is_csticking = ControlModule::get_command_flag_cat(boma, 0) & *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_S4 != 0; -// if WorkModule::get_int(boma, *FIGHTER_KIRBY_INSTANCE_WORK_ID_INT_COPY_CHARA) == *FIGHTER_KIND_BUDDY -// && (is_csticking) { -// return true; -// } -// return false; -//} - -// Normals -unsafe extern "C" fn game_buddyattacks3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, false, 0); - ArticleModule::change_motion(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("attack_s3_s"), false, 0.0); - } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 45, 67, 0, 46, 3.2, 0.0, 7.2, 13.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 45, 71, 0, 46, 2.6, 0.0, 7.2, 18.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 67, 0, 46, 3.6, 0.0, 7.2, 7.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - } - frame(lua_state, 12.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 50.0); - if is_excute(agent) { - ArticleModule::remove_exist(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - } -} - -unsafe extern "C" fn effect_buddyattacks3(agent: &mut L2CAgentBase) { +// Specials +unsafe extern "C" fn game_buddyspecialnfire(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 7.0); - if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 9.0); if is_excute(agent) { - EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 6.5, 9.5, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 6.5, 7, 0, 0, 0, 0.75, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 1.6); - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), -0.5, 7, 19, 0, 0, 0, 0.9, true); - } - frame(lua_state, 31.0); - if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_EFFECT_KIND_FLYING, Hash40::new("k_bag_bottom"), -3, 4, 0, 0, 0, 0, 0.6, true); - LAST_EFFECT_SET_RATE(agent, 1.6); + VarModule::off_flag(boma.object(), vars::buddy::instance::SPECIAL_N_LAND_CANCEL); } - frame(lua_state, 34.0); + frame(lua_state, 13.0); if is_excute(agent) { - EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_EFFECT_KIND_FLYING, false, true); + if !VarModule::is_flag(boma.object(), vars::buddy::instance::SPECIAL_N_LAND_CANCEL) { + WorkModule::on_flag(boma, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_GENERATE_BULLET); + WorkModule::on_flag(boma, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_ENABLE_SHOOT); + } } } -unsafe extern "C" fn sound_buddyattacks3(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_buddyspecialnfire(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 2.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s01")); - } - frame(lua_state, 8.0); + frame(lua_state, 13.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s02")); + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - if IS_RANDOM(agent, 2) { + if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 + && !VarModule::is_flag(boma.object(), vars::buddy::instance::SPECIAL_N_LAND_CANCEL) { if is_excute(agent) { - PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s01")); + EFFECT_FOLLOW(agent, Hash40::new("buddy_missile_shot_l"), Hash40::new("top"), 0, 10, 9, 0, 0, 0, 1, false); + } + else { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("buddy_missile_shot_r"), Hash40::new("top"), 0, 10, 9, 0, 0, 0, 1, false); } - } - frame(lua_state, 11.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s02")); - } - frame(lua_state, 20.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s03")); - } - frame(lua_state, 34.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_special_n04_01")); - } - frame(lua_state, 64.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_special_n04_02")); } } - -unsafe extern "C" fn expression_buddyattacks3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - ItemModule::set_have_item_visibility(boma, false, 0); - } - frame(lua_state, 7.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - frame(lua_state, 9.0); - if is_excute(agent) { - RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); - } +if is_excute(agent) { + EFFECT_FOLLOW_WORK(agent, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_EFFECT_KIND_FLYING, Hash40::new("k_all"), 0, -6, 0, 0, 0, 0, 0.8, true); } - -unsafe extern "C" fn game_buddyattacks3hi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, false, 0); - ArticleModule::change_motion(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("attack_s3_hi"), false, 0.0); - } - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 50, 67, 0, 46, 3.2, 0.0, 14.2, 12.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 50, 71, 0, 46, 2.6, 0.0, 16.2, 17.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 50, 67, 0, 46, 3.6, 0.0, 12.4, 6.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - } - frame(lua_state, 12.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 50.0); - if is_excute(agent) { - ArticleModule::remove_exist(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - } +frame(lua_state, 16.0); +if is_excute(agent) { + EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_EFFECT_KIND_FLYING, false, true); } - -unsafe extern "C" fn effect_buddyattacks3hi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 7.0); - if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 9.0); - if is_excute(agent) { - EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 11, 9.5, -26, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 10, 6.5, -26, 0, 0, 0.75, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 1.6); - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), -0.5, 15, 18, 0, 0, 0, 0.9, true); - } - frame(lua_state, 31.0); - if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_EFFECT_KIND_FLYING, Hash40::new("k_bag_bottom"), -3, 4, 0, 0, 0, 0, 0.6, true); - LAST_EFFECT_SET_RATE(agent, 1.6); - } - frame(lua_state, 34.0); - if is_excute(agent) { - EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_EFFECT_KIND_FLYING, false, true); - } } -unsafe extern "C" fn sound_buddyattacks3hi(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_buddyspecialnfire(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 2.0); + frame(lua_state, 3.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s01")); + PLAY_SE(agent, Hash40::new("se_buddy_special_n01")); } - frame(lua_state, 8.0); + frame(lua_state, 42.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s02")); - } - if IS_RANDOM(agent, 2) { - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s01")); + if !VarModule::is_flag(boma.object(), vars::buddy::instance::SPECIAL_N_LAND_CANCEL) { + PLAY_SE(agent, Hash40::new("se_buddy_special_n04_01")); } } - frame(lua_state, 11.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s02")); - } - frame(lua_state, 20.0); + frame(lua_state, 55.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s03")); + PLAY_SE(agent, Hash40::new("se_buddy_step_left_m")); } - frame(lua_state, 34.0); + frame(lua_state, 61.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_special_n04_01")); + PLAY_SE(agent, Hash40::new("se_buddy_step_right_m")); } - frame(lua_state, 64.0); + frame(lua_state, 73.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_buddy_special_n04_02")); } } -unsafe extern "C" fn expression_buddyattacks3hi(agent: &mut L2CAgentBase) { +unsafe extern "C" fn expression_buddyspecialnfire(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - ItemModule::set_have_item_visibility(boma, false, 0); } - frame(lua_state, 7.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - frame(lua_state, 9.0); + frame(lua_state, 11.0); if is_excute(agent) { - RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + if !VarModule::is_flag(boma.object(), vars::buddy::instance::SPECIAL_N_LAND_CANCEL) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_beams"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } } } -unsafe extern "C" fn game_buddyattacks3lw(agent: &mut L2CAgentBase) { +const KIRBY_OFFSET_Y: f32 = -2.0; +const KIRBY_OFFSET_Z: f32 = -2.0; + +unsafe extern "C" fn game_buddyspecialnattack(agent: &mut L2CAgentBase) { + let mut is_hi = false; + let mut is_lw = false; + let mut is_s = false; let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, false, 0); - ArticleModule::change_motion(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("attack_s3_lw"), false, 0.0); + let motion = MotionModule::motion_kind(boma); + is_hi = motion == hash40("buddy_special_n_attack_hi"); + is_lw = motion == hash40("buddy_special_n_attack_lw"); + is_s = !is_hi && !is_lw; + //ArticleModule::generate_article(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, false, 0); } frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.75); frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 40, 67, 0, 46, 3.2, 0.0, 2.8, 12.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 40, 71, 0, 46, 2.6, 0.0, 1.2, 17.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 40, 67, 0, 46, 3.6, 0.0, 4.2, 6.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + if is_hi { + let offset_y = KIRBY_OFFSET_Y-3.0; + let offset_z = KIRBY_OFFSET_Z; + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 50, 67, 0, 46, 3.2, 0.0, 12.4+offset_y, 6.8+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 50, 71, 0, 46, 2.6, 0.0, 16.2+offset_y, 17.4+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 50, 67, 0, 46, 3.6, 0.0, 14.2+offset_y, 12.2+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + } + else if is_s { + let offset_y = KIRBY_OFFSET_Y; + let offset_z = KIRBY_OFFSET_Z; + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 45, 67, 0, 46, 3.2, 0.0, 7.2+offset_y, 7.4+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 45, 71, 0, 46, 2.6, 0.0, 7.2+offset_y, 18.4+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 67, 0, 46, 3.6, 0.0, 7.2+offset_y, 13.2+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + } + else { + let offset_y = KIRBY_OFFSET_Y+2.0; + let offset_z = KIRBY_OFFSET_Z; + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 40, 67, 0, 46, 3.2, 0.0, 4.2+offset_y, 6.8+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 40, 71, 0, 46, 2.6, 0.0, 1.2+offset_y, 17.4+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 40, 67, 0, 46, 3.6, 0.0, 2.8+offset_y, 12.2+offset_z, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + } } frame(lua_state, 12.0); if is_excute(agent) { - AttackModule::clear_all(boma); + AttackModule::clear_all(boma); } - frame(lua_state, 50.0); + frame(lua_state, 24.0); if is_excute(agent) { - ArticleModule::remove_exist(boma, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + WorkModule::on_flag(boma, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_END); } } - -unsafe extern "C" fn effect_buddyattacks3lw(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_buddyspecialnattack(agent: &mut L2CAgentBase) { + let mut is_hi = false; + let mut is_lw = false; + let mut is_s = false; let lua_state = agent.lua_state_agent; let boma = agent.boma(); + if is_excute(agent) { + let motion = MotionModule::motion_kind(boma); + is_hi = motion == hash40("buddy_special_n_attack_hi"); + is_lw = motion == hash40("buddy_special_n_attack_lw"); + is_s = !is_hi && !is_lw; + } frame(lua_state, 7.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 9.0); if is_excute(agent) { - EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 3.5, 9.5, 15, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 3.5, 6, 15, 0, 0, 0.75, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 1.6); - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 0, 0.8, 17.5, 0, 0, 0, 0.9, true); + if is_hi { + let offset_y = KIRBY_OFFSET_Y-2.0; + let offset_z = KIRBY_OFFSET_Z; + EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 11.0+offset_y, 9.5+offset_z, -26, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 10.0+offset_y, 6.5+offset_z, -26, 0, 0, 0.75, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.6); + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), -0.5, 15.0+offset_y, 18.0+offset_z, 0, 0, 0, 0.9, true); + } + else if is_s { + let offset_y = KIRBY_OFFSET_Y; + let offset_z = KIRBY_OFFSET_Z; + EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 6.5+offset_y, 9.5+offset_z, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 6.5+offset_y, 7.0+offset_z, 0, 0, 0, 0.75, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.6); + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), -0.5, 7, 19, 0, 0, 0, 0.9, true); + } + else { + let offset_y = KIRBY_OFFSET_Y+2.0; + let offset_z = KIRBY_OFFSET_Z; + EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 3.5+offset_y, 9.5+offset_z, 15, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, 0.5); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("buddy_attack_line"), Hash40::new("buddy_attack_line"), Hash40::new("top"), 0, 3.5+offset_y, 6.0+offset_z, 15, 0, 0, 0.75, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.6); + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 0, 0.8+offset_y, 17.5+offset_z, 0, 0, 0, 0.9, true); + } } frame(lua_state, 31.0); if is_excute(agent) { @@ -266,7 +190,7 @@ unsafe extern "C" fn effect_buddyattacks3lw(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn sound_buddyattacks3lw(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_buddyspecialnattack(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 2.0); @@ -277,30 +201,13 @@ unsafe extern "C" fn sound_buddyattacks3lw(agent: &mut L2CAgentBase) { if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s02")); } - if IS_RANDOM(agent, 2) { - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s01")); - } - } - frame(lua_state, 11.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("vc_buddy_attackhard_s02")); - } frame(lua_state, 20.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_attackhard_s03")); - } - frame(lua_state, 34.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_special_n04_01")); - } - frame(lua_state, 64.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_special_n04_02")); + PLAY_STATUS(agent, Hash40::new("se_buddy_attackhard_s03")); } } -unsafe extern "C" fn expression_buddyattacks3lw(agent: &mut L2CAgentBase) { +unsafe extern "C" fn expression_buddyspecialnattack(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { @@ -316,95 +223,25 @@ unsafe extern "C" fn expression_buddyattacks3lw(agent: &mut L2CAgentBase) { RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); } } - -// Specials -unsafe extern "C" fn effect_buddyspecialnfire(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 13.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 - && !VarModule::is_flag(boma.object(), vars::buddy::instance::SPECIAL_N_LAND_CANCEL) { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("buddy_missile_shot_l"), Hash40::new("top"), 0, 10, 9, 0, 0, 0, 1, false); - } - else { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("buddy_missile_shot_r"), Hash40::new("top"), 0, 10, 9, 0, 0, 0, 1, false); - } - } -} -if is_excute(agent) { - EFFECT_FOLLOW_WORK(agent, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_EFFECT_KIND_FLYING, Hash40::new("k_all"), 0, -6, 0, 0, 0, 0, 0.8, true); -} -frame(lua_state, 16.0); -if is_excute(agent) { - EFFECT_OFF_KIND_WORK(agent, *FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_EFFECT_KIND_FLYING, false, true); -} -} - -unsafe extern "C" fn sound_buddyspecialnfire(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 3.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_special_n01")); - } - frame(lua_state, 42.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::buddy::instance::SPECIAL_N_LAND_CANCEL) { - PLAY_SE(agent, Hash40::new("se_buddy_special_n04_01")); - } - } - frame(lua_state, 55.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_step_left_m")); - } - frame(lua_state, 61.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_step_right_m")); - } - frame(lua_state, 73.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_buddy_special_n04_02")); - } -} - -unsafe extern "C" fn expression_buddyspecialnfire(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - } - frame(lua_state, 11.0); - if is_excute(agent) { - if !VarModule::is_flag(boma.object(), vars::buddy::instance::SPECIAL_N_LAND_CANCEL) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_beams"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - } +unsafe extern "C" fn game_buddyspecialnattackend(agent: &mut L2CAgentBase) { + FT_MOTION_RATE(agent, 0.75); + wait(agent.lua_state_agent, 36.0); + FT_MOTION_RATE(agent, 0.25); + frame(agent.lua_state_agent, 40.0); + FT_MOTION_RATE(agent, 1.0); } pub fn install(agent: &mut Agent) { - // Normals - //agent.acmd("game_buddyattacks3", game_buddyattacks3, Priority::Low); - //agent.acmd("effect_buddyattacks3", effect_buddyattacks3, Priority::Low); - //agent.acmd("sound_buddyattacks3", sound_buddyattacks3, Priority::Low); - //agent.acmd("expression_buddyattacks3", expression_buddyattacks3, Priority::Low); - - //agent.acmd("game_buddyattacks3hi", game_buddyattacks3hi, Priority::Low); - //agent.acmd("effect_buddyattacks3hi", effect_buddyattacks3hi, Priority::Low); - //agent.acmd("sound_buddyattacks3hi", sound_buddyattacks3hi, Priority::Low); - //agent.acmd("expression_buddyattacks3hi", expression_buddyattacks3hi, Priority::Low); - - //agent.acmd("game_buddyattacks3lw", game_buddyattacks3lw, Priority::Low); - //agent.acmd("effect_buddyattacks3lw", effect_buddyattacks3lw, Priority::Low); - //agent.acmd("sound_buddyattacks3lw", sound_buddyattacks3lw, Priority::Low); - //agent.acmd("expression_buddyattacks3lw", expression_buddyattacks3lw, Priority::Low); - // Specials + agent.acmd("game_buddyspecialnfire", game_buddyspecialnfire, Priority::Low); agent.acmd("effect_buddyspecialnfire", effect_buddyspecialnfire, Priority::Low); agent.acmd("sound_buddyspecialnfire", sound_buddyspecialnfire, Priority::Low); agent.acmd("expression_buddyspecialnfire", expression_buddyspecialnfire, Priority::Low); + + agent.acmd("game_buddyspecialnattack", game_buddyspecialnattack, Priority::Low); + agent.acmd("effect_buddyspecialnattack", effect_buddyspecialnattack, Priority::Low); + agent.acmd("sound_buddyspecialnattack", sound_buddyspecialnattack, Priority::Low); + agent.acmd("expression_buddyspecialnattack", expression_buddyspecialnattack, Priority::Low); + + agent.acmd("game_buddyspecialnattackend", game_buddyspecialnattackend, Priority::Low); } diff --git a/fighters/kirby/src/acmd/copy/chrom.rs b/fighters/kirby/src/acmd/copy/chrom.rs index 93d70ec642..3f6f0d2173 100644 --- a/fighters/kirby/src/acmd/copy/chrom.rs +++ b/fighters/kirby/src/acmd/copy/chrom.rs @@ -8,10 +8,10 @@ unsafe extern "C" fn effect_chromspecialnend(agent: &mut L2CAgentBase) { EFFECT_OFF_KIND(agent, Hash40::new("chrom_volcano_hold_2"), false, false); EFFECT_FOLLOW(agent, Hash40::new("chrom_sword_purple"), Hash40::new("havel"), 0, 1.25, 0, -90, 90, 0, 1, true); } - //frame(lua_state, 3.0); - //if is_excute(agent) { - //AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_chrom_sword1"), Hash40::new("tex_chrom_sword2"), 8, Hash40::new("sword1"), 0.0, 0.0, 1.65, Hash40::new("sword1"), -0.0, -0.0, 12.4, false, Hash40::new("chrom_sword"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.2, 0.2); - //} + frame(lua_state, 3.0); + if is_excute(agent) { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_chrom_stormsword1"), Hash40::new("tex_chrom_stormsword2"), 8, Hash40::new("havel"), 0.0, 1.65, 0.0, Hash40::new("havel"), 0.0, 12.4, 0.0, false, Hash40::new("null"), Hash40::new("havel"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.2, 0.2); + } frame(lua_state, 12.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 17, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); @@ -30,6 +30,15 @@ unsafe extern "C" fn effect_chromspecialnend(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn sound_chromspecialnend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_chrom_special_n02")); + } +} + unsafe extern "C" fn expression_chromspecialnend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -84,9 +93,141 @@ unsafe extern "C" fn expression_chromspecialairnend(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_chromspecialnend2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("chrom_volcano_hold_1"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("chrom_volcano_hold_2"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("chrom_sword_purple"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1, true); + } + frame(lua_state, 3.0); + if is_excute(agent) { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_chrom_stormsword1"), Hash40::new("tex_chrom_stormsword2"), 8, Hash40::new("havel"), 0.0, 0.0, 1.65, Hash40::new("havel"), -0.0, -0.0, 12.4, false, Hash40::new("chrom_sword"), Hash40::new("havel"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.2, 0.2); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("chrom_volcano_a"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 0.96, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT(agent, Hash40::new("chrom_volcano_b"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 0.96, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT(agent, Hash40::new("chrom_volcano_parts_1b"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 0.84, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.9); + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 17, 0, 0, 0, 0, 0, 0.96, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 12.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 17, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 6); + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 38.0); + if is_excute(agent) { + COL_NORMAL(agent); + EFFECT_OFF_KIND(agent, Hash40::new("chrom_sword_purple"), false, false); + } +} + +unsafe extern "C" fn effect_chromspecialnend3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("chrom_volcano_hold_1"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("chrom_volcano_hold_2"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("chrom_sword_purple"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1, true); + } + frame(lua_state, 3.0); + if is_excute(agent) { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_chrom_stormsword1"), Hash40::new("tex_chrom_stormsword2"), 8, Hash40::new("havel"), 0.0, 0.0, 1.65, Hash40::new("havel"), -0.0, -0.0, 12.4, false, Hash40::new("chrom_sword"), Hash40::new("havel"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.2, 0.2); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("chrom_volcano_parts_2"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.85); + EFFECT(agent, Hash40::new("chrom_volcano_c"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.6); + EFFECT(agent, Hash40::new("chrom_volcano_d"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.6); + EFFECT(agent, Hash40::new("chrom_volcano_parts_1"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.08, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.9); + EFFECT(agent, Hash40::new("chrom_volcano_spark"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.55); + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 17, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 12.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 17, 0, 0, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 6); + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 38.0); + if is_excute(agent) { + COL_NORMAL(agent); + EFFECT_OFF_KIND(agent, Hash40::new("chrom_sword_purple"), false, false); + } +} + +unsafe extern "C" fn effect_chromspecialnendmax(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("chrom_volcano_hold_1"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("chrom_volcano_hold_2"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("chrom_sword_purple"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_chrom_stormsword1"), Hash40::new("tex_chrom_stormsword2"), 12, Hash40::new("havel"), 0, 1.65, 0, Hash40::new("havel"), -0.0, 12.4, 0, true, Hash40::new("chrom_sword"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.2, 0.2); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("chrom_volcano_parts_3"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.85); + EFFECT(agent, Hash40::new("chrom_volcano_c"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.32, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.4); + EFFECT(agent, Hash40::new("chrom_volcano_d"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.32, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.4); + EFFECT(agent, Hash40::new("chrom_volcano_parts_1"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.9); + EFFECT(agent, Hash40::new("chrom_volcano_spark"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.48); + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 17, 0, 0, 0, 0, 0, 1.38, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 12.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 17, 0, 0, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 13.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + AFTER_IMAGE_OFF(agent, 6); + } + frame(lua_state, 46.0); + if is_excute(agent) { + COL_NORMAL(agent); + EFFECT_OFF_KIND(agent, Hash40::new("chrom_sword_purple"), false, false); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("effect_chromspecialnend", effect_chromspecialnend, Priority::Low); agent.acmd("effect_chromspecialairnend", effect_chromspecialnend, Priority::Low); + agent.acmd("sound_chromspecialnend", sound_chromspecialnend, Priority::Low); + agent.acmd("sound_chromspecialairnend", sound_chromspecialnend, Priority::Low); agent.acmd("expression_chromspecialnend", expression_chromspecialnend, Priority::Low); agent.acmd("expression_chromspecialairnend", expression_chromspecialairnend, Priority::Low); + + agent.acmd("effect_chromspecialnend2", effect_chromspecialnend2, Priority::Low); + agent.acmd("effect_chromspecialairnend2", effect_chromspecialnend2, Priority::Low); + agent.acmd("effect_chromspecialnend3", effect_chromspecialnend3, Priority::Low); + agent.acmd("effect_chromspecialairnend3", effect_chromspecialnend3, Priority::Low); + agent.acmd("effect_chromspecialnendmax", effect_chromspecialnendmax, Priority::Low); + agent.acmd("effect_chromspecialairnendmax", effect_chromspecialnendmax, Priority::Low); } \ No newline at end of file diff --git a/fighters/kirby/src/acmd/copy/krool.rs b/fighters/kirby/src/acmd/copy/krool.rs index 9bfe0a73a4..2f5bfe36d5 100644 --- a/fighters/kirby/src/acmd/copy/krool.rs +++ b/fighters/kirby/src/acmd/copy/krool.rs @@ -1,8 +1,62 @@ use super::*; +unsafe extern "C" fn game_kroolspecialnfire(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 25.0, 13.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (25.0 - 1.0)/13.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB); + } + frame(lua_state, 25.0); + FT_MOTION_RATE(agent, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, 1.0); + if is_excute(agent) { + if boma.is_button_on(Buttons::SpecialRaw) { + VarModule::on_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB); + agent.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_IRONBALL); + } + else { + VarModule::on_flag(agent.battle_object, vars::krool::status::SPECIAL_N_ANGLED); + } + } + frame(lua_state, 26.0); + if VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { + FT_MOTION_RATE_RANGE(agent, 26.0, 37.0, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (37.0 - 26.0)/1.0); + } + else { + FT_MOTION_RATE_RANGE(agent, 26.0, 30.0, 8.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (30.0 - 26.0)/8.0); + } + frame(lua_state, 30.0); + FT_MOTION_RATE(agent, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_CANCEL); + if !VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { + WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL); + } + } + frame(lua_state, 37.0); + FT_MOTION_RATE_RANGE(agent, 37.0, 70.0, 25.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (70.0 - 37.0)/25.0); + frame(lua_state, 70.0); + FT_MOTION_RATE(agent, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, 1.0); +} + unsafe extern "C" fn effect_kroolspecialnfire(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 25.0); + if is_excute(agent) { + if boma.is_button_on(Buttons::SpecialRaw) { + EFFECT_FOLLOW(agent, Hash40::new("sys_sp_flash"), Hash40::new("top"), 4, 13, 12, 0, 0, 0, 0.5, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + } frame(lua_state, 30.0); if is_excute(agent) { if agent.is_situation(*SITUATION_KIND_GROUND) { @@ -26,12 +80,12 @@ unsafe extern "C" fn sound_kroolspecialnfire(agent: &mut L2CAgentBase) { } frame(lua_state, 31.0); if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL) { - PLAY_SE(agent, Hash40::new("se_krool_special_n07")); - } - else if !VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { + if WorkModule::is_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL) { PLAY_SE(agent, Hash40::new("se_krool_special_n01")); } + else { + PLAY_SE(agent, Hash40::new("se_krool_special_n07")); + } } frame(lua_state, 60.0); if is_excute(agent) { @@ -43,18 +97,15 @@ unsafe extern "C" fn expression_kroolspecialnfire(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - ItemModule::set_have_item_visibility(boma, false, 0); - VisibilityModule::set_int64(boma, hash40("crown") as i64, hash40("crown_hide") as i64); - } - if IS_EXIST_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT) { - if is_excute(agent) { - ArticleModule::set_visibility_whole(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, true, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); } + ItemModule::set_have_item_visibility(boma, false, 0); } frame(lua_state, 30.0); - if is_excute(agent) { - if !VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) && IS_GENERATABLE_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { + if IS_GENERATABLE_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) + && !VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { + if is_excute(agent) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } @@ -62,55 +113,237 @@ unsafe extern "C" fn expression_kroolspecialnfire(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_attackm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 76.0); + frame(lua_state, 89.0); if is_excute(agent) { - VisibilityModule::set_int64(boma, hash40("crown") as i64, hash40("crown_normal") as i64); + ItemModule::set_have_item_visibility(boma, true, 0); } +} + +unsafe extern "C" fn game_kroolspecialnfirehi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); if is_excute(agent) { - if IS_EXIST_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT) { + MotionModule::set_rate(boma, 1.4); + } + frame(lua_state, 8.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.25); + } + frame(lua_state, 13.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.0); + } + frame(lua_state, 16.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL); + } +} + +unsafe extern "C" fn effect_kroolspecialnfirehi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 16.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("krool_cannon_shot"), Hash40::new("haver"), 0, 2, 25, 0, 0, 0, 1.3, true); + } + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("krool_cannon_shot"), -1); + } +} + +unsafe extern "C" fn sound_kroolspecialnfirehi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 17.0); + if is_excute(agent) { + if WorkModule::is_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL) { + PLAY_SE(agent, Hash40::new("se_krool_special_n07")); + } + else { + PLAY_SE(agent, Hash40::new("se_krool_special_n01")); + } + } +} + +unsafe extern "C" fn expression_kroolspecialnfirehi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + } + frame(lua_state, 17.0); + if is_excute(agent) { + if IS_GENERATABLE_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { + QUAKE(agent, *CAMERA_QUAKE_KIND_S); + } + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 56.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("crown") as i64, hash40("crown_normal") as i64); + if ArticleModule::is_exist(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT) { ArticleModule::set_visibility_whole(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, false, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); } } - frame(lua_state, 89.0); + frame(lua_state, 65.0); if is_excute(agent) { ItemModule::set_have_item_visibility(boma, true, 0); } } -unsafe extern "C" fn effect_kroolspecialnloop(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_kroolspecialnfireb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); if is_excute(agent) { - if VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { - EFFECT_FOLLOW(agent, Hash40::new("krool_cannon_vacuum"), Hash40::new("top"), 0, 10, 17, 0, 0, 0, 0.8, true); + MotionModule::set_rate(boma, 1.4); + } + frame(lua_state, 8.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.25); + } + frame(lua_state, 13.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.0); + } + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 22.0, 4.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (22.0 - 15.0)/4.0); + if is_excute(agent) { + REVERSE_LR(agent); + } + frame(lua_state, 22.0); + FT_MOTION_RATE(agent, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL); + } +} + +unsafe extern "C" fn effect_kroolspecialnfireb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 16.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 22.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("krool_cannon_shot"), Hash40::new("haver"), 0, 2, 25, 0, 0, 0, 1.3, true); + } + frame(lua_state, 23.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("krool_cannon_shot"), -1); + } +} + +unsafe extern "C" fn sound_kroolspecialnfireb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_krool_special_n10")); + } + frame(lua_state, 23.0); + if is_excute(agent) { + if WorkModule::is_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL) { + PLAY_SE(agent, Hash40::new("se_krool_special_n07")); } else { - EFFECT_FOLLOW(agent, Hash40::new("krool_cannon_vacuum"), Hash40::new("top"), 0, 10, 17, 0, 0, 0, 1.0, true); - LAST_EFFECT_SET_SCALE_W(agent, 0.6, 2.0, 1.0); - LAST_EFFECT_SET_ALPHA(agent, 0.9); + PLAY_SE(agent, Hash40::new("se_krool_special_n01")); } - if agent.is_situation(*SITUATION_KIND_GROUND) { - FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -6, 0, 0, 0, 0, 0, 0.6, 10, 0, 4, 0, 0, 0, false); + } +} + +unsafe extern "C" fn expression_kroolspecialnfireb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + VisibilityModule::set_int64(boma, hash40("crown") as i64, hash40("crown_hide") as i64); + if IS_EXIST_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT) { + ArticleModule::set_visibility_whole(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, true, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } + } + frame(lua_state, 22.0); + if is_excute(agent) { + if IS_GENERATABLE_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { + QUAKE(agent, *CAMERA_QUAKE_KIND_S); + } + } + frame(lua_state, 23.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 60.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("crown") as i64, hash40("crown_normal") as i64); + if IS_EXIST_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT) { + if is_excute(agent) { + ArticleModule::set_visibility_whole(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, false, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } + } + } + frame(lua_state, 70.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x23c33f3bdc)); + } +} + +unsafe extern "C" fn game_specialnloop(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_AIR) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } + if VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 9.5, 10.7, Some(0.0), Some(9.5), Some(17.5), *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_GA); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 160, 100, 20, 0, 6.0, 0.0, 9.0, 22.0, Some(0.0), Some(9.0), Some(28.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 361, 100, 0, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + SEARCH(agent, 0, 0, Hash40::new("top"), 7.0, 0.0, 8.0, 11.0, Some(0.0), Some(8.0), Some(28.0), *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_ALL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, true); } } - wait(lua_state, 10.0); } pub fn install(agent: &mut Agent) { + agent.acmd("game_kroolspecialnfire", game_kroolspecialnfire, Priority::Low); + agent.acmd("game_kroolspecialairnfire", game_kroolspecialnfire, Priority::Low); agent.acmd("effect_kroolspecialnfire", effect_kroolspecialnfire, Priority::Low); agent.acmd("effect_kroolspecialairnfire", effect_kroolspecialnfire, Priority::Low); agent.acmd("sound_kroolspecialnfire", sound_kroolspecialnfire, Priority::Low); agent.acmd("sound_kroolspecialairnfire", sound_kroolspecialnfire, Priority::Low); - agent.acmd( - "expression_kroolspecialnfire", - expression_kroolspecialnfire, - Priority::Low - ); - agent.acmd( - "expression_kroolspecialairnfire", - expression_kroolspecialnfire, - Priority::Low - ); - agent.acmd("effect_kroolspecialnloop", effect_kroolspecialnloop, Priority::Low); - agent.acmd("effect_kroolspecialairnloop", effect_kroolspecialnloop, Priority::Low); + agent.acmd("expression_kroolspecialnfire", expression_kroolspecialnfire, Priority::Low); + agent.acmd("expression_kroolspecialairnfire", expression_kroolspecialnfire, Priority::Low); + + agent.acmd("game_kroolspecialnfirehi", game_kroolspecialnfirehi, Priority::Low); + agent.acmd("game_kroolspecialairnfirehi", game_kroolspecialnfirehi, Priority::Low); + agent.acmd("effect_kroolspecialnfirehi", effect_kroolspecialnfirehi, Priority::Low); + agent.acmd("effect_kroolspecialairnfirehi", effect_kroolspecialnfirehi, Priority::Low); + agent.acmd("sound_kroolspecialnfirehi", sound_kroolspecialnfirehi, Priority::Low); + agent.acmd("sound_kroolspecialairnfirehi", sound_kroolspecialnfirehi, Priority::Low); + agent.acmd("expression_kroolspecialnfirehi", expression_kroolspecialnfirehi, Priority::Low); + agent.acmd("expression_kroolspecialairnfirehi", expression_kroolspecialnfirehi, Priority::Low); + + agent.acmd("game_kroolspecialnfireb", game_kroolspecialnfireb, Priority::Low); + agent.acmd("game_kroolspecialairnfireb", game_kroolspecialnfireb, Priority::Low); + agent.acmd("effect_kroolspecialnfireb", effect_kroolspecialnfireb, Priority::Low); + agent.acmd("effect_kroolspecialairnfireb", effect_kroolspecialnfireb, Priority::Low); + agent.acmd("sound_kroolspecialnfireb", sound_kroolspecialnfireb, Priority::Low); + agent.acmd("sound_kroolspecialairnfireb", sound_kroolspecialnfireb, Priority::Low); + agent.acmd("expression_kroolspecialnfireb", expression_kroolspecialnfireb, Priority::Low); + agent.acmd("expression_kroolspecialairnfireb", expression_kroolspecialnfireb, Priority::Low); } \ No newline at end of file diff --git a/fighters/kirby/src/acmd/copy/lucas.rs b/fighters/kirby/src/acmd/copy/lucas.rs index 131d2b1a73..3cce51a7b9 100644 --- a/fighters/kirby/src/acmd/copy/lucas.rs +++ b/fighters/kirby/src/acmd/copy/lucas.rs @@ -114,7 +114,7 @@ unsafe extern "C" fn effect_lucasspecialnfire(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FLW_POS(agent, Hash40::new("lucas_pkt_hold"), Hash40::new("top"), 0, 9, 0, 0, 0, 0, 0.9, true); EFFECT_FLW_POS(agent, Hash40::new("lucas_pkfr_bomb_max"), Hash40::new("top"), 0, 9, 0, 0, 0, 0, 0.5, true); - EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("top"), 0, 11, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 11, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); } for _ in 1..=5 { if is_excute(agent) { diff --git a/fighters/kirby/src/acmd/copy/mario.rs b/fighters/kirby/src/acmd/copy/mario.rs index 505e2882ef..35acf66c9b 100644 --- a/fighters/kirby/src/acmd/copy/mario.rs +++ b/fighters/kirby/src/acmd/copy/mario.rs @@ -71,7 +71,10 @@ unsafe extern "C" fn game_mariospecialnfire(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 14.0); if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.5, 0.0, 0.0)); + if boma.is_situation(*SITUATION_KIND_AIR) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } + sv_kinetic_energy!(set_speed, agent, FIGHTER_KINETIC_ENERGY_ID_STOP, -0.75 * PostureModule::lr(boma)); ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 50, 101, 0, 52, 3.0, 0.0, 5.5, 4.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 50, 101, 0, 52, 5.0, 0.0, 6.5, 11.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } @@ -93,19 +96,16 @@ unsafe extern "C" fn effect_mariospecialnfire(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 6, 11, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 11.0); + frame(lua_state, 13.0); if is_excute(agent) { if PostureModule::lr(boma) > 0.0 { - EFFECT_FOLLOW(agent, Hash40::new("mario_fb_shoot"), Hash40::new("havel"), 0, 0, 0, 0, 45, 0, 0.7, true); - EFFECT_FOLLOW(agent, Hash40::new("mario_fb_shoot"), Hash40::new("haver"), 0, 0, 0, 0, 45, 0, 0.7, true); + EFFECT_FOLLOW(agent, Hash40::new("mario_fb_shoot"), Hash40::new("havel"), 0, 0, 0, 0, 45, 0, 0.55, true); + EFFECT_FOLLOW(agent, Hash40::new("mario_fb_shoot"), Hash40::new("haver"), 0, 0, 0, 0, 45, 0, 0.55, true); } else { - EFFECT_FOLLOW(agent, Hash40::new("mario_fb_shoot"), Hash40::new("havel"), 0, 0, 0, 0, -45, 0, 0.7, true); - EFFECT_FOLLOW(agent, Hash40::new("mario_fb_shoot"), Hash40::new("haver"), 0, 0, 0, 0, -45, 0, 0.7, true); + EFFECT_FOLLOW(agent, Hash40::new("mario_fb_shoot"), Hash40::new("havel"), 0, 0, 0, 0, -45, 0, 0.55, true); + EFFECT_FOLLOW(agent, Hash40::new("mario_fb_shoot"), Hash40::new("haver"), 0, 0, 0, 0, -45, 0, 0.55, true); } - } - frame(lua_state, 12.0); - if is_excute(agent) { if agent.is_situation(*SITUATION_KIND_GROUND) { EFFECT_FOLLOW(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 0.2, 0.2); @@ -114,9 +114,12 @@ unsafe extern "C" fn effect_mariospecialnfire(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); if is_excute(agent) { FLASH(agent, 1, 0, 0, 0.35); - EFFECT_FOLLOW(agent, Hash40::new("sys_flame"), Hash40::new("handl"), 0.0, 0, 0, 0, 0, 0, 0.2, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_flame"), Hash40::new("handr"), 0.0, 0, 0, 0, 0, 0, 0.2, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("top"), 0, 6.0, 10.5, 0, 0, 0, 0.9, true); + LAST_EFFECT_SET_RATE(agent, 0.55); + EFFECT_FOLLOW(agent, Hash40::new("sys_damage_fire"), Hash40::new("top"), 0, 5.0, 10.5, 0, 0, 0, 0.9, true); + LAST_EFFECT_SET_RATE(agent, 0.55); EFFECT_FOLLOW(agent, Hash40::new("sys_bomb_a"), Hash40::new("top"), 0, 6.5, 11.5, 0, 0, 0, 0.26, true); + LAST_EFFECT_SET_COLOR(agent, 0.65, 0.2, 0.08); LAST_EFFECT_SET_RATE(agent, 1.2); EffectModule::enable_sync_init_pos_last(boma); if agent.is_situation(*SITUATION_KIND_GROUND) { @@ -168,7 +171,7 @@ unsafe extern "C" fn expression_mariospecialnfire(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_55_smash"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } } diff --git a/fighters/kirby/src/acmd/copy/mariod.rs b/fighters/kirby/src/acmd/copy/mariod.rs index 779390f8e5..e400f3de78 100644 --- a/fighters/kirby/src/acmd/copy/mariod.rs +++ b/fighters/kirby/src/acmd/copy/mariod.rs @@ -24,7 +24,6 @@ unsafe extern "C" fn effect_mariodspecialn(agent: &mut L2CAgentBase) { frame(lua_state, 15.0); if is_excute(agent) { EFFECT_FLIP(agent, Hash40::new("mariod_capsule_shoot"), Hash40::new("mariod_capsule_shoot"), Hash40::new("top"), -1, 8, 11, 0, 0, 0, 0.46, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); - EFFECT_FLIP(agent, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), -1, 8, 11, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); if agent.is_situation(*SITUATION_KIND_GROUND) { LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -1, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); } @@ -74,7 +73,6 @@ unsafe extern "C" fn effect_mariodspecialnchill(agent: &mut L2CAgentBase) { LAST_EFFECT_SET_RATE(agent, 0.75); EffectModule::enable_sync_init_pos_last(boma); EFFECT_FLIP(agent, Hash40::new("mariod_capsule_shoot"), Hash40::new("mariod_capsule_shoot"), Hash40::new("top"), 0, 4, 7, 0, 0, 0, 0.46, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); - EFFECT_FLIP(agent, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 4, 7, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); if agent.is_situation(*SITUATION_KIND_GROUND) { EFFECT_FOLLOW(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 0.2, 0.2); diff --git a/fighters/kirby/src/acmd/copy/miifighter.rs b/fighters/kirby/src/acmd/copy/miifighter.rs new file mode 100644 index 0000000000..aee118c6dd --- /dev/null +++ b/fighters/kirby/src/acmd/copy/miifighter.rs @@ -0,0 +1,117 @@ +use super::*; + +unsafe extern "C" fn game_miifighterspecialn1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ArticleModule::generate_article_enable(boma, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, false, -1); + } + frame(lua_state, 15.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_N1_START_HOLD); + } + frame(lua_state, 25.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD); + } + frame(lua_state, 28.0); + if is_excute(agent) { + ArticleModule::shoot_exist(boma, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); + } + frame(lua_state, 40.0); + FT_MOTION_RATE_RANGE(agent, 40.0, 80.0, 20.0); + frame(lua_state, 80.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_miifighterspecialn1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), -5, 8.5, -0.5, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 360, false); + } + frame(lua_state, 5.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 2, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 25.0); + if is_excute(agent) { + let eff_handle = VarModule::get_int(agent.battle_object, vars::miifighter::status::SPECIAL_N1_EFFECT_HANDLE) as u32; + if EffectModule::is_exist_effect(boma, eff_handle) { + EffectModule::kill(boma, eff_handle, true, true); + VarModule::set_int(agent.battle_object, vars::miifighter::status::SPECIAL_N1_EFFECT_HANDLE, -1); + } + } +} + +unsafe extern "C" fn game_miifighterspecialn1bowl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 25.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD); + } + frame(lua_state, 28.0); + if is_excute(agent) { + ArticleModule::shoot_exist(boma, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); + } + frame(lua_state, 40.0); + FT_MOTION_RATE_RANGE(agent, 40.0, 80.0, 20.0); + frame(lua_state, 80.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_miifighterspecialn1bowl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 25.0); + if is_excute(agent) { + let eff_handle = VarModule::get_int(agent.battle_object, vars::miifighter::status::SPECIAL_N1_EFFECT_HANDLE) as u32; + if EffectModule::is_exist_effect(boma, eff_handle) { + EffectModule::kill(boma, eff_handle, true, true); + VarModule::set_int(agent.battle_object, vars::miifighter::status::SPECIAL_N1_EFFECT_HANDLE, -1); + } + } +} + +unsafe extern "C" fn sound_miifighterspecialn1bowl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 24.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_special_n02")); + PLAY_SE(agent, Hash40::new("vc_kirby_copy_mii_01")); + } +} + +unsafe extern "C" fn expression_miifighterspecialn1bowl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 27.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_lightthrowitem"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 79.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_miifighterspecialn1", game_miifighterspecialn1, Priority::Low); + agent.acmd("game_miifighterspecialairn1", game_miifighterspecialn1, Priority::Low); + agent.acmd("effect_miifighterspecialn1", effect_miifighterspecialn1, Priority::Low); + agent.acmd("effect_miifighterspecialairn1", effect_miifighterspecialn1, Priority::Low); + + agent.acmd("game_miifighterspecialn1bowl", game_miifighterspecialn1bowl, Priority::Low); + agent.acmd("game_miifighterspecialairn1bowl", game_miifighterspecialn1bowl, Priority::Low); + agent.acmd("effect_miifighterspecialn1bowl", effect_miifighterspecialn1bowl, Priority::Low); + agent.acmd("effect_miifighterspecialairn1bowl", effect_miifighterspecialn1bowl, Priority::Low); + agent.acmd("sound_miifighterspecialn1bowl", sound_miifighterspecialn1bowl, Priority::Low); + agent.acmd("sound_miifighterspecialairn1bowl", sound_miifighterspecialn1bowl, Priority::Low); + agent.acmd("expression_miifighterspecialn1bowl", expression_miifighterspecialn1bowl, Priority::Low); + agent.acmd("expression_miifighterspecialairn1bowl", expression_miifighterspecialn1bowl, Priority::Low); +} \ No newline at end of file diff --git a/fighters/kirby/src/acmd/copy/palutena.rs b/fighters/kirby/src/acmd/copy/palutena.rs index 7d0961aa4c..d749edd1f0 100644 --- a/fighters/kirby/src/acmd/copy/palutena.rs +++ b/fighters/kirby/src/acmd/copy/palutena.rs @@ -11,9 +11,9 @@ unsafe extern "C" fn effect_palutenaspecialn(agent: &mut L2CAgentBase) { EffectModule::enable_sync_init_pos_last(boma); EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("havel"), 0, 6.5, 0, 0, 0, 0, 1, true); } - frame(lua_state, 17.0); + frame(lua_state, 11.0); if is_excute(agent) { - EFFECT_FOLLOW_ALPHA(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), -1, 21, 1, 0, 90, 0, 1, true, 0.7); + EFFECT_FOLLOW_ALPHA(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), -1.5, 13.5, -1, 0, 90, 0, 1, true, 0.7); } frame(lua_state, 40.0); if is_excute(agent) { diff --git a/fighters/kirby/src/acmd/copy/pfushigisou.rs b/fighters/kirby/src/acmd/copy/pfushigisou.rs index 90fb33ce5f..0dbcd721c2 100644 --- a/fighters/kirby/src/acmd/copy/pfushigisou.rs +++ b/fighters/kirby/src/acmd/copy/pfushigisou.rs @@ -18,7 +18,7 @@ unsafe extern "C" fn sound_pfushigisouspecialnstart(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_pfushigisouspecialnend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 3.0); + frame(lua_state, 2.0); if is_excute(agent) { EFFECT_FLW_POS(agent, Hash40::new("pfushigisou_tanemg"), Hash40::new("top"), 0, 12, 1, 0, 0, 0, 1.3, true); if agent.is_situation(*SITUATION_KIND_GROUND) { @@ -26,10 +26,18 @@ unsafe extern "C" fn effect_pfushigisouspecialnend(agent: &mut L2CAgentBase) { LAST_EFFECT_SET_ALPHA(agent, 0.8); } } - frame(lua_state, 4.0); + frame(lua_state, 3.0); if is_excute(agent) { EFFECT(agent, Hash40::new("pfushigisou_leaf"), Hash40::new("top"), 0, 12, 1, 0, 0, -90, 1, 0, 0, 0, 0, 360, 0, true); } + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FLW_POS(agent, Hash40::new("pfushigisou_tanemg"), Hash40::new("top"), 0, 12, 1, 0, 0, 0, 1.3, true); + if agent.is_situation(*SITUATION_KIND_GROUND) { + FOOT_EFFECT(agent, Hash40::new("sys_v_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_ALPHA(agent, 0.8); + } + } frame(lua_state, 26.0); if is_excute(agent) { if agent.is_situation(*SITUATION_KIND_GROUND) { diff --git a/fighters/kirby/src/acmd/copy/roy.rs b/fighters/kirby/src/acmd/copy/roy.rs index 313adb3608..dc683c4f88 100644 --- a/fighters/kirby/src/acmd/copy/roy.rs +++ b/fighters/kirby/src/acmd/copy/roy.rs @@ -12,15 +12,14 @@ unsafe extern "C" fn effect_royspecialnend(agent: &mut L2CAgentBase) { LAST_EFFECT_SET_RATE(agent, 1.25); EFFECT_FOLLOW_FLIP(agent, Hash40::new("roy_fire"), Hash40::new("roy_fire"), Hash40::new("havel"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, true, *EF_FLIP_NONE); LAST_EFFECT_SET_RATE(agent, 1.25); - //AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_roy_sword1"), Hash40::new("tex_roy_sword2"), 7, Hash40::new("havel"), 0.0, 0.0, -0.8, Hash40::new("havel"), -0.0, -0.0, 14.5, true, Hash40::new("roy_sword"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); + } + frame(lua_state, 3.0); + if is_excute(agent) { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_roy_flame1"), Hash40::new("tex_roy_flame2"), 7, Hash40::new("havel"), 0.0, -0.8, 0.0, Hash40::new("havel"), 0.0, 14.5, 0.0, true, Hash40::new("null"), Hash40::new("havel"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); } frame(lua_state, 10.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); - //EFFECT(agent, Hash40::new("roy_eruption_bomb_main"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, true); - //LAST_EFFECT_SET_RATE(agent, 1.5); - //EFFECT(agent, Hash40::new("roy_eruption_bomb_start"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.05, 0, 0, 0, 0, 0, 0, true); - //LAST_EFFECT_SET_RATE(agent, 1.5); LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 13.0); @@ -52,9 +51,136 @@ unsafe extern "C" fn sound_royspecialnend(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn expression_royspecialnend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + //AREA_WIND_2ND_arg10(fighter, 0, 2, 110, 300, 0.6, 0, 12, 30, 30, 40); + } + frame(lua_state, 9.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 5); + RUMBLE_HIT(agent, Hash40::new("rbkind_explosion"), 0); + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosion"), 0, false, 0); + } + frame(lua_state, 23.0); + if is_excute(agent) { + AreaModule::erase_wind(boma, 0); + } + frame(lua_state, 34.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 8); + } +} + +unsafe extern "C" fn effect_royspecialnend2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("roy_erupution_hold"), Hash40::new("roy_erupution_hold"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 0.7, true, *EF_FLIP_NONE); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("roy_sword"), Hash40::new("roy_sword"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1, true, *EF_FLIP_NONE); + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_roy_flame1"), Hash40::new("tex_roy_flame2"), 7, Hash40::new("havel"), 0.0, 0.0, -0.8, Hash40::new("havel"), -0.0, -0.0, 14.5, true, Hash40::new("roy_sword"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("roy_eruption_middle"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("roy_eruption_bomb_main"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("roy_eruption_bomb_start_middle"), Hash40::new("top"), 0, 0, 17, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 6); + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 26.0); + frame(lua_state, 38.0); + if is_excute(agent) { + COL_NORMAL(agent); + EFFECT_OFF_KIND(agent, Hash40::new("roy_sword"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + } +} + +unsafe extern "C" fn effect_royspecialnend3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("roy_erupution_hold"), Hash40::new("roy_erupution_hold"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1, true, *EF_FLIP_NONE); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("roy_sword"), Hash40::new("roy_sword"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1, true, *EF_FLIP_NONE); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_roy_flame1"), Hash40::new("tex_roy_flame2"), 7, Hash40::new("havel"), 0.0, 0.0, -0.8, Hash40::new("havel"), -0.0, -0.0, 14.5, true, Hash40::new("roy_sword"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + EFFECT(agent, Hash40::new("roy_eruption"), Hash40::new("top"), 0, 0, 15, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("roy_eruption_bomb_main"), Hash40::new("top"), 0, 0, 15, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT(agent, Hash40::new("roy_eruption_bomb_start_high"), Hash40::new("top"), 0, 0, 15, 0, 0, 0, 1.4, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.7); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 6); + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 26.0); + frame(lua_state, 38.0); + if is_excute(agent) { + COL_NORMAL(agent); + EFFECT_OFF_KIND(agent, Hash40::new("roy_sword"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + } +} + +unsafe extern "C" fn effect_royspecialnendmax(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("roy_erupution_hold"), Hash40::new("roy_erupution_hold"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1.3, true, *EF_FLIP_NONE); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("roy_sword"), Hash40::new("roy_sword"), Hash40::new("havel"), 0, 0, 0, -90, 90, 0, 1, true, *EF_FLIP_NONE); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_roy_flame1"), Hash40::new("tex_roy_flame2"), 7, Hash40::new("havel"), 0.0, 0.0, -0.8, Hash40::new("havel"), -0.0, -0.0, 14.5, true, Hash40::new("roy_sword"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + EFFECT(agent, Hash40::new("roy_eruption_max"), Hash40::new("top"), 0, 0, 15, 0, 0, 0, 2.1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.7); + EFFECT(agent, Hash40::new("roy_eruption_bomb_main"), Hash40::new("top"), 0, 0, 15, 0, 0, 0, 1.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.7); + EFFECT(agent, Hash40::new("roy_eruption_bomb_start_max"), Hash40::new("top"), 0, 0, 15, 0, 0, 0, 1.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.7); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 6); + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 26.0); + frame(lua_state, 46.0); + if is_excute(agent) { + COL_NORMAL(agent); + EFFECT_OFF_KIND(agent, Hash40::new("roy_sword"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("roy_erupution_hold"), false, false); + } +} + pub fn install(agent: &mut Agent) { - agent.acmd("sound_royspecialnend", sound_royspecialnend, Priority::Low); - agent.acmd("sound_royspecialairnend", sound_royspecialnend, Priority::Low); agent.acmd("effect_royspecialnend", effect_royspecialnend, Priority::Low); agent.acmd("effect_royspecialairnend", effect_royspecialnend, Priority::Low); + agent.acmd("sound_royspecialnend", sound_royspecialnend, Priority::Low); + agent.acmd("sound_royspecialairnend", sound_royspecialnend, Priority::Low); + agent.acmd("expression_royspecialnend", expression_royspecialnend, Priority::Low); + agent.acmd("expression_royspecialairnend", expression_royspecialnend, Priority::Low); + + agent.acmd("effect_royspecialnend2", effect_royspecialnend2, Priority::Low); + agent.acmd("effect_royspecialairnend2", effect_royspecialnend2, Priority::Low); + agent.acmd("effect_royspecialnend3", effect_royspecialnend3, Priority::Low); + agent.acmd("effect_royspecialairnend3", effect_royspecialnend3, Priority::Low); + agent.acmd("effect_royspecialnendmax", effect_royspecialnendmax, Priority::Low); + agent.acmd("effect_royspecialairnendmax", effect_royspecialnendmax, Priority::Low); } \ No newline at end of file diff --git a/fighters/kirby/src/acmd/ground.rs b/fighters/kirby/src/acmd/ground.rs index d7cea525e8..d75a0eb461 100644 --- a/fighters/kirby/src/acmd/ground.rs +++ b/fighters/kirby/src/acmd/ground.rs @@ -11,8 +11,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 50, 0, 8, 3.0, 0.0, 5.5, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 50, 0, 8, 3.0, 0.0, 5.5, 10.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 361, 50, 0, 8, 3.0, 0.0, 5.5, 13.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 30, 0, 20, 3.0, 0.0, 3.5, 6.0, Some(0.0), Some(3.5), Some(13.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 3.0); if is_excute(agent) { @@ -28,8 +29,9 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 70, 50, 0, 8, 3.0, 0.0, 5.2, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 70, 50, 0, 8, 3.5, 0.0, 5.2, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 361, 20, 0, 20, 2.5, 0.0, 3.3, 7.5, Some(0.0), Some(3.3), Some(13.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 2, true); } wait(lua_state, 3.0); if is_excute(agent) { diff --git a/fighters/kirby/src/acmd/other.rs b/fighters/kirby/src/acmd/other.rs index 9e41127ed6..46a8d4b062 100644 --- a/fighters/kirby/src/acmd/other.rs +++ b/fighters/kirby/src/acmd/other.rs @@ -72,16 +72,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -92,10 +88,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_landingheavy(agent: &mut L2CAgentBase) { diff --git a/fighters/kirby/src/acmd/specials.rs b/fighters/kirby/src/acmd/specials.rs index 760ce740ae..d39aa2f4ed 100644 --- a/fighters/kirby/src/acmd/specials.rs +++ b/fighters/kirby/src/acmd/specials.rs @@ -21,8 +21,8 @@ unsafe extern "C" fn game_specialnloop(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_KIRBY_STATUS_SPECIAL_N_FLAG_INHALE); - ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 160, 100, 30, 0, 8.5, 0.0, 7.0, 15.5, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 160, 100, 25, 0, 7.8, 0.0, 7.0, 9.7, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 160, 100, 25, 0, 8.5, 0.0, 7.0, 15.5, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 160, 100, 25, 0, 7.8, 0.0, 7.0, 9.7, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 10, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); CATCH(agent, 0, Hash40::new("top"), 5.3, 0.0, 6.4, 10.2, None, None, None, *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_A); CATCH(agent, 1, Hash40::new("top"), 5.8, 0.0, 6.4, 6.2, None, None, None, *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_GA); SEARCH(agent, 0, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 8.0, None, None, None, *COLLISION_KIND_MASK_ATTACK, *HIT_STATUS_MASK_ALL, 0, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false); diff --git a/fighters/kirby/src/acmd/throws.rs b/fighters/kirby/src/acmd/throws.rs index d2c023901a..b246f208a3 100644 --- a/fighters/kirby/src/acmd/throws.rs +++ b/fighters/kirby/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 5.5, 0.0, Some(0.0), Some(5.5), Some(9.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 5.5, 4.1, Some(0.0), Some(5.5), Some(9.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 5.5, 0.0, Some(0.0), Some(5.5), Some(12.25), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 5.5, 4.1, Some(0.0), Some(5.5), Some(12.25), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 5.5, 0.0, Some(0.0), Some(5.5), Some(-17.25), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 5.5, -4.1, Some(0.0), Some(5.5), Some(-17.25), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -193,7 +192,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::on_flag(opponent_boma.object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); } } diff --git a/fighters/kirby/src/lib.rs b/fighters/kirby/src/lib.rs index bb6ce6cde2..f115f12a96 100644 --- a/fighters/kirby/src/lib.rs +++ b/fighters/kirby/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/kirby/src/opff.rs b/fighters/kirby/src/opff.rs index 9f8e2c2ea7..c99a671aee 100644 --- a/fighters/kirby/src/opff.rs +++ b/fighters/kirby/src/opff.rs @@ -55,6 +55,16 @@ unsafe fn inhale_forced_end(fighter: &mut L2CFighterCommon) { } } +// Adds landing detection during the Stone reappearance animation +// (missing from vanilla script) +unsafe fn down_special_reappear_proper_landing(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_KIRBY_STATUS_KIND_STONE_END) + && !StatusModule::is_changing(fighter.module_accessor) + && fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.change_status_req(*FIGHTER_STATUS_KIND_LANDING, false); + } +} + unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { let copystatus = StatusModule::status_kind(fighter.module_accessor); if !fighter.is_in_hitlag() @@ -89,6 +99,7 @@ pub unsafe fn moveset(fighter: &mut L2CFighterCommon) { final_cutter_landing_bugfix(fighter); hammer_swing_drift_landcancel(fighter); inhale_forced_end(fighter); + down_special_reappear_proper_landing(fighter); fastfall_specials(fighter); copy::kirby_copy_handler(fighter); diff --git a/fighters/kirby/src/opff/copy.rs b/fighters/kirby/src/opff/copy.rs index 2eed3c5cfb..32334d7bd7 100644 --- a/fighters/kirby/src/opff/copy.rs +++ b/fighters/kirby/src/opff/copy.rs @@ -197,7 +197,8 @@ unsafe fn pitb_bow_lc(fighter: &mut L2CFighterCommon) { *FIGHTER_KIRBY_STATUS_KIND_PIT_SPECIAL_N_TURN ]) { if fighter.is_status(*FIGHTER_KIRBY_STATUS_KIND_PIT_SPECIAL_N_SHOOT) { - fighter.check_land_cancel(None); + let landing_lag = 7.0; + fighter.check_land_cancel(Some(landing_lag)); } } } @@ -545,6 +546,8 @@ unsafe fn reflet_nspecial_cancels(fighter: &mut L2CFighterCommon) { fighter.set_int(*STATUS_KIND_NONE, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); ControlModule::clear_command_one(fighter.module_accessor, *FIGHTER_PAD_COMMAND_CATEGORY1, *FIGHTER_PAD_CMD_CAT1_AIR_ESCAPE); } + } else if fighter.get_int(*FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS) != *FIGHTER_STATUS_KIND_JUMP_SQUAT { + fighter.set_int(*STATUS_KIND_NONE, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); } } } @@ -660,6 +663,15 @@ unsafe fn ken_hado_landcancel(fighter: &mut L2CFighterCommon) { fighter.check_land_cancel(Some(landing_lag)); } +// Cloud +unsafe fn cloud_special_n_hold(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_KIRBY_STATUS_KIND_CLOUD_SPECIAL_N) { + if fighter.check_hold_input(0, 10, Buttons::SpecialAll) { + VarModule::on_flag(fighter.battle_object, vars::cloud::status::SPECIAL_N_HOLD); + } + } +} + // Simon unsafe fn axe_drift(fighter: &mut L2CFighterCommon) { if fighter.is_status(*FIGHTER_KIRBY_STATUS_KIND_SIMON_SPECIAL_N) { @@ -693,29 +705,14 @@ unsafe fn miigunner_nspecial_cancels(fighter: &mut L2CFighterCommon) { // Piranha Plant unsafe fn packun_ptooie_stance(fighter: &mut L2CFighterCommon) { if fighter.is_status(*FIGHTER_KIRBY_STATUS_KIND_SPECIAL_N_SWALLOW_WAIT) { - let boma = fighter.boma(); - let opponent_boma = boma.get_grabbed_opponent_boma(); - let grabbed_fighter = smash::app::utility::get_kind(opponent_boma); - if grabbed_fighter == *FIGHTER_KIND_PACKUN { - let old_stance = VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE); + let opponent_boma = fighter.get_grabbed_opponent_boma(); + if opponent_boma.kind() == *FIGHTER_KIND_PACKUN { let new_stance = VarModule::get_int(opponent_boma.object(), vars::packun::instance::CURRENT_STANCE); - if new_stance != old_stance { - // println!("Copying Pirahna Plant's Current Stance, which is {}", new_stance); - VarModule::set_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE, new_stance); - } + VarModule::set_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE, new_stance); } } } -unsafe fn packun_ptooie_scale(fighter: &mut L2CFighterCommon) { - if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 { - VarModule::set_float(fighter.battle_object, vars::packun::instance::SPECIAL_N_PTOOIE_SCALE, 1.3); - } - else { - VarModule::set_float(fighter.battle_object, vars::packun::instance::SPECIAL_N_PTOOIE_SCALE, 1.0); - } -} - // Hero unsafe fn brave_nspecial_cancels(fighter: &mut L2CFighterCommon) { if fighter.is_status(*FIGHTER_KIRBY_STATUS_KIND_BRAVE_SPECIAL_N_CANCEL) @@ -751,6 +748,36 @@ unsafe fn indicator_breegull_fatigue(fighter: &mut L2CFighterCommon) { } } +unsafe fn breegull_bayonet(fighter: &mut L2CFighterCommon) { + let motion = MotionModule::motion_kind(fighter.module_accessor); + let motion_partial = MotionModule::motion_kind_partial(fighter.module_accessor,*FIGHTER_MOTION_PART_SET_KIND_UPPER_BODY); + if fighter.is_status_one_of(&[ + *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT, + *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_WALK_F, + *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_WALK_B, + *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_TURN, + *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_LANDING + ]) + && fighter.is_situation(*SITUATION_KIND_GROUND) + && !VarModule::is_flag(fighter.battle_object, vars::kirby::instance::BUDDY_SPECIAL_N_BAYONET_ACTIVE) { + if motion_partial == hash40("buddy_special_n_shoot_upper_fire") { + let frame_partial = MotionModule::frame_partial(fighter.module_accessor, *FIGHTER_MOTION_PART_SET_KIND_UPPER_BODY); + let disable_frame = 3.0; //frame before egg fires + let disable_bayonet = (!CancelModule::is_enable_cancel(fighter.module_accessor) && frame_partial >= disable_frame); + VarModule::set_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE,disable_bayonet); + } + else { + VarModule::off_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE); + } + let is_csticking = ControlModule::get_command_flag_cat(fighter.module_accessor, 0) & *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_S4 != 0; + if (is_csticking && !VarModule::is_flag(fighter.battle_object, vars::buddy::instance::SPECIAL_N_BAYONET_DISABLE)) { + VarModule::on_flag(fighter.battle_object, vars::kirby::instance::BUDDY_SPECIAL_N_BAYONET_ACTIVE); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_SHOOT); + fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT.into(), false.into()); + } + } +} + // Steve unsafe fn pickel_mining(fighter: &mut L2CFighterCommon) { if fighter.get_int(*FIGHTER_KIRBY_INSTANCE_WORK_ID_INT_COPY_CHARA) == *FIGHTER_KIND_PICKEL { @@ -797,7 +824,7 @@ unsafe fn trail_magic_handling(fighter: &mut L2CFighterCommon) { // blizzaga jump cancel if (fighter.is_status(*FIGHTER_KIRBY_STATUS_KIND_TRAIL_SPECIAL_N2) && fighter.motion_frame() > 12.0) { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, false); } // handles the cooldown timer between casting spells @@ -896,6 +923,7 @@ unsafe extern "C" fn pledge_init(fighter: &mut L2CFighterCommon) { if LinkModule::is_link(opponent_boma, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { let parent_id = LinkModule::get_parent_id(opponent_boma, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; let object = utils::util::get_battle_object_from_id(parent_id); + VarModule::off_flag(fighter.battle_object, vars::pfushigisou::instance::SPECIAL_N_SEED_FIRED); let pledge = VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE); if pledge != *PLEDGE_STATE_NONE { VarModule::set_int(fighter.battle_object, vars::kirby::instance::SPECIAL_N_PTRAINER_PLEDGE_STATE, pledge); @@ -907,6 +935,7 @@ unsafe extern "C" fn pledge_init(fighter: &mut L2CFighterCommon) { // The pokemon has no active pledge or the trainer was somehow not found, so Kirby will not get a pledge VarModule::set_int(fighter.battle_object, vars::kirby::instance::SPECIAL_N_PTRAINER_PLEDGE_STATE, *PLEDGE_STATE_NONE); VarModule::set_int(fighter.battle_object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, 0); + VarModule::off_flag(fighter.battle_object, vars::pfushigisou::instance::SPECIAL_N_SEED_FIRED); } } } @@ -937,26 +966,16 @@ unsafe extern "C" fn plant_meter(fighter: &mut L2CFighterCommon) { unsafe fn bayo_air_special_cancels(fighter: &mut L2CFighterCommon) { - if fighter.is_status(*FIGHTER_STATUS_KIND_ATTACK_AIR) - && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) //dont cancel on shield - && !fighter.is_in_hitlag() { //dont cancel during hitstop - let mut new_status = 0; - if fighter.is_cat_flag(Cat1::SpecialN) { - new_status = *FIGHTER_STATUS_KIND_SPECIAL_N; - VarModule::on_flag(fighter.battle_object, vars::bayonetta::instance::WAS_CANCEL); - } else if fighter.is_cat_flag(Cat1::SpecialHi) { - if !VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL) { - new_status = *FIGHTER_STATUS_KIND_SPECIAL_HI; - } - } else if fighter.is_cat_flag(Cat1::SpecialS) { - new_status = *FIGHTER_STATUS_KIND_SPECIAL_S; - } else if fighter.is_cat_flag(Cat1::SpecialLw) { - new_status = *FIGHTER_STATUS_KIND_SPECIAL_LW; + if fighter.is_status(*FIGHTER_STATUS_KIND_ATTACK_AIR) { + if AttackModule::is_infliction(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_SPECIAL); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_ESCAPE); + } + if !fighter.is_in_hitlag() + && !StopModule::is_stop(fighter.module_accessor) { + fighter.sub_transition_group_check_air_special(); + fighter.sub_transition_group_check_air_escape(); } - fighter.check_airdodge_cancel(); - if new_status != 0 { - StatusModule::change_status_force(fighter.module_accessor, new_status, true); - } //special cancel } } @@ -1060,6 +1079,10 @@ pub unsafe fn kirby_copy_handler(fighter: &mut L2CFighterCommon) { ken_air_hado_distinguish(fighter); ken_hado_landcancel(fighter) }, + // Cloud + 0x3E => { + cloud_special_n_hold(fighter); + } // Simon 0x43 => axe_drift(fighter), // Incineroar @@ -1069,7 +1092,6 @@ pub unsafe fn kirby_copy_handler(fighter: &mut L2CFighterCommon) { // Piranha Plant 0x51 => { packun_ptooie_stance(fighter); - packun_ptooie_scale(fighter); }, // Hero 0x53 => { @@ -1079,6 +1101,7 @@ pub unsafe fn kirby_copy_handler(fighter: &mut L2CFighterCommon) { 0x54 => { blue_eggs_land_cancels(fighter); indicator_breegull_fatigue(fighter); + breegull_bayonet(fighter); }, // Terry 0x55 => check_special_cancels(fighter), diff --git a/fighters/kirby/src/status/copy/bayonetta_special_n_cancel.rs b/fighters/kirby/src/status/copy/bayonetta_special_n_cancel.rs index a9cd5a6e08..19193e92da 100644 --- a/fighters/kirby/src/status/copy/bayonetta_special_n_cancel.rs +++ b/fighters/kirby/src/status/copy/bayonetta_special_n_cancel.rs @@ -2,9 +2,17 @@ use super::*; // FIGHTER_KIRBY_STATUS_KIND_BAYONETTA_SPECIAL_N +unsafe extern "C" fn special_n_init(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + return smashline::original_status(Init, fighter, *FIGHTER_KIRBY_STATUS_KIND_BAYONETTA_SPECIAL_N)(fighter); + } + air_stall(fighter); + 0.into() +} + unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_N_CANCEL_TYPE, 0); - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SPECIAL_N_FOOT); fighter.on_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_FLAG_SPECIAL_N_FOOT); fighter.set_int64(hash40("special_n_start_f") as i64, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_INT_MOTION_KIND_G); @@ -112,9 +120,7 @@ unsafe extern "C" fn special_n_cancel_main(fighter: &mut L2CFighterCommon) -> L2 fighter.set_float(1.0, *FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_FLOAT_MOTION_RATE); motion_handling(fighter, false); if !fighter.is_situation(*SITUATION_KIND_GROUND) { - let gravity = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) as *mut smash::app::KineticEnergy; - let start_y = fighter.get_param_float("param_special_n", "air_start_speed_mul_y"); - smash::app::lua_bind::KineticEnergy::mul_speed(gravity, &Vector3f::new(1.0, start_y, 1.0)); + air_stall(fighter); } //cut speed f0 of cancel fighter.clear_lua_stack(); lua_args!(fighter, MA_MSC_CMD_EFFECT_EFFECT_OFF_KIND, Hash40::new("bayonetta_bulletclimax_circle"), true, true); @@ -163,10 +169,24 @@ unsafe extern "C" fn special_n_cancel_end(fighter: &mut L2CFighterCommon) -> L2C 0.into() } +unsafe extern "C" fn air_stall(fighter: &mut L2CFighterCommon) -> L2CValue { + let x_speed = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let y_speed = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let air_start_speed_mul_x = fighter.get_param_float("param_special_n", "air_start_speed_mul_x"); + let air_start_speed_mul_y = fighter.get_param_float("param_special_n", "air_start_speed_mul_y"); + let startup_min_y = -0.5; + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL, x_speed * air_start_speed_mul_x, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, (y_speed * air_start_speed_mul_y).max(startup_min_y)); + 0.into() +} + + unsafe extern "C" fn motion_handling(fighter: &mut L2CFighterCommon, drift: bool) -> L2CValue { let mot_gr = fighter.get_int64(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_INT_MOTION_KIND_G); let mot_air = fighter.get_int64(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_N_INT_MOTION_KIND_A); let air = if drift {*FIGHTER_KINETIC_TYPE_MOTION_FALL} else {*FIGHTER_KINETIC_TYPE_AIR_STOP}; + fighter.sub_air_check_dive(); if StatusModule::is_changing(fighter.module_accessor) { fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, air); @@ -212,7 +232,7 @@ unsafe extern "C" fn cancel_check(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::change_status_force(fighter.module_accessor, statuses::kirby::BAYONETTA_SPECIAL_N_CANCEL, false); } } else { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, false); if fighter.is_cat_flag(Cat1::AirEscape) { VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_N_CANCEL_TYPE, *FIGHTER_STATUS_KIND_FALL); StatusModule::change_status_force(fighter.module_accessor, statuses::kirby::BAYONETTA_SPECIAL_N_CANCEL, false); @@ -232,6 +252,7 @@ unsafe extern "C" fn special_n_fire_end(fighter: &mut L2CFighterCommon) -> L2CVa } pub fn install(agent: &mut Agent) { + agent.status(Init, *FIGHTER_KIRBY_STATUS_KIND_BAYONETTA_SPECIAL_N, special_n_init); agent.status(Main, *FIGHTER_KIRBY_STATUS_KIND_BAYONETTA_SPECIAL_N, special_n_main); agent.status(Init, *FIGHTER_KIRBY_STATUS_KIND_BAYONETTA_SPECIAL_N_CHARGE, special_n_charge_init); diff --git a/fighters/kirby/src/status/copy/buddy_bayonet_end.rs b/fighters/kirby/src/status/copy/buddy_bayonet_end.rs index 9fb5c7cde0..9f986504fd 100644 --- a/fighters/kirby/src/status/copy/buddy_bayonet_end.rs +++ b/fighters/kirby/src/status/copy/buddy_bayonet_end.rs @@ -2,20 +2,22 @@ use super::*; // BUDDY_BUDDY_BAYONET_END -/// pre status for bayonet -/// handles initialization -pub unsafe extern "C" fn bayonet_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { +pub unsafe extern "C" fn bayonet_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if !VarModule::is_flag(fighter.battle_object, vars::kirby::instance::BUDDY_SPECIAL_N_BAYONET_ACTIVE) { + return smashline::original_status(Pre, fighter, *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT)(fighter); + } + StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_GROUND), - *FIGHTER_KINETIC_TYPE_MOTION_BIND, + *FIGHTER_KINETIC_TYPE_MOTION, *GROUND_CORRECT_KIND_GROUND as u32, app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, - 0 + *FIGHTER_BUDDY_STATUS_WORK_KEEP_FLAG_SPECIAL_N_FLAG, + *FIGHTER_BUDDY_STATUS_WORK_KEEP_FLAG_SPECIAL_N_INT, + *FIGHTER_BUDDY_STATUS_WORK_KEEP_FLAG_SPECIAL_N_FLOAT, + (*FS_SUCCEEDS_KEEP_SLOPE | *FS_SUCCEEDS_KEEP_VISIBILITY) as i32 ); FighterStatusModuleImpl::set_fighter_status_data( @@ -25,58 +27,101 @@ pub unsafe extern "C" fn bayonet_end_pre(fighter: &mut L2CFighterCommon) -> L2CV false, false, false, - 0, - 0, - 0, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + *FIGHTER_STATUS_ATTR_DISABLE_JUMP_BOARD_EFFECT as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, 0 ); 0.into() } -/// main status loop for bayonet_end -unsafe extern "C" fn bayonet_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - // exit if the animation is not done yet - if !MotionModule::is_end(fighter.module_accessor) { - return 0.into(); +pub unsafe extern "C" fn bayonet_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let stick_y = fighter.global_table[STICK_Y].get_f32(); + + let original = smashline::original_status(Main, fighter, *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT)(fighter); + if !VarModule::is_flag(fighter.battle_object, vars::kirby::instance::BUDDY_SPECIAL_N_BAYONET_ACTIVE) { + return original; } - // if the animation is over, transition to shoot - fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT.into(), false.into()); - 1.into() -} + let attack_hi3_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("attack_hi3_stick_y")); + let attack_lw3_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("attack_lw3_stick_y")); + ControlModule::clear_command(fighter.module_accessor, false); -pub unsafe extern "C" fn bayonet_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { - // change summon anim depending on LR - let frame = 26.0; - MotionModule::change_motion(fighter.module_accessor, Hash40::new("buddy_special_n_shoot_start"), frame, 1.0, false, 0.0, false, false); - ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("special_n_start"), false, frame); + let mot = hash40("buddy_special_n_attack_s"); + FighterMotionModuleImpl::change_motion_kirby_copy( + fighter.module_accessor, + Hash40::new_raw(mot), + 0.0, + 1.0, + false, + 0.0, + false, + false + ); - fighter.main_shift(bayonet_end_main_loop) + let mut motion = hash40("buddy_special_n_attack_s"); + if (stick_y >= attack_hi3_stick_y) { + motion = hash40("buddy_special_n_attack_hi"); + } + else if (stick_y <= attack_lw3_stick_y) { + motion = hash40("buddy_special_n_attack_lw"); + } + MotionModule::remove_motion_partial(fighter.module_accessor, *FIGHTER_MOTION_PART_SET_KIND_UPPER_BODY, false); + MotionModule::change_motion(fighter.module_accessor, Hash40::new_raw(motion), 0.0, 1.0, false, 0.0, false, false); + + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_START_PRECEDE_CHECK); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_TURN); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_END); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_SHOOT); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_SHOOT_TURN); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_RESERVED_SHOOT_TURN); + + fighter.sub_shift_status_main(L2CValue::Ptr(bayonet_main_loop as *const () as _)) } -pub unsafe extern "C" fn bayonet_end_end(fighter: &mut L2CFighterCommon) -> L2CValue { - // re-enable energies and remove the screenwide effect - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - - let next_status = StatusModule::status_kind_next(fighter.module_accessor); - let is_still_blasting = [*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT,*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_WALK_F,*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_WALK_B, - *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_TURN,*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT,*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_LANDING, - *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP,*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_AERIAL,*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_AIR, - *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_FALL,*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_AIR_TURN,*FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_END].contains(&next_status); - - if !is_still_blasting { - ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, ArticleOperationTarget(0)); - ItemModule::set_change_status_event(fighter.module_accessor, true); - WorkModule::set_int(fighter.module_accessor, 0,*FIGHTER_BUDDY_INSTANCE_WORK_ID_INT_SPECIAL_N_BAKYUN_BULLET_SHOOT_COUNT); +/// main status loop for bayonet +unsafe extern "C" fn bayonet_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + // exit if the animation is not done yet + if MotionModule::motion_kind(fighter.module_accessor) != hash40("buddy_special_n_attack_end") { + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_END) { + let start_frame = 26.0; + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_BUDDY_STATUS_SPECIAL_N_FLAG_PRECEDE_END); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("buddy_special_n_attack_end"), start_frame, 1.0, false, 0.0, false, false); + if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_KIRBY_GENERATE_ARTICLE_HAT) { + ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KIRBY_GENERATE_ARTICLE_HAT, Hash40::new("special_n_start"), false, start_frame); + } + if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER) { + ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_BUDDY_GENERATE_ARTICLE_PARTNER, Hash40::new("special_n_start"), false, start_frame); + } + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT.into(), false.into()); + return 1.into(); } - 0.into() } +pub unsafe extern "C" fn bayonet_end(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::off_flag(fighter.battle_object, vars::kirby::instance::BUDDY_SPECIAL_N_BAYONET_ACTIVE); + return smashline::original_status(End, fighter, *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT)(fighter); +} + +pub unsafe extern "C" fn bayonet_exit(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::off_flag(fighter.battle_object, vars::kirby::instance::BUDDY_SPECIAL_N_BAYONET_ACTIVE); + return smashline::original_status(Exit, fighter, *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT)(fighter); +} + pub fn install(agent: &mut Agent) { - agent.status(Pre, statuses::kirby::BUDDY_BUDDY_BAYONET_END, bayonet_end_pre); - agent.status(Main, statuses::kirby::BUDDY_BUDDY_BAYONET_END, bayonet_end_main); - agent.status(End, statuses::kirby::BUDDY_BUDDY_BAYONET_END, bayonet_end_end); + /* + agent.status(Pre, statuses::kirby::BUDDY_SPECIAL_N_BAYONET, bayonet_pre); + agent.status(Main, statuses::kirby::BUDDY_SPECIAL_N_BAYONET, bayonet_main); + agent.status(End, statuses::kirby::BUDDY_SPECIAL_N_BAYONET, bayonet_end); + agent.status(Exit, statuses::kirby::BUDDY_SPECIAL_N_BAYONET, bayonet_exit); + */ + agent.status(Pre, *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT, bayonet_pre); + agent.status(Main, *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT, bayonet_main); + agent.status(End, *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT, bayonet_end); + agent.status(Exit, *FIGHTER_KIRBY_STATUS_KIND_BUDDY_SPECIAL_N_SHOOT_JUMP_SQUAT, bayonet_exit); } \ No newline at end of file diff --git a/fighters/kirby/src/status/copy/krool_special_n.rs b/fighters/kirby/src/status/copy/krool_special_n.rs new file mode 100644 index 0000000000..add9b6d672 --- /dev/null +++ b/fighters/kirby/src/status/copy/krool_special_n.rs @@ -0,0 +1,196 @@ +use super::*; + +pub unsafe extern "C" fn krool_special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_int(0x50000000, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_BATTLE_OBJECT_ID_BLUNDERBUSS); + fighter.set_int(0x50000000, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_BATTLE_OBJECT_ID_SPITBALL); + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, false, -1); + ArticleModule::change_status_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, *WEAPON_KROOL_BLUNDERBUSS_STATUS_KIND_FIRE); + krool_special_n_change_motion(fighter, Hash40::new("krool_special_n_fire"), Hash40::new("krool_special_air_n_fire")); + krool_special_n_set_kinetic(fighter); + if !StopModule::is_stop(fighter.module_accessor) { + krool_special_n_substatus(fighter, false.into()); + } + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(krool_special_n_substatus as *const () as _)); + fighter.off_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_SUCTION_IRONBALL); + fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_NONE, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); + fighter.off_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_CATCH_CUT); + + fighter.main_shift(krool_special_n_main_loop) +} + +// // FUN_710002a5b0 +pub unsafe extern "C" fn krool_special_n_substatus(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { + if !param_1.get_bool() { + if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL_END) { + if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL) { + if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { + fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_IRONBALL); + } + else { + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL, false, -1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_SHOOT_NUM); + } + fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL_END); + let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let back_spd_x = fighter.get_param_float("param_special_n", "special_n_back_spd_x"); + let back_air_spd_x = fighter.get_param_float("param_special_n", "special_n_back_air_spd_x"); + let back_air_spd_y = fighter.get_param_float("param_special_n", "special_n_back_air_spd_y"); + if fighter.is_situation(*SITUATION_KIND_AIR) && sum_speed_y < -0.7 { + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, sum_speed_y + back_air_spd_y); + } + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + if fighter.is_situation(*SITUATION_KIND_AIR) { + let facing = fighter.lr(); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_speed_x - back_air_spd_x * facing, 0.0); + } + else { + let facing = fighter.lr(); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_speed_x - back_spd_x * facing, 0.0); + } + } + } + } + + return 0.into(); +} + +pub unsafe extern "C" fn krool_special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) + || StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_motion_one_of(&[Hash40::new("krool_special_n_fire_hi"), Hash40::new("krool_special_air_n_fire_hi")]) { + krool_special_n_change_motion(fighter, Hash40::new("krool_special_n_fire_hi"), Hash40::new("krool_special_air_n_fire_hi")); + } + else if fighter.is_motion_one_of(&[Hash40::new("krool_special_n_fire_b"), Hash40::new("krool_special_air_n_fire_b")]) { + krool_special_n_change_motion(fighter, Hash40::new("krool_special_n_fire_b"), Hash40::new("krool_special_air_n_fire_b")); + } + else { + krool_special_n_change_motion(fighter, Hash40::new("krool_special_n_fire"), Hash40::new("krool_special_air_n_fire")); + } + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() { + return 1.into(); + } + else { + if fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + } + let pass_speed_y = fighter.get_param_float("common", "pass_speed_y"); + if fighter.stick_y() <= pass_speed_y { + if GroundModule::is_passable_check(fighter.module_accessor) { + GroundModule::set_passable_check(fighter.module_accessor, false); + } + } + else { + if fighter.is_situation(*SITUATION_KIND_AIR) { + GroundModule::set_passable_check(fighter.module_accessor, true); + } + if GroundModule::is_passable_ground(fighter.module_accessor) { + let flick_speed_y = fighter.get_param_float("common", "pass_flick_y"); + if fighter.global_table[FLICK_Y].get_f32() < flick_speed_y { + GroundModule::set_passable_check(fighter.module_accessor, true); + fighter.set_situation(SITUATION_KIND_AIR.into()); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + } + } + // angled shots + if VarModule::is_flag(fighter.battle_object, vars::krool::status::SPECIAL_N_ANGLED) { + VarModule::off_flag(fighter.battle_object, vars::krool::status::SPECIAL_N_ANGLED); + if fighter.stick_y() > 0.5 { + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("krool_special_n_fire_hi") } else { Hash40::new("krool_special_air_n_fire_hi") }; + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + ArticleModule::change_status_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, *WEAPON_KROOL_BLUNDERBUSS_STATUS_KIND_SPIT); + ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_hi"), true, 0.0); + fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_HI, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); + return 0.into(); + } + else if PostureModule::lr(fighter.module_accessor) * fighter.stick_x() < 0.0 { + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("krool_special_n_fire_b") } else { Hash40::new("krool_special_air_n_fire_b") }; + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + ArticleModule::change_status_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, *WEAPON_KROOL_BLUNDERBUSS_STATUS_KIND_SPIT); + ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_b"), true, 0.0); + return 0.into(); + } + } + if VarModule::is_flag(fighter.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { + if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_CANCEL) { + fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_KROOL_SPECIAL_N_SUCTION.into(), true.into()); + return 0.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + if fighter.is_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_DROP_CROWN) { + VisibilityModule::set_int64(fighter.module_accessor, hash40("crown") as i64, hash40("crown_hide") as i64); + } + + return 0.into(); +} + +// FUN_7100025c00 +pub unsafe extern "C" fn krool_special_n_set_kinetic(fighter: &mut L2CFighterCommon) { + let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let start_mul_spd_x = fighter.get_param_float("param_special_n", "special_n_start_mul_spd_x"); + let start_air_mul_spd_x = fighter.get_param_float("param_special_n", "special_n_start_air_mul_spd_x"); + let start_mul_spd_y = fighter.get_param_float("param_special_n", "special_n_start_mul_spd_y"); + if fighter.global_table[STATUS_KIND_INTERRUPT].get_i32() == *FIGHTER_STATUS_KIND_SPECIAL_N { + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, sum_speed_y * start_mul_spd_y); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_speed_x * start_mul_spd_x, 0.0); + } + else { + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_speed_x * start_air_mul_spd_x, 0.0); + } + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + } + else { + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } +} + +// FUN_7100027ed0 +pub unsafe extern "C" fn krool_special_n_change_motion(fighter: &mut L2CFighterCommon, hash1: Hash40, hash2: Hash40) { + if fighter.is_situation(*SITUATION_KIND_AIR) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_FIRST) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + } + else { + MotionModule::change_motion(fighter.module_accessor, hash2, 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_FIRST); + return; + } + MotionModule::change_motion_inherit_frame(fighter.module_accessor, hash2, -1.0, 1.0, 0.0, false, false); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_FIRST) { + MotionModule::change_motion(fighter.module_accessor, hash1, 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_FIRST); + return; + } + MotionModule::change_motion_inherit_frame(fighter.module_accessor, hash1, -1.0, 1.0, 0.0, false, false); + } +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_KIRBY_STATUS_KIND_KROOL_SPECIAL_N, krool_special_n_main); +} \ No newline at end of file diff --git a/fighters/kirby/src/status/copy/lucario_special_n.rs b/fighters/kirby/src/status/copy/lucario_special_n.rs index da444c6986..64feae8c1b 100644 --- a/fighters/kirby/src/status/copy/lucario_special_n.rs +++ b/fighters/kirby/src/status/copy/lucario_special_n.rs @@ -137,10 +137,6 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> return 0.into(); } - // if fighter.check_jump_cancel(false) { - // return 0.into(); - // } - if special_n_check_cancel(fighter).get_bool() { fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_LUCARIO_SPECIAL_N_CANCEL.into(), true.into()); return 0.into(); @@ -182,10 +178,6 @@ unsafe extern "C" fn special_n_max_main_loop(fighter: &mut L2CFighterCommon) -> return 0.into(); } - // if fighter.check_jump_cancel(false) { - // return 0.into(); - // } - if special_n_check_cancel(fighter).get_bool() { fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_LUCARIO_SPECIAL_N_CANCEL.into(), true.into()); return 0.into(); diff --git a/fighters/kirby/src/status/copy/lucas_special_n.rs b/fighters/kirby/src/status/copy/lucas_special_n.rs index bcb1802217..b42a9c362f 100644 --- a/fighters/kirby/src/status/copy/lucas_special_n.rs +++ b/fighters/kirby/src/status/copy/lucas_special_n.rs @@ -135,6 +135,7 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> VarModule::set_int(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_CHARGE_LEVEL, LUCAS_CHARGE_TIME); VarModule::on_flag(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_ACTIVE); VarModule::on_flag(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_INIT); + app::FighterUtil::flash_eye_info(fighter.module_accessor); fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_LUCAS_SPECIAL_N_FIRE.into(), false.into()); return 1.into(); } diff --git a/fighters/kirby/src/status/copy/luigi_special_n.rs b/fighters/kirby/src/status/copy/luigi_special_n.rs index 39f52b713f..b6137135ee 100644 --- a/fighters/kirby/src/status/copy/luigi_special_n.rs +++ b/fighters/kirby/src/status/copy/luigi_special_n.rs @@ -24,7 +24,7 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV return 1.into(); } } - if fighter.status_frame() == 10 && (ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL_RAW)) { + if fighter.check_hold_input(0, 10, Buttons::SpecialAll) { VarModule::on_flag(fighter.object(), vars::kirby::status::SPECIAL_N_THUNDERHAND); let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("luigi_special_n_thunder") } else { Hash40::new("luigi_special_air_n_thunder") }; MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); diff --git a/fighters/kirby/src/status/copy/mario_special_n.rs b/fighters/kirby/src/status/copy/mario_special_n.rs index b05ed49339..7b93349040 100644 --- a/fighters/kirby/src/status/copy/mario_special_n.rs +++ b/fighters/kirby/src/status/copy/mario_special_n.rs @@ -24,7 +24,7 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV return 1.into(); } } - if fighter.status_frame() == 10 && (ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL_RAW)) { + if fighter.check_hold_input(0, 10, Buttons::SpecialAll) { VarModule::on_flag(fighter.object(), vars::kirby::status::SPECIAL_N_FIREBRAND); let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("mario_special_n_fire") } else { Hash40::new("mario_special_air_n_fire") }; MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); diff --git a/fighters/kirby/src/status/copy/mariod_special_n.rs b/fighters/kirby/src/status/copy/mariod_special_n.rs index 782ba8d06b..2259b67e6a 100644 --- a/fighters/kirby/src/status/copy/mariod_special_n.rs +++ b/fighters/kirby/src/status/copy/mariod_special_n.rs @@ -24,7 +24,7 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV return 1.into(); } } - if fighter.status_frame() == 10 && (ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL_RAW)) { + if fighter.check_hold_input(0, 10, Buttons::SpecialAll) { VarModule::on_flag(fighter.object(), vars::kirby::status::SPECIAL_N_CHILL_PILL); let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("mariod_special_n_chill") } else { Hash40::new("mariod_special_air_n_chill") }; MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); diff --git a/fighters/kirby/src/status/copy/mewtwo_special_n.rs b/fighters/kirby/src/status/copy/mewtwo_special_n.rs index 1fa4ce3606..ecc970c0ed 100644 --- a/fighters/kirby/src/status/copy/mewtwo_special_n.rs +++ b/fighters/kirby/src/status/copy/mewtwo_special_n.rs @@ -139,10 +139,6 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> return 0.into(); } - // if fighter.check_jump_cancel(false) { - // return 0.into(); - // } - if special_n_check_cancel(fighter).get_bool() { fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_MEWTWO_SPECIAL_N_CANCEL.into(), true.into()); return 0.into(); @@ -184,10 +180,6 @@ unsafe extern "C" fn special_n_max_main_loop(fighter: &mut L2CFighterCommon) -> return 0.into(); } - // if fighter.check_jump_cancel(false) { - // return 0.into(); - // } - if special_n_check_cancel(fighter).get_bool() { fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_MEWTWO_SPECIAL_N_CANCEL.into(), true.into()); return 0.into(); diff --git a/fighters/kirby/src/status/copy/miifighter_special_n.rs b/fighters/kirby/src/status/copy/miifighter_special_n.rs new file mode 100644 index 0000000000..55c1148341 --- /dev/null +++ b/fighters/kirby/src/status/copy/miifighter_special_n.rs @@ -0,0 +1,112 @@ +use super::*; + +pub unsafe extern "C" fn miifighter_special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01) + -1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01) + -1); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + special_n_change_motion(fighter, Hash40::new("miifighter_special_n1")); + } + else if fighter.is_situation(*SITUATION_KIND_AIR) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + special_n_change_motion(fighter, Hash40::new("miifighter_special_air_n1")); + } + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_ANGLE, 45.0); + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_SPEED, 2.25); + + fighter.main_shift(miifighter_special_n_main_loop) +} + +unsafe extern "C" fn miifighter_special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + StatusModule::set_situation_kind(fighter.module_accessor, SituationKind(*SITUATION_KIND_GROUND), false); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + special_n_change_motion(fighter, Hash40::new("miifighter_special_n1")); + } + else if fighter.is_situation(*SITUATION_KIND_AIR) { + StatusModule::set_situation_kind(fighter.module_accessor, SituationKind(*SITUATION_KIND_AIR), false); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + special_n_change_motion(fighter, Hash40::new("miifighter_special_air_n1")); + } + } + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + let charge = VarModule::get_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_CHARGE) as f32; + let angle = 45.0 - charge * 0.75; + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_START_HOLD) { + if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + VarModule::inc_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_CHARGE); + if charge == 1.0 { + MotionModule::set_rate(fighter.module_accessor, 0.5); + EFFECT_FOLLOW_FLIP(fighter, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), 2, 12, -3, 0, 0, 0, 0.3, false, *EF_FLIP_AXIS_YZ); + } + if charge == 10.0 { + fighter.change_motion_inherit_frame_keep_rate_by_situation("special_n1_bowl", "special_air_n1_bowl", -1.0, 1.0, 0.0); + } + } + else { + MotionModule::set_rate(fighter.module_accessor, 1.0); + VarModule::on_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD); + } + } + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD) { + VarModule::off_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_START_HOLD); + VarModule::off_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD); + MotionModule::set_rate(fighter.module_accessor, 1.0); + let throw_speed = if fighter.is_situation(*SITUATION_KIND_GROUND) { 2.75 } else { 2.75 - (charge * 0.025) }; + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_ANGLE, angle); + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_SPEED, throw_speed); + } + if MotionModule::is_end(fighter.module_accessor) { + let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_STATUS_KIND_WAIT } else { FIGHTER_STATUS_KIND_FALL }; + fighter.change_status(status.into(), false.into()); + } + + return 0.into(); +} + +unsafe fn special_n_change_motion(fighter: &mut L2CFighterCommon, motion: Hash40) { + if fighter.is_flag(*FIGHTER_MIIFIGHTER_STATUS_WORK_ID_IRONBALL_FLAG_FIRST) { + let _motion = if fighter.is_motion(Hash40::new("miifighter_special_n1_bowl")) { + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_SPEED, 2.25); + Hash40::new("miifighter_special_air_n1_bowl") + } + else if fighter.is_motion(Hash40::new("miifighter_special_air_n1_bowl")) { + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_SPEED, 2.75); + Hash40::new("miifighter_special_n1_bowl") + } + else { motion }; + MotionModule::change_motion_inherit_frame(fighter.module_accessor, _motion, -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIFIGHTER_STATUS_WORK_ID_IRONBALL_FLAG_FIRST); + } +} + +pub unsafe extern "C" fn miifighter_special_n_end(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_KIRBY_STATUS_KIND_MIIFIGHTER_SPECIAL_N, miifighter_special_n_main); + agent.status(End, *FIGHTER_KIRBY_STATUS_KIND_MIIFIGHTER_SPECIAL_N, miifighter_special_n_end); +} \ No newline at end of file diff --git a/fighters/kirby/src/status/copy/miigunner_special_n.rs b/fighters/kirby/src/status/copy/miigunner_special_n.rs index f008e40ae3..8f9bf69c52 100644 --- a/fighters/kirby/src/status/copy/miigunner_special_n.rs +++ b/fighters/kirby/src/status/copy/miigunner_special_n.rs @@ -1,5 +1,53 @@ use super::*; +pub unsafe extern "C" fn special_n1_start_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + FighterMotionModuleImpl::change_motion_kirby_copy(fighter.module_accessor, Hash40::new("special_n1_start"), 0.0, 1.0, false, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + FighterMotionModuleImpl::change_motion_kirby_copy(fighter.module_accessor, Hash40::new("special_air_n1_start"), 0.0, 1.0, false, 0.0, false, false); + } + VarModule::on_flag(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE); + ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8); + + fighter.main_shift(special_n1_start_main_loop) +} + +pub unsafe extern "C" fn special_n1_start_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if ControlModule::check_button_release(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + VarModule::off_flag(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE); + } + if MotionModule::is_end(fighter.module_accessor) { + let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); + let cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); + if charge_count as f32 >= cshot_charge_frame { + fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_MIIGUNNER_SPECIAL_N1_FIRE.into(), false.into()); + } + else { + fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_MIIGUNNER_SPECIAL_N1_HOLD.into(), false.into()); + } + return 1.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + FighterMotionModuleImpl::change_motion_inherit_frame_kirby_copy(fighter.module_accessor, Hash40::new("special_n1_start"), -1.0, 1.0, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + FighterMotionModuleImpl::change_motion_inherit_frame_kirby_copy(fighter.module_accessor, Hash40::new("special_air_n1_start"), -1.0, 1.0, 0.0, false, false); + } + } + + return 0.into(); +} + pub unsafe extern "C" fn special_n1_fire_main(fighter: &mut L2CFighterCommon) -> L2CValue { let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_COUNT); let n1_cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); @@ -13,7 +61,7 @@ pub unsafe extern "C" fn special_n1_fire_main(fighter: &mut L2CFighterCommon) -> FighterMotionModuleImpl::change_motion_kirby_copy(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); } else { - let motion = if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + let motion = if VarModule::is_flag(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE) { if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("miigunner_special_n1_neon") } @@ -74,10 +122,31 @@ pub unsafe extern "C" fn special_n1_fire_main_loop(fighter: &mut L2CFighterCommo MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, motion, -1.0, 1.0, 0.0); } } + if fighter.is_motion_one_of(&[Hash40::new("miigunner_special_n1_neon"), Hash40::new("miigunner_special_air_n1_neon")]) { + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) + && !VarModule::is_flag(fighter.battle_object, vars::miigunner::status::SPECIAL_N1_CLEAR_CRIT) { + VarModule::on_flag(fighter.battle_object, vars::miigunner::status::SPECIAL_N1_CLEAR_CRIT); + SlowModule::set_whole(fighter.module_accessor, 4, 25); + EffectModule::req_screen(fighter.module_accessor, Hash40::new("bg_criticalhit"), false, true, true); + } + } + + return 0.into(); +} +unsafe extern "C" fn special_n1_fire_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_CLEAR_CRIT) { + SlowModule::clear_whole(fighter.module_accessor); + CameraModule::reset_all(fighter.module_accessor); + EffectModule::remove_screen(fighter.module_accessor, Hash40::new("bg_criticalhit"), 0); + } + return 0.into(); } pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_KIRBY_STATUS_KIND_MIIGUNNER_SPECIAL_N1_START, special_n1_start_main); + agent.status(Main, *FIGHTER_KIRBY_STATUS_KIND_MIIGUNNER_SPECIAL_N1_FIRE, special_n1_fire_main); + agent.status(End, *FIGHTER_KIRBY_STATUS_KIND_MIIGUNNER_SPECIAL_N1_FIRE, special_n1_fire_end); } \ No newline at end of file diff --git a/fighters/kirby/src/status/copy/mod.rs b/fighters/kirby/src/status/copy/mod.rs index 5c5db7db74..a3a0705b18 100644 --- a/fighters/kirby/src/status/copy/mod.rs +++ b/fighters/kirby/src/status/copy/mod.rs @@ -3,7 +3,7 @@ use globals::*; // status script import mod bayonetta_special_n_cancel; -// mod buddy_bayonet_end; +mod buddy_bayonet_end; mod captain_special_n; mod daisy_special_n; mod diddy_special_n_cancel; @@ -13,6 +13,7 @@ mod ganon_special_n; mod ganon_special_n_float; mod gaogaen_special_n; mod koopa_special_n; +mod krool_special_n; mod littlemac_special_n; mod lucario_special_n; mod lucas_special_n; @@ -21,6 +22,7 @@ mod mario_special_n; mod mariod_special_n; mod master_special_n; mod mewtwo_special_n; +mod miifighter_special_n; mod miigunner_special_n; mod pacman_special_n; mod palutena_special_n; @@ -39,7 +41,7 @@ mod wario_special_n; pub fn install(agent: &mut Agent) { bayonetta_special_n_cancel::install(agent); - // buddy_bayonet_end::install(agent); + buddy_bayonet_end::install(agent); captain_special_n::install(agent); daisy_special_n::install(agent); diddy_special_n_cancel::install(agent); @@ -49,6 +51,7 @@ pub fn install(agent: &mut Agent) { ganon_special_n_float::install(agent); gaogaen_special_n::install(agent); koopa_special_n::install(agent); + krool_special_n::install(agent); littlemac_special_n::install(agent); lucario_special_n::install(agent); lucas_special_n::install(agent); @@ -57,6 +60,7 @@ pub fn install(agent: &mut Agent) { mariod_special_n::install(agent); master_special_n::install(agent); mewtwo_special_n::install(agent); + miifighter_special_n::install(agent); miigunner_special_n::install(agent); pacman_special_n::install(agent); palutena_special_n::install(agent); diff --git a/fighters/kirby/src/status/copy/palutena_special_n.rs b/fighters/kirby/src/status/copy/palutena_special_n.rs index 9baa47ef14..d9b645b46f 100644 --- a/fighters/kirby/src/status/copy/palutena_special_n.rs +++ b/fighters/kirby/src/status/copy/palutena_special_n.rs @@ -55,7 +55,7 @@ unsafe extern "C" fn special_n_init(fighter: &mut L2CFighterCommon) -> L2CValue unsafe extern "C" fn special_n_momentum_helper(fighter: &mut L2CFighterCommon, start: L2CValue) { let mut speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); if start.get_bool() { - let special_n_speed_x_mul = 0.8;//WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("special_s_speed_x_mul")); + let special_n_speed_x_mul = 0.7;//WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("special_s_speed_x_mul")); speed_x *= special_n_speed_x_mul; } let reset_type = if fighter.is_situation(*SITUATION_KIND_GROUND) { ENERGY_STOP_RESET_TYPE_GROUND } else { ENERGY_STOP_RESET_TYPE_AIR }; @@ -81,7 +81,8 @@ unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); FighterMotionModuleImpl::change_motion_kirby_copy(fighter.module_accessor, Hash40::new("special_air_n"), 0.0, 1.0, false, 0.0, false, false); } - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x37b6ecdcec)); + //notify_event_msc_cmd!(fighter, Hash40::new_raw(0x37b6ecdcec)); + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_PALUTENA_GENERATE_ARTICLE_EXPLOSIVEFLAME, false, -1); fighter.main_shift(special_n_main_loop) } diff --git a/fighters/kirby/src/status/copy/pfushigisou_special_n.rs b/fighters/kirby/src/status/copy/pfushigisou_special_n.rs index d3d0de68c9..ad40703204 100644 --- a/fighters/kirby/src/status/copy/pfushigisou_special_n.rs +++ b/fighters/kirby/src/status/copy/pfushigisou_special_n.rs @@ -19,6 +19,7 @@ unsafe extern "C" fn pfushigisou_special_n_main_loop(fighter: &mut L2CFighterCom } unsafe extern "C" fn pfushigisou_special_n_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::kirby::instance::SPECIAL_N_PFUSHIGISOU_SEED_FIRED); special_n_mot_helper(fighter, Hash40::new("special_n_end"), Hash40::new("special_air_n_end"), false); fighter.main_shift(pfushigisou_special_n_end_main_loop) } diff --git a/fighters/kirby/src/status/mod.rs b/fighters/kirby/src/status/mod.rs index 6b00180de9..08be46f921 100644 --- a/fighters/kirby/src/status/mod.rs +++ b/fighters/kirby/src/status/mod.rs @@ -205,19 +205,20 @@ unsafe extern "C" fn should_use_special_n_callback(fighter: &mut L2CFighterCommo return 1.into(); } } - if copy_kind != *FIGHTER_KIND_PIT { - if copy_kind != *FIGHTER_KIND_PITB { - if copy_kind == *FIGHTER_KIND_INKLING { - let inkling_ink = WorkModule::get_float(fighter.module_accessor, *FIGHTER_KIRBY_INSTANCE_WORK_ID_FLOAT_INKLING_SPECIAL_N_INK); - if inkling_ink > 0.0 { - return 1.into(); - } - else { - return 0.into(); - } - } + if copy_kind == *FIGHTER_KIND_INKLING { + let inkling_ink = WorkModule::get_float(fighter.module_accessor, *FIGHTER_KIRBY_INSTANCE_WORK_ID_FLOAT_INKLING_SPECIAL_N_INK); + if inkling_ink > 0.0 { return 1.into(); } + else { + return 0.into(); + } + } + if copy_kind == *FIGHTER_KIND_PFUSHIGISOU { + if VarModule::is_flag(fighter.battle_object, vars::kirby::instance::SPECIAL_N_PFUSHIGISOU_SEED_FIRED) { + return 0.into(); + } + return 1.into(); } if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_KIRBY_INSTANCE_WORK_ID_FLAG_COPY_STRANS_OFF) { return 1.into(); @@ -282,6 +283,7 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { VarModule::off_flag(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_ACTIVE); VarModule::off_flag(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_INIT); VarModule::off_flag(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_RELEASE_AFTER_WHIFF); + VarModule::off_flag(fighter.battle_object, vars::kirby::instance::SPECIAL_N_PFUSHIGISOU_SEED_FIRED); } unsafe extern "C" fn entry_main(fighter: &mut L2CFighterCommon) -> L2CValue { diff --git a/fighters/kirby/src/status/special_hi.rs b/fighters/kirby/src/status/special_hi.rs index 324d31b919..1aac82087b 100644 --- a/fighters/kirby/src/status/special_hi.rs +++ b/fighters/kirby/src/status/special_hi.rs @@ -139,7 +139,11 @@ unsafe extern "C" fn special_hi_h_main_loop(fighter: &mut L2CFighterCommon) -> L return 1.into(); } - let frame = MotionModule::frame(fighter.module_accessor); + // Reduce speed on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + let shield_hit_speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.shield_hit_speed_x_mul"); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, shield_hit_speed_x_mul); + } if MotionModule::is_end(fighter.module_accessor) { if fighter.is_situation(*SITUATION_KIND_GROUND) { @@ -158,17 +162,20 @@ unsafe extern "C" fn special_hi_h_main_loop(fighter: &mut L2CFighterCommon) -> L } } } - else { - if fighter.is_situation(*SITUATION_KIND_GROUND) && fighter.is_prev_situation(*SITUATION_KIND_AIR) { + + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + let frame = MotionModule::frame(fighter.module_accessor); if frame <= 13.0 { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi_h"), frame + 15.0, 1.0, false, 0.0, false, false); + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_hi_h"), -1.0, 1.0, 0.0); } - else { - if frame >= 53.0 { - StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, false); - } + else if frame >= 53.0 { + StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, false); } } + else { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_air_hi_h"), -1.0, 1.0, 0.0); + } } return 0.into(); diff --git a/fighters/koopa/Cargo.toml b/fighters/koopa/Cargo.toml index e160f4d659..6962164602 100644 --- a/fighters/koopa/Cargo.toml +++ b/fighters/koopa/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -interpolation = "0.2.0" \ No newline at end of file +interpolation = "0.2.0" +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/koopa/src/acmd/aerials.rs b/fighters/koopa/src/acmd/aerials.rs index f44d0ac666..c8e693e3d4 100644 --- a/fighters/koopa/src/acmd/aerials.rs +++ b/fighters/koopa/src/acmd/aerials.rs @@ -42,7 +42,7 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); for _ in 0..2 { if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("koopa_shell_b"), Hash40::new("koopa_shell_a"), Hash40::new("rot"), 0, 03, 0, 0, 0, 0, 1.45, true, *EF_FLIP_NONE); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("koopa_shell_b"), Hash40::new("koopa_shell_a"), Hash40::new("rot"), 0, 3, 0, 0, 0, 0, 1.45, true, *EF_FLIP_NONE); } wait(lua_state, 5.0); if is_excute(agent) { @@ -189,22 +189,23 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 8.0); + frame(lua_state, 8.0); // f14 FT_MOTION_RATE_RANGE(agent, 8.0, 17.0, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("head"), 17.0, 74, 84, 0, 45, 7.5, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("head"), 17.0, 80, 82, 0, 45, 7.5, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); } - frame(lua_state, 17.0); + frame(lua_state, 17.0); // f21 FT_MOTION_RATE_RANGE(agent, 17.0, 40.0, 21.0); if is_excute(agent) { AttackModule::clear_all(boma); HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); } - frame(lua_state, 40.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 35.5); // f38 if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 40.0); // f42 + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { diff --git a/fighters/koopa/src/acmd/ground.rs b/fighters/koopa/src/acmd/ground.rs index a54a3f670d..d611283a51 100644 --- a/fighters/koopa/src/acmd/ground.rs +++ b/fighters/koopa/src/acmd/ground.rs @@ -75,89 +75,106 @@ unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 13.0); sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.7); - frame(lua_state, 6.0); - FT_MOTION_RATE_RANGE(agent, 6.0, 14.0, 4.0); - frame(lua_state, 14.0); - FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + JostleModule::set_status(boma, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 70, 82, 0, 50, 8.5, 0.0, 13.5, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 55, 0, 50, 5.0, 0.0, 5.0, 5.0, Some(0.0), Some(7.5), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 62, 96, 0, 50, 5.0, 0.0, 15.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 62, 96, 0, 50, 6.0, 0.0, 16.0, 15.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 62, 76, 0, 50, 7.5, 0.0, 12.5, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + } + frame(lua_state, 22.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 55, 0, 50, 6.5, 0.0, 12.5, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + } + frame(lua_state, 24.0); + if is_excute(agent) { + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 55, 0, 50, 4.0, 0.0, 7.5, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } - frame(lua_state, 17.0); + frame(lua_state, 26.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 62, 96, 0, 50, 5.0, 0.0, 6.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 62, 96, 0, 50, 6.0, 0.0, 4.0, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 55, 0, 50, 6.5, 0.0, 11.5, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 55, 0, 50, 4.0, 0.0, 6.5, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } - frame(lua_state, 19.0); + frame(lua_state, 29.0); if is_excute(agent) { AttackModule::clear_all(boma); + JostleModule::set_status(boma, true); } } unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - - frame(lua_state, 13.0); + frame(lua_state, 11.0); if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); - LAST_EFFECT_SET_RATE(agent, 1.5); + FOOT_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 2, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 15.0); + frame(lua_state, 14.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("koopa_scratch"), Hash40::new("koopa_scratch"), Hash40::new("top"), -2, 20, 5.5, 19, -8, -52, 1.6, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 1.5); - EffectModule::set_visible_kind(boma, Hash40::new("koopa_scratch"), false); - - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), -4, 13, -30, 0, 0, 0, 2.5, true); - LAST_EFFECT_SET_RATE(agent, 1.75); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("koopa_shell_b"), Hash40::new("koopa_shell_a"), Hash40::new("rot"), 0, 3, 0, 0, 0, 0, 1.45, true, *EF_FLIP_NONE); + LAST_EFFECT_SET_RATE(agent, 0.75); } - frame(lua_state, 16.0); + frame(lua_state, 28.0); if is_excute(agent) { - EffectModule::set_visible_kind(boma, Hash40::new("koopa_scratch"), true); + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 5, 0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 17.0); + frame(lua_state, 42.0); if is_excute(agent) { - if PostureModule::lr(boma) > 0.0 { - EFFECT(agent, Hash40::new("sys_damage_spark_s"), Hash40::new("top"), 18.0, 2.0, 0.0, 0,0,140,0.9, 0, 0, 0, 0, 0, 0, false); - } - else{ - EFFECT(agent, Hash40::new("sys_damage_spark_s"), Hash40::new("top"), 18.0, 2.0, 0.0, 0,0,-140,0.9, 0, 0, 0, 0, 0, 0, false); - } - LAST_EFFECT_SET_RATE(agent,1.5); + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, false); } } unsafe extern "C" fn sound_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - - frame(lua_state, 15.0); + frame(lua_state, 10.0); if is_excute(agent) { let play_vc = app::sv_math::rand(hash40("fighter"), 3) == 0; if play_vc { - PLAY_SE(agent, Hash40::new("vc_koopa_attack07")); + PLAY_SE(agent, Hash40::new("vc_koopa_attack05")); } } - frame(lua_state, 16.0); + frame(lua_state, 13.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_koopa_nailswing02")); + PLAY_SE(agent, Hash40::new("se_koopa_smash_h01")); + PLAY_STATUS(agent, Hash40::new("se_koopa_smash_s01")); + } + frame(lua_state, 28.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_koopa_smash_l02")); + PLAY_LANDING_SE(agent, Hash40::new("se_koopa_landing02")); + } + frame(lua_state, 42.0); + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_koopa_landing02")); + PLAY_LANDING_SE(agent, Hash40::new("se_koopa_landing01")); } } unsafe extern "C" fn expression_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); } - frame(lua_state, 16.0); + frame(lua_state, 11.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 13.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); + } + frame(lua_state, 18.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } + frame(lua_state, 23.0); if is_excute(agent) { - RUMBLE_HIT(agent, Hash40::new("rbkind_slashl"), 0); + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); } } diff --git a/fighters/koopa/src/acmd/other.rs b/fighters/koopa/src/acmd/other.rs index d9e5ca5692..4b991ff60c 100644 --- a/fighters/koopa/src/acmd/other.rs +++ b/fighters/koopa/src/acmd/other.rs @@ -44,7 +44,7 @@ unsafe extern "C" fn expression_landingheavy(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_landl"), 0, false, 0x50000000 /* default value */); slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - if !agent.is_prev_status(*FIGHTER_STATUS_KIND_ESCAPE_AIR) { + if !agent.is_prev_status_one_of(&[*FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_STATUS_KIND_DAMAGE_AIR]) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } @@ -84,15 +84,11 @@ unsafe extern "C" fn sound_dash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -102,10 +98,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_passivestand(agent: &mut L2CAgentBase) { diff --git a/fighters/koopa/src/acmd/smashes.rs b/fighters/koopa/src/acmd/smashes.rs index 3086f38499..13e8badfd7 100644 --- a/fighters/koopa/src/acmd/smashes.rs +++ b/fighters/koopa/src/acmd/smashes.rs @@ -59,12 +59,9 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FLIP(agent, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), 12, 15, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false, *EF_FLIP_YZ); } - frame(lua_state, 7.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -8, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); - } frame(lua_state, 20.0); if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -8, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); EFFECT_FOLLOW_FLIP(agent, Hash40::new("koopa_smash_line"), Hash40::new("koopa_smash_line"), Hash40::new("top"), 0, 13, -20, 0, 0, 0, 2.3, true, *EF_FLIP_YZ); let eff_handle = VarModule::get_int64(agent.battle_object, vars::koopa::instance::ATTACK_S4_EFFECT_HANDLE); EffectModule::set_scale(boma, eff_handle as u32, &Vector3f::zero()); @@ -185,25 +182,17 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 4.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 9.0); - } frame(lua_state, 5.0); if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 9.0); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); - } - frame(lua_state, 6.0); - if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 9.0); } frame(lua_state, 12.0); if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - ATTACK(agent, 0, 0, Hash40::new("handl"), 16.0, 40, 90, 0, 56, 6.0, 0.0, 0.0, 1.0, Some(5.3), Some(0.0), Some(1.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 14.5, 40, 90, 0, 56, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 14.5, 40, 90, 0, 56, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handl"), 16.0, 42, 90, 0, 56, 6.0, 0.0, 0.0, 1.0, Some(5.3), Some(0.0), Some(1.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 14.0, 42, 90, 0, 56, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 14.0, 42, 90, 0, 56, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); } frame(lua_state, 15.0); FT_MOTION_RATE_RANGE(agent, 15.0, 27.0, 9.0); @@ -214,9 +203,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 28.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handr"), 15.0, 40, 96, 0, 56, 6.0, 0.0, -0.6, 0.5, Some(4.5), Some(-0.6), Some(0.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 13.5, 40, 96, 0, 56, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 13.5, 40, 96, 0, 56, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handr"), 15.0, 42, 96, 0, 56, 6.0, 0.0, -0.6, 0.5, Some(4.5), Some(-0.6), Some(0.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 13.0, 42, 96, 0, 56, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 13.0, 42, 96, 0, 56, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); } frame(lua_state, 31.0); if is_excute(agent) { diff --git a/fighters/koopa/src/acmd/specials/special_lw.rs b/fighters/koopa/src/acmd/specials/special_lw.rs index 039d67aed8..bf1f487941 100644 --- a/fighters/koopa/src/acmd/specials/special_lw.rs +++ b/fighters/koopa/src/acmd/specials/special_lw.rs @@ -19,7 +19,7 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { } frame(lua_state, 37.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 76, 89, 0, 45, 8.3, 0.0, 5.2, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 35, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 76, 89, 0, 45, 8.3, 0.0, 5.2, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 30, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } } @@ -51,11 +51,11 @@ unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { frame(lua_state, 31.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_KOOPA_STATUS_SPECIAL_LW_FLAG1); - ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 76, 89, 0, 45, 8.3, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 35, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 76, 89, 0, 45, 8.3, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 30, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } frame(lua_state, 33.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 76, 89, 0, 45, 8.3, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 35, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 76, 89, 0, 45, 8.3, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 30, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } } diff --git a/fighters/koopa/src/acmd/specials/special_n.rs b/fighters/koopa/src/acmd/specials/special_n.rs index 940d5873d4..cf207dc522 100644 --- a/fighters/koopa/src/acmd/specials/special_n.rs +++ b/fighters/koopa/src/acmd/specials/special_n.rs @@ -21,17 +21,18 @@ unsafe extern "C" fn game_specialnend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 31.0, 16.0); - frame(lua_state, 10.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 5.0); + frame(lua_state, 9.0); // f6 + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { if boma.kind() == *FIGHTER_KIND_KOOPA { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 50, 90, 0, 55, 6.0, 0.0, 9.0, 7.0, Some(0.0), Some(9.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 50, 90, 0, 55, 6.0, 0.0, 9.0, 7.0, Some(0.0), Some(9.0), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } else { ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 50, 90, 0, 55, 6.0, 0.0, 6.0, 4.0, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } } - frame(lua_state, 14.0); + frame(lua_state, 13.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -50,11 +51,20 @@ unsafe extern "C" fn effect_specialnend(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); if is_excute(agent) { if agent.is_situation(*SITUATION_KIND_GROUND) { - FOOT_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + FOOT_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } } } +unsafe extern "C" fn sound_specialnend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_koopa_smash_l02")); + } +} + unsafe extern "C" fn game_specialnmax(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -172,6 +182,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialairnend", game_specialnend, Priority::Low); agent.acmd("effect_specialnend", effect_specialnend, Priority::Low); agent.acmd("effect_specialairnend", effect_specialnend, Priority::Low); + agent.acmd("sound_specialnend", sound_specialnend, Priority::Low); + agent.acmd("sound_specialairnend", sound_specialnend, Priority::Low); agent.acmd("game_specialnmax", game_specialnmax, Priority::Low); agent.acmd("game_specialairnmax", game_specialnmax, Priority::Low); diff --git a/fighters/koopa/src/acmd/specials/special_s.rs b/fighters/koopa/src/acmd/specials/special_s.rs index f826aa5cb1..4bcb4ff863 100644 --- a/fighters/koopa/src/acmd/specials/special_s.rs +++ b/fighters/koopa/src/acmd/specials/special_s.rs @@ -7,6 +7,23 @@ unsafe extern "C" fn game_specialscatch(agent: &mut L2CAgentBase) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 70, 30, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BODY); } + frame(lua_state, 13.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_MOTION); + JostleModule::set_overlap_rate_mul(boma, 2.0); + } + else { + if VarModule::is_flag(boma.object(), vars::koopa::instance::SPECIAL_S_DISABLE_STALL) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } + else { + VarModule::on_flag(boma.object(), vars::koopa::instance::SPECIAL_S_DISABLE_STALL); + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + } + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.5); + } + } frame(lua_state, 15.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); @@ -14,22 +31,35 @@ unsafe extern "C" fn game_specialscatch(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 7.0, 17.0, None, None, None, *FIGHTER_STATUS_KIND_KOOPA_DIVED, *COLLISION_SITUATION_MASK_GA); - CATCH(agent, 1, Hash40::new("top"), 5.5, 0.0, 7.0, 10.0, None, None, None, *FIGHTER_STATUS_KIND_KOOPA_DIVED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 7.0, 13.5, None, None, None, *FIGHTER_STATUS_KIND_KOOPA_DIVED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 1, Hash40::new("top"), 5.5, 0.0, 7.0, 8.5, None, None, None, *FIGHTER_STATUS_KIND_KOOPA_DIVED, *COLLISION_SITUATION_MASK_GA); } frame(lua_state, 17.0); if is_excute(agent) { grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); GrabModule::set_rebound(boma, false); - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 65, 90, 0, 55, 5.5, 0.0, 7.5, 22.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_THROW); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 65, 90, 0, 55, 6.5, 0.0, 7.5, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_THROW); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 65, 90, 0, 55, 6.5, 0.0, 7.5, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_THROW); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 65, 90, 0, 55, 5.5, 0.0, 7.5, 22.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_THROW); + } + frame(lua_state, 18.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_AIR) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } } frame(lua_state, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 25.0); - FT_MOTION_RATE_RANGE(agent, 25.0, 60.0, 25.0); + FT_MOTION_RATE_RANGE(agent, 25.0, 60.0, 23.0); + frame(lua_state, 39.0); // f35 + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + if agent.is_situation(*SITUATION_KIND_AIR) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); + } + } frame(lua_state, 60.0); FT_MOTION_RATE(agent, 1.0); } @@ -39,18 +69,27 @@ unsafe extern "C" fn effect_specialscatch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), 5, 15, -14, 0, 0, 0, 0.8, false, *EF_FLIP_YZ); + if agent.is_situation(*SITUATION_KIND_GROUND) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_sp_flash"), Hash40::new("sys_sp_flash"), Hash40::new("top"), 5, 17, -15, 0, 0, 0, 0.8, false, *EF_FLIP_YZ); + } + else { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_sp_flash"), Hash40::new("sys_sp_flash"), Hash40::new("top"), 5, 15, -14, 0, 0, 0, 0.8, false, *EF_FLIP_YZ); + } } frame(lua_state, 12.0); if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("koopa_scratch"), Hash40::new("koopa_scratch"), Hash40::new("top"), 0, 13.5, 5, 24, -70, 2, 2, true, *EF_FLIP_YZ); LAST_EFFECT_SET_COLOR(agent, 0.6, 0.6, 2.0); } - frame(lua_state, 18.0); + frame(lua_state, 13.0); if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("sys_sp_flash"), true, true); if agent.is_situation(*SITUATION_KIND_GROUND) { LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } + } + frame(lua_state, 18.0); + if is_excute(agent) { FLASH(agent, 1, 1, 0.753, 0.627); FLASH_FRM(agent, 5, 0.502, 0, 0, 0); } @@ -92,6 +131,18 @@ unsafe extern "C" fn expression_specialscatch(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialssquat(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 70, 30, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BODY); + } + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 16.0, 10.0); + frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 1.0); +} + unsafe extern "C" fn effect_specialssquat(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("sys_catch"), Hash40::new("haver"), 0, 1, 2, 0, 0, 0, 0.8, false); @@ -102,13 +153,16 @@ unsafe extern "C" fn game_specialsthrowf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 12.0, 65, 49, 0, 88, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 12.0, 77, 49, 0, 84, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 14.0, 8.0); + frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 19.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_KOOPA_STATUS_SPECIAL_S_FLAG_HIT); - CameraModule::reset_all(boma); } } @@ -133,7 +187,7 @@ unsafe extern "C" fn sound_specialsthrowf(agent: &mut L2CAgentBase) { if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_common_throw_01")); } - wait(lua_state, 15.0); + frame(lua_state, 16.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_common_throw_02")); } @@ -156,7 +210,7 @@ unsafe extern "C" fn game_specialsthrowb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 12.0, 45, 81, 0, 57, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 15.0, 45, 75, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 1.0); @@ -171,7 +225,6 @@ unsafe extern "C" fn game_specialsthrowb(agent: &mut L2CAgentBase) { if is_excute(agent) { REVERSE_LR(agent); WorkModule::on_flag(boma, *FIGHTER_KOOPA_STATUS_SPECIAL_S_FLAG_HIT); - CameraModule::reset_all(boma); } } @@ -196,7 +249,7 @@ unsafe extern "C" fn sound_specialsthrowb(agent: &mut L2CAgentBase) { if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_common_throw_01")); } - wait(lua_state, 15.0); + wait(lua_state, 12.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_common_throw_02")); } @@ -303,8 +356,19 @@ unsafe extern "C" fn game_specialsthrowlw(agent: &mut L2CAgentBase) { frame(lua_state, 21.0); if is_excute(agent) { AttackModule::clear_all(boma); - let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); + WorkModule::on_flag(boma, *FIGHTER_KOOPA_STATUS_SPECIAL_S_FLAG_HIT); + } +} + +unsafe extern "C" fn game_specialairsthrowlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 12.0, 290, 60, 0, 30, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 19.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_KOOPA_STATUS_SPECIAL_S_FLAG_HIT); } } @@ -313,15 +377,13 @@ unsafe extern "C" fn effect_specialsthrowlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; frame(lua_state, 18.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 25, 2, 45, 0, 0, 1.7, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), -7, 25, 2, 45, 0, 0, 1.7, true); FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 2, 0, -8, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 19.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 10, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); - EFFECT(agent, Hash40::new("sys_attack_impact"), Hash40::new("head"), 3, 0, 0, 0, 0, 0, 2.3, 0, 0, 0, 0, 0, 360, true); - LAST_EFFECT_SET_RATE(agent,0.8); + LAST_EFFECT_SET_RATE(agent, 0.8); } } @@ -331,6 +393,10 @@ unsafe extern "C" fn sound_specialsthrowlw(agent: &mut L2CAgentBase) { if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_common_throw_01")); } + frame(lua_state, 16.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } } unsafe extern "C" fn expression_specialsthrowlw(agent: &mut L2CAgentBase) { @@ -356,6 +422,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_specialscatch", expression_specialscatch, Priority::Low); agent.acmd("expression_specialsaircatch", expression_specialscatch, Priority::Low); + agent.acmd("game_specialssquat", game_specialssquat, Priority::Low); + agent.acmd("game_specialairssquat", game_specialssquat, Priority::Low); agent.acmd("effect_specialssquat", effect_specialssquat, Priority::Low); agent.acmd("effect_specialairssquat", effect_specialssquat, Priority::Low); @@ -385,7 +453,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_specialslanding", expression_specialslanding, Priority::Low); agent.acmd("game_specialsthrowlw", game_specialsthrowlw, Priority::Low); - agent.acmd("game_specialairsthrowlw", game_specialsthrowlw, Priority::Low); + agent.acmd("game_specialairsthrowlw", game_specialairsthrowlw, Priority::Low); agent.acmd("effect_specialsthrowlw", effect_specialsthrowlw, Priority::Low); agent.acmd("effect_specialairsthrowlw", effect_specialsthrowlw, Priority::Low); agent.acmd("sound_specialsthrowlw", sound_specialsthrowlw, Priority::Low); diff --git a/fighters/koopa/src/acmd/throws.rs b/fighters/koopa/src/acmd/throws.rs index 8c16e83683..5350845e07 100644 --- a/fighters/koopa/src/acmd/throws.rs +++ b/fighters/koopa/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.875); - frame(lua_state, 7.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 5.5, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(14.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 5.5, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(14.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -66,11 +65,79 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 12.0, 42, 80, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 35.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, 23, 16); + } + frame(lua_state, 36.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + +unsafe extern "C" fn sound_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 30.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } +} + +unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 12.0, 45, 74, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 18.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); + CHECK_FINISH_CAMERA(agent, 20, 15); + } + frame(lua_state, 19.0); + if is_excute(agent) { + REVERSE_LR(agent); + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + +unsafe extern "C" fn sound_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 15.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } +} + unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 2.0, 77, 189, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 2.0, 80, 189, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 16.0); @@ -161,7 +228,13 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("sound_throwf", sound_throwf, Priority::Low); + + agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("sound_throwb", sound_throwb, Priority::Low); + agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/koopa/src/acmd/tilts.rs b/fighters/koopa/src/acmd/tilts.rs index 88250250a6..b170e1c7e8 100644 --- a/fighters/koopa/src/acmd/tilts.rs +++ b/fighters/koopa/src/acmd/tilts.rs @@ -18,9 +18,9 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); if is_excute(agent) { HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); - ATTACK(agent, 0, 0, Hash40::new("arml"), 10.0, 361, 90, 0, 20, 4.5, 5.1, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 10.0, 361, 90, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 10.0, 361, 90, 0, 20, 3.5, -1.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("arml"), 10.0, 361, 96, 0, 5, 4.5, 5.1, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 10.0, 361, 96, 0, 5, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 10.0, 361, 96, 0, 5, 3.5, -1.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 18.0); if is_excute(agent) { @@ -34,7 +34,7 @@ unsafe extern "C" fn effect_attacks3hi(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), 7, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, false); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_line"), Hash40::new("sys_attack_line"), Hash40::new("top"), -5, 3, -9, -25, 10, 0, 2.2, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_line"), Hash40::new("sys_attack_line"), Hash40::new("top"), -5, 4, -9, -25, 10, 0, 2.2, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 1.5); } frame(lua_state, 11.0); diff --git a/fighters/koopa/src/lib.rs b/fighters/koopa/src/lib.rs index 5d33410eeb..69c325db80 100644 --- a/fighters/koopa/src/lib.rs +++ b/fighters/koopa/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/koopa/src/opff.rs b/fighters/koopa/src/opff.rs index 97f60a86c8..1648742b39 100644 --- a/fighters/koopa/src/opff.rs +++ b/fighters/koopa/src/opff.rs @@ -24,7 +24,7 @@ unsafe fn bowser_bomb(boma: &mut BattleObjectModuleAccessor) { } if boma.status_frame() >= 20 && boma.status_frame() < 30 { if boma.is_situation(*SITUATION_KIND_AIR) { - boma.check_jump_cancel(false, false); + boma.check_jump_cancel(false, false, true); } } } diff --git a/fighters/koopa/src/status/mod.rs b/fighters/koopa/src/status/mod.rs index 58d1649bd0..ec3542a58c 100644 --- a/fighters/koopa/src/status/mod.rs +++ b/fighters/koopa/src/status/mod.rs @@ -19,11 +19,17 @@ unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L VarModule::set_int(fighter.battle_object, vars::koopa::instance::SPECIAL_N_FIREBALL_EFFECT_ID, 0); VarModule::set_int(fighter.battle_object, vars::koopa::instance::SPECIAL_N_FIREBALL_COOLDOWN, MAX_COOLDOWN); } + if [*SITUATION_KIND_GROUND, *SITUATION_KIND_CLIFF].contains(&fighter.global_table[SITUATION_KIND].get_i32()) + || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { + VarModule::off_flag(fighter.battle_object, vars::koopa::instance::SPECIAL_S_DISABLE_STALL); + } true.into() } unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); + + VarModule::off_flag(fighter.battle_object, vars::koopa::instance::SPECIAL_S_DISABLE_STALL); } pub fn install(agent: &mut Agent) { diff --git a/fighters/koopa/src/status/special_hi.rs b/fighters/koopa/src/status/special_hi.rs index 5189f0c623..d3c7b7e487 100644 --- a/fighters/koopa/src/status/special_hi.rs +++ b/fighters/koopa/src/status/special_hi.rs @@ -28,6 +28,62 @@ unsafe extern "C" fn special_hi_a_pre(fighter: &mut L2CFighterCommon) -> L2CValu return 0.into() } +pub unsafe extern "C" fn special_hi_a_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_flag(*FIGHTER_KOOPA_STATUS_SPECIAL_HI_FLAG_MOT_RESTART) { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi"), 0.0, 1.0, false, 0.0, false, false); + } + else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_hi"), -1.0, 1.0, 0.0, false, false); + } + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_CLIFF); + fighter.set_float(0.0, *FIGHTER_KOOPA_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_RESTART_FRAME); + + fighter.main_shift(special_hi_a_main_loop) +} + +pub unsafe extern "C" fn special_hi_a_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, *FIGHTER_STATUS_KIND_FALL_SPECIAL, false); + return 0.into(); + } + if fighter.status_frame() >= 1 { + if fighter.is_situation(*SITUATION_KIND_AIR) { + let jump_restart_start_frame = fighter.get_param_float("param_special_hi", "special_hi_jump_restart_start_frame"); + let jump_restart_end_frame = fighter.get_param_float("param_special_hi", "special_hi_jump_restart_end_frame"); + if (jump_restart_start_frame..=jump_restart_end_frame).contains(&(fighter.status_frame() as f32)) { + if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + let restart_frame = fighter.get_float(*FIGHTER_KOOPA_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_RESTART_FRAME); + let jump_restart_prohibition_frame = fighter.get_param_float("param_special_hi", "special_hi_jump_restart_prohibition_frame"); + let frame = fighter.status_frame() as f32; + if jump_restart_prohibition_frame < frame - restart_frame { + fighter.set_float(frame, *FIGHTER_KOOPA_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_RESTART_FRAME); + let jump_speed_y = fighter.get_param_float("param_special_hi", "special_hi_jump_speed_y"); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, jump_speed_y); + } + } + } + } + } + + return 0.into(); +} + pub unsafe extern "C" fn special_hi_a_exec(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.is_prev_status(*FIGHTER_KOOPA_STATUS_KIND_SPECIAL_HI_G) { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); @@ -52,5 +108,6 @@ pub unsafe extern "C" fn special_hi_a_exec(fighter: &mut L2CFighterCommon) -> L2 pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_HI_A, special_hi_a_pre); + agent.status(Main, *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_HI_A, special_hi_a_main); agent.status(Exec, *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_HI_A, special_hi_a_exec); } \ No newline at end of file diff --git a/fighters/koopa/src/status/special_s.rs b/fighters/koopa/src/status/special_s.rs index 8fce54f3aa..01e2fe920a 100644 --- a/fighters/koopa/src/status/special_s.rs +++ b/fighters/koopa/src/status/special_s.rs @@ -7,6 +7,9 @@ pub const SPECIAL_S_KIND_LW: i32 = 4; unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue { special_s_situation_change_helper(fighter, true); + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, speed_x * 0.6, speed_y); // parameterize fighter.main_shift(special_s_main_loop) } @@ -94,7 +97,8 @@ unsafe extern "C" fn special_s_situation_helper(fighter: &mut L2CFighterCommon, fighter.sub_change_kinetic_type_by_situation(FIGHTER_KINETIC_TYPE_GROUND_STOP.into(),FIGHTER_KINETIC_TYPE_AIR_STOP.into()); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); - if throw_input == SPECIAL_S_KIND_LW && fighter.is_situation(*SITUATION_KIND_AIR) { + if fighter.is_status(*FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_SQUAT) + || (throw_input == SPECIAL_S_KIND_LW && fighter.is_situation(*SITUATION_KIND_AIR)) { KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); } else { @@ -249,24 +253,20 @@ unsafe extern "C" fn special_s_squat_main(fighter: &mut L2CFighterCommon) -> L2C WorkModule::set_float(fighter.module_accessor, PostureModule::pos_y(fighter.module_accessor), *FIGHTER_KOOPA_STATUS_SPECIAL_S_WORK_FLOAT_START_Y); ControlModule::reset_trigger(fighter.module_accessor); special_s_situation_helper(fighter, true); + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, speed_x * 0.6, speed_y); // parameterize + fighter.sub_shift_status_main(L2CValue::Ptr(special_s_squat_main_loop as *const () as _)) } unsafe extern "C" fn special_s_squat_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.status_frame() >= 10 { - if fighter.is_situation(*SITUATION_KIND_GROUND) { // TEMPORARY UNTIL CRASHES ARE FIXED - if fighter.global_table[CMD_CAT2].get_i32() & *FIGHTER_PAD_CMD_CAT2_FLAG_THROW_LW != 0 { - VarModule::set_int(fighter.battle_object, vars::koopa::instance::SPECIAL_S_THROW_TYPE, SPECIAL_S_KIND_LW); - fighter.change_status(FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING.into(),false.into()); - return 0.into(); - } + if fighter.status_frame() >= 8 { + if fighter.global_table[CMD_CAT2].get_i32() & *FIGHTER_PAD_CMD_CAT2_FLAG_THROW_LW != 0 { + VarModule::set_int(fighter.battle_object, vars::koopa::instance::SPECIAL_S_THROW_TYPE, SPECIAL_S_KIND_LW); + fighter.change_status(FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING.into(),false.into()); + return 0.into(); } - // Uncommenting this will allow early transition into Flying Slam - // else if fighter.global_table[CMD_CAT2].get_i32() & *FIGHTER_PAD_CMD_CAT2_FLAG_THROW_HI != 0 { - // VarModule::set_int(fighter.battle_object, vars::koopa::instance::SPECIAL_S_THROW_TYPE, SPECIAL_S_KIND_HI); - // fighter.change_status(FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_JUMP.into(),false.into()); - // return 0.into(); - // } else if fighter.global_table[CMD_CAT2].get_i32() & *FIGHTER_PAD_CMD_CAT2_FLAG_THROW_B != 0 { VarModule::set_int(fighter.battle_object, vars::koopa::instance::SPECIAL_S_THROW_TYPE, SPECIAL_S_KIND_B); fighter.change_status(FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING.into(),false.into()); @@ -286,8 +286,7 @@ unsafe extern "C" fn special_s_squat_main_loop(fighter: &mut L2CFighterCommon) - let mut throw_input = SPECIAL_S_KIND_F; // default to fthrow let mut next_status = FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING; if throw_Lw { - throw_input = if fighter.is_situation(*SITUATION_KIND_GROUND) { SPECIAL_S_KIND_LW } else { SPECIAL_S_KIND_HI }; - next_status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING } else { FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_JUMP }; + throw_input = SPECIAL_S_KIND_LW; } else if throw_Hi { throw_input = SPECIAL_S_KIND_HI; @@ -355,15 +354,25 @@ unsafe extern "C" fn special_s_jump_init(fighter: &mut L2CFighterCommon) -> L2CV } unsafe extern "C" fn special_s_jump_main(fighter: &mut L2CFighterCommon) -> L2CValue { - // let motion; - // if VarModule::get_int(fighter.battle_object, vars::koopa::instance::SPECIAL_S_THROW_TYPE) == SPECIAL_S_KIND_HI { - // motion = Hash40::new("special_s_jump"); - // } - // else { - // motion = Hash40::new("special_s_throw_lw_jump"); - // } MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_jump"), 0.0, 1.0, false, 0.0, false, false); GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + CameraModule::set_enable_camera(fighter.module_accessor, true, -1); + + let capture_id = LinkModule::get_node_object_id(fighter.module_accessor, *LINK_NO_CAPTURE); + if capture_id != 0x50000000 { + let capture_boma = &mut *(sv_battle_object::module_accessor(capture_id as u32)); + let capture_fighter = utils::util::get_fighter_common_from_accessor(capture_boma); + let entry_id = capture_fighter.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID); + let facing = capture_fighter.lr(); + capture_fighter.clear_lua_stack(); + capture_fighter.push_lua_stack(&mut L2CValue::I32(*MA_MSC_CMD_CAMERA_SET_TEMPORARY_CAMERA)); + capture_fighter.push_lua_stack(&mut L2CValue::I32(entry_id)); + capture_fighter.push_lua_stack(&mut L2CValue::F32(facing)); + capture_fighter.push_lua_stack(&mut L2CValue::I32(100)); + sv_module_access::camera(capture_fighter.lua_state_agent); + capture_fighter.pop_lua_stack(1); + } + fighter.main_shift(special_s_jump_main_loop) } @@ -428,13 +437,6 @@ unsafe extern "C" fn special_s_fall_init(fighter: &mut L2CFighterCommon) -> L2CV unsafe extern "C" fn special_s_fall_main(fighter: &mut L2CFighterCommon) -> L2CValue { let dead_offset_y = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("special_s_fall_check_dead_offset_y")); WorkModule::set_float(fighter.module_accessor, dead_offset_y, *FIGHTER_INSTANCE_WORK_ID_FLOAT_CHECK_DEAD_OFFSET_Y); - // let motion; - // if VarModule::get_int(fighter.battle_object, vars::koopa::instance::SPECIAL_S_THROW_TYPE) == SPECIAL_S_KIND_HI { - // motion = Hash40::new("special_s_fall"); - // } - // else { - // motion = Hash40::new("special_s_throw_lw_fall"); - // } MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_fall"), 0.0, 1.0, false, 0.0, false, false); fighter.main_shift(special_s_fall_main_loop) } @@ -560,12 +562,20 @@ unsafe extern "C" fn special_s_landing_main_loop(fighter: &mut L2CFighterCommon) return 1.into(); } } - + let throw_type = VarModule::get_int(fighter.battle_object, vars::koopa::instance::SPECIAL_S_THROW_TYPE); + if throw_type != SPECIAL_S_KIND_HI && fighter.motion_frame() >= 30.0 { + fighter.sub_air_check_dive(); + } if !StatusModule::is_changing(fighter.module_accessor) && StatusModule::is_situation_changed(fighter.module_accessor) { - if VarModule::get_int(fighter.battle_object, vars::koopa::instance::SPECIAL_S_THROW_TYPE) != SPECIAL_S_KIND_HI { + if throw_type == SPECIAL_S_KIND_F || throw_type == SPECIAL_S_KIND_B { special_s_situation_helper(fighter, false); } + else if throw_type == SPECIAL_S_KIND_LW { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.check_land_cancel(None); + } + } } 0.into() @@ -581,11 +591,10 @@ unsafe extern "C" fn special_s_landing_exec(fighter: &mut L2CFighterCommon) -> L let capture_id = LinkModule::get_node_object_id(fighter.module_accessor, *LINK_NO_CAPTURE); notify_event_msc_cmd!(fighter, Hash40::new_raw(0x31dbed6513), Hash40::new("throw"), Hash40::new("invalid")); if capture_id != 0x50000000 { - AttackModule::hit_absolute_joint(fighter.module_accessor, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW,capture_id as u32,Hash40::new("throw"), 0, 0); + AttackModule::hit_absolute_joint(fighter.module_accessor, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, capture_id as u32,Hash40::new("throw"), 0, 0); } WorkModule::off_flag(fighter.module_accessor, *FIGHTER_KOOPA_STATUS_SPECIAL_S_FLAG_HIT); WorkModule::off_flag(fighter.module_accessor, *FIGHTER_KOOPA_STATUS_SPECIAL_S_FLAG_CAPTURE); - CameraModule::reset_all(fighter.module_accessor); //unable energies, then do hop energy KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); @@ -595,6 +604,18 @@ unsafe extern "C" fn special_s_landing_exec(fighter: &mut L2CFighterCommon) -> L 0.into() } +unsafe extern "C" fn special_s_landing_exit(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[0xB] != FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_JUMP + && fighter.global_table[0xB] != FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_FALL + && fighter.global_table[0xB] != FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING { + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_KOOPA_STATUS_SPECIAL_S_FLAG_CAPTURE) { + special_s_ejected(fighter); + } + } + + 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); @@ -613,4 +634,5 @@ pub fn install(agent: &mut Agent) { agent.status(Init, *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING, special_s_landing_init); agent.status(Main, *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING, special_s_landing_main); agent.status(Exec, *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING, special_s_landing_exec); + agent.status(Exit, *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_S_LANDING, special_s_landing_exit); } \ No newline at end of file diff --git a/fighters/koopag/Cargo.toml b/fighters/koopag/Cargo.toml index fb0b1fb0d1..98bf3acb4b 100644 --- a/fighters/koopag/Cargo.toml +++ b/fighters/koopag/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/koopag/src/lib.rs b/fighters/koopag/src/lib.rs index 42dc4cc180..42406f6dbe 100644 --- a/fighters/koopag/src/lib.rs +++ b/fighters/koopag/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/koopajr/Cargo.toml b/fighters/koopajr/Cargo.toml index d8af30993b..8c7ffb536a 100644 --- a/fighters/koopajr/Cargo.toml +++ b/fighters/koopajr/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/koopajr/src/acmd/aerials.rs b/fighters/koopajr/src/acmd/aerials.rs index 2bd3d956e3..a53261b13f 100644 --- a/fighters/koopajr/src/acmd/aerials.rs +++ b/fighters/koopajr/src/acmd/aerials.rs @@ -10,17 +10,17 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("clownarmr1"), 8.0, 60, 85, 0, 60, 4.0, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("clownarml1"), 8.0, 60, 85, 0, 60, 4.0, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("clownarmr1"), 8.0, 60, 85, 0, 60, 5.0, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("clownarml1"), 8.0, 60, 85, 0, 60, 5.0, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("clownarmr1"), 10.0, 58, 120, 0, 10, 4.0, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("clownarml1"), 10.0, 58, 120, 0, 10, 4.0, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("clownarmr1"), 10.0, 58, 120, 0, 10, 4.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("clownarml1"), 10.0, 58, 120, 0, 10, 4.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clownarmr1"), 6.5, 361, 88, 0, 40, 3.5, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("clownarml1"), 6.5, 361, 88, 0, 40, 3.5, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("clownarmr1"), 6.5, 361, 88, 0, 40, 4.5, 4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("clownarml1"), 6.5, 361, 88, 0, 40, 4.5, 4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("clownarmr1"), 7.0, 48, 135, 0, 5, 3.5, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("clownarml1"), 7.0, 48, 135, 0, 5, 3.5, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("clownarmr1"), 7.0, 48, 135, 0, 5, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("clownarml1"), 7.0, 48, 135, 0, 5, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 20.0); FT_MOTION_RATE(agent, 19.0/(35.0-20.0)); @@ -54,7 +54,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("clownarml1"), 8.0, 48, 102, 0, 33, 4.5, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("clownarml1"), 7.0, 48, 102, 0, 33, 3.0, 1.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("clownarml1"), 7.0, 48, 102, 0, 33, 5.0, -5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("clownarml1"), 7.0, 48, 102, 0, 33, 5.0, -5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } frame(lua_state, 24.0); if is_excute(agent) { @@ -91,7 +91,9 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { wait(lua_state, 3.0); // f12 ingame FT_MOTION_RATE(agent, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clownarmr1"), 10.0, 361, 101, 0, 20, 5.2, 6.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("clownarmr1"), 9.0, 361, 101, 0, 20, 5.2, 6.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("clownarmr1"), 9.0, 361, 101, 0, 20, 2.2, 0.0, 0.0, 0.0, Some(-6.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("clownarmr1"), 9.0, 361, 101, 0, 20, 5.0, -4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } frame(lua_state, 15.6); // f18 ingame FT_MOTION_RATE(agent, 20.0/(29.0-15.6)); @@ -115,17 +117,29 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 5.0); + frame(lua_state, 6.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 63, 120, 0, 30, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 63, 120, 0, 30, 3.0, 0.0, 6.0, 1.0, Some(0.0), Some(6.0), Some(-2.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("neck"), 8.0, 63, 120, 0, 30, 3.0, 1.5, 0.0, 0.0, Some(-1.5), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + } + frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 9.0, 74, 115, 0, 50, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 74, 115, 0, 50, 3.0, 0.0, 6.0, 1.0, Some(0.0), Some(6.0), Some(-2.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("neck"), 9.0, 74, 115, 0, 50, 3.0, 1.5, 0.0, 0.0, Some(-1.5), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("haver"), 11.0, 74, 105, 0, 40, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 1.05, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 74, 105, 0, 40, 3.0, 0.0, 6.0, 1.0, Some(0.0), Some(6.0), Some(-2.5), 1.05, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("neck"), 11.0, 74, 105, 0, 40, 3.0, 1.5, 0.0, 0.0, Some(-1.5), Some(0.0), Some(0.0), 1.05, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } - wait(lua_state, 9.0); + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 63, 120, 0, 30, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 63, 120, 0, 30, 3.0, 0.0, 6.0, 1.0, Some(0.0), Some(6.0), Some(-2.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("neck"), 8.0, 63, 120, 0, 30, 3.0, 1.5, 0.0, 0.0, Some(-1.5), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + } + frame(lua_state, 14.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 35.0); + frame(lua_state, 31.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -166,22 +180,24 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 15.0); - FT_MOTION_RATE(agent, 38.0/(60.0-15.0)); + frame(lua_state, 15.0); // F8 + //FT_MOTION_RATE(agent, 38.0/(60.0-15.0)); + FT_MOTION_RATE_RANGE(agent, 15.0, 50.0, 30.0); if is_excute(agent) { // GROUND ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 290, 100, 46, 0, 4.2, 0.0, 4.0, -2.0, Some(0.0), Some(4.0), Some(2.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 290, 100, 46, 0, 4.0, 0.0, -2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); // AIR - ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 290, 100, 20, 0, 4.2, 0.0, 4.0, -2.0, Some(0.0), Some(4.0), Some(2.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 290, 100, 20, 0, 4.0, 0.0, -2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 290, 100, 15, 0, 4.2, 0.0, 4.0, -2.0, Some(0.0), Some(4.0), Some(2.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 290, 100, 15, 0, 4.0, 0.0, -2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } - frame(lua_state, 50.0); + frame(lua_state, 50.0); // F38 + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); JostleModule::set_status(boma, true); } - frame(lua_state, 68.0); + frame(lua_state, 56.0); // F44 if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } diff --git a/fighters/koopajr/src/acmd/ground.rs b/fighters/koopajr/src/acmd/ground.rs index 8ec3da5118..0c096cecd5 100644 --- a/fighters/koopajr/src/acmd/ground.rs +++ b/fighters/koopajr/src/acmd/ground.rs @@ -9,14 +9,20 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 3.0, 0.0, 6.0, 6.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 3.0, 0.0, 6.0, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 3.6, 0.0, 6.0, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 3.6, 0.0, 6.0, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 50, 0, 10, 3.0, 0.0, 6.0, 6.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 50, 0, 10, 3.0, 0.0, 6.0, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 361, 50, 0, 10, 3.6, 0.0, 6.0, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 50, 0, 10, 3.6, 0.0, 6.0, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 3.0, 0.0, 3.5, 6.5, Some(0.0), Some(3.5), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); + } frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 7.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } @@ -30,18 +36,20 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 3.0, 0.0, 6.3, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 3.4, 0.0, 6.3, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 4.0, 0.0, 6.3, 17.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 70, 50, 0, 24, 3.0, 0.0, 6.3, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 75, 50, 0, 24, 3.4, 0.0, 6.3, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 80, 50, 0, 24, 4.0, 0.0, 6.3, 17.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 4, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 3.0, 0.0, 3.5, 8.0, Some(0.0), Some(3.5), Some(17.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); } frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } - frame(lua_state, 10.0); + frame(lua_state, 9.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } diff --git a/fighters/koopajr/src/acmd/other.rs b/fighters/koopajr/src/acmd/other.rs index 3c6db54699..97951e3272 100644 --- a/fighters/koopajr/src/acmd/other.rs +++ b/fighters/koopajr/src/acmd/other.rs @@ -79,15 +79,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -97,34 +93,23 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_specialhijrescape(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); + if !WorkModule::is_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE) { frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } } else { frame(lua_state, 29.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } } } diff --git a/fighters/koopajr/src/acmd/smashes.rs b/fighters/koopajr/src/acmd/smashes.rs index dfbdbc6318..fcb4521627 100644 --- a/fighters/koopajr/src/acmd/smashes.rs +++ b/fighters/koopajr/src/acmd/smashes.rs @@ -13,8 +13,9 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 93, 0, 0, 20, 5.0, 0.0, 8.0, 16.5, Some(0.0), Some(12.5), Some(16.5), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 361, 0, 0, 20, 3.5, 0.0, 7.0, 9.7, Some(0.0), Some(12.0), Some(9.7), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.4, 361, 100, 20, 0, 3.5, 0.0, 7.0, 9.7, Some(0.0), Some(12.0), Some(9.7), 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.4, 180, 100, 20, 0, 5.0, 0.0, 8.0, 16.5, Some(0.0), Some(12.5), Some(16.5), 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.4, 240, 100, 20, 0, 5.0, 0.0, 8.0, 16.5, Some(0.0), Some(12.5), Some(16.5), 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 15.0); if is_excute(agent) { @@ -22,7 +23,8 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { } frame(lua_state, 35.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 46, 129, 0, 40, 7.0, 0.0, 9.0, 17.0, Some(0.0), Some(12.0), Some(17.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 46, 129, 0, 40, 4.0, 0.0, 7.0, 9.7, Some(0.0), Some(12.0), Some(9.7), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 46, 129, 0, 40, 7.0, 0.0, 9.0, 17.0, Some(0.0), Some(12.0), Some(17.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 3.0); if is_excute(agent) { @@ -43,8 +45,9 @@ unsafe extern "C" fn game_attacks4hi(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 93, 0, 0, 20, 5.0, 0.0, 12.0, 15.0, Some(0.0), Some(16.5), Some(14.5), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 361, 0, 0, 20, 3.5, 0.0, 10.0, 8.3, Some(0.0), Some(15.0), Some(7.8), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.4, 361, 100, 20, 0, 3.5, 0.0, 10.0, 8.3, Some(0.0), Some(15.0), Some(7.8), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.4, 180, 100, 20, 0, 5.0, 0.0, 12.0, 15.0, Some(0.0), Some(16.5), Some(14.5), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.4, 240, 100, 20, 0, 5.0, 0.0, 12.0, 15.0, Some(0.0), Some(16.5), Some(14.5), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 15.0); if is_excute(agent) { @@ -52,7 +55,8 @@ unsafe extern "C" fn game_attacks4hi(agent: &mut L2CAgentBase) { } frame(lua_state, 35.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 46, 126, 0, 40, 7.0, 0.0, 13.0, 16.0, Some(0.0), Some(16.0), Some(15.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 46, 126, 0, 40, 4.0, 0.0, 10.0, 8.3, Some(0.0), Some(15.0), Some(7.8), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 46, 126, 0, 40, 7.0, 0.0, 13.0, 16.0, Some(0.0), Some(16.0), Some(15.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 3.0); if is_excute(agent) { @@ -73,8 +77,9 @@ unsafe extern "C" fn game_attacks4lw(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 93, 0, 0, 20, 5.0, 0.0, 3.5, 16.0, Some(0.0), Some(7.5), Some(17.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 361, 0, 0, 20, 3.5, 0.0, 4.5, 9.1, Some(0.0), Some(9.0), Some(10.5), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.4, 361, 100, 20, 0, 3.5, 0.0, 4.5, 9.1, Some(0.0), Some(9.0), Some(10.5), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.4, 180, 100, 20, 0, 5.0, 0.0, 3.5, 16.0, Some(0.0), Some(7.5), Some(17.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.4, 240, 100, 20, 0, 5.0, 0.0, 3.5, 16.0, Some(0.0), Some(7.5), Some(17.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 15.0); if is_excute(agent) { @@ -82,7 +87,8 @@ unsafe extern "C" fn game_attacks4lw(agent: &mut L2CAgentBase) { } frame(lua_state, 35.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 46, 129, 0, 40, 7.0, 0.0, 4.5, 16.5, Some(0.0), Some(6.5), Some(17.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 46, 129, 0, 40, 4.0, 0.0, 4.5, 9.1, Some(0.0), Some(9.0), Some(10.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 46, 129, 0, 40, 7.0, 0.0, 4.5, 16.5, Some(0.0), Some(6.5), Some(17.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 3.0); if is_excute(agent) { @@ -103,8 +109,8 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 1.0, 110, 100, 80, 0, 5.0, 0.0, 10.0, -5.0, Some(0.0), Some(10.0), Some(5.0), 0.75, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 1, Hash40::new("top"), 1.0, 110, 100, 80, 0, 5.0, 0.0, 5.5, -7.0, Some(0.0), Some(5.5), Some(7.0), 0.75, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 1, Hash40::new("top"), 1.0, 120, 100, 80, 0, 5.0, 0.0, 10.0, -5.0, Some(0.0), Some(10.0), Some(5.0), 0.75, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 1, Hash40::new("top"), 1.0, 120, 100, 80, 0, 5.0, 0.0, 5.5, -7.0, Some(0.0), Some(5.5), Some(7.0), 0.75, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 2.0); if is_excute(agent) { @@ -114,7 +120,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } wait(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 1.0, 120, 100, 35, 0, 5.0, 0.0, 19.0, -4.0, Some(0.0), Some(17.0), Some(7.0), 0.75, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 1, Hash40::new("top"), 1.0, 120, 100, 55, 0, 5.0, 0.0, 19.0, -4.0, Some(0.0), Some(17.0), Some(7.0), 0.75, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 1.0); if is_excute(agent) { @@ -122,7 +128,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 85, 173, 0, 38, 6.0, 0.0, 24.5, -4.0, Some(0.0), Some(22.5), Some(5.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 90, 168, 0, 38, 6.0, 0.0, 24.5, -4.0, Some(0.0), Some(22.5), Some(5.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/koopajr/src/acmd/specials.rs b/fighters/koopajr/src/acmd/specials.rs index 64c0749828..7c86af8504 100644 --- a/fighters/koopajr/src/acmd/specials.rs +++ b/fighters/koopajr/src/acmd/specials.rs @@ -100,7 +100,7 @@ unsafe extern "C" fn game_specialairsspin(agent: &mut L2CAgentBase) { } frame(lua_state, 40.0); if is_excute(agent) { - JostleModule::set_status(boma, true); + JostleModule::set_status(boma, true); } } diff --git a/fighters/koopajr/src/acmd/throws.rs b/fighters/koopajr/src/acmd/throws.rs index d1c2a7f911..6752aa37b0 100644 --- a/fighters/koopajr/src/acmd/throws.rs +++ b/fighters/koopajr/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 13.0, 7.0); - frame(lua_state, 12.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(14.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(14.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -70,7 +69,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 45, 85, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 45, 97, 0, 30, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 23.0); @@ -88,6 +87,32 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 75, 60, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 17.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, -3, 28); + } + frame(lua_state, 18.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } + FT_MOTION_RATE(agent, 0.7); + if is_excute(agent) { + ArticleModule::set_rate(boma, *FIGHTER_KOOPAJR_GENERATE_ARTICLE_MAGICHAND, 1.429); + } +} + unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -110,7 +135,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::on_flag(opponent_boma.object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); } frame(lua_state, 78.0); FT_MOTION_RATE(agent, 1.0); @@ -122,6 +147,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchturn", game_catchturn, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); + + agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/koopajr/src/acmd/tilts.rs b/fighters/koopajr/src/acmd/tilts.rs index b26bc9c236..bf387e0a5a 100644 --- a/fighters/koopajr/src/acmd/tilts.rs +++ b/fighters/koopajr/src/acmd/tilts.rs @@ -64,41 +64,65 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 4.0); + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 5.0, 4.0); + frame(lua_state, 5.0); + FT_MOTION_RATE_RANGE(agent, 5.0, 7.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clownhip"), 2.0, 361, 100, 30, 0, 4.0, 0.0, 3.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("clowntongue2"), 2.0, 361, 100, 30, 0, 4.0, 3.0, 1.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("clowntongue2"), 2.0, 361, 100, 30, 0, 4.0, 9.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("clowntongue2"), 2.5, 361, 100, 30, 0, 4.0, 1.5, 1.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("clowntongue2"), 2.5, 180, 100, 30, 0, 3.5, 8.5, 1.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } - wait(lua_state, 3.0); + frame(lua_state, 7.0); + FT_MOTION_RATE_RANGE(agent, 7.0, 13.0, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 12.0); + frame(lua_state, 13.0); + FT_MOTION_RATE_RANGE(agent, 13.0, 15.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clownhip"), 2.0, 361, 100, 30, 0, 4.0, 0.0, 3.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("clowntongue2"), 2.0, 361, 100, 30, 0, 4.0, 3.0, 1.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("clowntongue2"), 2.0, 361, 100, 30, 0, 4.0, 9.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("clowntongue2"), 2.5, 361, 100, 30, 0, 4.0, 1.5, 1.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("clowntongue2"), 2.5, 180, 100, 30, 0, 3.5, 8.5, 1.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } - wait(lua_state, 3.0); + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 23.0, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 23.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("clownhip"), 6.0, 34, 131, 0, 20, 4.0, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("clowntongue2"), 6.0, 34, 131, 0, 20, 4.0, 3.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("clowntongue2"), 6.0, 34, 131, 0, 20, 5.0, 9.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("clowntongue2"), 6.0, 54, 131, 0, 20, 4.0, 2.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("clowntongue2"), 6.0, 54, 131, 0, 20, 4.0, 9.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } - wait(lua_state, 3.0); + frame(lua_state, 26.0); if is_excute(agent) { AttackModule::clear_all(boma); } } +unsafe extern "C" fn sound_attacklw3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_koopajr_open_light")); + SET_PLAY_INHIVIT(agent, Hash40::new("se_koopajr_open_light"), 40); + } + frame(lua_state, 3.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_koopajr_attackhard_l01")); + SoundModule::set_se_pitch_ratio(boma, Hash40::new("se_koopajr_attackhard_l01"), 1.2); + PLAY_SEQUENCE(agent, Hash40::new("seq_koopajr_rnd_attack")); + } + frame(lua_state, 38.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_koopajr_close_light")); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attacks3", game_attacks3, Priority::Low); agent.acmd("game_attacks3hi", game_attacks3hi, Priority::Low); @@ -107,4 +131,5 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackhi3", game_attackhi3, Priority::Low); agent.acmd("game_attacklw3", game_attacklw3, Priority::Low); + agent.acmd("sound_attacklw3", sound_attacklw3, Priority::Low); } \ No newline at end of file diff --git a/fighters/koopajr/src/lib.rs b/fighters/koopajr/src/lib.rs index 7b7974cbe1..1690f847d1 100644 --- a/fighters/koopajr/src/lib.rs +++ b/fighters/koopajr/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/koopajr/src/status/mod.rs b/fighters/koopajr/src/status/mod.rs index e24f35d2ff..fbbd85c065 100644 --- a/fighters/koopajr/src/status/mod.rs +++ b/fighters/koopajr/src/status/mod.rs @@ -7,7 +7,6 @@ mod special_hi; mod special_hi_damage; mod special_hi_escape; mod special_s; -mod special_s_jump; // Prevents sideB from being used again if it has already been used once in the current airtime unsafe extern "C" fn should_use_special_s_callback(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -46,5 +45,4 @@ pub fn install(agent: &mut Agent) { special_hi_damage::install(agent); special_hi_escape::install(agent); special_s::install(agent); - special_s_jump::install(agent); } \ No newline at end of file diff --git a/fighters/koopajr/src/status/special_s.rs b/fighters/koopajr/src/status/special_s.rs index 90058c4f61..022dcf4ae4 100644 --- a/fighters/koopajr/src/status/special_s.rs +++ b/fighters/koopajr/src/status/special_s.rs @@ -10,6 +10,44 @@ pub unsafe extern "C" fn special_s(fighter: &mut L2CFighterCommon) -> L2CValue { smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_S)(fighter) } +// FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_DASH + +pub unsafe extern "C" fn special_s_dash_main(fighter: &mut L2CFighterCommon) -> L2CValue { + smashline::original_status(Main, fighter, *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_DASH)(fighter); + + fighter.sub_shift_status_main(L2CValue::Ptr(special_s_dash_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_s_dash_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_KOOPAJR_STATUS_SPECIAL_S_FLAG_CLIFF_JUMP) + && (fighter.is_cat_flag(Cat2::CommonGuard) + || fighter.is_cat_flag(Cat1::AttackN) + || fighter.is_cat_flag(Cat1::SpecialAny)) { + fighter.change_status(FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_SPIN_TURN.into(), true.into()); + return 1.into(); + } + + if let Some(target) = smashline::api::get_target_function("lua2cpp_koopajr.nrs", 0x14500) { + let og_special_s_dash_main_loop: fn(&mut L2CFighterCommon) -> L2CValue = std::mem::transmute(target); + return og_special_s_dash_main_loop(fighter); + } + + 0.into() +} + +// FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_JUMP + +pub unsafe extern "C" fn special_s_jump_init(fighter: &mut L2CFighterCommon) -> L2CValue { + // Burn double jump when jumping out of Clown Kart Dash + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR + && fighter.get_num_used_jumps() < fighter.get_jump_count_max() { + WorkModule::inc_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + } + 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s); + agent.status(Main, *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_DASH, special_s_dash_main); + agent.status(Init, *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_JUMP, special_s_jump_init); } \ No newline at end of file diff --git a/fighters/koopajr/src/status/special_s_jump.rs b/fighters/koopajr/src/status/special_s_jump.rs deleted file mode 100644 index 6e659b85af..0000000000 --- a/fighters/koopajr/src/status/special_s_jump.rs +++ /dev/null @@ -1,16 +0,0 @@ -use super::*; - -// FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_JUMP - -pub unsafe extern "C" fn special_s_jump_init(fighter: &mut L2CFighterCommon) -> L2CValue { - // Burn double jump when jumping out of Clown Kart Dash - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR - && fighter.get_num_used_jumps() < fighter.get_jump_count_max() { - WorkModule::inc_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - } - 0.into() -} - -pub fn install(agent: &mut Agent) { - agent.status(Init, *FIGHTER_KOOPAJR_STATUS_KIND_SPECIAL_S_JUMP, special_s_jump_init); -} \ No newline at end of file diff --git a/fighters/krool/Cargo.toml b/fighters/krool/Cargo.toml index a1488cbc0c..2de2d7e751 100644 --- a/fighters/krool/Cargo.toml +++ b/fighters/krool/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/krool/src/acmd/aerials.rs b/fighters/krool/src/acmd/aerials.rs index 745739f308..356cc8a048 100644 --- a/fighters/krool/src/acmd/aerials.rs +++ b/fighters/krool/src/acmd/aerials.rs @@ -73,13 +73,16 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 15.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 16.5, 1.0); + frame(lua_state, 16.5); + FT_MOTION_RATE_RANGE(agent, 16.5, 17.0, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 16.0, 361, 87, 0, 45, 5.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 16.0, 361, 87, 0, 45, 5.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 17.0, 361, 87, 0, 45, 5.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("armr"), 17.0, 361, 87, 0, 45, 7.4, 7.7, 3.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } + frame(lua_state, 17.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 18.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 16.0, 361, 87, 0, 45, 5.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); @@ -130,8 +133,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 366, 33, 0, 38, 7.5, 0.0, 23.0, -1.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 366, 33, 0, 38, 3.5, 0.0, 14.5, 3.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 366, 38, 0, 37, 7.5, 0.0, 23.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 366, 38, 0, 37, 3.5, 0.0, 14.5, 3.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); } frame(lua_state, 22.0); if is_excute(agent) { diff --git a/fighters/krool/src/acmd/ground.rs b/fighters/krool/src/acmd/ground.rs index b82e125c98..f3a72d5a26 100644 --- a/fighters/krool/src/acmd/ground.rs +++ b/fighters/krool/src/acmd/ground.rs @@ -14,10 +14,14 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 2, 0, Hash40::new("top"), 3.5, 68, 30, 0, 35, 4.8, 0.0, 10.2, 18.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); // Jab lock Hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.5, 361, 30, 0, 20 , 2.5, 0.0, 3.0, 6.0, Some(0.0), Some(3.0), Some(17.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 9.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 11.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } @@ -47,7 +51,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 10.0); + frame(lua_state, 12.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } @@ -66,6 +70,7 @@ unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.25); frame(lua_state, 4.0); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area_xy(boma, 2.0, 7.0, 10.0, 10.0); @@ -77,6 +82,7 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 361, 80, 0, 59, 6.0, 0.0, 11.0, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 9.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } diff --git a/fighters/krool/src/acmd/other.rs b/fighters/krool/src/acmd/other.rs index a472b7cc6f..6fcbe95649 100644 --- a/fighters/krool/src/acmd/other.rs +++ b/fighters/krool/src/acmd/other.rs @@ -44,7 +44,8 @@ unsafe extern "C" fn expression_landingheavy(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_landl"), 0, false, 0x50000000 /* default value */); slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - if !agent.is_prev_status(*FIGHTER_STATUS_KIND_ESCAPE_AIR) && !agent.is_status(*FIGHTER_STATUS_KIND_JUMP_SQUAT) { + if !agent.is_prev_status_one_of(&[*FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_STATUS_KIND_DAMAGE_AIR]) + && !agent.is_status(*FIGHTER_STATUS_KIND_JUMP_SQUAT) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } @@ -85,15 +86,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -103,10 +100,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { diff --git a/fighters/krool/src/acmd/smashes.rs b/fighters/krool/src/acmd/smashes.rs index 3ab2275e6e..1cfbfddb7a 100644 --- a/fighters/krool/src/acmd/smashes.rs +++ b/fighters/krool/src/acmd/smashes.rs @@ -7,78 +7,15 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } - frame(lua_state, 12.0); - if is_excute(agent) { - if WorkModule::get_float(boma, 0x4d) >= 1.0 { - WorkModule::on_flag(boma, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_REQUEST_WAIST_SHIELD_ON); - } - } - frame(lua_state, 13.0); - FT_MOTION_RATE(agent, 0.476); - frame(lua_state, 17.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 19.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_REQUEST_WAIST_SHIELD_OFF); - ATTACK(agent, 0, 0, Hash40::new("arml"), 19.0, 361, 96, 0, 40, 6.0, 6.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 16.5, 361, 100, 0, 40, 4.5, -2.0, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 16.5, 361, 100, 0, 40, 5.5, -2.0, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn game_attacks4hi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 12.0); - if is_excute(agent) { - if WorkModule::get_float(boma, 0x4d) >= 1.0 { - WorkModule::on_flag(boma, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_REQUEST_WAIST_SHIELD_ON); - } - } frame(lua_state, 13.0); FT_MOTION_RATE(agent, 0.476); frame(lua_state, 17.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 19.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_REQUEST_WAIST_SHIELD_OFF); - ATTACK(agent, 0, 0, Hash40::new("arml"), 19.0, 361, 92, 0, 40, 6.0, 6.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 16.5, 361, 96, 0, 40, 4.5, -2.0, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 16.5, 361, 96, 0, 40, 5.5, -2.0, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn game_attacks4lw(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 10.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); - } - frame(lua_state, 12.0); - if is_excute(agent) { - if WorkModule::get_float(boma, 0x4d) >= 1.0 { - WorkModule::on_flag(boma, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_REQUEST_WAIST_SHIELD_ON); - } - } - frame(lua_state, 13.0); - FT_MOTION_RATE(agent, 0.476); - frame(lua_state, 17.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 19.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_REQUEST_WAIST_SHIELD_OFF); - ATTACK(agent, 0, 0, Hash40::new("arml"), 19.0, 361, 96, 0, 40, 6.0, 6.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 16.5, 361, 100, 0, 40, 4.5, -2.0, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 16.5, 361, 100, 0, 40, 5.5, -2.0, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 16.0, 361, 96, 0, 40, 5.5, -2.0, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 16.0, 361, 96, 0, 40, 4.5, -2.0, 0.0, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 19.0, 361, 96, 0, 40, 6.0, 6.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 4.0); if is_excute(agent) { @@ -176,9 +113,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { ATTACK(agent, 2, 0, Hash40::new("hip"), 15.0, 270, 100, 200, 0, 6.0, 11.0, -6.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } else { - ATTACK(agent, 0, 0, Hash40::new("hip"), 18.0, 361, 80, 0, 65, 6.0, -4.0, -3.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("hip"), 18.0, 361, 80, 0, 65, 6.0, 1.5, -5.5, 3.5, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("hip"), 18.0, 361, 80, 0, 65, 6.0, 7.0, -8.0, 7.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 361, 73, 0, 65, 5.0, 0.0, 16.5, 8.5, Some(0.0), Some(16.5), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } @@ -187,12 +122,12 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); WorkModule::on_flag(boma, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_REQUEST_WAIST_SHIELD_OFF); - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 361, 80, 0, 65, 6.0, 0.0, 7.5, 10.5, Some(0.0), Some(7.5), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 361, 73, 0, 65, 6.0, 0.0, 7.5, 10.5, Some(0.0), Some(7.5), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } wait(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 361, 80, 0, 65, 6.0, 0.0, 5.0, 10.5, Some(0.0), Some(5.0), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 361, 73, 0, 65, 6.0, 0.0, 5.0, 10.5, Some(0.0), Some(5.0), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } wait(lua_state, 2.0); @@ -230,8 +165,8 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); - agent.acmd("game_attacks4hi", game_attacks4hi, Priority::Low); - agent.acmd("game_attacks4lw", game_attacks4lw, Priority::Low); + agent.acmd("game_attacks4hi", game_attacks4, Priority::Low); + agent.acmd("game_attacks4lw", game_attacks4, Priority::Low); agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); diff --git a/fighters/krool/src/acmd/specials/mod.rs b/fighters/krool/src/acmd/specials/mod.rs index 27974b7557..21205dc4c1 100644 --- a/fighters/krool/src/acmd/specials/mod.rs +++ b/fighters/krool/src/acmd/specials/mod.rs @@ -3,7 +3,7 @@ use super::*; mod special_n; mod special_hi; -unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialsthrow(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 6.0); @@ -37,6 +37,19 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialscatch(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + } + frame(lua_state, 6.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + } +} + unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -161,8 +174,10 @@ unsafe extern "C" fn expression_speciallw(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { special_n::install(agent); - agent.acmd("game_specialsthrow", game_specials, Priority::Low); - agent.acmd("game_specialairsthrow", game_specials, Priority::Low); + agent.acmd("game_specialsthrow", game_specialsthrow, Priority::Low); + agent.acmd("game_specialairsthrow", game_specialsthrow, Priority::Low); + agent.acmd("game_specialscatch", game_specialscatch, Priority::Low); + agent.acmd("game_specialairscatch", game_specialscatch, Priority::Low); special_hi::install(agent); diff --git a/fighters/krool/src/acmd/specials/special_hi.rs b/fighters/krool/src/acmd/specials/special_hi.rs index f2d608280b..2a753148ab 100644 --- a/fighters/krool/src/acmd/specials/special_hi.rs +++ b/fighters/krool/src/acmd/specials/special_hi.rs @@ -1,12 +1,36 @@ use super::*; +hitbox_templates!( + pub KROOL_PROPELLER = { + extends: BASE_HITBOX, + effect: "collision_attr_cutup", + hit_sound: CollisionSound::Cutup, + region: AttackRegion::Object, + clank: SetOff::Off, + }; + pub KROOL_PROPELLER_S = { + extends: KROOL_PROPELLER, + sound_level: SoundLevel::S, + hitlag: 0.5, + }; + pub KROOL_PROPELLER_M = { + extends: KROOL_PROPELLER, + sound_level: SoundLevel::M, + hitlag: 0.5, + }; + pub KROOL_PROPELLER_L = { + extends: KROOL_PROPELLER, + sound_level: SoundLevel::L, + }; +); + unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 12.0); + frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("head"), 3.0, 90, 100, 90, 0, 5.0, 4.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 100, 100, 90, 0, 3.5, 0.0, 16.5, -6.0, Some(0.0), Some(16.5), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + hitbox!(agent, { extends: KROOL_PROPELLER_M, id: 0, bone: "top", dmg: 3.0, angle: 100, kbg: 100, fkb: 85, bkb: 0, size: 3.5, x: 0.0, y: 16.5, z: -6.0, x2: 0.0, y2: 16.5, z2: 6.0, rehit: 10, set_weight: true, }); + hitbox!(agent, { extends: KROOL_PROPELLER_S, id: 1, bone: "head", dmg: 3.0, angle: 90, kbg: 100, fkb: 50, bkb: 0, size: 5.0, x: 0.0, y: 0.0, z: 0.0, rehit: 10, set_weight: true, }); } } @@ -42,13 +66,8 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { if ArticleModule::is_exist(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BACKPACK) { ArticleModule::change_motion(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BACKPACK, Hash40::new("fly"), false, 0.0); } - ATTACK(agent, 0, 1, Hash40::new("head"), 3.0, 90, 100, 90, 0, 5.0, 4.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 8, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 1, Hash40::new("top"), 3.0, 100, 100, 110, 0, 3.5, 0.0, 18.0, -6.0, Some(0.0), Some(18.0), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 8, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - } - frame(lua_state, 18.0); - if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("head"), 3.0, 90, 100, 80, 0, 5.0, 4.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 8, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 1, Hash40::new("top"), 3.0, 100, 100, 100, 0, 3.5, 0.0, 18.0, -6.0, Some(0.0), Some(18.0), Some(6.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 8, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + hitbox!(agent, { extends: KROOL_PROPELLER_M, id: 0, part: 1, bone: "top", dmg: 3.0, angle: 100, kbg: 100, fkb: 85, bkb: 0, size: 3.5, x: 0.0, y: 16.5, z: -6.0, x2: 0.0, y2: 16.5, z2: 6.0, rehit: 8, set_weight: true, }); + hitbox!(agent, { extends: KROOL_PROPELLER_S, id: 1, part: 1, bone: "head", dmg: 3.0, angle: 90, kbg: 100, fkb: 50, bkb: 0, size: 5.0, x: 0.0, y: 0.0, z: 0.0, rehit: 8, set_weight: true, }); } frame(lua_state, 26.0); if is_excute(agent) { @@ -91,10 +110,14 @@ unsafe extern "C" fn game_specialhiairend(agent: &mut L2CAgentBase) { if is_excute(agent) { let charge = VarModule::get_int(agent.object(), vars::krool::instance::SPECIAL_HI_FUEL) as f32; let damage = 4.0 + if charge > 0.0 { (charge * 4.0/charge).clamp(0.0, 4.0) } else { 0.0 }; - ATTACK(agent, 0, 2, Hash40::new("head"), damage, 90, 100, 0, 60, 5.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 2, Hash40::new("top"), damage, 90, 100, 0, 60, 4.5, 0.0, 17.0, -6.0, Some(0.0), Some(17.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + let mut hitbox1 = decl_hitbox!{extends: KROOL_PROPELLER_L, id: 0, part: 2, bone: "top", dmg: 0.0, angle: 90, kbg: 100, bkb: 60, size: 4.5, x: 0.0, y: 16.0, z: -6.0, x2: 0.0, y2: 16.0, z2: 6.0 }; + let mut hitbox0 = decl_hitbox!{extends: KROOL_PROPELLER_L, id: 1, part: 2, bone: "head", dmg: 0.0, angle: 90, kbg: 100, bkb: 60, size: 6.0, x: 0.0, y: 0.0, z: 0.0, }; + hitbox0.dmg = damage; + hitbox1.dmg = damage; + create_hitbox(agent, &hitbox0); + create_hitbox(agent, &hitbox1); } - frame(lua_state, 9.0); + frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); } diff --git a/fighters/krool/src/acmd/specials/special_n.rs b/fighters/krool/src/acmd/specials/special_n.rs index 97314b4c37..1e3a5b1d8e 100644 --- a/fighters/krool/src/acmd/specials/special_n.rs +++ b/fighters/krool/src/acmd/specials/special_n.rs @@ -5,52 +5,58 @@ unsafe extern "C" fn game_specialnfire(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 25.0, 13.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (25.0 - 1.0)/13.0); if is_excute(agent) { VarModule::off_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB); } frame(lua_state, 25.0); FT_MOTION_RATE(agent, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, 1.0); if is_excute(agent) { - if boma.is_button_on(Buttons::AttackRaw) || boma.is_button_on(Buttons::Guard) { + if boma.is_button_on(Buttons::SpecialRaw) { VarModule::on_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB); + agent.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_IRONBALL); + } + else { + VarModule::on_flag(agent.battle_object, vars::krool::status::SPECIAL_N_ANGLED); } - // if boma.stick_y() > 0.5 { - // let motion = if boma.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("special_n_fire_hi") } else { Hash40::new("special_air_n_fire_hi") }; - // MotionModule::change_motion(boma, motion, 0.0, 1.0, false, 0.0, false, false); - // } } frame(lua_state, 26.0); if VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { FT_MOTION_RATE_RANGE(agent, 26.0, 37.0, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (37.0 - 26.0)/1.0); } else { - FT_MOTION_RATE_RANGE(agent, 26.0, 30.0, 5.0); + FT_MOTION_RATE_RANGE(agent, 26.0, 30.0, 8.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (30.0 - 26.0)/8.0); } frame(lua_state, 30.0); FT_MOTION_RATE(agent, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, 1.0); if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_CANCEL); if !VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL); - WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL); } } frame(lua_state, 37.0); - FT_MOTION_RATE_RANGE(agent, 37.0, 70.0, 30.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_CANCEL); - WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL); - } + FT_MOTION_RATE_RANGE(agent, 37.0, 70.0, 25.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (70.0 - 37.0)/25.0); frame(lua_state, 70.0); FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_CANCEL); - WorkModule::off_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL); - } + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, 1.0); } unsafe extern "C" fn effect_specialnfire(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 25.0); + if is_excute(agent) { + if boma.is_button_on(Buttons::SpecialRaw) { + EFFECT_FOLLOW(agent, Hash40::new("sys_sp_flash"), Hash40::new("top"), 4, 18, 17, 0, 0, 0, 0.5, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + } frame(lua_state, 30.0); if is_excute(agent) { if agent.is_situation(*SITUATION_KIND_GROUND) { @@ -74,12 +80,12 @@ unsafe extern "C" fn sound_specialnfire(agent: &mut L2CAgentBase) { } frame(lua_state, 31.0); if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL) { - PLAY_SE(agent, Hash40::new("se_krool_special_n07")); - } - else if !VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { + if WorkModule::is_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL) { PLAY_SE(agent, Hash40::new("se_krool_special_n01")); } + else { + PLAY_SE(agent, Hash40::new("se_krool_special_n07")); + } } frame(lua_state, 60.0); if is_excute(agent) { @@ -102,7 +108,8 @@ unsafe extern "C" fn expression_specialnfire(agent: &mut L2CAgentBase) { } frame(lua_state, 30.0); if is_excute(agent) { - if !VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) && IS_GENERATABLE_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { + if !VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) + && IS_GENERATABLE_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } @@ -136,22 +143,12 @@ unsafe extern "C" fn game_specialnfirehi(agent: &mut L2CAgentBase) { if is_excute(agent) { MotionModule::set_rate(boma, 1.25); } - frame(lua_state, 10.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL); - WorkModule::off_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL); - } frame(lua_state, 13.0); - if is_excute(agent) { - MotionModule::set_rate(boma, 2.0); - } - frame(lua_state, 15.0); if is_excute(agent) { MotionModule::set_rate(boma, 1.0); } - frame(lua_state, 17.0); + frame(lua_state, 16.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SPIT); WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL); } } @@ -161,18 +158,24 @@ unsafe extern "C" fn effect_specialnfirehi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 16.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } } frame(lua_state, 17.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("krool_cannon_shot"), Hash40::new("haver"), 0, 2, 25, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, true); + EFFECT_FOLLOW(agent, Hash40::new("krool_cannon_shot"), Hash40::new("haver"), 0, 2, 25, 0, 0, 0, 1.3, true); + } + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("krool_cannon_shot"), -1); } } unsafe extern "C" fn sound_specialnfirehi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 18.0); + frame(lua_state, 17.0); if is_excute(agent) { if WorkModule::is_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL) { PLAY_SE(agent, Hash40::new("se_krool_special_n07")); @@ -186,41 +189,143 @@ unsafe extern "C" fn sound_specialnfirehi(agent: &mut L2CAgentBase) { unsafe extern "C" fn expression_specialnfirehi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + } frame(lua_state, 17.0); if is_excute(agent) { - if ArticleModule::is_generatable(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { + if IS_GENERATABLE_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 18.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_attackm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - frame(lua_state, 54.0); + frame(lua_state, 56.0); if is_excute(agent) { VisibilityModule::set_int64(boma, hash40("crown") as i64, hash40("crown_normal") as i64); if ArticleModule::is_exist(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT) { ArticleModule::set_visibility_whole(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, false, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); } } - frame(lua_state, 67.0); + frame(lua_state, 65.0); if is_excute(agent) { ItemModule::set_have_item_visibility(boma, true, 0); } } +unsafe extern "C" fn game_specialnfireb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.4); + } + frame(lua_state, 8.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.25); + } + frame(lua_state, 13.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 1.0); + } + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 22.0, 4.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, (22.0 - 15.0)/4.0); + if is_excute(agent) { + REVERSE_LR(agent); + } + frame(lua_state, 22.0); + FT_MOTION_RATE(agent, 1.0); + ArticleModule::set_rate(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL); + } +} + +unsafe extern "C" fn effect_specialnfireb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 16.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 22.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("krool_cannon_shot"), Hash40::new("haver"), 0, 2, 25, 0, 0, 0, 1.3, true); + } + frame(lua_state, 23.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("krool_cannon_shot"), -1); + } +} + +unsafe extern "C" fn sound_specialnfireb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_krool_special_n10")); + } + frame(lua_state, 23.0); + if is_excute(agent) { + if WorkModule::is_flag(boma, *FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL) { + PLAY_SE(agent, Hash40::new("se_krool_special_n07")); + } + else { + PLAY_SE(agent, Hash40::new("se_krool_special_n01")); + } + } +} + +unsafe extern "C" fn expression_specialnfireb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + VisibilityModule::set_int64(boma, hash40("crown") as i64, hash40("crown_hide") as i64); + if IS_EXIST_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT) { + ArticleModule::set_visibility_whole(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, true, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } + } + frame(lua_state, 22.0); + if is_excute(agent) { + if IS_GENERATABLE_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { + QUAKE(agent, *CAMERA_QUAKE_KIND_S); + } + } + frame(lua_state, 23.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 60.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("crown") as i64, hash40("crown_normal") as i64); + if IS_EXIST_ARTICLE(agent, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT) { + if is_excute(agent) { + ArticleModule::set_visibility_whole(boma, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, false, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } + } + } + frame(lua_state, 70.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x23c33f3bdc)); + } +} + unsafe extern "C" fn game_specialnloop(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { if VarModule::is_flag(agent.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { - CATCH(agent, 0, Hash40::new("top"), 7.0, 0.0, 8.0, 13.0, Some(0.0), Some(8.0), Some(18.0), *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_G); - CATCH(agent, 1, Hash40::new("top"), 4.5, 0.0, 9.5, 10.7, Some(0.0), Some(9.5), Some(20.5), *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_A); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 160, 100, 50, 0, 9.0, 0.0, 9.0, 22.0, Some(0.0), Some(9.0), Some(27.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_NO_STAGE_GIMMICK, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 9.5, 10.0, Some(0.0), Some(9.5), Some(19.0), *FIGHTER_STATUS_KIND_SWALLOWED, *COLLISION_SITUATION_MASK_GA); + hitbox!(agent, { extends: BASE_WINDBOX, id: 1, bone: "top", dmg: 0.0, angle: 160, kbg: 100, fkb: 25, bkb: 0, size: 6.0, x: 0.0, y: 9.0, z: 22.0, x2: 0.0, y2: 9.0, z2: 28.0, rehit: 10, situation: CollisionSituation::G_d, }); + // hitbox!(agent, { extends: BASE_WINDBOX, id: 2, bone: "top", dmg: 0.0, angle: 160, kbg: 100, fkb: 20, bkb: 0, size: 6.0, x: 0.0, y: 9.0, z: 22.0, x2: 0.0, y2: 9.0, z2: 28.0, rehit: 10, situation: CollisionSituation::GA_d, }); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 5.0, 361, 100, 0, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - } - else { - SEARCH(agent, 0, 0, Hash40::new("top"), 7.0, 0.0, 8.0, 11.0, Some(0.0), Some(8.0), Some(60.0), *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_ALL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, true); + SEARCH(agent, 0, 0, Hash40::new("top"), 7.0, 0.0, 8.0, 11.0, Some(0.0), Some(8.0), Some(30.0), *COLLISION_KIND_MASK_AH, *HIT_STATUS_MASK_ALL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, true); } } } @@ -263,8 +368,20 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_specialnfirehi", expression_specialnfirehi, Priority::Low); agent.acmd("expression_specialairnfirehi", expression_specialnfirehi, Priority::Low); + agent.acmd("game_specialnfireb", game_specialnfireb, Priority::Low); + agent.acmd("game_specialairnfireb", game_specialnfireb, Priority::Low); + agent.acmd("effect_specialnfireb", effect_specialnfireb, Priority::Low); + agent.acmd("effect_specialairnfireb", effect_specialnfireb, Priority::Low); + agent.acmd("sound_specialnfireb", sound_specialnfireb, Priority::Low); + agent.acmd("sound_specialairnfireb", sound_specialnfireb, Priority::Low); + agent.acmd("expression_specialnfireb", expression_specialnfireb, Priority::Low); + agent.acmd("expression_specialairnfireb", expression_specialnfireb, Priority::Low); + agent.acmd("game_specialnloop", game_specialnloop, Priority::Low); agent.acmd("game_specialairnloop", game_specialnloop, Priority::Low); agent.acmd("effect_specialnloop", effect_specialnloop, Priority::Low); agent.acmd("effect_specialairnloop", effect_specialnloop, Priority::Low); + + agent.acmd("effect_specialnspitb", effect_specialnfireb, Priority::Low); + agent.acmd("effect_specialairnspitb", effect_specialnfireb, Priority::Low); } \ No newline at end of file diff --git a/fighters/krool/src/acmd/throws.rs b/fighters/krool/src/acmd/throws.rs index bbb3c9fc95..2ea6c2ee8e 100644 --- a/fighters/krool/src/acmd/throws.rs +++ b/fighters/krool/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.875); - frame(lua_state, 7.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 6.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(15.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 6.0, 0.0, 7.0, 6.0, Some(0.0), Some(7.0), Some(15.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -161,7 +160,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 2.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 15.0); - FT_MOTION_RATE_RANGE(agent, 15.0, 35.0, 10.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 35.0, 12.0); frame(lua_state, 35.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 40.0); @@ -170,7 +169,29 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); + VarModule::on_flag(opponent_boma.object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); + } +} + +unsafe extern "C" fn effect_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 3, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 0, 21, 12, 0, 0, 0, 1.6, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 38.0); + if is_excute(agent) { + LANDING_EFFECT_FLIP(agent, Hash40::new("sys_down_smoke"), Hash40::new("sys_dash_smoke"), Hash40::new("top"), 12, 0, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, false, *EF_FLIP_YZ); + } + frame(lua_state, 39.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } } @@ -271,6 +292,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); + agent.acmd("effect_throwlw", effect_throwlw, Priority::Low); agent.acmd("game_specialnspitf", game_specialnspitf, Priority::Low); agent.acmd("game_specialairnspitf", game_specialnspitf, Priority::Low); diff --git a/fighters/krool/src/acmd/tilts.rs b/fighters/krool/src/acmd/tilts.rs index f7d631bc83..ff1b326491 100644 --- a/fighters/krool/src/acmd/tilts.rs +++ b/fighters/krool/src/acmd/tilts.rs @@ -320,7 +320,7 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { // ground-only ATTACK(agent, 0, 0, Hash40::new("top"), 13.0 + damage, 270, 44, 0, 89, 5.0, 0.0, 3.5, 16.5, None, None, None, hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 7.0 + damage, 85, 30, 0, 100, 5.0, 0.0, 3.5, 10.0, Some(0.0), Some(3.5), Some(23.0), hitlag * 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 7.0 + damage, 85, 30, 0, 100, 3.5, 0.0, 2.0, 8.5, Some(0.0), Some(2.0), Some(24.5), hitlag * 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); // air-only ATTACK(agent, 1, 0, Hash40::new("top"), 13.0 + damage, 270, 50, 0, 30, 5.0, 0.0, 3.5, 16.5, None, None, None, hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); diff --git a/fighters/krool/src/crown/acmd.rs b/fighters/krool/src/crown/acmd.rs index 5dc18cc049..98857beb58 100644 --- a/fighters/krool/src/crown/acmd.rs +++ b/fighters/krool/src/crown/acmd.rs @@ -1,19 +1,30 @@ use super::*; +hitbox_templates!( + pub KROOL_KROWN = { + extends: PHYSICAL_PROJECTILE_HITBOX, + effect: "collision_attr_normal", + hit_sound: CollisionSound::Punch, + region: AttackRegion::Object, + clank: SetOff::Thru, + sound_level: SoundLevel::L, + }; +); + unsafe extern "C" fn game_throw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("rot"), 9.0, 65, 79, 0, 45, 3.5, 0.0, 0.0, 0.0, Some(-4.8), Some(-6.0), Some(0.0), 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -4.5, 0.0, 44, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + hitbox!(agent, { extends: KROOL_KROWN, id: 0, bone: "rot", dmg: 9.0, angle: 65, kbg: 79, bkb: 45, size: 3.5, x: 0.0, y: 0.0, z: 0.0, x2: -4.8, y2: -6.0, z2: 0.0, facing: LrCheck::F, rehit: 44, }); AttackModule::enable_safe_pos(boma); } frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("rot"), 9.0, 65, 79, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -4.5, 0.0, 44, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + hitbox!(agent, { extends: KROOL_KROWN, id: 0, bone: "rot", dmg: 9.0, angle: 65, kbg: 79, bkb: 45, size: 3.5, x: 0.0, y: 0.0, z: 0.0, facing: LrCheck::F, rehit: 44, }); } frame(lua_state, 39.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("rot"), 7.0, 65, 79, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_B, false, -3.5, 0.0, 44, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + hitbox!(agent, { extends: KROOL_KROWN, id: 0, bone: "rot", dmg: 7.0, angle: 65, kbg: 79, bkb: 45, size: 3.5, x: 0.0, y: 0.0, z: 0.0, facing: LrCheck::B, rehit: 44, }); } } diff --git a/fighters/krool/src/crown/mod.rs b/fighters/krool/src/crown/mod.rs index 1934704e14..3604c6e4a0 100644 --- a/fighters/krool/src/crown/mod.rs +++ b/fighters/krool/src/crown/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod opff; pub fn install() { let agent = &mut Agent::new("krool_crown"); acmd::install(agent); + opff::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/krool/src/crown/opff.rs b/fighters/krool/src/crown/opff.rs new file mode 100644 index 0000000000..39e5c64784 --- /dev/null +++ b/fighters/krool/src/crown/opff.rs @@ -0,0 +1,38 @@ +// opff import +utils::import_noreturn!(common::opff::fighter_common_opff); +use super::*; +use globals::*; + +unsafe fn krown_reflect_fix(weapon: &mut smash::lua2cpp::L2CFighterBase) { + // this opff runs once after reflection + let boma = weapon.module_accessor; + if !weapon.is_status(*WEAPON_KROOL_CROWN_STATUS_KIND_THROW) || !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_REFLECTOR | *COLLISION_KIND_MASK_PARRY) { + return; + } + AttackModule::clear_inflict_kind_status(boma); + + // update position, accounting for boomerang-weirdness + let top_pos = *PostureModule::pos(boma); + let rot_pos = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + ModelModule::joint_global_position(boma, Hash40::new("rot"), rot_pos, false); + PostureModule::set_pos(boma, &Vector3f{ x: rot_pos.x, y: top_pos.y, z: top_pos.z }); + + // update facing direction depending on whether it is traveling forwards or backwards + let lr = PostureModule::lr(boma); + let speed_x = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + if weapon.is_status(*WEAPON_KROOL_CROWN_STATUS_KIND_THROW) && weapon.motion_frame() <= 40.0 { // F40 is the frame that animation reverses direction + PostureModule::reverse_lr(boma); + PostureModule::update_rot_y_lr(boma); + } + + // restart status + weapon.change_status(WEAPON_KROOL_CROWN_STATUS_KIND_THROW.into(), false.into()); +} + +pub unsafe extern "C" fn krool_crown_frame(weapon: &mut smash::lua2cpp::L2CFighterBase) { + krown_reflect_fix(weapon); +} + +pub fn install(agent: &mut Agent) { + agent.on_line(Main, krool_crown_frame); +} \ No newline at end of file diff --git a/fighters/krool/src/ironball/acmd.rs b/fighters/krool/src/ironball/acmd.rs index 0118acafdc..2b2eb7436e 100644 --- a/fighters/krool/src/ironball/acmd.rs +++ b/fighters/krool/src/ironball/acmd.rs @@ -6,7 +6,12 @@ unsafe extern "C" fn game_shoot(agent: &mut L2CAgentBase) { if is_excute(agent) { let owner_module_accessor = &mut *sv_battle_object::module_accessor((agent.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); let lr = PostureModule::lr(owner_module_accessor); - if owner_module_accessor.kind() == *FIGHTER_KIND_KROOL && owner_module_accessor.is_motion(Hash40::new("special_n_fire_hi")) { + if (owner_module_accessor.kind() == *FIGHTER_KIND_KROOL && owner_module_accessor.is_motion_one_of(&[ + Hash40::new("special_n_fire_b"), Hash40::new("special_air_n_fire_b") ])) + || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY && owner_module_accessor.is_motion_one_of(&[ + Hash40::new("krool_special_n_fire_b"), Hash40::new("krool_special_air_n_fire_b") ])) + { + // 25 degrees KineticModule::reflect_speed(boma, &Vector3f{x: -0.2164, y: lr * 0.9762, z: 0.0}, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); } ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 60, 92, 0, 18, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, false, 7, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); @@ -18,7 +23,21 @@ unsafe extern "C" fn game_spitshoot(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 60, 87, 0, 55, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, false, 8, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + let owner_module_accessor = &mut *sv_battle_object::module_accessor((agent.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); + let lr = PostureModule::lr(owner_module_accessor); + if (owner_module_accessor.kind() == *FIGHTER_KIND_KROOL && owner_module_accessor.is_motion_one_of(&[ + Hash40::new("special_n_fire_hi"), Hash40::new("special_air_n_fire_hi") ])) + || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY && owner_module_accessor.is_motion_one_of(&[ + Hash40::new("krool_special_n_fire_hi"), Hash40::new("krool_special_air_n_fire_hi") ])) + { + // use shoot data when doing fire_hi + let start_spd_x = agent.get_param_float("param_ironball", "start_spd_x"); + sv_kinetic_energy!(set_speed, agent, WEAPON_KROOL_IRONBALL_KINETIC_ENERGY_ID_GRAVITY, start_spd_x, 0.0); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 60, 92, 0, 18, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, false, 7, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + } + else { + ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 60, 87, 0, 55, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, false, 8, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + } AttackModule::enable_safe_pos(boma); } } diff --git a/fighters/krool/src/ironball/status.rs b/fighters/krool/src/ironball/status.rs index dbfc8099e5..9ca38c6b05 100644 --- a/fighters/krool/src/ironball/status.rs +++ b/fighters/krool/src/ironball/status.rs @@ -1,66 +1,26 @@ use super::*; use globals::*; -unsafe extern "C" fn shoot_main(weapon: &mut L2CWeaponCommon) -> L2CValue { - let life = weapon.get_param_int("param_ironball", "life"); - weapon.set_int(life, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); - weapon.set_int(life, *WEAPON_INSTANCE_WORK_ID_INT_INIT_LIFE); - let motion = if weapon.is_flag(*WEAPON_KROOL_IRONBALL_INSTANCE_WORK_ID_FLAG_SPIT) { Hash40::new("spit_shoot") } else { Hash40::new("shoot") }; - MotionModule::change_motion(weapon.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); - if !StopModule::is_stop(weapon.module_accessor) { - shoot_substatus(weapon, false); - } - weapon.global_table[SUB_STATUS].assign(&L2CValue::Ptr(shoot_substatus as *const () as _)); - weapon.off_flag(*WEAPON_KROOL_IRONBALL_INSTANCE_WORK_ID_FLAG_HIT_CEIL); +unsafe extern "C" fn end_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + weapon.set_int(6, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); + MotionModule::change_motion(weapon.module_accessor, Hash40::new("end"), 0.0, 1.0, false, 0.0, false, false); HitModule::set_whole(weapon.module_accessor, app::HitStatus(*HIT_STATUS_OFF), 0); - weapon.fastshift(L2CValue::Ptr(shoot_main_loop as *const () as _)) + + weapon.fastshift(L2CValue::Ptr(end_main_loop as *const () as _)) } -unsafe extern "C" fn shoot_substatus(weapon: &mut L2CWeaponCommon, param_1: bool) -> L2CValue { - if param_1 { - weapon.dec_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE); - } - else { - let sum_speed_x = KineticModule::get_sum_speed_x(weapon.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - let facing = weapon.lr(); - if sum_speed_x * facing < 0.0 { - sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); - sv_kinetic_energy!(set_accel, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); - } - } - - return 0.into(); -} - -unsafe extern "C" fn shoot_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { +unsafe extern "C" fn end_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { + // this doesn't actually work, I hate vtable if weapon.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE) <= 0 { - weapon.change_status(WEAPON_KROOL_IRONBALL_STATUS_KIND_END.into(), false.into()); - return 1.into(); - } - if GroundModule::is_touch(weapon.module_accessor, *GROUND_TOUCH_FLAG_UP as u32) { - weapon.on_flag(*WEAPON_KROOL_IRONBALL_INSTANCE_WORK_ID_FLAG_HOP); - weapon.on_flag(*WEAPON_KROOL_IRONBALL_INSTANCE_WORK_ID_FLAG_HIT_CEIL); - weapon.change_status(WEAPON_KROOL_IRONBALL_STATUS_KIND_HOP.into(), false.into()); - return 1.into(); + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); } else { - if GroundModule::is_wall_touch_line(weapon.module_accessor, *GROUND_TOUCH_FLAG_ALL as u32) { - weapon.on_flag(*WEAPON_KROOL_IRONBALL_INSTANCE_WORK_ID_FLAG_HOP); - weapon.change_status(WEAPON_KROOL_IRONBALL_STATUS_KIND_HOP.into(), false.into()); - return 1.into(); - } - else { - if GroundModule::is_floor_touch_line(weapon.module_accessor, *GROUND_TOUCH_FLAG_ALL as u32) { - weapon.on_flag(*WEAPON_KROOL_IRONBALL_INSTANCE_WORK_ID_FLAG_HOP); - weapon.change_status(WEAPON_KROOL_IRONBALL_STATUS_KIND_HOP.into(), false.into()); - return 1.into(); - } - } + weapon.dec_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE); } return 0.into(); } pub fn install(agent: &mut Agent) { - agent.status(Main, *WEAPON_KROOL_IRONBALL_STATUS_KIND_SHOOT, shoot_main); + agent.status(End, *WEAPON_KROOL_IRONBALL_STATUS_KIND_END, end_main); } \ No newline at end of file diff --git a/fighters/krool/src/lib.rs b/fighters/krool/src/lib.rs index 5485e35d9a..65cd59baff 100644 --- a/fighters/krool/src/lib.rs +++ b/fighters/krool/src/lib.rs @@ -13,7 +13,6 @@ mod backpack; mod crown; mod ironball; -//pub mod vtable_hook; pub use status::krool_belly_damage_hook_impl; use smash::{ @@ -39,6 +38,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/krool/src/opff.rs b/fighters/krool/src/opff.rs index 68717e1f49..7bf7e9dca1 100644 --- a/fighters/krool/src/opff.rs +++ b/fighters/krool/src/opff.rs @@ -3,18 +3,6 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -unsafe fn var_reset(fighter: &mut smash::lua2cpp::L2CFighterCommon) { - if fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_WIN, - *FIGHTER_STATUS_KIND_LOSE, - *FIGHTER_STATUS_KIND_ENTRY, - *FIGHTER_STATUS_KIND_DEAD, - *FIGHTER_STATUS_KIND_REBIRTH]) { - VarModule::set_float(fighter.battle_object, vars::krool::instance::SPECIAL_LW_STORED_DAMAGE, 0.0); - VarModule::off_flag(fighter.battle_object, vars::krool::instance::SPECIAL_N_GRAB); - } -} - pub unsafe fn armored_charge(fighter: &mut L2CFighterCommon, motion_kind: u64) { if fighter.is_motion_one_of(&[ Hash40::new("attack_s3_s"), @@ -79,7 +67,6 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { armored_charge(fighter, motion_kind); - var_reset(fighter); fastfall_specials(fighter); } diff --git a/fighters/krool/src/status/mod.rs b/fighters/krool/src/status/mod.rs index 0f15f7217d..56eb213917 100644 --- a/fighters/krool/src/status/mod.rs +++ b/fighters/krool/src/status/mod.rs @@ -6,6 +6,7 @@ mod attack_lw4; mod special_hi; mod special_lw; mod special_n; +mod special_s; // handle damage to belly #[no_mangle] @@ -52,9 +53,17 @@ pub unsafe extern "C" fn krool_belly_damage_hook_impl(damage: f32, fighter: *mut // // ...as_mut() &= logic // } +unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { + VarModule::set_float(fighter.battle_object, vars::krool::instance::SPECIAL_LW_STORED_DAMAGE, 0.0); + VarModule::off_flag(fighter.battle_object, vars::krool::instance::SPECIAL_N_GRAB); +} + pub fn install(agent: &mut Agent) { + agent.on_start(on_start); + attack_lw4::install(agent); special_hi::install(agent); special_lw::install(agent); special_n::install(agent); + special_s::install(agent); } \ No newline at end of file diff --git a/fighters/krool/src/status/special_hi.rs b/fighters/krool/src/status/special_hi.rs index 155433bde9..867391f94d 100644 --- a/fighters/krool/src/status/special_hi.rs +++ b/fighters/krool/src/status/special_hi.rs @@ -223,6 +223,10 @@ unsafe extern "C" fn special_hi_fall_main(fighter: &mut L2CFighterCommon) -> L2C special_hi_set_physics(fighter); fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(special_hi_movement_helper as *const () as _)); GroundModule::select_cliff_hangdata(fighter.module_accessor, *FIGHTER_KROOL_CLIFF_HANG_DATA_SPECIAL_HI as u32); + let front_cliff_hang_data = fighter.get_front_cliff_hangdata(); + let p1_x = front_cliff_hang_data.x; + let fall_special_cliff_hangdata_p1x_reduction_dist = ParamModule::get_float(fighter.battle_object, ParamType::Shared, "fall_special_cliff_hangdata_p1x_reduction_dist"); + fighter.set_front_cliff_hangdata(p1_x - fall_special_cliff_hangdata_p1x_reduction_dist, front_cliff_hang_data.y); fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_fall_main_loop as *const () as _)) } diff --git a/fighters/krool/src/status/special_lw.rs b/fighters/krool/src/status/special_lw.rs index ee07624690..cf955bd06c 100644 --- a/fighters/krool/src/status/special_lw.rs +++ b/fighters/krool/src/status/special_lw.rs @@ -1,11 +1,10 @@ use super::*; // FIGHTER_STATUS_KIND_SPECIAL_LW - -unsafe extern "C" fn special_lw_main_old(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.change_status(statuses::krool::SPECIAL_LW_GUT.into(), true.into()); +unsafe extern "C" fn special_lw_pre_old(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.change_status(statuses::krool::SPECIAL_LW_GUT.into(), false.into()); - 0.into() + return 0.into(); } unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -33,35 +32,38 @@ unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue 0 ); - 0.into() + return 0.into(); } unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw"), 0.0, 1.0, false, 0.0, false, false); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw"), 0.0, 1.0, false, 0.0, false, false); + } + fighter.main_shift(special_lw_main_loop) } unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if StatusModule::is_changing(fighter.module_accessor) - || StatusModule::is_situation_changed(fighter.module_accessor) { - special_lw_change_motion(fighter); - } if CancelModule::is_enable_cancel(fighter.module_accessor) { if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { return 1.into(); } } + if StatusModule::is_situation_changed(fighter.module_accessor) { + special_lw_change_motion(fighter); + } if MotionModule::is_end(fighter.module_accessor) { - let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { - FIGHTER_STATUS_KIND_WAIT - } - else { - FIGHTER_STATUS_KIND_FALL - }; - fighter.change_status(status.into(), false.into()); + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); return 0.into(); } - if WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_FRAME_IN_AIR) <= 1 { GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); } @@ -74,7 +76,7 @@ unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2C if fighter.motion_frame() > 30.0 // Allows for jump cancel on frame 8 (30 in animation) if not charged && !VarModule::is_flag(fighter.battle_object, vars::krool::status::SPECIAL_LW_GUT_CHARGED) && !fighter.is_in_hitlag() { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, false); } if VarModule::is_flag(fighter.battle_object, vars::krool::status::SPECIAL_LW_GUT_CHARGED) // restore armor on full charge hit && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) @@ -91,29 +93,17 @@ unsafe extern "C" fn special_lw_change_motion(fighter: &mut L2CFighterCommon) { if !fighter.is_situation(*SITUATION_KIND_GROUND) { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_KROOL_STATUS_SPECIAL_LW_FLAG_FIRST) { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw"), 0.0, 1.0, false, 0.0, false, false); - WorkModule::on_flag(fighter.module_accessor, *FIGHTER_KROOL_STATUS_SPECIAL_LW_FLAG_FIRST); - } - else { - MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_air_lw"), -1.0, 1.0, 0.0); - } + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_air_lw"), -1.0, 1.0, 0.0); } else { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); - if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_KROOL_STATUS_SPECIAL_LW_FLAG_FIRST) { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw"), 0.0, 1.0, false, 0.0, false, false); - WorkModule::on_flag(fighter.module_accessor, *FIGHTER_KROOL_STATUS_SPECIAL_LW_FLAG_FIRST); - } - else { - MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_lw"), -1.0, 1.0, 0.0); - } + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_lw"), -1.0, 1.0, 0.0); } } pub fn install(agent: &mut Agent) { - agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_main_old); + agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre_old); agent.status(Pre, statuses::krool::SPECIAL_LW_GUT, special_lw_pre); agent.status(Main, statuses::krool::SPECIAL_LW_GUT, special_lw_main); } \ No newline at end of file diff --git a/fighters/krool/src/status/special_n.rs b/fighters/krool/src/status/special_n.rs index b5f108a3ce..0f4c52a9af 100644 --- a/fighters/krool/src/status/special_n.rs +++ b/fighters/krool/src/status/special_n.rs @@ -1,217 +1,139 @@ use super::*; -// pub unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { -// fighter.set_int(0x50000000, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_BATTLE_OBJECT_ID_BLUNDERBUSS); -// fighter.set_int(0x50000000, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_BATTLE_OBJECT_ID_SPITBALL); -// if fighter.kind() != *FIGHTER_KIND_KIRBY { -// ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, false, -1); -// } -// ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, false, -1); -// ArticleModule::change_status_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, *WEAPON_KROOL_BLUNDERBUSS_STATUS_KIND_FIRE); -// special_n_set_kinetic(fighter); -// if !StopModule::is_stop(fighter.module_accessor) { -// special_n_substatus(fighter, false); -// } -// fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(special_n_substatus as *const () as _)); -// fighter.off_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_SUCTION_IRONBALL); -// fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_NONE, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); -// fighter.off_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_CATCH_CUT); - -// fighter.main_shift(special_n_main_loop) -// } - -// // FUN_710002a5b0 -// pub unsafe extern "C" fn special_n_substatus(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { -// if !param_1.get_bool() { -// if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL_END) { -// if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL) { -// if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { -// fighter.on_flag(*FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL); -// } -// else { -// ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL, false, -1); -// notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_SHOOT_NUM); -// } -// fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL_END); -// let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); -// let back_air_spd_y = fighter.get_param_float("param_special_n", "special_n_back_air_spd_y"); -// if fighter.is_situation(*SITUATION_KIND_AIR) && sum_speed_y < -0.7 { -// sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); -// sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, sum_speed_y + back_air_spd_y); -// } -// KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); -// } -// let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); -// if fighter.is_situation(*SITUATION_KIND_AIR) { -// let back_air_spd_x = fighter.get_param_float("param_special_n", "special_n_back_air_spd_x"); -// let facing = fighter.lr(); -// sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, 0.0, 0.0, 0.0, 0.0, 0.0); -// sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, back_air_spd_x * facing - sum_speed_x, 0.0); -// } -// else { -// let back_spd_x = fighter.get_param_float("param_special_n", "special_n_back_spd_x"); -// let facing = fighter.lr(); -// sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, 0.0, 0.0, 0.0, 0.0, 0.0); -// sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, back_spd_x * facing - sum_speed_x, 0.0); -// } -// } -// } - -// return 0.into(); -// } - -// pub unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { -// if !StatusModule::is_changing(fighter.module_accessor) { -// if fighter.is_prev_situation(*SITUATION_KIND_GROUND) { -// if fighter.is_situation(*SITUATION_KIND_AIR) { -// special_n_change_motion(fighter, Hash40::new("special_n_fire"), Hash40::new("special_air_n_fire")); -// } -// } -// if fighter.is_situation(*SITUATION_KIND_GROUND) { -// special_n_change_motion(fighter, Hash40::new("special_n_fire"), Hash40::new("special_air_n_fire")); -// } -// } -// if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { -// if CancelModule::is_enable_cancel(fighter.module_accessor) { -// if fighter.sub_wait_ground_check_common(false.into()).get_bool() { -// return 1.into(); -// } -// else { -// if fighter.sub_air_check_fall_common().get_bool() { -// return 1.into(); -// } -// } -// } -// } -// let pass_speed_y = fighter.get_param_float("common", "pass_speed_y"); -// if fighter.stick_y() <= pass_speed_y { -// if GroundModule::is_passable_check(fighter.module_accessor) { -// GroundModule::set_passable_check(fighter.module_accessor, false); -// } -// } -// else { -// if fighter.is_situation(*SITUATION_KIND_AIR) { -// GroundModule::set_passable_check(fighter.module_accessor, true); -// } -// if GroundModule::is_passable_ground(fighter.module_accessor) { -// let flick_speed_y = fighter.get_param_float("common", "pass_flick_y"); -// if fighter.global_table[FLICK_Y].get_f32() < flick_speed_y { -// GroundModule::set_passable_check(fighter.module_accessor, true); -// fighter.set_situation(SITUATION_KIND_AIR.into()); -// KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); -// KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); -// } -// } -// } -// if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { -// if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_CANCEL) { -// if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_CANCEL) { -// if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_IRONBALL) { -// fighter.change_status(FIGHTER_KROOL_STATUS_KIND_SPECIAL_N_SUCTION.into(), true.into()); -// return 0.into(); -// } -// } -// if MotionModule::is_end(fighter.module_accessor) { -// let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_STATUS_KIND_WAIT.into() } else { FIGHTER_STATUS_KIND_FALL.into() }; -// fighter.change_status(status, false.into()); -// return 0.into(); -// } -// if fighter.is_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_DROP_CROWN) { -// VisibilityModule::set_int64(fighter.module_accessor, hash40("crown") as i64, hash40("crown_hide") as i64); -// } -// } -// fighter.change_status(FIGHTER_KROOL_STATUS_KIND_SPECIAL_N_SUCTION.into(), true.into()); -// return 0.into(); -// } -// else { -// if MotionModule::is_end(fighter.module_accessor) { -// let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_STATUS_KIND_WAIT.into() } else { FIGHTER_STATUS_KIND_FALL.into() }; -// fighter.change_status(status, false.into()); -// return 0.into(); -// } -// if fighter.is_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_DROP_CROWN) { -// VisibilityModule::set_int64(fighter.module_accessor, hash40("crown") as i64, hash40("crown_hide") as i64); -// } -// } - -// return 0.into(); -// } - -unsafe extern "C" fn special_n_fire_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue { - StatusModule::init_settings(fighter.module_accessor, - app::SituationKind(*SITUATION_KIND_NONE), - *FIGHTER_KINETIC_TYPE_UNIQ, - *GROUND_CORRECT_KIND_KEEP as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), - true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, - 0 - ); - FighterStatusModuleImpl::set_fighter_status_data( - fighter.module_accessor, - false, - *FIGHTER_TREADED_KIND_NO_REAC, - false, - false, - false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_SHOOT) as u64, - 0, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, - 0 - ); - - 0.into() -} - -pub unsafe extern "C" fn special_n_fire_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue { +pub unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { fighter.set_int(0x50000000, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_BATTLE_OBJECT_ID_BLUNDERBUSS); fighter.set_int(0x50000000, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_BATTLE_OBJECT_ID_SPITBALL); - //fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SPIT); - if fighter.kind() != *FIGHTER_KIND_KIRBY { - ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, false, -1); - } + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_PIRATEHAT, false, -1); ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, false, -1); - //ArticleModule::change_status_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, *WEAPON_KROOL_BLUNDERBUSS_STATUS_KIND_SPIT); ArticleModule::change_status_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, *WEAPON_KROOL_BLUNDERBUSS_STATUS_KIND_FIRE); - // if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS) { - // let spit_type = fighter.get_int(*FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); - // if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_F { - // ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_f"), false, -1.0); - // } - // else if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_B { - // ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_b"), false, -1.0); - // } - // else { - // ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_hi"), false, -1.0); - // } - // } + special_n_change_motion(fighter, Hash40::new("special_n_fire"), Hash40::new("special_air_n_fire")); special_n_set_kinetic(fighter); if !StopModule::is_stop(fighter.module_accessor) { - special_n_fire_hi_substatus(fighter, false.into()); + special_n_substatus(fighter, false.into()); } - fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(special_n_fire_hi_substatus as *const () as _)); - fighter.main_shift(special_n_fire_hi_main_loop) + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(special_n_substatus as *const () as _)); + fighter.off_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_SUCTION_IRONBALL); + fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_NONE, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); + fighter.off_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_CATCH_CUT); + + fighter.main_shift(special_n_main_loop) +} + +// // FUN_710002a5b0 +pub unsafe extern "C" fn special_n_substatus(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { + if !param_1.get_bool() { + if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL_END) { + if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL) { + if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL) { + fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_NO_SHOOT_IRONBALL); + } + else { + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_IRONBALL, false, -1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_SHOOT_NUM); + } + fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL_END); + let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let back_spd_x = fighter.get_param_float("param_special_n", "special_n_back_spd_x"); + let back_air_spd_x = fighter.get_param_float("param_special_n", "special_n_back_air_spd_x"); + let back_air_spd_y = fighter.get_param_float("param_special_n", "special_n_back_air_spd_y"); + if fighter.is_situation(*SITUATION_KIND_AIR) && sum_speed_y < -0.7 { + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, sum_speed_y + back_air_spd_y); + } + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + if !fighter.is_motion_one_of(&[Hash40::new("special_n_fire_hi"), Hash40::new("special_air_n_fire_hi")]) { + if fighter.is_situation(*SITUATION_KIND_AIR) { + let facing = fighter.lr(); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_speed_x - back_air_spd_x * facing, 0.0); + } + else { + let facing = fighter.lr(); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_speed_x - back_spd_x * facing, 0.0); + } + } + } + } + } + + return 0.into(); } -pub unsafe extern "C" fn special_n_fire_hi_substatus(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { - if param_1.get_bool() { - let mut motion_2nd_waight = fighter.get_float(*FIGHTER_KROOL_STATUS_SPECIAL_N_WORK_FLOAT_MOTION_2ND_WAIGHT); - if motion_2nd_waight < 0.0 { - motion_2nd_waight = (motion_2nd_waight - 0.1666667).abs().max(0.0); - fighter.set_float(motion_2nd_waight, *FIGHTER_KROOL_STATUS_SPECIAL_N_WORK_FLOAT_MOTION_2ND_WAIGHT); +pub unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) + || StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_motion_one_of(&[Hash40::new("special_n_fire_hi"), Hash40::new("special_air_n_fire_hi")]) { + special_n_change_motion(fighter, Hash40::new("special_n_fire_hi"), Hash40::new("special_air_n_fire_hi")); + } + else if fighter.is_motion_one_of(&[Hash40::new("special_n_fire_b"), Hash40::new("special_air_n_fire_b")]) { + special_n_change_motion(fighter, Hash40::new("special_n_fire_b"), Hash40::new("special_air_n_fire_b")); + } + else { + special_n_change_motion(fighter, Hash40::new("special_n_fire"), Hash40::new("special_air_n_fire")); + } + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() { + return 1.into(); + } + else { + if fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + } + let pass_speed_y = fighter.get_param_float("common", "pass_speed_y"); + if fighter.stick_y() <= pass_speed_y { + if GroundModule::is_passable_check(fighter.module_accessor) { + GroundModule::set_passable_check(fighter.module_accessor, false); } } else { - //if fighter.is_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_SUCTION_IRONBALL) { - if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL_END) { - if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL) { - ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_SPITBALL, false, -1); - fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_IRONBALL_END); - } + if fighter.is_situation(*SITUATION_KIND_AIR) { + GroundModule::set_passable_check(fighter.module_accessor, true); + } + if GroundModule::is_passable_ground(fighter.module_accessor) { + let flick_speed_y = fighter.get_param_float("common", "pass_flick_y"); + if fighter.global_table[FLICK_Y].get_f32() < flick_speed_y { + GroundModule::set_passable_check(fighter.module_accessor, true); + fighter.set_situation(SITUATION_KIND_AIR.into()); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } - //} + } + } + // angled shots + if VarModule::is_flag(fighter.battle_object, vars::krool::status::SPECIAL_N_ANGLED) { + VarModule::off_flag(fighter.battle_object, vars::krool::status::SPECIAL_N_ANGLED); + if fighter.stick_y() > 0.5 { + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("special_n_fire_hi") } else { Hash40::new("special_air_n_fire_hi") }; + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + ArticleModule::change_status_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, *WEAPON_KROOL_BLUNDERBUSS_STATUS_KIND_SPIT); + ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_hi"), true, 0.0); + fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_HI, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); + return 0.into(); + } + else if PostureModule::lr(fighter.module_accessor) * fighter.stick_x() < 0.0 { + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("special_n_fire_b") } else { Hash40::new("special_air_n_fire_b") }; + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + ArticleModule::change_status_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, *WEAPON_KROOL_BLUNDERBUSS_STATUS_KIND_SPIT); + ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_b"), true, 0.0); + return 0.into(); + } + } + if VarModule::is_flag(fighter.battle_object, vars::krool::instance::SPECIAL_N_GRAB) { + if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SHOOT_CANCEL) { + fighter.change_status(FIGHTER_KROOL_STATUS_KIND_SPECIAL_N_SUCTION.into(), true.into()); + return 0.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + if fighter.is_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_DROP_CROWN) { + VisibilityModule::set_int64(fighter.module_accessor, hash40("crown") as i64, hash40("crown_hide") as i64); } return 0.into(); @@ -219,16 +141,12 @@ pub unsafe extern "C" fn special_n_fire_hi_substatus(fighter: &mut L2CFighterCom // FUN_7100025c00 pub unsafe extern "C" fn special_n_set_kinetic(fighter: &mut L2CFighterCommon) { - let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - let start_mul_spd_x = fighter.get_param_float("param_special_n", "special_n_start_mul_spd_x"); - let start_air_mul_spd_x = fighter.get_param_float("param_special_n", "special_n_start_air_mul_spd_x"); - let start_mul_spd_y = fighter.get_param_float("param_special_n", "special_n_start_mul_spd_y"); - if !fighter.global_table[STATUS_KIND_INTERRUPT].get_i32() == *FIGHTER_STATUS_KIND_SPECIAL_N { - KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); - KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } - else { + let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); // l70 + let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); // l80 + let start_mul_spd_x = fighter.get_param_float("param_special_n", "special_n_start_mul_spd_x"); // l90 + let start_air_mul_spd_x = fighter.get_param_float("param_special_n", "special_n_start_air_mul_spd_x"); // la0 + let start_mul_spd_y = fighter.get_param_float("param_special_n", "special_n_start_mul_spd_y"); // lb0 + if fighter.global_table[STATUS_KIND_INTERRUPT].get_i32() == *FIGHTER_STATUS_KIND_SPECIAL_N { KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, sum_speed_y * start_mul_spd_y); @@ -242,112 +160,22 @@ pub unsafe extern "C" fn special_n_set_kinetic(fighter: &mut L2CFighterCommon) { sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, 0.0, 0.0, 0.0, 0.0, 0.0); sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_speed_x * start_air_mul_spd_x, 0.0); } - } -} - -pub unsafe extern "C" fn special_n_fire_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - let spit_type = fighter.get_int(*FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); - if !StatusModule::is_changing(fighter.module_accessor) { - if StatusModule::is_situation_changed(fighter.module_accessor) { - if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_F { - special_n_change_motion(fighter, Hash40::new("special_n_spit_f"), Hash40::new("special_air_n_spit_f")); - } - else if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_B { - special_n_change_motion(fighter, Hash40::new("special_n_spit_b"), Hash40::new("special_air_n_spit_b")); - } - else { - special_n_change_motion(fighter, Hash40::new("special_n_spit_hi"), Hash40::new("special_air_n_spit_hi")); - } - } - } - if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_F { - special_n_change_motion(fighter, Hash40::new("special_n_spit_f"), Hash40::new("special_air_n_spit_f")); - } - else if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_B { - special_n_change_motion(fighter, Hash40::new("special_n_spit_b"), Hash40::new("special_air_n_spit_b")); - } - else { - special_n_change_motion(fighter, Hash40::new("special_n_spit_hi"), Hash40::new("special_air_n_spit_hi")); - } - if MotionModule::motion_kind_2nd(fighter.module_accessor) != hash40("special_n_spit_f") { - let mut motion_2nd_waight = fighter.get_float(*FIGHTER_KROOL_STATUS_SPECIAL_N_WORK_FLOAT_MOTION_2ND_WAIGHT); - MotionModule::set_weight(fighter.module_accessor, 1.0 - motion_2nd_waight, true); - if motion_2nd_waight <= 0.0 { - let frame = MotionModule::frame(fighter.module_accessor); - let rate = MotionModule::rate(fighter.module_accessor); - MotionModule::add_motion_2nd(fighter.module_accessor, Hash40::new("invalid"), frame, rate, false, 0.0); - } - } - if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_F { - if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SPIT_TYPE_DECIDE) { - decide_spit_type(fighter); - if !spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_HI { - if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_B { - special_n_change_motion(fighter, Hash40::new("special_n_spit_b"), Hash40::new("special_air_n_spit_b")); - let frame = MotionModule::frame(fighter.module_accessor); - let rate = MotionModule::rate(fighter.module_accessor); - MotionModule::add_motion_2nd(fighter.module_accessor, Hash40::new("special_n_spit_f"), frame, rate, false, 0.0); - fighter.set_float(1.0, *FIGHTER_KROOL_STATUS_SPECIAL_N_WORK_FLOAT_MOTION_2ND_WAIGHT); - let attack_abs_frame = fighter.get_param_int("param_special_n", "special_n_attack_abs_frame"); - if !AttackModule::is_attack(fighter.module_accessor, 0, true) { - if (attack_abs_frame - 1).to_f32() <= frame { - MotionAnimcmdModule::call_script_single(fighter.module_accessor, *FIGHTER_ANIMCMD_GAME, Hash40::new("game_specialnspitbattackabs"), -1); - } - } - } - } - else { - special_n_change_motion(fighter, Hash40::new("special_n_spit_hi"), Hash40::new("special_air_n_spit_hi")); - let frame = MotionModule::frame(fighter.module_accessor); - let rate = MotionModule::rate(fighter.module_accessor); - MotionModule::add_motion_2nd(fighter.module_accessor, Hash40::new("special_n_spit_f"), frame, rate, false, 0.0); - fighter.set_float(1.0, *FIGHTER_KROOL_STATUS_SPECIAL_N_WORK_FLOAT_MOTION_2ND_WAIGHT); - let lvar1 = -0x60; - } - if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS) { - let spit_type = fighter.get_int(*FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); - if spit_type != *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_HI { - if spit_type == *FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_B { - ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_b"), true, -1.0); - } - } - else { - ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_BLUNDERBUSS, Hash40::new("spit_hi"), true, -1.0); - } - } - } - } - if CancelModule::is_enable_cancel(fighter.module_accessor) - && fighter.sub_wait_ground_check_common(false.into()).get_bool() - || fighter.sub_air_check_fall_common().get_bool() { - return 1.into(); - } - if MotionModule::is_end(fighter.module_accessor) { - let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_STATUS_KIND_WAIT.into() } else { FIGHTER_STATUS_KIND_FALL.into() }; - fighter.change_status(status, false.into()); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); } else { - if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SPIT) { - fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SPIT_END); - fighter.off_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_SPIT); - //if fighter.is_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_SUCTION_IRONBALL) { - ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_SPITBALL, false, -1); - //} - } - check_crown_vis(fighter); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } - - return 0.into(); } // FUN_7100027ed0 pub unsafe extern "C" fn special_n_change_motion(fighter: &mut L2CFighterCommon, hash1: Hash40, hash2: Hash40) { if fighter.is_situation(*SITUATION_KIND_AIR) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_FIRST) { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); } - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - if fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_FIRST) { + else { MotionModule::change_motion(fighter.module_accessor, hash2, 0.0, 1.0, false, 0.0, false, false); fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_N_FLAG_FIRST); return; @@ -366,51 +194,6 @@ pub unsafe extern "C" fn special_n_change_motion(fighter: &mut L2CFighterCommon, } } -// FUN_7100028320 -unsafe extern "C" fn decide_spit_type(fighter: &mut L2CFighterCommon) { - let spit_angle = fighter.get_param_float("param_special_n", "special_n_spit_angle"); - let this_00 = fighter.stick_y(); - let plvar5 = fighter.stick_x(); - let l90 = fighter.lr(); - let plvar4 = this_00.atan2(plvar5); - let la0 = plvar5 * plvar5; - let lb0 = this_00 * this_00; - let a90 = la0 + lb0; - let plvar6 = a90.sqrt(); - if plvar6 >= 0.1 { - let a90_20 = (90.0 - spit_angle).to_radians(); - if a90_20 >= plvar6 { - let a90_10 = (90.0 + spit_angle).to_radians(); - if a90_10 >= a90_20 { - fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_HI, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); - } - else { - fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_B, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); - } - } - else { - fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_F, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); - } - } - else { - fighter.set_int(*FIGHTER_KROOL_SPECIAL_N_SPIT_TYPE_F, *FIGHTER_KROOL_INSTANCE_WORK_ID_INT_SPECIAL_N_SPIT_TYPE); - } -} - -unsafe extern "C" fn check_crown_vis(fighter: &mut L2CFighterCommon) { - if fighter.is_flag(*FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_DROP_CROWN) { - VisibilityModule::set_int64(fighter.module_accessor, hash40("crown") as i64, hash40("crown_hide") as i64); - } -} - -unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.change_status(statuses::krool::SPECIAL_N_FIRE_HI.into(), false.into()); - - 0.into() -} - pub fn install(agent: &mut Agent) { - //agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_main); - //agent.status(Pre, statuses::krool::SPECIAL_N_FIRE_HI, special_n_fire_hi_pre); - //agent.status(Main, statuses::krool::SPECIAL_N_FIRE_HI, special_n_fire_hi_main); + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_main); } \ No newline at end of file diff --git a/fighters/krool/src/status/special_s.rs b/fighters/krool/src/status/special_s.rs new file mode 100644 index 0000000000..3ca96b2e1e --- /dev/null +++ b/fighters/krool/src/status/special_s.rs @@ -0,0 +1,66 @@ +use super::*; + +unsafe extern "C" fn special_s_catch_main(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_CROWN, ArticleOperationTarget(0)); + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, speed_x, 0.0); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + + fighter.main_shift(special_s_catch_main_loop) +} + +unsafe extern "C" fn special_s_catch_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) + || StatusModule::is_situation_changed(fighter.module_accessor) { + special_s_change_motion(fighter, Hash40::new("special_s_catch"), Hash40::new("special_air_s_catch")); + } + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 0.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 0.into(); + } + + return 0.into() +} + +unsafe extern "C" fn special_s_change_motion(fighter: &mut L2CFighterCommon, ground_motion: Hash40, air_motion: Hash40) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_S_FLAG_FIRST) { + fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_S_FLAG_FIRST); + MotionModule::change_motion(fighter.module_accessor, ground_motion, 0.0, 1.0, false, 0.0, false, false); + } + else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, ground_motion, -1.0, 1.0, 0.0, false, false); + } + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + if !fighter.is_flag(*FIGHTER_KROOL_STATUS_SPECIAL_S_FLAG_FIRST) { + fighter.on_flag(*FIGHTER_KROOL_STATUS_SPECIAL_S_FLAG_FIRST); + MotionModule::change_motion(fighter.module_accessor, air_motion, 0.0, 1.0, false, 0.0, false, false); + } + else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, air_motion, -1.0, 1.0, 0.0, false, false); + } + } +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_CATCH, special_s_catch_main); +} \ No newline at end of file diff --git a/fighters/krool/src/vtable_hook.rs b/fighters/krool/src/vtable_hook.rs index e16ec4416a..31dd79b1f7 100644 --- a/fighters/krool/src/vtable_hook.rs +++ b/fighters/krool/src/vtable_hook.rs @@ -1,37 +1,52 @@ use super::*; -// Covers Canonball Suction (Applies to Kirby as well) and Crown Catch +#[skyline::hook(offset = 0x342ab20)] +unsafe extern "C" fn ironball_init(_vtable: u64, weapon: *mut app::Weapon, something: u64) { + println!("h"); + println!(); + let ret = original!()(_vtable, weapon, something); + // let module_accessor = (*weapon).battle_object.module_accessor; + // let owner_id = WorkModule::get_int(module_accessor, 0x1000000a); // WEAPON_KROOL_IRONBALL_INSTANCE_WORK_ID_INT_PARENT_OWNER_ID + // let owner = utils::util::get_battle_object_from_id(owner_id as u32); + // let owner_boma = &mut *(*owner).module_accessor; + // if owner_boma.is_motion_one_of(&[Hash40::new("special_n_fire_hi"), Hash40::new("special_air_n_fire_hi")]) { -#[skyline::hook(offset = 0xc06550)] -pub unsafe extern "C" fn krool_func(_vtable: u64, fighter: &mut Fighter) -> u64 { - let module_accessor = (fighter.battle_object).module_accessor; - let status = StatusModule::status_kind(module_accessor); - let kind = WorkModule::get_int(module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND); - if (status == 0x1e2 || status == 0x319) - && WorkModule::is_flag(module_accessor, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_SUCTION_IRONBALL) { - let status = if kind == *FIGHTER_KIND_KIRBY { - 0x31b - } - else { - 0x1e4 - }; - StatusModule::change_status_request(module_accessor, status, false); - } - else if kind != *FIGHTER_KIND_KIRBY - && WorkModule::is_flag(module_accessor, 0x200000EC) { // FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_CATCH_CROWN - if ArticleModule::is_exist(module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_CROWN) { - if status == *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_FAILURE { - StatusModule::change_status_request(module_accessor, *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_CATCH, false); - WorkModule::off_flag(module_accessor, 0x200000EB); // FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_DROP_CROWN - } - } - WorkModule::off_flag(module_accessor, 0x200000EC); - } - 0 + // } + return ret } +// Covers Canonball Suction (Applies to Kirby as well) and Crown Catch +// #[skyline::hook(offset = 0xc06550)] +// pub unsafe extern "C" fn krool_func(_vtable: u64, fighter: &mut Fighter) -> u64 { +// let module_accessor = (fighter.battle_object).module_accessor; +// let status = StatusModule::status_kind(module_accessor); +// let kind = WorkModule::get_int(module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND); +// if (status == 0x1e2 || status == 0x319) +// && WorkModule::is_flag(module_accessor, *FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_SPECIAL_N_SUCTION_IRONBALL) { +// let status = if kind == *FIGHTER_KIND_KIRBY { +// 0x31b +// } +// else { +// 0x1e4 +// }; +// StatusModule::change_status_request(module_accessor, status, false); +// } +// else if kind != *FIGHTER_KIND_KIRBY +// && WorkModule::is_flag(module_accessor, 0x200000EC) { // FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_CATCH_CROWN +// if ArticleModule::is_exist(module_accessor, *FIGHTER_KROOL_GENERATE_ARTICLE_CROWN) { +// if status == *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_FAILURE { +// StatusModule::change_status_request(module_accessor, *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_CATCH, false); +// WorkModule::off_flag(module_accessor, 0x200000EB); // FIGHTER_KROOL_INSTANCE_WORK_ID_FLAG_DROP_CROWN +// } +// } +// WorkModule::off_flag(module_accessor, 0x200000EC); +// } +// 0 +// } + pub fn install() { skyline::install_hooks!( - krool_func + //krool_func + //ironball_init ); } diff --git a/fighters/link/Cargo.toml b/fighters/link/Cargo.toml index 07923b9426..d957571dd8 100644 --- a/fighters/link/Cargo.toml +++ b/fighters/link/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/link/src/acmd/aerials.rs b/fighters/link/src/acmd/aerials.rs index b2c3a7512b..9b554a67cc 100644 --- a/fighters/link/src/acmd/aerials.rs +++ b/fighters/link/src/acmd/aerials.rs @@ -26,6 +26,10 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 34.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } frame(lua_state, 36.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); @@ -43,7 +47,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 14.0, 361, 100, 0, 30, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 361, 103, 0, 30, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 361, 100, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 361, 100, 0, 30, 3.5, 4.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("sword2"), 14.0, 361, 100, 0, 30, 3.5, 8.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); @@ -57,7 +61,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 21.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 68, 65, 0, 43, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 68, 65, 0, 43, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 10.0, 68, 65, 0, 43, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword2"), 10.0, 68, 65, 0, 43, 3.5, 4.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("sword2"), 10.0, 68, 65, 0, 43, 3.5, 8.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); @@ -66,7 +70,11 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 52.0); + frame(lua_state, 34.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } + frame(lua_state, 43.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -137,15 +145,23 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 7.0, 45, 90, 0, 25, 4.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 7.0, 45, 90, 0, 25, 4.3, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 7.0, 45, 90, 0, 25, 4.3, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 7.0, 48, 90, 0, 25, 4.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 7.0, 48, 90, 0, 25, 4.3, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 7.0, 48, 90, 0, 25, 4.3, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 27.0); + frame(lua_state, 23.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } + frame(lua_state, 24.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } + frame(lua_state, 25.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -161,11 +177,11 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("sword2"), 14.0, 80, 98, 0, 25, 3.5, 8.5, 0.0, 0.0, Some(-4.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 14.0, 85, 98, 0, 25, 3.5, 8.5, 0.0, 0.0, Some(-4.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 12.0, 80, 91, 0, 22, 3.0, 8.5, 0.0, 0.0, Some(-4.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 12.0, 85, 91, 0, 22, 3.0, 8.5, 0.0, 0.0, Some(-4.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 41.0); if is_excute(agent) { @@ -175,6 +191,10 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 51.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { @@ -206,14 +226,18 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_ATTACK_AIR_LW_SET_ATTACK); - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 270, 38, 0, 30, 3.5, 0.0, -0.5, 0.0, Some(1.5), Some(9.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 18.0, 65, 98, 0, 42, 3.5, 0.0, -0.5, 0.0, Some(1.5), Some(9.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 270, 38, 0, 30, 3.5, 0.0, 3.75, 0.0, Some(1.5), Some(9.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 18.0, 270, 38, 0, 30, 3.5, 0.0, -0.5, 0.0, Some(1.5), Some(1.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 16.0, 65, 102, 0, 42, 3.5, 0.0, 3.75, 0.0, Some(1.5), Some(9.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 18.0, 65, 98, 0, 42, 3.5, 0.0, -0.5, 0.0, Some(1.5), Some(1.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 17.0); FT_MOTION_RATE_RANGE(agent, 17.0, 65.0, 37.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 65, 100, 0, 41, 3.0, 0.0, 1.0, 0.0, Some(1.0), Some(9.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.5, 65, 110, 0, 41, 3.0, 0.0, 1.0, 0.0, Some(1.0), Some(9.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::clear(boma, 1, false); + AttackModule::clear(boma, 2, false); + AttackModule::clear(boma, 3, false); } frame(lua_state, 65.0); if is_excute(agent) { @@ -221,26 +245,31 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { WorkModule::off_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_ATTACK_AIR_LW_SET_ATTACK); WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 73.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 7.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword1"), 7, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 1.5); - } - frame(lua_state, 14.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("link_sword_flare"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1.0, true); - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword1"), 12.5, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword1"), 7, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + frame(lua_state, 14.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("link_sword_flare"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword1"), 12.5, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); LAST_EFFECT_SET_RATE(agent, 1.5); - } - frame(lua_state, 64.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("link_sword_flare"), false, false); - } + } + frame(lua_state, 64.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("link_sword_flare"), false, false); + } } unsafe extern "C" fn game_attackairlw2attack(agent: &mut L2CAgentBase) { @@ -249,6 +278,10 @@ unsafe extern "C" fn game_attackairlw2attack(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 65, 75, 0, 41, 3.0, 0.0, 1.0, 0.0, Some(1.0), Some(9.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } + frame(lua_state, 10.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } pub fn install(agent: &mut Agent) { diff --git a/fighters/link/src/acmd/ground.rs b/fighters/link/src/acmd/ground.rs index e2c569b0cc..16997bc547 100644 --- a/fighters/link/src/acmd/ground.rs +++ b/fighters/link/src/acmd/ground.rs @@ -4,14 +4,17 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 5.0); - frame(lua_state, 8.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 4.0); + frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 70, 30, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 4.0, 70, 30, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword2"), 4.0, 70, 30, 0, 25, 3.5, 4.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("sword2"), 4.0, 70, 30, 0, 25, 3.5, 7.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + frame(lua_state, 8.0); + if is_excute(agent) { ATTACK(agent, 4, 0, Hash40::new("top"), 4.0, 361, 20, 0, 20, 2.5, 0.0, 3.0, 7.0, Some(0.0), Some(3.0), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_down_only(boma, 4, false); } @@ -90,6 +93,10 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 20.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_attack13(agent: &mut L2CAgentBase) { @@ -137,13 +144,17 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 62, 67, 0, 45, 5.5, 0.0, 8.5, 4.0, Some(0.0), Some(8.5), Some(4.75), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 62, 55, 0, 45, 5.5, 0.0, 8.5, 4.0, Some(0.0), Some(8.5), Some(4.75), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); } frame(lua_state, 15.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_WAIT_SHIELD); AttackModule::clear_all(boma); } + frame(lua_state, 28.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { diff --git a/fighters/link/src/acmd/other.rs b/fighters/link/src/acmd/other.rs index 4bc90035a9..a8001c2067 100644 --- a/fighters/link/src/acmd/other.rs +++ b/fighters/link/src/acmd/other.rs @@ -81,16 +81,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -100,10 +96,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_itemlightthrowdash(agent: &mut L2CAgentBase) { diff --git a/fighters/link/src/acmd/smashes.rs b/fighters/link/src/acmd/smashes.rs index e18c4fa216..60090008d1 100644 --- a/fighters/link/src/acmd/smashes.rs +++ b/fighters/link/src/acmd/smashes.rs @@ -11,10 +11,10 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { frame(lua_state, 14.75); FT_MOTION_RATE_RANGE(agent, 14.75, 15.0, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 15.0, 45, 93, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 15.0, 45, 93, 0, 25, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 45, 93, 0, 25, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 14.0, 45, 93, 0, 25, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 15.0, 45, 93, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 15.0, 45, 93, 0, 25, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 45, 93, 0, 25, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 14.0, 45, 93, 0, 25, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); if DamageModule::damage(boma, 0) == 0.0 { ArticleModule::generate_article(boma,*FIGHTER_LINK_GENERATE_ARTICLE_SWORD_BEAM, false, 0); } @@ -33,6 +33,10 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } + frame(lua_state, 35.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { @@ -124,11 +128,11 @@ unsafe extern "C" fn game_attacks4s2(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 19.0, 65, 100, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 19.0, 65, 100, 0, 30, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 19.0, 65, 100, 0, 30, 3.0, 0.0, 0.0, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 17.0, 65, 100, 0, 30, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword2"), 17.0, 65, 100, 0, 30, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 19.0, 65, 100, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 19.0, 65, 100, 0, 30, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 19.0, 65, 100, 0, 30, 3.0, 0.0, 0.0, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 17.0, 65, 100, 0, 30, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword2"), 17.0, 65, 100, 0, 30, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 11.0); FT_MOTION_RATE_RANGE(agent, 11.0, 11.75, 1.0); @@ -139,6 +143,10 @@ unsafe extern "C" fn game_attacks4s2(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 29.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_attacks4s2(agent: &mut L2CAgentBase) { @@ -174,22 +182,13 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 105, 100, 55, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 4.0, 115, 100, 38, 0, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 4.0, 107, 100, 28, 0, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 4.0, 115, 100, 28, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword2"), 4.0, 107, 100, 28, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("sword2"), 4.0, 115, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 6, 0, Hash40::new("sword2"), 4.0, 107, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - frame(lua_state, 12.0); - if is_excute(agent) { - ATTACK(agent, 5, 0, Hash40::new("sword2"), 4.0, 200, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - frame(lua_state, 14.0); - if is_excute(agent) { - ATTACK(agent, 3, 0, Hash40::new("sword2"), 4.0, 135, 100, 45, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("sword2"), 4.0, 135, 100, 45, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 95, 100, 55, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 4.0, 105, 100, 38, 0, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 4.0, 97, 100, 28, 0, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 4.0, 105, 100, 28, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword2"), 4.0, 97, 100, 28, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 5, 0, Hash40::new("sword2"), 4.0, 105, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 6, 0, Hash40::new("sword2"), 4.0, 97, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 17.0); FT_MOTION_RATE_RANGE(agent, 17.0, 25.0, 6.0); @@ -199,22 +198,13 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 25.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 105, 100, 55, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 3.0, 115, 100, 38, 0, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 3.0, 107, 100, 28, 0, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 3.0, 115, 100, 28, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword2"), 3.0, 107, 100, 28, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("sword2"), 3.0, 115, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 6, 0, Hash40::new("sword2"), 3.0, 107, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - frame(lua_state, 27.0); - if is_excute(agent) { - ATTACK(agent, 5, 0, Hash40::new("sword2"), 3.0, 200, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - frame(lua_state, 29.0); - if is_excute(agent) { - ATTACK(agent, 3, 0, Hash40::new("sword2"), 3.0, 135, 100, 40, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("sword2"), 3.0, 135, 100, 40, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 95, 100, 55, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 3.0, 105, 100, 38, 0, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 3.0, 97, 100, 28, 0, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 3.0, 105, 100, 28, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword2"), 3.0, 97, 100, 28, 0, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 5, 0, Hash40::new("sword2"), 3.0, 105, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 6, 0, Hash40::new("sword2"), 3.0, 97, 100, 28, 0, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 32.0); FT_MOTION_RATE_RANGE(agent, 32.0, 41.0, 6.0); @@ -224,16 +214,20 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 41.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 11.0, 90, 103, 0, 60, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 11.0, 90, 103, 0, 60, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 10.0, 90, 103, 0, 60, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("armr"), 10.0, 90, 103, 0, 60, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("top"), 10.0, 90, 103, 0, 60, 4.0, 0.0, 11.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 9.0, 90, 93, 0, 70, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 90, 93, 0, 70, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 90, 93, 0, 70, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("armr"), 9.0, 90, 93, 0, 70, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("top"), 9.0, 90, 93, 0, 70, 3.0, 0.0, 12.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 48.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 55.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } frame(lua_state, 56.0); FT_MOTION_RATE_RANGE(agent, 56.0, 70.0, 10.0); frame(lua_state, 70.0); @@ -370,17 +364,21 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 21.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 11.0, 75, 91, 0, 20, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 75, 101, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 75, 101, 0, 20, 3.5, 4.25, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 14.0, 75, 101, 0, 20, 3.5, 8.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("kneer"), 11.0, 75, 91, 0, 20, 2.7, 1.5, 0.0, -0.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 75, 98, 0, 20, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 86, 72, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 86, 72, 0, 40, 3.5, 4.25, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 14.0, 86, 72, 0, 40, 3.5, 8.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("kneer"), 10.0, 75, 98, 0, 20, 2.7, 1.5, 0.0, -0.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 23.0); if is_excute(agent) { AttackModule::clear_all(boma); - } + } + frame(lua_state, 31.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } frame(lua_state, 32.0); FT_MOTION_RATE_RANGE(agent, 32.0, 56.0, 12.0); frame(lua_state, 56.0); diff --git a/fighters/link/src/acmd/specials.rs b/fighters/link/src/acmd/specials.rs index 07c876a684..ad3bdd1af5 100644 --- a/fighters/link/src/acmd/specials.rs +++ b/fighters/link/src/acmd/specials.rs @@ -159,7 +159,7 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 367, 100, 107, 0, 6.0, 0.0, 10.0, 14.5, Some(0.0), Some(10.0), Some(8.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 367, 100, 107, 0, 6.0, 0.0, 10.0, 14.5, Some(0.0), Some(10.0), Some(8.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -169,11 +169,11 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { frame(lua_state, 12.0); if is_excute(agent) { //Air - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 145, 100, 95, 0, 5.0, 0.0, 11.5, -12.0, Some(0.0), Some(11.0), Some(-9.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 70, 100, 95, 0, 5.0, 0.0, 11.5, -12.0, Some(0.0), Some(11.0), Some(-9.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); //Ground - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 145, 100, 30, 0, 5.0, 0.0, 11.5, -12.0, Some(0.0), Some(11.0), Some(-9.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 70, 100, 30, 0, 5.0, 0.0, 11.5, -12.0, Some(0.0), Some(11.0), Some(-9.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); let hit1 = Vector2f { x: 10.0, y: 20.0 }; - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 10, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 14, false); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -182,7 +182,7 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 107, 0, 6.0, 0.0, 6.0, 15.0, Some(0.0), Some(7.5), Some(8.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 107, 0, 6.0, 0.0, 6.0, 15.0, Some(0.0), Some(7.5), Some(8.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -192,11 +192,11 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { frame(lua_state, 19.0); if is_excute(agent) { //Air - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 145, 100, 95, 0, 5.0, 0.0, 11.5, -12.5, Some(0.0), Some(11.0), Some(-9.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 95, 0, 5.0, 0.0, 11.5, -12.5, Some(0.0), Some(11.0), Some(-9.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); //Ground - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 145, 100, 30, 0, 5.0, 0.0, 11.5, -12.5, Some(0.0), Some(11.0), Some(-9.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 67, 100, 30, 0, 5.0, 0.0, 11.5, -12.5, Some(0.0), Some(11.0), Some(-9.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); let hit1 = Vector2f { x: 10.0, y: 20.0 }; - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 10, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 14, false); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -205,7 +205,7 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 83, 100, 71, 0, 6.0, 0.0, 10.0, 15.0, Some(0.0), Some(10.5), Some(8.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 83, 100, 71, 0, 6.0, 0.0, 10.0, 15.0, Some(0.0), Some(10.5), Some(8.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -216,11 +216,11 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { JostleModule::set_status(boma, false); //Air - ATTACK(agent, 1, 0, Hash40::new("sword2"), 2.0, 150, 100, 95, 0, 5.0, 2.0, 0.0, 0.0, Some(5.5), Some(0.0), Some(0.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 2.0, 60, 100, 95, 0, 5.0, 2.0, 0.0, 0.0, Some(5.5), Some(0.0), Some(0.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); //Ground - ATTACK(agent, 2, 0, Hash40::new("sword2"), 2.0, 150, 100, 30, 0, 5.0, 2.0, 0.0, 0.0, Some(5.5), Some(0.0), Some(0.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 2.0, 67, 100, 30, 0, 5.0, 2.0, 0.0, 0.0, Some(5.5), Some(0.0), Some(0.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); let hit1 = Vector2f { x: 10.0, y: 20.0 }; - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 10, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 14, false); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -229,7 +229,7 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 31.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 69, 100, 62, 0, 7.0, 0.0, 14.0, 12.5, Some(0.0), Some(12.5), Some(8.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 69, 100, 62, 0, 7.0, 0.0, 14.0, 12.5, Some(0.0), Some(12.5), Some(8.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -240,11 +240,11 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { frame(lua_state, 38.0); if is_excute(agent) { //Air - ATTACK(agent, 1, 0, Hash40::new("sword2"), 2.0, 160, 100, 95, 0, 5.0, 2.0, 0.0, 0.0, Some(5.5), Some(0.0), Some(0.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 2.0, 60, 100, 95, 0, 5.0, 2.0, 0.0, 0.0, Some(5.5), Some(0.0), Some(0.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); //Ground - ATTACK(agent, 2, 0, Hash40::new("sword2"), 2.0, 160, 100, 30, 0, 5.0, 2.0, 0.0, 0.0, Some(5.5), Some(0.0), Some(0.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 2.0, 67, 100, 30, 0, 5.0, 2.0, 0.0, 0.0, Some(5.5), Some(0.0), Some(0.0), 0.75, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); let hit1 = Vector2f { x: 10.0, y: 20.0 }; - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 10, false); + AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 14, false); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -253,16 +253,16 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 47.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 210, 0, 30, 7.5, 0.0, 7.5, 14.0, Some(0.0), Some(9.5), Some(7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 193, 0, 30, 7.5, 0.0, 7.5, 14.0, Some(0.0), Some(9.5), Some(7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 48.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 210, 0, 30, 7.5, 0.0, 13.0, 15.5, Some(0.0), Some(12.5), Some(7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 193, 0, 30, 7.5, 0.0, 13.0, 15.5, Some(0.0), Some(12.5), Some(7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); WorkModule::on_flag(boma, *FIGHTER_LINK_STATUS_RSLASH_FLAG_RESET_SPEED_MAX_X); } frame(lua_state, 49.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 210, 0, 30, 7.5, 0.0, 19.0, 12.5, Some(0.0), Some(14.0), Some(7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 193, 0, 30, 7.5, 0.0, 19.0, 12.5, Some(0.0), Some(14.0), Some(7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 50.0); if is_excute(agent) { diff --git a/fighters/link/src/acmd/throws.rs b/fighters/link/src/acmd/throws.rs index e509f78bca..03ad711c4b 100644 --- a/fighters/link/src/acmd/throws.rs +++ b/fighters/link/src/acmd/throws.rs @@ -4,17 +4,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.2); - } - frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.2); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); if is_excute(agent) { FT_MOTION_RATE(agent, 1.0); - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 2.0, Some(0.0), Some(8.0), Some(8.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(8.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -34,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -54,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(-12.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -2.0, Some(0.0), Some(7.0), Some(-12.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -90,6 +87,10 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 22.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } FT_MOTION_RATE_RANGE(agent, 15.0, 34.0, 14.0); frame(lua_state, 34.0); FT_MOTION_RATE(agent, 1.0); @@ -114,6 +115,10 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); } + frame(lua_state, 21.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } FT_MOTION_RATE_RANGE(agent, 15.0, 30.0, 9.0); frame(lua_state, 30.0); FT_MOTION_RATE(agent, 1.0); @@ -123,7 +128,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 90, 145, 0, 39, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 90, 147, 0, 39, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 12.0); @@ -148,6 +153,10 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 43.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_throwhi(agent: &mut L2CAgentBase) { @@ -182,7 +191,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { FT_LEAVE_NEAR_OTTOTTO(agent, -2.5, 2.5); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 43, 105, 0, 52, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 43, 100, 0, 58, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 22.0); @@ -200,6 +209,10 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); AttackModule::clear_all(boma); } + frame(lua_state, 35.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } frame(lua_state, 48.0); FT_MOTION_RATE(agent, 1.0); } diff --git a/fighters/link/src/acmd/tilts.rs b/fighters/link/src/acmd/tilts.rs index c743f16adc..bc51146d07 100644 --- a/fighters/link/src/acmd/tilts.rs +++ b/fighters/link/src/acmd/tilts.rs @@ -12,19 +12,26 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 15.0); FT_MOTION_RATE_RANGE(agent, 15.0, 16.0, 2.0); frame(lua_state, 15.5); + FT_MOTION_RATE(agent, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 35, 90, 0, 35, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 13.0, 35, 90, 0, 35, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 35, 90, 0, 35, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 41, 90, 0, 35, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 13.0, 41, 90, 0, 35, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 41, 90, 0, 35, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("sword2"), 14.0, 361, 100, 0, 35, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 18.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 21.0); + frame(lua_state, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 27.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { @@ -83,7 +90,6 @@ unsafe extern "C" fn expression_attacks3(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - QUAKE(agent, *CAMERA_QUAKE_KIND_S); RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); ControlModule::set_rumble(boma, Hash40::new("rbkind_impact"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } @@ -94,15 +100,19 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 85, 115, 0, 30, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 10.0, 85, 115, 0, 30, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 10.0, 85, 115, 0, 30, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 10.0, 85, 115, 0, 30, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 70, 122, 0, 30, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 70, 122, 0, 30, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 70, 122, 0, 30, 3.5, 4.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 10.0, 85, 115, 0, 30, 3.5, 8.5, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 14.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 23.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { @@ -132,11 +142,10 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 82, 100, 0, 50, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 12.0, 82, 110, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 280, 50, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 11.0, 82, 100, 0, 50, 3.5, 4.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword2"), 11.0, 82, 100, 0, 50, 3.5, 8.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 64, 101, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 11.0, 82, 91, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 11.0, 82, 91, 0, 45, 3.5, 4.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword2"), 12.0, 82, 91, 0, 50, 3.5, 8.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 16.0); @@ -159,6 +168,10 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { AFTER_IMAGE_OFF(agent, 4); EFFECT_OFF_KIND(agent, Hash40::new("link_sword"), false, false); } + frame(lua_state, 21.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL); + } } unsafe extern "C" fn expression_attacklw3(agent: &mut L2CAgentBase) { diff --git a/fighters/link/src/boomerang/mod.rs b/fighters/link/src/boomerang/mod.rs index 40fc9ca15a..7626d5445c 100644 --- a/fighters/link/src/boomerang/mod.rs +++ b/fighters/link/src/boomerang/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod opff; pub fn install() { let agent = &mut Agent::new("link_boomerang"); acmd::install(agent); + opff::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/link/src/boomerang/opff.rs b/fighters/link/src/boomerang/opff.rs new file mode 100644 index 0000000000..5c1bc70e64 --- /dev/null +++ b/fighters/link/src/boomerang/opff.rs @@ -0,0 +1,41 @@ +// opff import +utils::import_noreturn!(common::opff::fighter_common_opff); +use super::*; +use globals::*; + +unsafe fn boomerang_reflect_fix(weapon: &mut smash::lua2cpp::L2CFighterBase) { + // this opff runs once after reflection + let boma = weapon.module_accessor; + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_REFLECTOR | *COLLISION_KIND_MASK_PARRY) { + return; + } + AttackModule::clear_inflict_kind_status(boma); + + // update position, accounting for boomerang-weirdness + let top_pos = *PostureModule::pos(boma); + let rot_pos = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + ModelModule::joint_global_position(boma, Hash40::new("rot"), rot_pos, false); + PostureModule::set_pos(boma, &Vector3f{ x: rot_pos.x, y: top_pos.y, z: top_pos.z }); + + // update facing direction depending on whether it is traveling forwards or backwards + let lr = PostureModule::lr(boma); + let speed_x = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + if weapon.is_status(*WN_LINK_BOOMERANG_STATUS_KIND_FLY) { + PostureModule::reverse_lr(boma); + PostureModule::update_rot_y_lr(boma); + } + + // lifetime fix + weapon.set_int_from_param(*WN_LINK_BOOMERANG_INSTANCE_WORK_ID_INT_LIFE, "boomerang", "life"); + + // restart status + weapon.change_status(WN_LINK_BOOMERANG_STATUS_KIND_FLY.into(), false.into()); +} + +pub unsafe extern "C" fn link_boomerang_frame(weapon: &mut smash::lua2cpp::L2CFighterBase) { + boomerang_reflect_fix(weapon); +} + +pub fn install(agent: &mut Agent) { + agent.on_line(Main, link_boomerang_frame); +} \ No newline at end of file diff --git a/fighters/link/src/lib.rs b/fighters/link/src/lib.rs index b326cc8906..28bb571dad 100644 --- a/fighters/link/src/lib.rs +++ b/fighters/link/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/link/src/opff.rs b/fighters/link/src/opff.rs index 707d477fd2..5882f28d75 100644 --- a/fighters/link/src/opff.rs +++ b/fighters/link/src/opff.rs @@ -18,8 +18,21 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } } +unsafe fn bomb_cancel(fighter: &mut smash::lua2cpp::L2CFighterCommon) { + if VarModule::is_flag(fighter.battle_object, vars::link::status::ENABLE_SPECIAL_LW_CANCEL) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) + && ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_LINK_GENERATE_ARTICLE_LINKBOMB) + && fighter.is_cat_flag(Cat1::SpecialLw) { + // let bomb_exists = ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_LINK_GENERATE_ARTICLE_LINKBOMB); + // println!("Bomb Exists: {}", bomb_exists); + fighter.change_status_req(*FIGHTER_STATUS_KIND_SPECIAL_LW, true); { + } +} +} + pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { fastfall_specials(fighter); + bomb_cancel(fighter); } pub extern "C" fn link_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterCommon) { diff --git a/fighters/littlemac/Cargo.toml b/fighters/littlemac/Cargo.toml index 61f0282746..778da04af2 100644 --- a/fighters/littlemac/Cargo.toml +++ b/fighters/littlemac/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/littlemac/src/acmd/aerials.rs b/fighters/littlemac/src/acmd/aerials.rs index 9f17974d17..fd4d1f807d 100644 --- a/fighters/littlemac/src/acmd/aerials.rs +++ b/fighters/littlemac/src/acmd/aerials.rs @@ -159,15 +159,20 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 4.25); FT_MOTION_RATE_RANGE(agent, 4.25, 4.75, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 5.0, 78, 130, 0, 45, 4.25, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 5.0, 78, 130, 0, 45, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 5.0, 78, 130, 0, 45, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("arml"), 0.0, 0, 0, 0, 0, 0.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 0.0, 0, 0, 0, 0, 0.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 0.0, 0, 0, 0, 0, 0.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 4.75); FT_MOTION_RATE_RANGE(agent, 4.75, 6.0, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("arml"), 5.0, 78, 130, 0, 45, 4.25, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 5.0, 78, 130, 0, 45, 3.5, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 5.0, 78, 130, 0, 45, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 11.0); + frame(lua_state, 9.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -182,7 +187,7 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.75); if is_excute(agent) { - EFFECT_FOLLOW_ALPHA(agent, Hash40::new("littlemac_attack_arc_weak"), Hash40::new("top"), -3, 9.5, 2, -10, -80, -100, 0.8, true, 1); + EFFECT_FOLLOW_ALPHA(agent, Hash40::new("littlemac_attack_arc_weak"), Hash40::new("top"), -3, 8.5, 2, -10, -80, -100, 0.8, true, 1); let color_vec = match WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR) { 0 => Vector3f::new(0.43, 1.0, 0.3), 1 => Vector3f::new(1.0, 0.6, 0.3), @@ -195,7 +200,7 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { _ => Vector3f::new(0.43, 1.0, 0.3) }; LAST_PARTICLE_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); - LAST_EFFECT_SET_RATE(agent, 0.9); + LAST_EFFECT_SET_RATE(agent, 1.0); } } diff --git a/fighters/littlemac/src/acmd/ground.rs b/fighters/littlemac/src/acmd/ground.rs index d9f86af0b2..0d7eb9d3c1 100644 --- a/fighters/littlemac/src/acmd/ground.rs +++ b/fighters/littlemac/src/acmd/ground.rs @@ -6,9 +6,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_ATTACK_DISABLE_MINI_JUMP_ATTACK); - ATTACK(agent, 0, 0, Hash40::new("handl"), 3.0, 88, 25, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 83, 25, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 3.0, 78, 25, 0, 30, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handl"), 3.0, 88, 25, 0, 30, 3.5, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 83, 25, 0, 30, 3.0, 0.0, -1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 3.0, 78, 25, 0, 30, 2.5, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 88, 25, 0, 30, 2.5, 0.0, 7.0, 6.0, Some(0.0), Some(7.0), Some(11.75), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 10, 0, 27, 2.5, 0.0, 4.5, 6.0, Some(0.0), Some(4.5), Some(11.75), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_MIDDLE), false); @@ -32,13 +32,12 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { VarModule::off_flag(agent.battle_object, vars::littlemac::instance::ATTACK_13_DREAMLAND_EXPRESS); VarModule::off_flag(agent.battle_object, vars::littlemac::instance::ATTACK_13_LATE_DLE_INPUT); WorkModule::on_flag(boma, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_ATTACK_DISABLE_MINI_JUMP_ATTACK); - ATTACK(agent, 0, 0, Hash40::new("handr"), 4.0, 88, 55, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 4.0, 83, 55, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 4.0, 78, 55, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 88, 55, 0, 20, 2.5, 0.0, 7.0, 7.5, Some(0.0), Some(7.0), Some(14.0), 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("top"), 4.0, 361, 25, 0, 25, 2.5, 0.0, 4.5, 7.5, Some(0.0), Some(4.5), Some(14.0), 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_down_only(boma, 4, false); - ATK_SET_SHIELD_SETOFF_MUL_arg5(agent, 0, 1, 2, 3, 3.0); + ATTACK(agent, 0, 0, Hash40::new("handr"), 4.0, 88, 55, 0, 20, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 4.0, 83, 55, 0, 20, 3.5, 0.0, 1.5, 0.0, None, None, None, 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 4.0, 78, 55, 0, 20, 3.0, 0.0, 0.0, 1.0, None, None, None, 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 361, 25, 0, 25, 2.5, 0.0, 4.5, 7.5, Some(0.0), Some(4.5), Some(14.0), 1.0, 0.9, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, false); + ATK_SET_SHIELD_SETOFF_MUL_arg4(agent, 0, 1, 2, 3.0); } frame(lua_state, 4.0); if is_excute(agent) { diff --git a/fighters/littlemac/src/acmd/other.rs b/fighters/littlemac/src/acmd/other.rs index 9a3386cfeb..9be852c69d 100644 --- a/fighters/littlemac/src/acmd/other.rs +++ b/fighters/littlemac/src/acmd/other.rs @@ -68,16 +68,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -88,10 +84,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/littlemac/src/acmd/smashes.rs b/fighters/littlemac/src/acmd/smashes.rs index 0dab3519d6..b1947338ec 100644 --- a/fighters/littlemac/src/acmd/smashes.rs +++ b/fighters/littlemac/src/acmd/smashes.rs @@ -56,8 +56,8 @@ unsafe extern "C" fn game_attacks4hi(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 14.0, 16.0, 3.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("bust"), 13.0, 85, 87, 0, 35, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 16.0, 80, 91, 0, 35, 3.0, 0.5, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 16.0, 80, 91, 0, 35, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 17.0, 80, 86, 0, 35, 3.0, 0.5, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 17.0, 80, 86, 0, 35, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("hip"), 13.0, 85, 87, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 16.0); @@ -115,14 +115,17 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 21.0, 86, 76, 0, 40, 5.0, 3.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 17.0, 85, 76, 0, 40, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 17.0, 85, 76, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("bust"), 17.0, 85, 76, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 21.0, 86, 76, 0, 40, 5.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 21.0, 86, 76, 0, 40, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 21.0, 86, 76, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("bust"), 21.0, 86, 76, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } - frame(lua_state, 12.0); + frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 17.0, 85, 76, 0, 40, 5.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 16.0, 86, 85, 0, 40, 5.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 16.0, 86, 85, 0, 40, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 16.0, 86, 85, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("bust"), 16.0, 86, 85, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 18.0); if is_excute(agent) { diff --git a/fighters/littlemac/src/acmd/specials.rs b/fighters/littlemac/src/acmd/specials.rs index ab6cd5bae7..e06a3ae2f0 100644 --- a/fighters/littlemac/src/acmd/specials.rs +++ b/fighters/littlemac/src/acmd/specials.rs @@ -15,10 +15,10 @@ unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { let meter_lvl = if meter < 40.0 { 0 } else if meter >= 40.0 && meter < 100.0 { 1 } else { 2 }; let (mut damage, hitlag, shield_damage, sfx_lvl, sound_attr) = match meter_lvl { 0 => {( - (10.0 + meter / 8.0), 1.0, 10, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH + (9.0 + meter / 8.0), 1.0, 10, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH )}, 1 => {( - (10.0 + meter / 8.0), 1.2, 20, *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH + (9.0 + meter / 8.0), 1.2, 20, *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH )} _ => {( 25.0, 1.5, 30, *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK @@ -274,7 +274,7 @@ unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { frame(lua_state, 3.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 103, 100, 155, 0, 2.0, 0.0, 6.0, 10.0, Some(0.0), Some(12.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 118, 100, 155, 0, 2.0, 0.0, 6.0, 10.0, Some(0.0), Some(12.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 95, 100, 160, 0, 3.0, 0.0, 5.0, 5.0, Some(0.0), Some(12.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); } @@ -292,9 +292,9 @@ unsafe extern "C" fn game_specialairhistart(agent: &mut L2CAgentBase) { frame(lua_state, 3.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 103, 100, 185, 0, 2.0, 0.0, 6.0, 10.0, Some(0.0), Some(12.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 118, 100, 185, 0, 2.0, 0.0, 6.0, 10.0, Some(0.0), Some(12.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 95, 100, 180, 0, 3.0, 0.0, 5.0, 5.0, Some(0.0), Some(12.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 103, 100, 155, 0, 2.0, 0.0, 6.0, 10.0, Some(0.0), Some(12.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 118, 100, 155, 0, 2.0, 0.0, 6.0, 10.0, Some(0.0), Some(12.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 95, 100, 160, 0, 3.0, 0.0, 5.0, 5.0, Some(0.0), Some(12.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); } @@ -325,7 +325,7 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { if VarModule::is_flag(boma.object(), vars::littlemac::instance::SPECIAL_HI_GROUND_START) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 80, 197, 0, 45, 6.5, 0.0, 22.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 85, 207, 0, 45, 6.5, 0.0, 22.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } else { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 75, 195, 0, 40, 6.5, 0.0, 22.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); @@ -468,14 +468,14 @@ unsafe extern "C" fn expression_speciallwhit(agent: &mut L2CAgentBase) { } pub fn install(agent: &mut Agent) { - agent.acmd("game_specialn2", game_specialn, Priority::Low); - agent.acmd("game_specialairn2", game_specialn, Priority::Low); - agent.acmd("effect_specialn2", effect_specialn, Priority::Low); - agent.acmd("effect_specialairn2", effect_specialn, Priority::Low); - agent.acmd("sound_specialn2", sound_specialn, Priority::Low); - agent.acmd("sound_specialairn2", sound_specialn, Priority::Low); - agent.acmd("expression_specialn2", expression_specialn, Priority::Low); - agent.acmd("expression_specialairn2", expression_specialn, Priority::Low); + agent.acmd("game_specialn", game_specialn, Priority::Low); + agent.acmd("game_specialairn", game_specialn, Priority::Low); + agent.acmd("effect_specialn", effect_specialn, Priority::Low); + agent.acmd("effect_specialairn", effect_specialn, Priority::Low); + agent.acmd("sound_specialn", sound_specialn, Priority::Low); + agent.acmd("sound_specialairn", sound_specialn, Priority::Low); + agent.acmd("expression_specialn", expression_specialn, Priority::Low); + agent.acmd("expression_specialairn", expression_specialn, Priority::Low); agent.acmd("game_specialsjump", game_specialsjump, Priority::Low); agent.acmd("game_specialairsblow", game_specialairsblow, Priority::Low); diff --git a/fighters/littlemac/src/acmd/throws.rs b/fighters/littlemac/src/acmd/throws.rs index ead42645b0..46bad3a3ba 100644 --- a/fighters/littlemac/src/acmd/throws.rs +++ b/fighters/littlemac/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.667); - frame(lua_state, 8.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(10.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 7.0, 3.7, Some(0.0), Some(7.0), Some(10.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(8.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 8.0, 3.7, Some(0.0), Some(8.0), Some(8.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.7, 0.0, 8.0, -6.0, Some(0.0), Some(8.0), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -67,17 +66,19 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 65, 65, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 69, 65, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 15.0); if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, -2.0, 14.0), false, false); ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 80, 100, 0, 60, 4.0, 0.0, 10.0, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 18, 3); } frame(lua_state, 17.0); if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, 0.0, 15.0), false, false); let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); @@ -91,7 +92,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let boma = agent.boma(); FT_MOTION_RATE_RANGE(agent, 1.0, 14.0, 10.0); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 65, 65, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 62, 27, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 14.0); @@ -107,6 +108,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); REVERSE_LR(agent); + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, 10.0, -10.0), false, false); let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); @@ -141,7 +143,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 35, 85, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 35, 75, 0, 35, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 14.0); @@ -157,8 +159,6 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); AttackModule::clear_all(boma); - let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); } } diff --git a/fighters/littlemac/src/acmd/tilts.rs b/fighters/littlemac/src/acmd/tilts.rs index fdc3cc524f..95768c37b4 100644 --- a/fighters/littlemac/src/acmd/tilts.rs +++ b/fighters/littlemac/src/acmd/tilts.rs @@ -9,13 +9,13 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("arml"), 4.0, 361, 100, 10, 0, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 361, 100, 40, 0, 3.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 4.0, 361, 100, 80, 0, 3.0, -5.8, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("hip"), 4.0, 361, 100, 100, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 361, 100, 20, 0, 3.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 4.0, 361, 100, 40, 0, 3.0, -5.8, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("hip"), 4.0, 361, 100, 60, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 4, 0, Hash40::new("arml"), 4.0, 240, 100, 20, 0, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 5, 0, Hash40::new("arml"), 4.0, 359, 100, 40, 0, 3.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 6, 0, Hash40::new("arml"), 4.0, 359, 100, 80, 0, 3.0, -5.8, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 7, 0, Hash40::new("hip"), 4.0, 359, 100, 100, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 5, 0, Hash40::new("arml"), 4.0, 359, 100, 20, 0, 3.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 6, 0, Hash40::new("arml"), 4.0, 359, 100, 40, 0, 3.0, -5.8, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 7, 0, Hash40::new("hip"), 4.0, 359, 100, 60, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); ATK_SET_SHIELD_SETOFF_MUL_arg5(agent, 0, 1, 2, 3, 1.5); } @@ -43,10 +43,10 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 100, 80, 0, 70, 4.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0, 100, 80, 0, 70, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 7.0, 100, 80, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("bust"), 7.0, 100, 80, 0, 70, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 100, 103, 0, 50, 4.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0, 100, 103, 0, 50, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 7.0, 100, 103, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("bust"), 7.0, 100, 103, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 7.0); if is_excute(agent) { @@ -83,12 +83,11 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 3.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 7.0, 70, 45, 0, 75, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 8.0, 80, 46, 0, 75, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 8.0, 80, 46, 0, 72, 4.0, 4.4, 0.2, 0.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("hip"), 7.0, 70, 45, 0, 75, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 7.0, 74, 55, 0, 42, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 8.0, 68, 55, 0, 42, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 8.0, 68, 55, 0, 42, 4.0, 4.4, 0.2, 0.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("hip"), 7.0, 74, 55, 0, 42, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); - ATK_SET_SHIELD_SETOFF_MUL_arg5(agent, 0, 1, 2, 3, 1.7); } wait(lua_state, 4.0); if is_excute(agent) { diff --git a/fighters/littlemac/src/lib.rs b/fighters/littlemac/src/lib.rs index df03f89185..43e968038b 100644 --- a/fighters/littlemac/src/lib.rs +++ b/fighters/littlemac/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/littlemac/src/status/special_n.rs b/fighters/littlemac/src/status/special_n.rs index a82dad719b..ca294928da 100644 --- a/fighters/littlemac/src/status/special_n.rs +++ b/fighters/littlemac/src/status/special_n.rs @@ -2,18 +2,12 @@ use super::*; // FIGHTER_STATUS_KIND_SPECIAL_N -unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); - } - else { - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); - } - fighter.change_status(FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N2.into(), false.into()); - return 1.into() +unsafe extern "C" fn special_n_old_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_status_kind_interrupt(*FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N2); + return 1.into(); } -unsafe extern "C" fn special_n2_pre(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn special_n_pre(fighter: &mut L2CFighterCommon) -> L2CValue { fighter.sub_status_pre_SpecialNCommon(); StatusModule::init_settings(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), @@ -42,7 +36,7 @@ unsafe extern "C" fn special_n2_pre(fighter: &mut L2CFighterCommon) -> L2CValue 0.into() } -unsafe extern "C" fn special_n2_main(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { WorkModule::set_int(fighter.module_accessor, *FIGHTER_LOG_ATTACK_SUB_KIND_UNIQ, *FIGHTER_INSTANCE_WORK_ID_INT_TRICK_SUB); WorkModule::off_flag(fighter.module_accessor, *FIGHTER_LITTLEMAC_INSTANCE_WORK_ID_FLAG_MTRANS_SMPL_AIR); WorkModule::off_flag(fighter.module_accessor, *FIGHTER_LITTLEMAC_INSTANCE_WORK_ID_FLAG_MTRANS_SMPL_GROUND); @@ -54,13 +48,13 @@ unsafe extern "C" fn special_n2_main(fighter: &mut L2CFighterCommon) -> L2CValue sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, 0.0, 0.0, 0.0, 0.0, 0.0); sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_spd_x * 0.3, 0.0); sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); } else { sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, 0.0, 0.0, 0.0, 0.0, 0.0); sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_spd_x * 0.3, 0.0); sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); } let meter = WorkModule::get_float(fighter.module_accessor, *FIGHTER_LITTLEMAC_INSTANCE_WORK_ID_FLOAT_KO_GAGE); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); @@ -86,10 +80,10 @@ unsafe extern "C" fn special_n2_main(fighter: &mut L2CFighterCommon) -> L2CValue notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) + -1); notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) + -1); - fighter.main_shift(special_n2_main_loop) + fighter.main_shift(special_n_main_loop) } -unsafe extern "C" fn special_n2_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if CancelModule::is_enable_cancel(fighter.module_accessor) { if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { @@ -158,18 +152,19 @@ unsafe extern "C" fn special_n2_main_loop(fighter: &mut L2CFighterCommon) -> L2C return 0.into() } -unsafe extern "C" fn special_n2_end(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn special_n_end(fighter: &mut L2CFighterCommon) -> L2CValue { WorkModule::set_float(fighter.module_accessor, 0.0, *FIGHTER_LITTLEMAC_INSTANCE_WORK_ID_FLOAT_KO_GAGE); WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_LITTLEMAC_INSTANCE_WORK_ID_INT_KO_GAGE_MAX_KEEP_FRAME); WorkModule::off_flag(fighter.module_accessor, *FIGHTER_LITTLEMAC_INSTANCE_WORK_ID_FLAG_REQUEST_KO_GAUGE_MAX_EFFECT); WorkModule::set_int(fighter.module_accessor, *FIGHTER_LOG_ATTACK_SUB_KIND_NONE, *FIGHTER_INSTANCE_WORK_ID_INT_TRICK_SUB); - EFFECT_OFF_KIND(fighter, Hash40::new("sys_starrod_bullet"), false, false); + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_starrod_bullet"), true, true); return 0.into() } pub fn install(agent: &mut Agent) { - agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_main); - agent.status(Pre, *FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N2, special_n2_pre); - agent.status(Main, *FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N2, special_n2_main); - agent.status(End, *FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N2, special_n2_end); + agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_old_pre); + + agent.status(Pre, *FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N2, special_n_pre); + agent.status(Main, *FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N2, special_n_main); + agent.status(End, *FIGHTER_LITTLEMAC_STATUS_KIND_SPECIAL_N2, special_n_end); } \ No newline at end of file diff --git a/fighters/lucario/Cargo.toml b/fighters/lucario/Cargo.toml index ee12f37bc6..6a49c969a4 100644 --- a/fighters/lucario/Cargo.toml +++ b/fighters/lucario/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -interpolation = "0.2.0" \ No newline at end of file +interpolation = "0.2.0" +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/lucario/src/acmd/ground.rs b/fighters/lucario/src/acmd/ground.rs index fbaeac1d93..11b283ae7e 100644 --- a/fighters/lucario/src/acmd/ground.rs +++ b/fighters/lucario/src/acmd/ground.rs @@ -12,11 +12,15 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 3.0, 60, 100, 34, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 60, 100, 34, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("handl"), 3.0, 70, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); - // jab lock + // Jab lock hitboxes ATTACK(agent, 4, 0, Hash40::new("shoulderr"), 3.0, 361, 100, 38, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); ATTACK(agent, 5, 0, Hash40::new("shoulderl"), 3.0, 361, 100, 34, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); ATTACK(agent, 6, 0, Hash40::new("arml"), 3.0, 361, 100, 34, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); ATTACK(agent, 7, 0, Hash40::new("handl"), 3.0, 361, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); + AttackModule::set_down_only(boma, 5, true); + AttackModule::set_down_only(boma,6, true); + AttackModule::set_down_only(boma, 7, true); } wait(lua_state, 2.0); if is_excute(agent) { @@ -39,9 +43,11 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { VarModule::set_int(agent.battle_object, vars::lucario::status::HIT_CANCEL_TIMER, 12); ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 60, 100, 30, 0, 4.5, 0.0, 8.8, 8.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 36, 0, 4.5, 0.0, 8.8, 4.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); - // jab lock + // Jab lock hitboxes ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 100, 30, 0, 4.5, 0.0, 8.8, 8.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 100, 36, 0, 4.5, 0.0, 8.8, 4.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_LUCARIO, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 2, true); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/lucario/src/acmd/other.rs b/fighters/lucario/src/acmd/other.rs index 348da7e7b4..768cd06d00 100644 --- a/fighters/lucario/src/acmd/other.rs +++ b/fighters/lucario/src/acmd/other.rs @@ -81,16 +81,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -101,10 +97,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/lucario/src/acmd/smashes.rs b/fighters/lucario/src/acmd/smashes.rs index 9a9c93ea10..d8476cf3e9 100644 --- a/fighters/lucario/src/acmd/smashes.rs +++ b/fighters/lucario/src/acmd/smashes.rs @@ -87,6 +87,15 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { sv_kinetic_energy!(reset_energy, agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); KineticModule::unable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + let air_speed_x_stable = agent.get_param_float("air_speed_x_stable", ""); + let jump_stable_speed_x_mul = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_attack_hi4.jump_stable_speed_x_mul"); + sv_kinetic_energy!( + set_stable_speed, + agent, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + air_speed_x_stable * jump_stable_speed_x_mul, + 0.0 + ); } } diff --git a/fighters/lucario/src/acmd/specials.rs b/fighters/lucario/src/acmd/specials.rs index 8c4d476c60..724fbff411 100644 --- a/fighters/lucario/src/acmd/specials.rs +++ b/fighters/lucario/src/acmd/specials.rs @@ -61,6 +61,7 @@ unsafe extern "C" fn game_specialnbomb(agent: &mut L2CAgentBase) { frame(lua_state, 37.0); if is_excute(agent) { ArticleModule::shoot(boma, *FIGHTER_LUCARIO_GENERATE_ARTICLE_AURABALL, ArticleOperationTarget(*ARTICLE_OPE_TARGET_LAST), false); + VarModule::off_flag(agent.battle_object, vars::lucario::instance::IS_POWERED_UP); } } @@ -361,9 +362,6 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); FT_MOTION_RATE_RANGE(agent, 8.0, 21.0, 16.0); - if is_excute(agent) { - boma.on_flag(*FIGHTER_LUCARIO_MACH_STATUS_WORK_ID_FLAG_GRAVITY_ONOFF); - } frame(lua_state, 21.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { diff --git a/fighters/lucario/src/acmd/throws.rs b/fighters/lucario/src/acmd/throws.rs index 561351cb47..537916ad8d 100644 --- a/fighters/lucario/src/acmd/throws.rs +++ b/fighters/lucario/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, 0.0, Some(0.0), Some(8.5), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, 5.0, Some(0.0), Some(8.5), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-15.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, -7.0, Some(0.0), Some(8.0), Some(-15.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/lucario/src/auraball/acmd.rs b/fighters/lucario/src/auraball/acmd.rs new file mode 100644 index 0000000000..f8363d443b --- /dev/null +++ b/fighters/lucario/src/auraball/acmd.rs @@ -0,0 +1,35 @@ +use super::*; + +unsafe extern "C" fn effect_chargemax(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if !VarModule::is_flag(agent.battle_object, vars::lucario::instance::IS_POWERED_UP) { + EFFECT_FLW_POS(agent, Hash40::new("lucario_hadoudan_max_sign"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 2.5, true); + EFFECT_FOLLOW(agent, Hash40::new("lucario_hadoudan_max_hold"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, true); + } + } + frame(lua_state, 3.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("lucario_hadoudan_hold"), false, false); + if VarModule::is_flag(agent.battle_object, vars::lucario::instance::IS_POWERED_UP) { + EFFECT_FLW_POS(agent, Hash40::new("lucario_hadoudan_max_sign"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, true); + EFFECT_FOLLOW(agent, Hash40::new("lucario_hadoudan_max_hold"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, true); + EFFECT_FOLLOW(agent, Hash40::new("lucario_hadoudan_hold"), Hash40::new("virtualeffect"), 0, 0, 0, 0, 0, 0, 0.5, true); + } + } +} + +unsafe extern "C" fn effect_shoot(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("lucario_hadoudan_max_hold"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("lucario_hadoudan_tail"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, true); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("effect_chargemax", effect_chargemax, Priority::Low); + agent.acmd("effect_shoot", effect_shoot, Priority::Low); +} \ No newline at end of file diff --git a/fighters/lucario/src/auraball/mod.rs b/fighters/lucario/src/auraball/mod.rs index 74472bf692..220c37c768 100644 --- a/fighters/lucario/src/auraball/mod.rs +++ b/fighters/lucario/src/auraball/mod.rs @@ -1,9 +1,11 @@ use super::*; +mod acmd; mod status; pub fn install() { let agent = &mut Agent::new("lucario_auraball"); + acmd::install(agent); status::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/lucario/src/auraball/status.rs b/fighters/lucario/src/auraball/status.rs index 9ff9ae042e..3aaaba9962 100644 --- a/fighters/lucario/src/auraball/status.rs +++ b/fighters/lucario/src/auraball/status.rs @@ -86,6 +86,11 @@ unsafe extern "C" fn auraball_set_scale(fighter: &mut L2CFighterCommon) { let charge_ratio = (charge_frame as f32) / (max_charge_frame as f32); //println!("charge_ratio: {}", charge_ratio); + if fighter.is_status(*WEAPON_LUCARIO_AURABALL_STATUS_KIND_CHARGE) + && VarModule::is_flag(fighter.battle_object, vars::lucario::instance::IS_POWERED_UP) { + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("lucario_hadoudan_hold"), true, true); + } + let mut hvar4 = ""; let mut min_scale = 0.0; let mut max_scale = 0.0; diff --git a/fighters/lucario/src/lib.rs b/fighters/lucario/src/lib.rs index 33b627d411..7aff1dc830 100644 --- a/fighters/lucario/src/lib.rs +++ b/fighters/lucario/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/lucario/src/opff.rs b/fighters/lucario/src/opff.rs index 1c5259f501..5a0327f2de 100644 --- a/fighters/lucario/src/opff.rs +++ b/fighters/lucario/src/opff.rs @@ -96,7 +96,21 @@ pub unsafe fn check_burnout(agent: &mut L2CAgentBase) { if meter <= 0.0 && !VarModule::is_flag(agent.battle_object, vars::lucario::instance::METER_BURNOUT) { VarModule::on_flag(agent.battle_object, vars::lucario::instance::METER_BURNOUT); - PLAY_SE(agent, Hash40::new("se_common_spirits_critical_l_tail")); + let bust_pos = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + let lr = PostureModule::lr(agent.module_accessor); + ModelModule::joint_global_position(agent.module_accessor, Hash40::new("bust"), bust_pos, false); + EffectModule::req( + agent.module_accessor, + Hash40::new("sys_ground_shockwave"), + &Vector3f::new(bust_pos.x + (2.0 * lr), bust_pos.y, bust_pos.z), + &Vector3f::new(1.57, 0.0, 0.0), + 0.77, + 0, + -1, + false, + 0 + ); + LAST_EFFECT_SET_RATE(agent, 0.65); MeterModule::drain_direct(agent.battle_object, meter); } } @@ -256,6 +270,7 @@ unsafe fn meter_module(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectMo && VarModule::is_flag(fighter.battle_object, vars::lucario::instance::METER_BURNOUT) { VarModule::off_flag(fighter.battle_object, vars::lucario::instance::METER_BURNOUT); PLAY_SE(fighter, Hash40::new("se_system_favorite_on")); + app::FighterUtil::flash_eye_info(fighter.module_accessor); MeterModule::drain_direct(fighter.battle_object, meter); } diff --git a/fighters/lucario/src/status/mod.rs b/fighters/lucario/src/status/mod.rs index 34f9abb056..6564b766bd 100644 --- a/fighters/lucario/src/status/mod.rs +++ b/fighters/lucario/src/status/mod.rs @@ -48,7 +48,23 @@ unsafe extern "C" fn shield_break_fly_main(fighter: &mut L2CFighterCommon) -> L2 MeterModule::set_meter_cap(fighter.object(), 3); MeterModule::set_meter_per_level(fighter.object(), ParamModule::get_float(fighter.battle_object, ParamType::Agent, "meter.damage_per_level")); VarModule::on_flag(fighter.battle_object, vars::lucario::instance::METER_BURNOUT); - PLAY_SE(fighter, Hash40::new("se_common_spirits_critical_l_tail")); + EffectModule::req_follow( + fighter.module_accessor, + Hash40::new("sys_flash"), + Hash40::new("bust"), + &Vector3f::zero(), + &Vector3f::zero(), + 2.0, + true, + 0, + 0, + 0, + 0, + 0, + false, + false + ); + LAST_EFFECT_SET_COLOR(fighter, 0.0, 0.37, 0.9); smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SHIELD_BREAK_FLY)(fighter) } diff --git a/fighters/lucario/src/status/special_hi.rs b/fighters/lucario/src/status/special_hi.rs index 8943c467f1..4cd5ef5610 100644 --- a/fighters/lucario/src/status/special_hi.rs +++ b/fighters/lucario/src/status/special_hi.rs @@ -61,6 +61,21 @@ unsafe extern "C" fn special_hi_exec(fighter: &mut L2CFighterCommon) -> L2CValue special_hi_guide_handler(fighter, rate); } } + + let start_stop_y_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_hi.start_stop_y_frame"); + if fighter.global_table[CURRENT_FRAME].get_i32() == start_stop_y_frame - 2 { + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_LUCARIO_MACH_STATUS_WORK_ID_FLAG_GRAVITY_ONOFF); + } + + if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_LUCARIO_MACH_STATUS_WORK_ID_FLAG_GRAVITY_ONOFF) { + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + 0.0 + ); + } + smashline::original_status(Exec, fighter, *FIGHTER_STATUS_KIND_SPECIAL_HI)(fighter) } diff --git a/fighters/lucario/src/status/special_n.rs b/fighters/lucario/src/status/special_n.rs index 9b3f6c0be9..54a88ef745 100644 --- a/fighters/lucario/src/status/special_n.rs +++ b/fighters/lucario/src/status/special_n.rs @@ -149,10 +149,6 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> return 0.into(); } - // if fighter.check_jump_cancel(true, false) { - // return 0.into(); - // } - if special_n_check_cancel(fighter).get_bool() { fighter.change_status(FIGHTER_LUCARIO_STATUS_KIND_SPECIAL_N_CANCEL.into(), true.into()); return 0.into(); diff --git a/fighters/lucario/src/status/special_s.rs b/fighters/lucario/src/status/special_s.rs index b5d3305373..55c71c99af 100644 --- a/fighters/lucario/src/status/special_s.rs +++ b/fighters/lucario/src/status/special_s.rs @@ -114,7 +114,8 @@ unsafe extern "C" fn special_s_throw_main_loop(fighter: &mut L2CFighterCommon) - if !StatusModule::is_changing(fighter.module_accessor) && ((fighter.global_table[PREV_SITUATION_KIND] == SITUATION_KIND_GROUND && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR) - || (fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_GROUND && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND)) { + || (fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_GROUND && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND)) + && fighter.motion_frame() >= 15.0 { if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { WorkModule::set_int64(fighter.module_accessor, hash40("special_s_throw") as i64, *FIGHTER_LUCARIO_INSTANCE_WORK_ID_INT_GROUND_MOT); } else { diff --git a/fighters/lucas/Cargo.toml b/fighters/lucas/Cargo.toml index d3c7a70491..7bf4b3a373 100644 --- a/fighters/lucas/Cargo.toml +++ b/fighters/lucas/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/lucas/src/acmd/aerials.rs b/fighters/lucas/src/acmd/aerials.rs index a96361abe3..bbb21878cb 100644 --- a/fighters/lucas/src/acmd/aerials.rs +++ b/fighters/lucas/src/acmd/aerials.rs @@ -34,13 +34,13 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 30.0); MotionModule::set_rate(boma, (72.0-30.0)/31.5); if is_excute(agent) { - AttackModule::clear_all(boma);//20f + AttackModule::clear_all(boma); } - frame(lua_state, 43.3);//30f + frame(lua_state, 43.3); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); //28 -> 30 + WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 72.0);//anim end frame + frame(lua_state, 72.0); // anim end frame MotionModule::set_rate(boma, 1.0); } @@ -106,18 +106,10 @@ unsafe extern "C" fn sound_attackairn(agent: &mut L2CAgentBase) { PLAY_SEQUENCE(agent, Hash40::new("seq_lucas_rnd_attack")); PLAY_SE(agent, Hash40::new("se_lucas_attackair_l03")); } - frame(lua_state, 10.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_lucas_attackair_l03")); - } frame(lua_state, 14.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_lucas_attackair_l03")); } - frame(lua_state, 18.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_lucas_attackair_l03")); - } frame(lua_state, 26.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_lucas_attackhard_s01")); @@ -248,25 +240,21 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 6.0, -0.2, 0, 155, 90, 0.95, true); - LAST_EFFECT_SET_RATE(agent, 1.1); - // LAST_EFFECT_SET_COLOR(agent, 1.0, 0.8, 0.1); - EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 6.7, -2.0, 0, 0, 90, 0, 0.4, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 6.0, 0, 0, 155, 90, 0.95, true); + LAST_EFFECT_SET_RATE(agent, 1.2); + EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 6.6, -2.0, 0, 0, 90, 0, 0.4, true); LAST_EFFECT_SET_RATE(agent, 2.0); } - frame(lua_state, 20.0); + frame(lua_state, 16.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk_lw"), Hash40::new("kneer"), 7, 0, 0, 0, 90, 0, 0.4, true); + EFFECT_OFF_KIND(agent, Hash40::new("lucas_psi_atk"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 5.6, 0.0, 0, 0, 90, 0, 0.4, true); LAST_EFFECT_SET_RATE(agent, 2.0); } - frame(lua_state, 22.0); + frame(lua_state, 21.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("lucas_psi_atk"), false, false); } - frame(lua_state, 25.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("lucas_psi_atk_lw"), false, false); - } } unsafe extern "C" fn expression_attackairb(agent: &mut L2CAgentBase) { @@ -288,7 +276,7 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("head"), 10.0, 70, 100, 0, 20, 5.74, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("head"), 10.0, 70, 100, 0, 20, 5.6, 3.9, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } frame(lua_state, 10.0); if is_excute(agent) { @@ -336,10 +324,10 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 365, 100, 30, 0, 3.9, 0.0, -3.0, 0.3, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 365, 100, 30, 0, 4.2, 0.0, 2.0, 0.3, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.5, 270, 100, 29, 0, 3.9, 0.0, -3.0, 0.3, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.5, 270, 100, 29, 0, 4.2, 0.0, 2.0, 0.3, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 365, 100, 30, 0, 3.9, 0.0, -3.0, 0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 365, 100, 30, 0, 4.2, 0.0, 2.0, 0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.5, 275, 100, 29, 0, 3.9, 0.0, -3.0, 0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.5, 275, 100, 29, 0, 4.2, 0.0, 2.0, 0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 7.0); if is_excute(agent) { @@ -347,10 +335,10 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 365, 100, 30, 0, 3.9, 0.0, -3.0, 0.3, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 365, 100, 30, 0, 4.2, 0.0, 2.0, 0.3, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.5, 270, 100, 29, 0, 3.9, 0.0, -3.0, 0.3, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.5, 270, 100, 29, 0, 4.2, 0.0, 2.0, 0.3, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 365, 100, 30, 0, 3.9, 0.0, -3.0, 0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 365, 100, 30, 0, 4.2, 0.0, 2.0, 0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.5, 275, 100, 29, 0, 3.9, 0.0, -3.0, 0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.5, 275, 100, 29, 0, 4.2, 0.0, 2.0, 0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 14.0); if is_excute(agent) { @@ -359,8 +347,8 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 19.0); if is_excute(agent) { MotionModule::set_rate(boma, 1.0); - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 270, 84, 0, 20, 4.1, 0.0, -3.0, 0.3, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 270, 84, 0, 20, 4.5, 0.0, 2.0, 0.3, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 275, 84, 0, 20, 4.1, 0.0, -3.0, 0.3, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 275, 84, 0, 20, 4.5, 0.0, 2.0, 0.3, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 22.0); if is_excute(agent) { @@ -377,8 +365,8 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0.0, -3, 0.0, 0, 0, 0, 0.81, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 2.0); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0.0, -3, 0.0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.5); } frame(lua_state, 4.0); if is_excute(agent) { diff --git a/fighters/lucas/src/acmd/ground.rs b/fighters/lucas/src/acmd/ground.rs index 2c02e1ab1f..94cb0f8e62 100644 --- a/fighters/lucas/src/acmd/ground.rs +++ b/fighters/lucas/src/acmd/ground.rs @@ -5,9 +5,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 3.0, 65, 100, 20, 0, 2.9, -0.1, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 3.0, 65, 100, 20, 0, 3.0, 1.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 3.0, 65, 100, 20, 0, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("legl"), 3.0, 65, 100, 20, 0, 2.75, -0.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 3.0, 65, 100, 20, 0, 3.0, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("toel"), 3.0, 65, 100, 20, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 10, 0, 20, 2.5, 0.0, 3.0, 5.5, Some(0.0), Some(3.0), Some(12.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_down_only(boma, 3, true); @@ -28,12 +28,12 @@ unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 0, 5.5, 3.5, -12, -35, 20, 0.9, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 0, 5.5, 3.0, -12, -35, 20, 0.9, true, *EF_FLIP_YZ); // LAST_EFFECT_SET_COLOR(agent, 1.0, 0.8, 0.1); } frame(lua_state, 2.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneel"), 4.0, 0.0, 1.0, 0, 0, 0, 0.3, true); + EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("toel"), 0.0, 0.0, 0.0, 0, 0, 0, 0.25, true); } frame(lua_state, 5.0); if is_excute(agent) { @@ -46,9 +46,9 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 4.0, 48, 93, 0, 57, 2.9, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 4.0, 48, 93, 0, 57, 3.3, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 4.0, 48, 93, 0, 57, 5.0, 6.2, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("legr"), 4.0, 48, 115, 0, 44, 2.9, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 4.0, 48, 115, 0, 44, 3.3, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("toer"), 4.0, 48, 115, 0, 44, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 9.0); if is_excute(agent) { @@ -62,12 +62,12 @@ unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 0, 6.0, 8.0, -28, -45, 30, 1.0, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 0, 6.0, 8.0, -28, -45, 30, 0.95, true, *EF_FLIP_YZ); // LAST_EFFECT_SET_COLOR(agent, 1.0, 0.8, 0.1); } frame(lua_state, 6.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 5.0, -0.75, 0.0, 0, 0, 0, 0.4, true); + EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("toer"), 0.0, 0.0, 0.0, 0, 0, 0, 0.3, true); } frame(lua_state, 9.0); if is_excute(agent) { @@ -89,22 +89,18 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 10.0, 83, 77, 0, 55, 5.5, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 83, 77, 0, 50, 4.5, 0.0, 5.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("neck"), 10.0, 83, 77, 0, 55, 4.75, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 83, 77, 0, 50, 4.25, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 7.0, 361, 90, 0, 40, 4.5, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 361, 90, 0, 35, 3.5, 0.0, 5.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("neck"), 7.0, 361, 90, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 1, 0, Hash40::new("haver"), 7.0, 361, 90, 0, 35, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 17.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 39.0); - if is_excute(agent) { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_WAIT, false); - } } unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { @@ -121,7 +117,7 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("lucas_psi_hold"), false, false); - EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("top"), 0, 5, 11.0, 0, 0, 0, 0.5, true); + EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("haver"), 0.0, 0, 0.0, 0, 0, 0, 0.4, true); } frame(lua_state, 18.0); if is_excute(agent) { diff --git a/fighters/lucas/src/acmd/other.rs b/fighters/lucas/src/acmd/other.rs index 5ad5aac861..78062d5f56 100644 --- a/fighters/lucas/src/acmd/other.rs +++ b/fighters/lucas/src/acmd/other.rs @@ -72,15 +72,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -90,10 +86,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealhir(agent: &mut L2CAgentBase) { diff --git a/fighters/lucas/src/acmd/specials.rs b/fighters/lucas/src/acmd/specials.rs index 1a14bb6243..d3a0f7eff9 100644 --- a/fighters/lucas/src/acmd/specials.rs +++ b/fighters/lucas/src/acmd/specials.rs @@ -119,7 +119,7 @@ unsafe extern "C" fn effect_specialnfire(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FLW_POS(agent, Hash40::new("lucas_pkt_hold"), Hash40::new("top"), 0, 9, 0, 0, 0, 0, 0.9, true); EFFECT_FLW_POS(agent, Hash40::new("lucas_pkfr_bomb_max"), Hash40::new("top"), 0, 9, 0, 0, 0, 0, 0.5, true); - EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("top"), 0, 11, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 11, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); } for _ in 1..=5 { if is_excute(agent) { @@ -367,7 +367,8 @@ unsafe extern "C" fn game_speciallwend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - if is_excute(agent) { + if is_excute(agent) + && !VarModule::is_flag(agent.object(), vars::lucas::instance::SPECIAL_LW_DISABLE_JC) { ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 127, 80, 0, 77, 4.5, 0.0, 6.3, 3.75, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_PSI); ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 127, 80, 0, 77, 5.0, 0.0, 6.3, 8.25, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_PSI); } @@ -428,7 +429,9 @@ unsafe extern "C" fn game_fallspecial(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_specialnstart", game_specialnstart, Priority::Low); + agent.acmd("effect_specialnstart", acmd_stub, Priority::Low); agent.acmd("game_specialairnstart", game_specialnstart, Priority::Low); + agent.acmd("effect_specialairnstart", acmd_stub, Priority::Low); agent.acmd("sound_specialnstart", sound_specialnstart, Priority::Low); agent.acmd("sound_specialairnstart", sound_specialnstart, Priority::Low); agent.acmd("game_specialnhold", game_specialnhold, Priority::Low); diff --git a/fighters/lucas/src/acmd/throws.rs b/fighters/lucas/src/acmd/throws.rs index 857a39d7b1..0a77dec287 100644 --- a/fighters/lucas/src/acmd/throws.rs +++ b/fighters/lucas/src/acmd/throws.rs @@ -26,7 +26,7 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); FT_MOTION_RATE(agent, 2.0 / (18.0 - 14.0)); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 6.3, 17.0, Some(0.0), Some(6.3), Some(20.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 6.3, 18.0, Some(0.0), Some(6.3), Some(20.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } frame(lua_state, 18.0); FT_MOTION_RATE(agent, 1.0); @@ -62,7 +62,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 6.3, 20.0, Some(0.0), Some(6.3), Some(24.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 6.3, 22.5, Some(0.0), Some(6.3), Some(24.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } frame(lua_state, 20.0); if is_excute(agent) { @@ -84,7 +84,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - GrabModule::set_rebound(boma, /*CanCatchRebound*/ true); + GrabModule::set_rebound(boma, true); } frame(lua_state, 15.0); if is_excute(agent) { @@ -97,7 +97,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 6.3, -17.0, Some(0.0), Some(6.3), Some(-20.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 6.3, -18.0, Some(0.0), Some(6.3), Some(-20.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } frame(lua_state, 21.0); if is_excute(agent) { @@ -121,8 +121,6 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { frame(lua_state, 22.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 6, 11); - //FighterCutInManager::set_throw_finish_zoom_rate(boma, 2); - //FighterCutInManager::set_throw_finish_offset(boma, 5, 8, 0); } frame(lua_state, 23.0); FT_MOTION_RATE(agent, 1.0); @@ -137,13 +135,11 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 10.0, 45, 75, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } + } frame(lua_state, 19.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); CHECK_FINISH_CAMERA(agent, 13, 3); - //FighterCutInManager::set_throw_finish_zoom_rate(boma, 1.5); - //FighterCutInManager::set_throw_finish_offset(boma, 8, 3, 0); } frame(lua_state, 20.0); if is_excute(agent) { @@ -162,8 +158,6 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { frame(lua_state, 24.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 7, 16); - //FighterCutInManager::set_throw_finish_zoom_rate(boma, 1.5); - //FighterCutInManager::set_throw_finish_offset(boma, 0, 8, 0); } frame(lua_state, 25.0); if is_excute(agent) { @@ -174,14 +168,14 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + FT_MOTION_RATE(agent, 0.5); if is_excute(agent) { - FT_MOTION_RATE(agent, 0.500); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 100, 55, 0, 85, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 75, 55, 0, 85, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 40.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.000); CHECK_FINISH_CAMERA(agent, 9.0, 0.0); } frame(lua_state, 41.0); @@ -193,12 +187,10 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { unsafe extern "C" fn expression_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_elecattack"), 10, true, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 4.0); if is_excute(agent) { QUAKE(agent, *CAMERA_QUAKE_KIND_L); diff --git a/fighters/lucas/src/acmd/tilts.rs b/fighters/lucas/src/acmd/tilts.rs index 90a90d51ba..c79a4a8a70 100644 --- a/fighters/lucas/src/acmd/tilts.rs +++ b/fighters/lucas/src/acmd/tilts.rs @@ -70,24 +70,24 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 7.0, 85, 110, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PSI); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 85, 110, 0, 50, 2.5, -0.5, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PSI); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 10.0, 95, 85, 0, 60, 4.0, 4.5, 1.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("hip"), 7.0, 85, 110, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PSI); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 85, 110, 0, 50, 2.5, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PSI); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 10.0, 95, 85, 0, 60, 4.0, 4.5, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 11.0); + FT_MOTION_RATE_RANGE(agent, 11.0, 11.75, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 7.0, 85, 110, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PSI); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 85, 110, 0, 50, 2.5, -0.5, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PSI); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 85, 100, 0, 50, 4.0, 4.5, 1.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("hip"), 7.0, 85, 110, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PSI); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 85, 110, 0, 50, 2.5, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PSI); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 85, 100, 0, 50, 4.0, 4.5, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } + frame(lua_state, 11.75); + FT_MOTION_RATE_RANGE(agent, 11.75, 13.0, 1.0); frame(lua_state, 13.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 37.0); - if is_excute(agent) { - //StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_WAIT, false); - } } unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { @@ -99,16 +99,23 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 13.5, 2.0, 0, 45, 90, 0.85, true); - // LAST_EFFECT_SET_COLOR(agent, 1.0, 0.8, 0.1); - LAST_EFFECT_SET_RATE(agent, 1.0); EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 4.5, 0.2, 0, 0, 0, 0, 0.5, true); - LAST_EFFECT_SET_RATE(agent, 2.0); + LAST_EFFECT_SET_RATE(agent, 1.8); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 12.5, 2.0, 0, 45, 90, 0.8, true); + LAST_EFFECT_SET_SCALE_W(agent, 0.75, 0.75, 1.0); + LAST_EFFECT_SET_RATE(agent, 1.7); } frame(lua_state, 13.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("lucas_psi_atk"), false, false); } + frame(lua_state, 14.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("sys_attack_arc_d"), false, false); + } frame(lua_state, 28.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); @@ -121,9 +128,8 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 1.0, 3.0, 4.0); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 80, 0, 45, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 5.0, 361, 80, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.0, 84, 75, 0, 50, 4.0, 6.0, 0.0, -1.0, None, None, None, 1.1, 1.2, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 55, 115, 0, 25, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 80, 100, 0, 30, 4.0, 5.5, 0.0, -1.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } FT_MOTION_RATE(agent, 1.0); @@ -142,13 +148,7 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { LAST_EFFECT_SET_RATE(agent, 1.5); // LAST_EFFECT_SET_COLOR(agent, 1.0, 0.8, 0.1); FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - if PostureModule::lr(boma) > 0.0{ - EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 3.8, -1.0, -0.7, 0, 0, 0, 0.3, false); - } - else{ - EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 3.8, -1.0, 0.7, 0, 0, 0, 0.3, false); - } - //EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 6.0, 0.0, -1.0, 0, 0, 0, 0.35, false); + EFFECT_FOLLOW(agent, Hash40::new("lucas_psi_atk"), Hash40::new("kneer"), 3.3, -1.0, -0.7*(boma.lr()), 0, 0, 0, 0.3, false); LAST_EFFECT_SET_RATE(agent, 1.5); } frame(lua_state, 5.0); diff --git a/fighters/lucas/src/lib.rs b/fighters/lucas/src/lib.rs index 390e594eee..d6d039b32f 100644 --- a/fighters/lucas/src/lib.rs +++ b/fighters/lucas/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/lucas/src/opff.rs b/fighters/lucas/src/opff.rs index f0347b3219..51466a468a 100644 --- a/fighters/lucas/src/opff.rs +++ b/fighters/lucas/src/opff.rs @@ -3,14 +3,41 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -unsafe fn psi_magnet_jc(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status_one_of(&[*FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_HIT, *FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_END]) { - if boma.status_frame() > 0 { - if !AttackModule::is_attack(boma, 0, false) { //jc if hitbox clear - boma.check_jump_cancel(false, false); - } +unsafe fn psi_magnet_jc(fighter: &mut smash::lua2cpp::L2CFighterCommon) { + let boma = fighter.boma(); + // resets the disable jump cancel flag + if boma.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, + ]) + && StatusModule::is_changing(boma) { + VarModule::off_flag(boma.object(), vars::lucas::instance::SPECIAL_LW_DISABLE_JC); + } + + // disables jump cancels when parried between statuses + if boma.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, + *FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_HOLD, + *FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_END, + *FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_HIT, + ]) + && AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_PARRY) { + VarModule::on_flag(boma.object(), vars::lucas::instance::SPECIAL_LW_DISABLE_JC); + if !fighter.is_status(*FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_END) + && !fighter.is_in_hitlag() { + fighter.change_status(FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); } } + + if boma.is_status_one_of(&[ + *FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_END, + *FIGHTER_LUCAS_STATUS_KIND_SPECIAL_LW_HIT, + ]) + && boma.status_frame() > 0 + && !boma.is_in_hitlag() + && !AttackModule::is_attack(boma, 0, false) //jc if hitbox clear + && !VarModule::is_flag(boma.object(), vars::lucas::instance::SPECIAL_LW_DISABLE_JC){ + boma.check_jump_cancel(false, false, false); + } } // Offense Up charge Handler @@ -220,7 +247,7 @@ unsafe fn pkt2_edgeslipoff(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { smash_s_angle_handler(fighter); dashgrab_position_fix(fighter); - psi_magnet_jc(boma); + psi_magnet_jc(fighter); offense_charge(fighter); offense_effect_handler(fighter); reset_flags(fighter); diff --git a/fighters/lucas/src/status/special_n.rs b/fighters/lucas/src/status/special_n.rs index 1f6876a835..51110a7801 100644 --- a/fighters/lucas/src/status/special_n.rs +++ b/fighters/lucas/src/status/special_n.rs @@ -4,14 +4,22 @@ use super::*; unsafe extern "C" fn special_n_pre(fighter: &mut L2CFighterCommon) -> L2CValue{ if VarModule::is_flag(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_ACTIVE) { - fighter.change_status(FIGHTER_LUCAS_STATUS_KIND_SPECIAL_N_FIRE.into(), false.into()); - return 0.into(); + fighter.set_status_kind_interrupt(FIGHTER_LUCAS_STATUS_KIND_SPECIAL_N_FIRE.into()); + return 1.into(); } else { smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_SPECIAL_N)(fighter) } } +unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let stop_y_time = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_n"), hash40("stop_y_time")); + WorkModule::set_int(fighter.module_accessor, stop_y_time, *FIGHTER_LUCAS_STATUS_SPECIAL_N_WORK_INT_STOP_Y_TIME); + + let main_loop = smashline::api::get_target_function("lua2cpp_lucas.nrs", 0x21180).unwrap(); + fighter.sub_shift_status_main(L2CValue::Ptr(main_loop as *const () as _)) +} + // FIGHTER_LUCAS_STATUS_KIND_SPECIAL_N_HOLD unsafe extern "C" fn special_n_hold_main(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -135,6 +143,7 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> VarModule::set_int(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_CHARGE_LEVEL, charge_time); VarModule::on_flag(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_ACTIVE); VarModule::on_flag(fighter.object(), vars::lucas::instance::SPECIAL_N_OFFENSE_UP_INIT); + app::FighterUtil::flash_eye_info(fighter.module_accessor); fighter.change_status(FIGHTER_LUCAS_STATUS_KIND_SPECIAL_N_FIRE.into(), false.into()); return 1.into(); } @@ -146,7 +155,7 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> if StatusModule::is_changing(fighter.module_accessor) || fighter.is_situation(wait_mtrans_kind) { // else block special_n_hold_transition_g2a_kind(fighter, *FIGHTER_LUCAS_STATUS_SPECIAL_N_WORK_INT_WAIT_MTRANS_KIND, *FIGHTER_LUCAS_STATUS_SPECIAL_N_FLAG_MOT_CHANGE, - *FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_LUCAS_AIR_STOP_SPECIAL_N, Hash40::new("special_n_hold"), + *FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_AIR_STOP, Hash40::new("special_n_hold"), Hash40::new("special_air_n_hold"), *GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK); } 1.into() @@ -186,5 +195,6 @@ unsafe extern "C" fn special_n_hold_transition_g2a_kind( pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_main); agent.status(Main, *FIGHTER_LUCAS_STATUS_KIND_SPECIAL_N_HOLD, special_n_hold_main); } \ No newline at end of file diff --git a/fighters/lucina/Cargo.toml b/fighters/lucina/Cargo.toml index b38978926a..d96ccc2f21 100644 --- a/fighters/lucina/Cargo.toml +++ b/fighters/lucina/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/lucina/src/acmd/ground.rs b/fighters/lucina/src/acmd/ground.rs index dbbc181b28..1f179316aa 100644 --- a/fighters/lucina/src/acmd/ground.rs +++ b/fighters/lucina/src/acmd/ground.rs @@ -13,7 +13,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 10.0); + frame(lua_state, 15.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } diff --git a/fighters/lucina/src/acmd/other.rs b/fighters/lucina/src/acmd/other.rs index fd0c722c2b..538cde11bf 100644 --- a/fighters/lucina/src/acmd/other.rs +++ b/fighters/lucina/src/acmd/other.rs @@ -81,15 +81,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -99,10 +95,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/lucina/src/acmd/specials/mod.rs b/fighters/lucina/src/acmd/specials/mod.rs index 232b971455..dab3fb329f 100644 --- a/fighters/lucina/src/acmd/specials/mod.rs +++ b/fighters/lucina/src/acmd/specials/mod.rs @@ -13,15 +13,15 @@ unsafe extern "C" fn game_specialnend(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(8.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 8.5, 25.0, Some(0.0), Some(8.5), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 8.5, 17.0, Some(0.0), Some(8.5), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 8.5, 23.5, Some(0.0), Some(8.5), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(8.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 8.5, 25.0, Some(0.0), Some(8.5), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 8.5, 17.0, Some(0.0), Some(8.5), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 8.5, 23.5, Some(0.0), Some(8.5), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 5.0, 8.0, Some(0.0), Some(5.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 5.0, 25.0, Some(0.0), Some(5.0), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 5.0, 17.0, Some(0.0), Some(5.0), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 5.0, 23.5, Some(0.0), Some(5.0), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 5.0, 8.0, Some(0.0), Some(5.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 5.0, 25.0, Some(0.0), Some(5.0), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 5.0, 17.0, Some(0.0), Some(5.0), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 5.0, 23.5, Some(0.0), Some(5.0), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } frame(lua_state, 9.0); @@ -44,16 +44,16 @@ unsafe extern "C" fn game_specialnendhi(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(12.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 14.0, 25.0, Some(0.0), Some(14.6), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 9.8, 17.0, Some(0.0), Some(12.3), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 13.0, 23.5, Some(0.0), Some(14.7), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(12.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 14.0, 25.0, Some(0.0), Some(14.6), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 9.8, 17.0, Some(0.0), Some(12.3), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 13.0, 23.5, Some(0.0), Some(14.7), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(10.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 11.5, 25.0, Some(0.0), Some(12.0), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 9.0, 17.0, Some(0.0), Some(10.5), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 11.0, 23.5, Some(0.0), Some(12.5), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(10.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 11.5, 25.0, Some(0.0), Some(12.0), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 9.0, 17.0, Some(0.0), Some(10.5), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 11.0, 23.5, Some(0.0), Some(12.5), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } } @@ -77,16 +77,16 @@ unsafe extern "C" fn game_specialnendlw(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(4.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 3.0, 25.0, Some(0.0), Some(2.7), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 5.6, 17.0, Some(0.0), Some(3.5), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 3.0, 23.5, Some(0.0), Some(1.7), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(4.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 3.0, 25.0, Some(0.0), Some(2.7), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 5.6, 17.0, Some(0.0), Some(3.5), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 3.0, 23.5, Some(0.0), Some(1.7), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 4.5, 8.0, Some(0.0), Some(1.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, -0.5, 25.0, Some(0.0), Some(-1.0), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 2.0, 17.0, Some(0.0), Some(0.5), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 0.0, 23.5, Some(0.0), Some(-1.5), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, 4.5, 8.0, Some(0.0), Some(1.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 3.0, 0.0, -0.5, 25.0, Some(0.0), Some(-1.0), Some(27.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 2.0, 17.0, Some(0.0), Some(0.5), Some(22.0), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 361, 90, 0, 45, 0.9, 0.0, 0.0, 23.5, Some(0.0), Some(-1.5), Some(28.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } } @@ -488,14 +488,9 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 5.0); - frame(lua_state, 3.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } frame(lua_state, 5.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); ATTACK(agent, 0, 0, Hash40::new("sword2"), 11.0, 361, 89, 0, 70, 3.5, 2.0, 0.0, 0.6, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 10.0, 74, 74, 0, 70, 3.5, 1.5, 0.0, 6.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 74, 74, 0, 70, 3.5, -1.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); diff --git a/fighters/lucina/src/acmd/throws.rs b/fighters/lucina/src/acmd/throws.rs index bcbad13548..0a1f981bfa 100644 --- a/fighters/lucina/src/acmd/throws.rs +++ b/fighters/lucina/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(12.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 7.0, Some(0.0), Some(8.0), Some(12.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -4.0, Some(0.0), Some(7.0), Some(-12.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -5.0, Some(0.0), Some(7.0), Some(-12.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -63,8 +62,31 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 57, 106, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 14.0); + if is_excute(agent) { + FT_CATCH_STOP(agent, 4, 1); + CHECK_FINISH_CAMERA(agent, 15, 2); + } + frame(lua_state, 15.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + + agent.acmd("game_throwf", game_throwf, Priority::Low); } \ No newline at end of file diff --git a/fighters/lucina/src/lib.rs b/fighters/lucina/src/lib.rs index a03316205e..39185dfae2 100644 --- a/fighters/lucina/src/lib.rs +++ b/fighters/lucina/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/lucina/src/opff.rs b/fighters/lucina/src/opff.rs index ecf97db269..9f79e6c17f 100644 --- a/fighters/lucina/src/opff.rs +++ b/fighters/lucina/src/opff.rs @@ -3,86 +3,6 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; - /* -unsafe fn side_special_cancels(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat1: i32, motion_kind: u64) { - if status_kind == *FIGHTER_MARTH_STATUS_KIND_SPECIAL_S3 { - if (AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) && !boma.is_in_hitlag()) { - // Up - if [hash40("special_s3_hi"), hash40("special_air_s3_hi")].contains(&motion_kind) { - // Check for tilt attack inputs - if boma.is_cat_flag(Cat1::AttackHi3) { - if situation_kind == *SITUATION_KIND_GROUND { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_HI3, false); - } - if situation_kind == *SITUATION_KIND_AIR { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_AIR, false); - } - } - // Check for smash attack inputs - if boma.is_cat_flag(Cat1::AttackHi4) { - if situation_kind == *SITUATION_KIND_GROUND { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_HI4_START, false); - } - if situation_kind == *SITUATION_KIND_AIR { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_AIR, false); - } - } - } - // Forward - if [hash40("special_s3_s"), hash40("special_air_s3_s")].contains(&motion_kind) { - // Check for tilt attack inputs - if boma.is_cat_flag(Cat1::AttackS3) { - if situation_kind == *SITUATION_KIND_GROUND { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_S3, false); - } - if situation_kind == *SITUATION_KIND_AIR { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_AIR, false); - } - } - // Check for smash attack inputs - if boma.is_cat_flag(Cat1::AttackS4) { - if situation_kind == *SITUATION_KIND_GROUND { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_S4_START, false); - } - if situation_kind == *SITUATION_KIND_AIR { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_AIR, false); - } - } - } - // Down - if [hash40("special_s3_lw"), hash40("special_air_s3_lw")].contains(&motion_kind) { - // Check for tilt attack inputs - if boma.is_cat_flag(Cat1::AttackLw3) { - if situation_kind == *SITUATION_KIND_GROUND { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_LW3, false); - } - if situation_kind == *SITUATION_KIND_AIR { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_AIR, false); - } - } - // Check for smash attack inputs - if boma.is_cat_flag(Cat1::AttackLw4) { - if situation_kind == *SITUATION_KIND_GROUND { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_LW4_START, false); - } - if situation_kind == *SITUATION_KIND_AIR { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_AIR, false); - } - } - } - } - } - // Jump cancel 4th hit high - if status_kind == *FIGHTER_MARTH_STATUS_KIND_SPECIAL_S4 { - if (AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) && !boma.is_in_hitlag()) { - if [hash40("special_s4_hi"), hash40("special_air_s4_hi")].contains(&motion_kind) && MotionModule::frame(boma) > 14.0 { - boma.check_jump_cancel(false, false); - } - } - } -} -*/ - // Fixes weird vanilla behavior where touching ground during upB puts you into special fall for 1f before landing unsafe fn up_special_proper_landing(fighter: &mut L2CFighterCommon) { if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) diff --git a/fighters/luigi/Cargo.toml b/fighters/luigi/Cargo.toml index ecc62b15b8..73f6b9af74 100644 --- a/fighters/luigi/Cargo.toml +++ b/fighters/luigi/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/luigi/src/acmd/aerials.rs b/fighters/luigi/src/acmd/aerials.rs index 18c339cfd9..5e69fee4d0 100644 --- a/fighters/luigi/src/acmd/aerials.rs +++ b/fighters/luigi/src/acmd/aerials.rs @@ -78,8 +78,8 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.25); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 20, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 20, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 361, 100, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 20, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); @@ -160,7 +160,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("hip"), 14.0, 270, 55, 0, 10, 3.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 14.0, 361, 110, 0, 25, 5.2, 4.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 14.0, 361, 110, 0, 25, 5.2, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 11.0); if is_excute(agent) { diff --git a/fighters/luigi/src/acmd/other.rs b/fighters/luigi/src/acmd/other.rs index ff163c2005..7f07287a57 100644 --- a/fighters/luigi/src/acmd/other.rs +++ b/fighters/luigi/src/acmd/other.rs @@ -64,15 +64,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -82,10 +78,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/luigi/src/acmd/specials.rs b/fighters/luigi/src/acmd/specials.rs index 323494558c..8fb88f2147 100644 --- a/fighters/luigi/src/acmd/specials.rs +++ b/fighters/luigi/src/acmd/specials.rs @@ -165,7 +165,6 @@ unsafe extern "C" fn effect_specialshold(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("luigi_rocket_hold"), Hash40::new("top"), 0, 6, 0, 0, 1, 0, 1, true); let handle = EffectModule::get_last_handle(boma) as u32; - VarModule::set_int(agent.battle_object, vars::luigi::instance::SPECIAL_S_PULSE_EFFECT_HANDLE, handle as i32); if WorkModule::is_flag(boma, *FIGHTER_LUIGI_STATUS_SPECIAL_S_CHARGE_FLAG_DISCHARGE) { LAST_EFFECT_SET_COLOR(agent, 0.0, 0.8, 0.0); } @@ -174,7 +173,6 @@ unsafe extern "C" fn effect_specialshold(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 10, 00, 4, 0, 0, 0, false); let handle = EffectModule::get_last_handle(boma) as u32; - VarModule::set_int(agent.battle_object, vars::luigi::instance::SPECIAL_S_SMOKE_EFFECT_HANDLE, handle as i32); if WorkModule::is_flag(boma, *FIGHTER_LUIGI_STATUS_SPECIAL_S_CHARGE_FLAG_DISCHARGE) { LAST_EFFECT_SET_COLOR(agent, 0.0, 0.7, 0.3); } @@ -190,7 +188,6 @@ unsafe extern "C" fn effect_specialairshold(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("luigi_rocket_hold"), Hash40::new("top"), 0, 6, 0, 0, 1, 0, 1, true); let handle = EffectModule::get_last_handle(boma) as u32; - VarModule::set_int(agent.battle_object, vars::luigi::instance::SPECIAL_S_PULSE_EFFECT_HANDLE, handle as i32); if WorkModule::is_flag(boma, *FIGHTER_LUIGI_STATUS_SPECIAL_S_CHARGE_FLAG_DISCHARGE) { LAST_EFFECT_SET_COLOR(agent, 0.0, 0.8, 0.0); } @@ -237,9 +234,7 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialsdischarge(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let misfire_multiplier = VarModule::get_float(agent.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_DAMAGE_MUL); - VarModule::set_float(agent.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_DAMAGE_MUL, 1.0); + let boma: &mut BattleObjectModuleAccessor = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { SA_SET(agent, *SITUATION_KIND_AIR); @@ -248,7 +243,7 @@ unsafe extern "C" fn game_specialsdischarge(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 20.0 * misfire_multiplier, 361, 100, 0, 20, 4.8, -1.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("neck"), 20.0, 361, 100, 0, 20, 4.8, -1.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); AttackModule::set_attack_keep_rumble(boma, 0, true); JostleModule::set_status(boma, false); } @@ -258,7 +253,7 @@ unsafe extern "C" fn game_specialsdischarge(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 20.0 * misfire_multiplier, 361, 100, 0, 20, 4.8, -1.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("neck"), 20.0, 361, 100, 0, 20, 4.8, -1.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); } frame(lua_state, 14.0); if is_excute(agent) { diff --git a/fighters/luigi/src/acmd/throws.rs b/fighters/luigi/src/acmd/throws.rs index 4acdb1e95f..e16569aea2 100644 --- a/fighters/luigi/src/acmd/throws.rs +++ b/fighters/luigi/src/acmd/throws.rs @@ -5,6 +5,7 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); FT_MOTION_RATE_RANGE(agent, 1.0, 13.0, 5.0); if is_excute(agent) { + GrabModule::set_rebound(boma, true); if ArticleModule::is_exist(boma, *FIGHTER_LUIGI_GENERATE_ARTICLE_OBAKYUMU) { ArticleModule::remove_exist(boma, *FIGHTER_LUIGI_GENERATE_ARTICLE_OBAKYUMU, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); } @@ -22,7 +23,6 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ArticleModule::set_rate(boma, *FIGHTER_LUIGI_GENERATE_ARTICLE_OBAKYUMU, 1.0); - GrabModule::set_rebound(boma, true); SEARCH(agent, 0, 0, Hash40::new("throw"), 3.0, 0.0, 0.0, -1.5, None, None, None, *COLLISION_KIND_MASK_HIT, *HIT_STATUS_MASK_NORMAL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_BODY_HEAD, false); } frame(lua_state, 14.0); diff --git a/fighters/luigi/src/acmd/tilts.rs b/fighters/luigi/src/acmd/tilts.rs index cd2b602e91..344ac774e8 100644 --- a/fighters/luigi/src/acmd/tilts.rs +++ b/fighters/luigi/src/acmd/tilts.rs @@ -5,9 +5,9 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 10.0, 361, 100, 0, 15, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legl"), 11.0, 361, 100, 0, 15, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 11.0, 361, 100, 0, 15, 5.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 11.0, 361, 100, 0, 15, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 11.0, 361, 100, 0, 15, 5.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 10.0, 361, 100, 0, 15, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 5.0); if is_excute(agent) { @@ -53,7 +53,7 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 72, 0, 32, 4.8, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KAMEHIT, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 5.0, 361, 72, 0, 32, 4.8, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KAMEHIT, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("legr"), 5.0, 361, 72, 0, 32, 3.8, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KAMEHIT, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } diff --git a/fighters/luigi/src/lib.rs b/fighters/luigi/src/lib.rs index 7d714346e5..7595eb091c 100644 --- a/fighters/luigi/src/lib.rs +++ b/fighters/luigi/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -46,45 +47,19 @@ use smashline::*; #[macro_use] extern crate smash_script; pub unsafe fn reset_misfire_queue(fighter: &mut L2CFighterCommon) { - let numerator = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "misfire.numerator"); - let denominator = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "misfire.denominator").min(32); - - // this bitflag represents the misfire queue - // each 0 is a standard missile, each 1 is a misfire - // the numerator above is the maximum number of misfires in the queue - // the denominator above is the maximum length of the queue (capped to 32, because we are using an i32) - let mut bitflag = 0b00000000000000000000000000000000; - let mut num_misfire = 0; - while (num_misfire < numerator) { - // generate a random position between [0, denominator - 1] (inclusive) - let position = app::sv_math::rand(hash40("fighter"), denominator); - // if that bit is already set, skip it (prevents duplicates) - if (bitflag & (1 << position)) != 0 { - continue; - } - bitflag |= (1 << position); // set the bit at this position to 1 - num_misfire += 1; - } - // the result is a bit flag that looks something like: 0b00000000000000000001000000100000 - // in which case a misfire will happen at position 12 and 5 - //println!("Misfire bitflag on init: {:0denominator$b}", bitflag, denominator = (denominator as usize)); - VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_BITFLAG, bitflag); - VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_COUNT, denominator - 1); // counts down from denominator (higher positions first) + let denominator = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "misfire.denominator"); + let position = app::sv_math::rand(hash40("fighter"), denominator); + VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_COUNT, position); } pub unsafe fn calculate_misfire(fighter: &mut L2CFighterCommon) -> bool { - // reset the queue and counter if the queue has not been initialized or the counter has dipped below zero - if VarModule::get_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_BITFLAG) == 0 - || VarModule::get_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_COUNT) < 0 { + let misfire_count = VarModule::get_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_COUNT); + if misfire_count <= 0 { reset_misfire_queue(fighter); + return true; } - - let bitflag = VarModule::get_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_BITFLAG); - let position = VarModule::get_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_COUNT); VarModule::dec_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_COUNT); - //println!("Misfire queue: {:0position$b}", bitflag, position = (position as usize)); - let is_misfire = (bitflag & (1 << position)) != 0; // if the bit at this position is 1, we misfire - return is_misfire; + return false; } pub fn install() { diff --git a/fighters/luigi/src/opff.rs b/fighters/luigi/src/opff.rs index 8dc6f6a8af..f0e44eff45 100644 --- a/fighters/luigi/src/opff.rs +++ b/fighters/luigi/src/opff.rs @@ -24,7 +24,6 @@ unsafe fn training_mode_misfire(fighter: &mut L2CFighterCommon) { LAST_EFFECT_SET_COLOR(fighter, 0.0, 1.0, 0.0); } else { VarModule::off_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_TRAINING_MISFIRE); - VarModule::off_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_STORED); } } } @@ -63,7 +62,6 @@ unsafe fn luigi_missile_edge_cancel(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { training_mode_misfire(fighter); luigi_missle_ledgegrab(fighter); - special_s_charge_init(fighter, status_kind); special_hi_proper_landing(fighter); fastfall_specials(fighter); luigi_missile_edge_cancel(fighter); @@ -82,12 +80,6 @@ pub unsafe fn luigi_frame(fighter: &mut smash::lua2cpp::L2CFighterCommon) { } } -unsafe fn special_s_charge_init(fighter: &mut smash::lua2cpp::L2CFighterCommon, status_kind: i32) { - if [*FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_LOSE, *FIGHTER_STATUS_KIND_ENTRY].contains(&status_kind) || !sv_information::is_ready_go() { - VarModule::off_flag(fighter.object(), vars::luigi::instance::SPECIAL_S_MISFIRE_STORED); - } -} - pub fn install(agent: &mut Agent) { agent.on_line(Main, luigi_frame_wrapper); } diff --git a/fighters/luigi/src/status/mod.rs b/fighters/luigi/src/status/mod.rs index 72a0790196..9d7ff49ca1 100644 --- a/fighters/luigi/src/status/mod.rs +++ b/fighters/luigi/src/status/mod.rs @@ -23,10 +23,6 @@ unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); - VarModule::off_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_STORED); - VarModule::set_float(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_DAMAGE_MUL, 1.0); - VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_SMOKE_EFFECT_HANDLE, -1); - VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_PULSE_EFFECT_HANDLE, -1); super::reset_misfire_queue(fighter); } diff --git a/fighters/luigi/src/status/special_n.rs b/fighters/luigi/src/status/special_n.rs index 2033e1891d..9347006feb 100644 --- a/fighters/luigi/src/status/special_n.rs +++ b/fighters/luigi/src/status/special_n.rs @@ -24,7 +24,7 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV return 1.into(); } } - if fighter.status_frame() == 10 && (ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL_RAW)) { + if fighter.check_hold_input(0, 10, Buttons::SpecialAll) { VarModule::on_flag(fighter.object(), vars::luigi::status::SPECIAL_N_THUNDERHAND); let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("special_n_thunder") } else { Hash40::new("special_air_n_thunder") }; MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); diff --git a/fighters/luigi/src/status/special_s.rs b/fighters/luigi/src/status/special_s.rs index 648e367ec3..1932295b3c 100644 --- a/fighters/luigi/src/status/special_s.rs +++ b/fighters/luigi/src/status/special_s.rs @@ -2,22 +2,16 @@ use super::*; unsafe extern "C" fn special_s_init(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::off_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_INIT); - if is_training_mode() { - if VarModule::is_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_TRAINING_MISFIRE) { - VarModule::on_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_STORED); - VarModule::on_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_INIT); - } + + if is_training_mode() + && VarModule::is_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_TRAINING_MISFIRE) { + VarModule::on_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_INIT); return 0.into(); } - if VarModule::is_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_STORED) { - VarModule::off_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_STORED); + + if super::calculate_misfire(fighter) { VarModule::on_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_INIT); } - else { - if super::calculate_misfire(fighter) { - VarModule::on_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_INIT); - } - } return 0.into(); } @@ -87,27 +81,6 @@ unsafe extern "C" fn special_s_charge_main_loop(fighter: &mut L2CFighterCommon) special_s_charge_motion_check(fighter); } } - if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_LUIGI_STATUS_SPECIAL_S_CHARGE_FLAG_DISCHARGE) - && fighter.global_table[globals::CURRENT_FRAME].get_i32() >= 3 - && fighter.is_button_on(Buttons::Guard | Buttons::GuardHold) { - VarModule::on_flag(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_STORED); - let mult = VarModule::get_float(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_DAMAGE_MUL); - let diminish_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "misfire.storage_diminish_mul"); - let diminish_min = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "misfire.storage_diminish_min"); - VarModule::set_float(fighter.battle_object, vars::luigi::instance::SPECIAL_S_MISFIRE_DAMAGE_MUL, (mult * diminish_mul).max(diminish_min)); - WorkModule::off_flag(fighter.module_accessor, *FIGHTER_LUIGI_STATUS_SPECIAL_S_CHARGE_FLAG_DISCHARGE); - let smoke_eff = VarModule::get_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_SMOKE_EFFECT_HANDLE); - let pulse_eff = VarModule::get_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_PULSE_EFFECT_HANDLE); - if smoke_eff != -1 { - EffectModule::kill(fighter.module_accessor, smoke_eff as u32, true, true); - VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_SMOKE_EFFECT_HANDLE, -1); - } - if pulse_eff != -1 { - EffectModule::kill(fighter.module_accessor, pulse_eff as u32, true, true); - VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_PULSE_EFFECT_HANDLE, -1); - EFFECT_FOLLOW(fighter, Hash40::new("luigi_rocket_hold"), Hash40::new("top"), 0, 6, 0, 0, 1, 0, 1, true); - } - } } else { fighter.change_status(FIGHTER_LUIGI_STATUS_KIND_SPECIAL_S_RAM.into(), true.into()); } @@ -115,8 +88,6 @@ unsafe extern "C" fn special_s_charge_main_loop(fighter: &mut L2CFighterCommon) } unsafe extern "C" fn special_s_charge_main(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_SMOKE_EFFECT_HANDLE, -1); - VarModule::set_int(fighter.battle_object, vars::luigi::instance::SPECIAL_S_PULSE_EFFECT_HANDLE, -1); if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_LUIGI_STATUS_SPECIAL_S_CHARGE_FLAG_BONUS) { WorkModule::set_float(fighter.module_accessor, WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("charge_bonus")), *FIGHTER_LUIGI_STATUS_SPECIAL_S_CHARGE_WORK_FLOAT_CHARGE); } else { diff --git a/fighters/mario/Cargo.toml b/fighters/mario/Cargo.toml index 2b1790ba2c..c722c36e83 100644 --- a/fighters/mario/Cargo.toml +++ b/fighters/mario/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/mario/src/acmd/aerials.rs b/fighters/mario/src/acmd/aerials.rs index 455495f338..734e24fa56 100644 --- a/fighters/mario/src/acmd/aerials.rs +++ b/fighters/mario/src/acmd/aerials.rs @@ -31,20 +31,26 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 16.0); + frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 14.0, 280, 35, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 15.0, 280, 35, 0, 30, 4.0, 3.2, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 15.0, 280, 35, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 15.0, 280, 35, 0, 30, 4.0, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_punch_hit_l")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_punch_hit_l")); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 14.0, 280, 35, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 15.0, 280, 35, 0, 30, 4.6, 3.4, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 14.0, 280, 35, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 15.0, 280, 35, 0, 30, 4.6, 3.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_punch_hit_l")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_punch_hit_l")); } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 14.0, 280, 35, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 15.0, 280, 35, 0, 30, 4.6, 3.2, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 14.0, 280, 35, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 15.0, 280, 35, 0, 30, 4.6, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_punch_hit_l")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_punch_hit_l")); } frame(lua_state, 23.0); if is_excute(agent) { @@ -61,30 +67,30 @@ unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("handl"), 1, 0, 0, 0, 0, 0, 0.5, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 7.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("mario_fb_shoot"), Hash40::new("mario_fb_shoot"), Hash40::new("handl"), 0.75, -1, 0, 0, -45, 0, 0.5, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mario_fb_shoot"), Hash40::new("mario_fb_shoot"), Hash40::new("haver"), 0.75, -1, 0, 0, -45, 0, 0.5, true, *EF_FLIP_YZ); } - frame(lua_state, 13.0); + frame(lua_state, 14.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("mario_fb_bullet_r"), Hash40::new("mario_fb_bullet_l"), Hash40::new("handl"), 0.75, -1, 0, 0, 0, 0, 0.4, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mario_fb_bullet_r"), Hash40::new("mario_fb_bullet_l"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.3, true, *EF_FLIP_YZ); } frame(lua_state, 17.0); - if is_excute(agent){ - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 0, 7, -1, -3, -11, -113, 1.1, true, *EF_FLIP_YZ); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 0, 7, -1, -3, -11, -113, 1.1, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 0.5); } frame(lua_state, 20.0); - if is_excute(agent){ + if is_excute(agent) { LAST_EFFECT_SET_RATE(agent, 1.0); } - frame(lua_state, 24.0); + frame(lua_state, 23.0); if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("mario_fb_shoot"), false, false); EFFECT_OFF_KIND(agent, Hash40::new("mario_fb_bullet_r"), false, false); EFFECT_OFF_KIND(agent, Hash40::new("mario_fb_bullet_l"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("mario_fb_shoot"), false, false); } } @@ -100,8 +106,8 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); FT_MOTION_RATE_RANGE(agent, 8.0, 13.0, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 8.0, 361, 110, 0, 19, 4.5, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 361, 110, 0, 19, 3.5, 3.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 8.0, 361, 100, 0, 20, 4.5, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 361, 100, 0, 20, 3.5, 3.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); @@ -141,8 +147,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 4.5); FT_MOTION_RATE_RANGE(agent, 4.5, 10.0, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 68, 84, 0, 30, 3.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 68, 84, 0, 30, 4.7, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 68, 92, 0, 30, 3.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 68, 92, 0, 30, 4.7, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 8.0); if is_excute(agent) { diff --git a/fighters/mario/src/acmd/ground.rs b/fighters/mario/src/acmd/ground.rs index a42d0f7914..d368c6534b 100644 --- a/fighters/mario/src/acmd/ground.rs +++ b/fighters/mario/src/acmd/ground.rs @@ -39,14 +39,10 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 2.0, 80, 100, 25, 0, 3.0, 1.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("bust"), 2.0, 80, 100, 25, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("bust"), 2.0, 80, 100, 25, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 2.0, 80, 100, 25, 0, 3.0, 1.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("armr"), 2.0, 80, 100, 25, 0, 4.0, 4.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 30, 0, 20, 2.5, 0.0, 3.3, 6.0, Some(0.0), Some(3.3), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - - AttackModule::set_add_reaction_frame(boma, 0, 1.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 1.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 1.0, false); } frame(lua_state, 4.0); if is_excute(agent) { @@ -78,16 +74,17 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { frame(lua_state, 2.0); FT_MOTION_RATE_RANGE(agent, 2.0, 2.5, 1.0); frame(lua_state, 2.5); - FT_MOTION_RATE_RANGE(agent, 2.5, 5.0, 5.0); + FT_MOTION_RATE_RANGE(agent, 2.5, 5.0, 4.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("legr"), 5.0, 361, 83, 0, 35, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("footr"), 5.0, 361, 83, 0, 35, 4.5, 0.4, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attack13(agent: &mut L2CAgentBase) { @@ -96,9 +93,10 @@ unsafe extern "C" fn effect_attack13(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 2.0); + frame(lua_state, 1.5); if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), -1, 8.5, 4.5, 0, -25, 80, 0.85, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 0.7); } } diff --git a/fighters/mario/src/acmd/other.rs b/fighters/mario/src/acmd/other.rs index 7c48a214fe..a5bb5f5c5e 100644 --- a/fighters/mario/src/acmd/other.rs +++ b/fighters/mario/src/acmd/other.rs @@ -76,19 +76,32 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn sound_jump(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + let rng = app::sv_math::rand(hash40("fighter"), 2); + if rng == 0 { + let handle = SoundModule::play_se(agent.module_accessor, Hash40::new("vc_mario_jump01"), false, false, false, false, enSEType(0)); //hooh + SoundModule::set_se_vol(agent.module_accessor, handle as i32, 0.45, 0); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_mario_jump01")); + } +} + unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -99,10 +112,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealsl(agent: &mut L2CAgentBase) { @@ -176,6 +186,9 @@ pub fn install(agent: &mut Agent) { agent.acmd("sound_dash", sound_dash, Priority::Low); agent.acmd("game_turndash", game_turndash, Priority::Low); + agent.acmd("sound_jumpfront", sound_jump, Priority::Low); + agent.acmd("sound_jumpback", sound_jump, Priority::Low); + agent.acmd("game_escapeair", game_escapeair, Priority::Low); agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); diff --git a/fighters/mario/src/acmd/smashes.rs b/fighters/mario/src/acmd/smashes.rs index 1ff67403a5..6ba8b4c26b 100644 --- a/fighters/mario/src/acmd/smashes.rs +++ b/fighters/mario/src/acmd/smashes.rs @@ -18,6 +18,22 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attacks4charge(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mario_fb_shoot"), Hash40::new("mario_fb_shoot"), Hash40::new("havel"), 1.5, 0, 0, 0, 0, 0, 0.5, true, *EF_FLIP_YZ); + frame(lua_state, 5.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 10, 0, 4, 0, 0, 0, false); + } + for _ in 0..i32::MAX { + wait(lua_state, 5.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("handl"), 2.0, 3, 0, 0, 0, 0, 1, 3, 3, 3, 0, 0, 0, true); + } + } +} + unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -29,8 +45,8 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); FT_MOTION_RATE_RANGE(agent, 9.0, 14.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("head"), 14.0, 83, 95, 0, 32, 4.5, 2.5, 1.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("bust"), 14.0, 83, 95, 0, 32, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("head"), 15.0, 83, 95, 0, 32, 4.5, 2.5, 1.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("bust"), 15.0, 83, 95, 0, 32, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); } frame(lua_state, 14.0); @@ -73,8 +89,8 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 361, 75, 0, 40, 4.5, 0.0, 3.6, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 361, 75, 0, 40, 3.5, 0.0, 3.6, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 361, 75, 0, 45, 4.5, 0.0, 3.6, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 361, 75, 0, 45, 3.5, 0.0, 3.6, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -83,8 +99,8 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 38, 75, 0, 35, 4.5, 0.0, 3.6, -11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 38, 75, 0, 35, 3.5, 0.0, 3.6, -6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 361, 75, 0, 40, 4.5, 0.0, 3.6, -11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 361, 75, 0, 40, 3.5, 0.0, 3.6, -6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -97,6 +113,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); agent.acmd("game_attacks4hi", game_attacks4, Priority::Low); agent.acmd("game_attacks4lw", game_attacks4, Priority::Low); + agent.acmd("effect_attacks4charge", effect_attacks4charge, Priority::Low); agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); agent.acmd("effect_attackhi4", effect_attackhi4, Priority::Low); diff --git a/fighters/mario/src/acmd/specials.rs b/fighters/mario/src/acmd/specials.rs index 22e8ea30aa..c9bb8fca3d 100644 --- a/fighters/mario/src/acmd/specials.rs +++ b/fighters/mario/src/acmd/specials.rs @@ -82,7 +82,10 @@ unsafe extern "C" fn game_specialnfire(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 14.0); if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(-0.5, 0.0, 0.0)); + if boma.is_situation(*SITUATION_KIND_AIR) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } + sv_kinetic_energy!(set_speed, agent, FIGHTER_KINETIC_ENERGY_ID_STOP, -0.75 * PostureModule::lr(boma)); ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 50, 101, 0, 52, 3.0, 0.0, 6.5, 4.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 50, 101, 0, 52, 5.0, 0.0, 7.5, 10.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } @@ -261,19 +264,19 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { else { EFFECT_FOLLOW(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, false); } - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.4, 0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.8, 0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.045, 0.345, 2.05); LAST_EFFECT_SET_ALPHA(agent, 0.55); LAST_EFFECT_SET_RATE(agent, 0.65); - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.4, 0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.8, 0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.045, 0.345, 2.05); LAST_EFFECT_SET_ALPHA(agent, 0.55); LAST_EFFECT_SET_RATE(agent, 0.65); - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.4, 0, 0, 180, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.8, 0, 0, 180, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.045, 0.345, 2.05); LAST_EFFECT_SET_ALPHA(agent, 0.55); LAST_EFFECT_SET_RATE(agent, 0.65); - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.4, 0, 0, 180, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.8, 0, 0, 180, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.045, 0.345, 2.05); LAST_EFFECT_SET_ALPHA(agent, 0.55); LAST_EFFECT_SET_RATE(agent, 0.65); @@ -281,13 +284,13 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { LAST_EFFECT_SET_ALPHA(agent, 0.5); EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.3, 9.0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.5, 9.0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.3, -9.0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.5, -9.0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.3, 4.5, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.5, 4.5, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.3, -4.5, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.5, -4.5, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); } } @@ -297,19 +300,19 @@ unsafe extern "C" fn effect_specialairs(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 9.5, 0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.5, 0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.045, 0.345, 2.05); LAST_EFFECT_SET_ALPHA(agent, 0.55); LAST_EFFECT_SET_RATE(agent, 0.45); - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 9.45, 0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.5, 0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.045, 0.345, 2.05); LAST_EFFECT_SET_ALPHA(agent, 0.55); LAST_EFFECT_SET_RATE(agent, 0.45); - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 9.5, 0, 0, 180, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.5, 0, 0, 180, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.045, 0.345, 2.05); LAST_EFFECT_SET_ALPHA(agent, 0.55); LAST_EFFECT_SET_RATE(agent, 0.45); - EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 9.45, 0, 0, 180, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("top"), 0, 10.5, 0, 0, 180, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.045, 0.345, 2.05); LAST_EFFECT_SET_ALPHA(agent, 0.55); LAST_EFFECT_SET_RATE(agent, 0.45); @@ -317,13 +320,13 @@ unsafe extern "C" fn effect_specialairs(agent: &mut L2CAgentBase) { LAST_EFFECT_SET_ALPHA(agent, 0.5); EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.3, 9.0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.5, 9.0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.3, -9.0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.5, -9.0, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.3, 4.5, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.5, 4.5, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.3, -4.5, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_starrod_splash"), Hash40::new("top"), 0, 9.5, -4.5, 0, 0, 0, 1.0, true); LAST_EFFECT_SET_ALPHA(agent, 0.5); } } @@ -363,8 +366,10 @@ unsafe extern "C" fn expression_specials(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let attr = if (WorkModule::is_flag(boma, *FIGHTER_MARIO_STATUS_SPECIAL_HI_FLAG_CAPPY)) { Hash40::new("collision_attr_mario_local_coin") } else { Hash40::new("collision_attr_coin") }; - let collision_sound_attr = if (WorkModule::is_flag(boma, *FIGHTER_MARIO_STATUS_SPECIAL_HI_FLAG_CAPPY)) { *COLLISION_SOUND_ATTR_MARIO_LOCAL_COIN } else { *COLLISION_SOUND_ATTR_COIN }; + let attr = if (WorkModule::is_flag(boma, *FIGHTER_MARIO_STATUS_SPECIAL_HI_FLAG_CAPPY)) + { Hash40::new("collision_attr_mario_local_coin") } else { Hash40::new("collision_attr_coin") }; + let collision_sound_attr = if (WorkModule::is_flag(boma, *FIGHTER_MARIO_STATUS_SPECIAL_HI_FLAG_CAPPY)) + { *COLLISION_SOUND_ATTR_MARIO_LOCAL_COIN } else { *COLLISION_SOUND_ATTR_COIN }; if is_excute(agent) { boma.select_cliff_hangdata_from_name("special_hi"); } @@ -398,9 +403,9 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); AttackModule::clear_all(boma); ATTACK(agent, 0, 0, Hash40::new("top"), 0.6, 60, 100, 180, 0, 3.0, 0.0, 4.5, 2.5, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, collision_sound_attr, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.6, 92, 100, 170, 0, 3.8, 0.0, 4.5, 7.5, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, collision_sound_attr, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.6, 97, 100, 170, 0, 3.8, 0.0, 4.5, 7.5, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, collision_sound_attr, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 0.6, 60, 100, 110, 0, 3.0, 0.0, 8.0, 2.5, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, collision_sound_attr, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 0.6, 92, 100, 110, 0, 3.0, 0.0, 8.0, 8.0, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, collision_sound_attr, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 0.6, 97, 100, 110, 0, 3.0, 0.0, 8.0, 8.0, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, collision_sound_attr, *ATTACK_REGION_PUNCH); AttackModule::set_no_finish_camera(boma, 0, true, false); AttackModule::set_no_finish_camera(boma, 1, true, false); AttackModule::set_no_finish_camera(boma, 2, true, false); @@ -409,7 +414,8 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - let sound_attr = if (WorkModule::is_flag(boma, *FIGHTER_MARIO_STATUS_SPECIAL_HI_FLAG_CAPPY)) { *COLLISION_SOUND_ATTR_MARIO_LOCAL_COIN_LAST } else { *COLLISION_SOUND_ATTR_MARIO_COIN_LAST }; + let sound_attr = if (WorkModule::is_flag(boma, *FIGHTER_MARIO_STATUS_SPECIAL_HI_FLAG_CAPPY)) + { *COLLISION_SOUND_ATTR_MARIO_LOCAL_COIN_LAST } else { *COLLISION_SOUND_ATTR_MARIO_COIN_LAST }; AttackModule::clear_all(boma); ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 60, 140, 0, 50, 8.75, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_L, sound_attr, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("hip"), 3.0, 60, 140, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_L, sound_attr, *ATTACK_REGION_PUNCH); @@ -441,7 +447,7 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 7.0); + frame(lua_state, 6.0); if is_excute(agent) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handl"), 0, -0.4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } @@ -466,7 +472,7 @@ unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mario_superjump_power"), Hash40::new("handl"), 0, 0, 0, 0, 0, 0, 1, true); } - frame(lua_state, 7.0); + frame(lua_state, 6.0); if is_excute(agent) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handl"), 0, -0.4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } @@ -574,7 +580,7 @@ unsafe extern "C" fn effect_groundpoundstart(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + // EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); } } diff --git a/fighters/mario/src/acmd/throws.rs b/fighters/mario/src/acmd/throws.rs index 49b58a603c..e37b0f121d 100644 --- a/fighters/mario/src/acmd/throws.rs +++ b/fighters/mario/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(-13.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -5.0, Some(0.0), Some(6.6), Some(-13.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -116,7 +115,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 90, 90, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 90, 95, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 17.0); @@ -136,25 +135,68 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 90, 95, 0, 58, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 90, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 17.0); + frame(lua_state, 0.0); + FT_MOTION_RATE_RANGE(agent, 0.0, 18.0, 15.0); + frame(lua_state, 18.0); + FT_MOTION_RATE_RANGE(agent, 18.0, 19.0, 3.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 4.0, 0.0); } - frame(lua_state, 18.0); + frame(lua_state, 19.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); } } +unsafe extern "C" fn effect_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 1); + } + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("throw"), 0, 6, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + wait(lua_state, 14.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_03")); + PLAY_SEQUENCE(agent, Hash40::new("seq_mario_rnd_attack")); + } + wait(lua_state, 4.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_down_l_01")); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("game_throwhi", game_throwhi, Priority::Low); + agent.acmd("game_throwlw", game_throwlw, Priority::Low); + agent.acmd("effect_throwlw", effect_throwlw, Priority::Low); + agent.acmd("sound_throwlw", sound_throwlw, Priority::Low); } diff --git a/fighters/mario/src/acmd/tilts.rs b/fighters/mario/src/acmd/tilts.rs index 1793609f4b..1dbf19f76c 100644 --- a/fighters/mario/src/acmd/tilts.rs +++ b/fighters/mario/src/acmd/tilts.rs @@ -90,20 +90,26 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 4.0, 4.0); - frame(lua_state, 4.0); + frame(lua_state, 4.0); //effectively frame 5 FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("head"), 8.0, 92, 100, 0, 40, 4.0, -0.5, -0.8, 0.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_coin"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_COIN, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("arml"), 8.0, 92, 100, 0, 40, 5.0, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_coin"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_COIN, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("arml"), 8.0, 92, 100, 0, 40, 5.0, 4.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_coin"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_COIN, *ATTACK_REGION_PUNCH); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_punch_hit_m")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_punch_hit_m")); + AttackModule::set_optional_hit_sound(boma, 2, Hash40::new("se_common_punch_hit_m")); } - frame(lua_state, 6.0); + wait(lua_state, 2.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("head"), 8.0, 92, 100, 0, 40, 4.0, -0.5, -0.8, 0.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_coin"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_COIN, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("arml"), 8.0, 92, 100, 0, 40, 4.0, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_coin"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_COIN, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("arml"), 8.0, 92, 100, 0, 40, 4.0, 4.0, -1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_coin"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_COIN, *ATTACK_REGION_PUNCH); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_punch_hit_m")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_punch_hit_m")); + AttackModule::set_optional_hit_sound(boma, 2, Hash40::new("se_common_punch_hit_m")); } - frame(lua_state, 11.0); + wait(lua_state, 5.0); FT_MOTION_RATE_RANGE(agent, 11.0, 30.0, 18.0); if is_excute(agent) { AttackModule::clear_all(boma); diff --git a/fighters/mario/src/fireball/acmd.rs b/fighters/mario/src/fireball/acmd.rs index 75bcf437bc..0f85c2a6e6 100644 --- a/fighters/mario/src/fireball/acmd.rs +++ b/fighters/mario/src/fireball/acmd.rs @@ -4,16 +4,16 @@ unsafe extern "C" fn game_regular(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 30, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIO_FIREBALL, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 30, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIO_FIREBALL, *ATTACK_REGION_NONE); AttackModule::enable_safe_pos(boma); } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 30, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIO_FIREBALL, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 30, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIO_FIREBALL, *ATTACK_REGION_NONE); } frame(lua_state, 30.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 30, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIO_FIREBALL, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 30, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIO_FIREBALL, *ATTACK_REGION_NONE); } } diff --git a/fighters/mario/src/lib.rs b/fighters/mario/src/lib.rs index 1a87764694..1312ceb790 100644 --- a/fighters/mario/src/lib.rs +++ b/fighters/mario/src/lib.rs @@ -38,6 +38,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/mario/src/opff.rs b/fighters/mario/src/opff.rs index e95403bcc7..8807160c38 100644 --- a/fighters/mario/src/opff.rs +++ b/fighters/mario/src/opff.rs @@ -7,6 +7,21 @@ extern "Rust" { fn gimmick_flash(boma: &mut BattleObjectModuleAccessor); } +// enables mario to cancel dash into long jump, similarly to how common dash can be cancelled into side special +unsafe fn dash_dspecial_cancel(fighter: &mut L2CFighterCommon) { + if !fighter.is_status(*FIGHTER_STATUS_KIND_DASH) { + return; + } + if StatusModule::is_changing(fighter.module_accessor) { + WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_LW); + return; + } + if fighter.global_table[PREV_STATUS_KIND] == FIGHTER_STATUS_KIND_RUN_BRAKE + && 0 < WorkModule::get_int(fighter.module_accessor, *FIGHTER_STATUS_DASH_WORK_INT_INVALID_ATTACK_ESCAPE_FRAME) { + WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_LW); + } +} + unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) @@ -21,6 +36,7 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { + dash_dspecial_cancel(fighter); fastfall_specials(fighter); } diff --git a/fighters/mario/src/status/special_lw.rs b/fighters/mario/src/status/special_lw.rs index 552c33f214..ad0c11edbb 100644 --- a/fighters/mario/src/status/special_lw.rs +++ b/fighters/mario/src/status/special_lw.rs @@ -59,6 +59,22 @@ unsafe extern "C" fn mario_special_lw_main(fighter: &mut L2CFighterCommon) -> L2 } unsafe extern "C" fn mario_special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + // uncomment to enable a limited b-reverse that allows approaching backwards with aerials but without crazy momentum mixups + // if fighter.status_frame() == 3 { + // let lr = PostureModule::lr(fighter.module_accessor); + // let turn_stick_x = fighter.get_param_float("common", "turn_stick_x"); + // let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + // if fighter.left_stick_x() * lr <= turn_stick_x // stick backwards + // && speed_x * lr >= 0.0 // but traveling forwards + // && !fighter.is_prev_status_one_of(&[ // except during the self-cancel + // *FIGHTER_STATUS_KIND_SPECIAL_LW, + // *FIGHTER_MARIO_STATUS_KIND_SPECIAL_LW_CHARGE, + // *FIGHTER_MARIO_STATUS_KIND_SPECIAL_LW_SHOOT + // ]) { + // PostureModule::reverse_lr(fighter.module_accessor); + // PostureModule::update_rot_y_lr(fighter.module_accessor); + // } + // } if MotionModule::is_end(fighter.module_accessor) { fighter.change_status(FIGHTER_MARIO_STATUS_KIND_SPECIAL_LW_SHOOT.into(), true.into()); return false.into(); diff --git a/fighters/mario/src/status/special_n.rs b/fighters/mario/src/status/special_n.rs index a3723e6800..abf4c6b62a 100644 --- a/fighters/mario/src/status/special_n.rs +++ b/fighters/mario/src/status/special_n.rs @@ -24,7 +24,7 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV return 1.into(); } } - if fighter.status_frame() == 10 && (ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL_RAW)) { + if fighter.check_hold_input(0, 10, Buttons::SpecialAll) { VarModule::on_flag(fighter.object(), vars::mario::status::SPECIAL_N_FIREBRAND); let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("special_n_fire") } else { Hash40::new("special_air_n_fire") }; MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); diff --git a/fighters/mario/src/status/special_s.rs b/fighters/mario/src/status/special_s.rs index 350f80e7de..7459c89507 100644 --- a/fighters/mario/src/status/special_s.rs +++ b/fighters/mario/src/status/special_s.rs @@ -2,7 +2,6 @@ use super::*; unsafe extern "C" fn special_s_kinetic_helper(fighter: &mut L2CFighterCommon) { let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); @@ -23,7 +22,6 @@ unsafe extern "C" fn special_s_kinetic_helper(fighter: &mut L2CFighterCommon) { sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable, 0.0); sv_kinetic_energy!(controller_set_accel_x_add, fighter, air_accel_x_add); sv_kinetic_energy!(controller_set_accel_x_mul, fighter, air_accel_x_mul); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, speed_x); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); // FIGHTER_KINETIC_ENERGY_ID_STOP @@ -33,9 +31,8 @@ unsafe extern "C" fn special_s_kinetic_helper(fighter: &mut L2CFighterCommon) { // FIGHTER_KINETIC_ENERGY_ID_GRAVITY let special_s_attack_acl_y = fighter.get_param_float("param_special_s", "special_s_attack_acl_y"); - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, speed_y, 0.0, 0.0, 0.0); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -special_s_attack_acl_y * 0.2); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); } KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_MOTION, fighter.module_accessor); @@ -158,6 +155,10 @@ unsafe extern "C" fn special_s_exec(fighter: &mut L2CFighterCommon) -> L2CValue } else { KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); if fighter.is_flag(*FIGHTER_MARIO_STATUS_SPECIAL_S_FLAG_SPECIAL_FALL) { + let air_speed_x_stable = fighter.get_param_float("air_speed_x_stable", ""); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable, 0.0); + let air_accel_y = fighter.get_param_float("air_accel_y", ""); let air_speed_y_stable = fighter.get_param_float("air_speed_y_stable", ""); sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y); diff --git a/fighters/mariod/Cargo.toml b/fighters/mariod/Cargo.toml index 41b8f3a69f..a8c8f03a62 100644 --- a/fighters/mariod/Cargo.toml +++ b/fighters/mariod/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/mariod/src/acmd/aerials.rs b/fighters/mariod/src/acmd/aerials.rs index 84773fbc35..3305016f49 100644 --- a/fighters/mariod/src/acmd/aerials.rs +++ b/fighters/mariod/src/acmd/aerials.rs @@ -72,13 +72,13 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 16.0, 50, 100, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 17.0, 50, 100, 0, 30, 4.0, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 16.0, 50, 100, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 17.0, 50, 100, 0, 30, 4.0, 3.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 16.0, 50, 100, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 17.0, 50, 100, 0, 30, 4.6, 3.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 16.0, 50, 100, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 17.0, 50, 100, 0, 30, 4.6, 3.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 22.0); if is_excute(agent) { @@ -95,18 +95,16 @@ unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("handl"), 1, 0, 0, 0, 0, 0, 0.5, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handl"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 7.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_aura"), Hash40::new("mariod_smash_aura"), Hash40::new("handl"), -1.5, 0, 0, 0, 0, 0, 0.5, true, *EF_FLIP_YZ); - } - frame(lua_state, 15.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_impact"), Hash40::new("mariod_smash_impact"), Hash40::new("handl"), 1.0, 0, 0, 0, 0, 0, 0.3, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_aura"), Hash40::new("mariod_smash_aura"), Hash40::new("handl"), -1.5, 0, 0, 0, 0, 0, 0.3, true, *EF_FLIP_YZ); } frame(lua_state, 17.0); if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_impact"), Hash40::new("mariod_smash_impact"), Hash40::new("handl"), 0, 0, 0, 0, 0, 0, 0.3, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 0.7); EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 0, 7, 0, -3, -20, -113, 1.1, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 0.5); } @@ -131,14 +129,14 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 6.0, 8.0, 3.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 35, 70, 0, 40, 4.7, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 13.0, 38, 112, 0, 25, 3.7, 5.5, 0.0, 1.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 38, 70, 0, 40, 4.7, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 13.0, 38, 102, 0, 35, 3.7, 5.5, 0.0, 1.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 8.0); FT_MOTION_RATE_RANGE(agent, 8.0, 13.0, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 361, 100, 0, 20, 4.5, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 361, 100, 0, 20, 3.5, 3.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 7.0, 361, 100, 0, 20, 4.5, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 361, 100, 0, 20, 3.5, 3.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); @@ -183,8 +181,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 4.5); FT_MOTION_RATE_RANGE(agent, 4.5, 10.0, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 54, 85, 0, 25, 3.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 54, 85, 0, 25, 4.7, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 55, 85, 0, 25, 3.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 55, 85, 0, 25, 4.7, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 8.0); if is_excute(agent) { @@ -225,7 +223,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneer"), 15.0, 270, 76, 0, 0, 5.0, 3.25, 0.0, 1.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 15.0, 361, 82, 0, 14, 4.0, 0.0 , 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 12.0, 361, 92, 0, 14, 4.0, 0.0 , 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 3.0); if is_excute(agent) { diff --git a/fighters/mariod/src/acmd/ground.rs b/fighters/mariod/src/acmd/ground.rs index bb38117c50..7bca9e8ba5 100644 --- a/fighters/mariod/src/acmd/ground.rs +++ b/fighters/mariod/src/acmd/ground.rs @@ -74,16 +74,17 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { frame(lua_state, 2.0); FT_MOTION_RATE_RANGE(agent, 2.0, 2.5, 1.0); frame(lua_state, 2.5); - FT_MOTION_RATE_RANGE(agent, 2.5, 5.0, 5.0); + FT_MOTION_RATE_RANGE(agent, 2.5, 5.0, 3.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 361, 83, 0, 45, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("footr"), 6.0, 361, 83, 0, 45, 4.5, 0.4, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attack13(agent: &mut L2CAgentBase) { @@ -92,9 +93,10 @@ unsafe extern "C" fn effect_attack13(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 2.0); + frame(lua_state, 1.5); if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), -1, 8.5, 4.5, 0, -25, 80, 0.85, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 0.7); } } diff --git a/fighters/mariod/src/acmd/other.rs b/fighters/mariod/src/acmd/other.rs index 776c9e7de7..6dfdd41bdc 100644 --- a/fighters/mariod/src/acmd/other.rs +++ b/fighters/mariod/src/acmd/other.rs @@ -67,19 +67,32 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn sound_jump(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + let rng = app::sv_math::rand(hash40("fighter"), 2); + if rng == 0 { + let handle = SoundModule::play_se(agent.module_accessor, Hash40::new("vc_mariod_jump01"), false, false, false, false, enSEType(0)); //hooh + SoundModule::set_se_vol(agent.module_accessor, handle as i32, 0.70, 0); + } + } + wait(lua_state, 1.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_mariod_jump01")); + } +} + unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -90,9 +103,46 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); + +} + +unsafe extern "C" fn game_appealsl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ArticleModule::generate_article_enable(boma, *FIGHTER_MARIOD_GENERATE_ARTICLE_DRCAPSULE, false, -1); + } + frame(lua_state, 23.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("havel"), 3.0, 361, 30, 0, 20, 1.5, 1.5, 0.0, 0.0, Some(-1.5), Some(0.0), Some(0.0), 1.25, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIOD_CAPSULE, *ATTACK_REGION_NONE); + } + frame(lua_state, 49.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 78.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + ArticleModule::remove_exist(boma, *FIGHTER_MARIOD_GENERATE_ARTICLE_DRCAPSULE, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } +} + +unsafe extern "C" fn game_appealsr(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ArticleModule::generate_article_enable(boma, *FIGHTER_MARIOD_GENERATE_ARTICLE_DRCAPSULE, false, -1); + } + frame(lua_state, 23.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("havel"), 3.0, 361, 30, 0, 20, 1.5, 1.5, 0.0, 0.0, Some(-1.5), Some(0.0), Some(0.0), 1.25, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIOD_CAPSULE, *ATTACK_REGION_NONE); + } + frame(lua_state, 49.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 78.0); + if is_excute(agent) { + ArticleModule::remove_exist(boma, *FIGHTER_MARIOD_GENERATE_ARTICLE_DRCAPSULE, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); } } @@ -108,6 +158,12 @@ pub fn install(agent: &mut Agent) { agent.acmd("sound_dash", sound_dash, Priority::Low); agent.acmd("game_turndash", game_turndash, Priority::Low); + agent.acmd("sound_jumpfront", sound_jump, Priority::Low); + agent.acmd("sound_jumpback", sound_jump, Priority::Low); + agent.acmd("game_escapeair", game_escapeair, Priority::Low); agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); + + agent.acmd("game_appealsl", game_appealsl, Priority::Low); + agent.acmd("game_appealsr", game_appealsr, Priority::Low); } diff --git a/fighters/mariod/src/acmd/smashes.rs b/fighters/mariod/src/acmd/smashes.rs index a5a85f4748..8c5b089855 100644 --- a/fighters/mariod/src/acmd/smashes.rs +++ b/fighters/mariod/src/acmd/smashes.rs @@ -9,9 +9,8 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 16.0, 361, 95, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 16.0, 361, 95, 0, 25, 2.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 20.0, 361, 95, 0, 25, 5.0, 4.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("arml"), 16.0, 361, 95, 0, 25, 3.5, -2.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 20.0, 361, 95, 0, 25, 5.0, 4.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_PUNCH); } wait(lua_state, 3.0); if is_excute(agent) { @@ -57,21 +56,6 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_attacks4hi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 15.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 16.0, 361, 95, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 16.0, 361, 95, 0, 25, 2.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 20.0, 361, 95, 0, 25, 5.0, 4.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 3.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - unsafe extern "C" fn effect_attacks4hi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -110,25 +94,6 @@ unsafe extern "C" fn effect_attacks4hi(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_attacks4lw(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 6.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); - } - frame(lua_state, 15.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 16.0, 361, 95, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 16.0, 361, 95, 0, 25, 2.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 20.0, 361, 95, 0, 25, 5.0, 4.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 3.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - unsafe extern "C" fn effect_attacks4lw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -191,10 +156,10 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, late_hit_frame); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("head"), 15.0, 259, 84, 0, 37, 4.7, 2.5, 1.1, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("bust"), 15.0, 259, 84, 0, 37, 3.5, 1.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("head"), 15.0, 76, 84, 0, 37, 4.7, 2.5, 1.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 3, 0, Hash40::new("bust"), 15.0, 76, 84, 0, 37, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("head"), 15.0, 259, 69, 0, 39, 4.7, 2.5, 1.1, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("bust"), 15.0, 259, 69, 0, 39, 3.5, 1.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("head"), 15.0, 76, 69, 0, 39, 4.7, 2.5, 1.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 3, 0, Hash40::new("bust"), 15.0, 76, 69, 0, 39, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } frame(lua_state, attack_end_frame); if is_excute(agent) { @@ -247,6 +212,22 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackhi4charge(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_aura"), Hash40::new("mariod_smash_aura"), Hash40::new("head"), 0, 0, 0, 0, 0, 0, 0.3, true, *EF_FLIP_YZ); + frame(lua_state, 5.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 10, 0, 4, 0, 0, 0, false); + } + for _ in 0..i32::MAX { + wait(lua_state, 5.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("head"), 2.0, 0, -2.5, 0, 0, 0, 1, 4, 4, 4, 0, 0, 0, true); + } + } +} + unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -256,7 +237,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 361, 75, 0, 45, 4.5, 0.0, 3.6, 12.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 361, 75, 0, 45, 4.7, 0.0, 3.6, 12.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 361, 75, 0, 45, 3.5, 0.0, 3.6, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } @@ -266,7 +247,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 38, 75, 0, 40, 4.5, 0.0, 3.6, -11.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 38, 75, 0, 40, 4.7, 0.0, 3.6, -11.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 38, 75, 0, 40, 3.5, 0.0, 3.6, -6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } @@ -280,7 +261,7 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("toel"), 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("hip"), -2, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 4.0); if is_excute(agent) { @@ -317,17 +298,35 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attacklw4charge(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_aura"), Hash40::new("mariod_smash_aura"), Hash40::new("toer"), 0, 0, 0, 0, 0, 0, 0.3, true, *EF_FLIP_YZ); + frame(lua_state, 5.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, -2, 0, 0, 0, 1, 4, 0, 10, 0, 0, 0, true); + } + for _ in 0..i32::MAX { + wait(lua_state, 5.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("toer"), 0, 0, -2, 0, 0, 0, 1, 3, 3, 3, 0, 0, 0, false); + } + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); agent.acmd("effect_attacks4", effect_attacks4, Priority::Low); - agent.acmd("game_attacks4hi", game_attacks4hi, Priority::Low); + agent.acmd("game_attacks4hi", game_attacks4, Priority::Low); agent.acmd("effect_attacks4hi", effect_attacks4hi, Priority::Low); - agent.acmd("game_attacks4lw", game_attacks4lw, Priority::Low); + agent.acmd("game_attacks4lw", game_attacks4, Priority::Low); agent.acmd("effect_attacks4lw", effect_attacks4lw, Priority::Low); agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); agent.acmd("effect_attackhi4", effect_attackhi4, Priority::Low); + agent.acmd("effect_attackhi4charge", effect_attackhi4charge, Priority::Low); agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); agent.acmd("effect_attacklw4", effect_attacklw4, Priority::Low); + agent.acmd("effect_attacklw4charge", effect_attacklw4charge, Priority::Low); } \ No newline at end of file diff --git a/fighters/mariod/src/acmd/specials.rs b/fighters/mariod/src/acmd/specials.rs index 8961d83e0e..37954db62c 100644 --- a/fighters/mariod/src/acmd/specials.rs +++ b/fighters/mariod/src/acmd/specials.rs @@ -24,7 +24,6 @@ unsafe extern "C" fn effect_specialn(agent: &mut L2CAgentBase) { frame(lua_state, 15.0); if is_excute(agent) { EFFECT_FLIP(agent, Hash40::new("mariod_capsule_shoot"), Hash40::new("mariod_capsule_shoot"), Hash40::new("top"), -1, 8, 11, 0, 0, 0, 0.46, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); - EFFECT_FLIP(agent, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), -1, 8, 11, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); if agent.is_situation(*SITUATION_KIND_GROUND) { LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -1, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); } @@ -74,7 +73,6 @@ unsafe extern "C" fn effect_specialnchill(agent: &mut L2CAgentBase) { LAST_EFFECT_SET_RATE(agent, 0.75); EffectModule::enable_sync_init_pos_last(boma); EFFECT_FLIP(agent, Hash40::new("mariod_capsule_shoot"), Hash40::new("mariod_capsule_shoot"), Hash40::new("top"), 0, 4, 7, 0, 0, 0, 0.46, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); - EFFECT_FLIP(agent, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 4, 7, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); if agent.is_situation(*SITUATION_KIND_GROUND) { EFFECT_FOLLOW(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 0.2, 0.2); @@ -331,7 +329,7 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handl"), 1.2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_aura"), Hash40::new("mariod_smash_aura"), Hash40::new("havel"), -1.5, 0, 0, 0, 0, 0, 0.5, true, *EF_FLIP_YZ); } - frame(lua_state, 3.0); + frame(lua_state, 4.0); if is_excute(agent) { if PostureModule::lr(boma) > 0.0 { EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mariod_superjump_fnish"), Hash40::new("handl"), 2.5, 0, 1, 0, 0, 0, 1.05, true); @@ -339,7 +337,7 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { else{ EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mariod_superjump_fnish"), Hash40::new("handl"), 2.5, 1, 0, 0, 0, 0, 1.05, true); } - EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_impact"), Hash40::new("mariod_smash_impact"), Hash40::new("havel"), 1.0, 0, 0, 0, 0, 0, 0.5, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_impact"), Hash40::new("mariod_smash_impact"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 0.5, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 0.75); EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mariod_superjump_power"), Hash40::new("handl"), 1.2, 0, 0, 0, 0, 0, 1.45, true); LAST_EFFECT_SET_RATE(agent, 2.0); @@ -347,9 +345,6 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { EFFECT_DETACH_KIND(agent, Hash40::new("mariod_superjump_fnish"), -1); - } - frame(lua_state, 7.0); - if is_excute(agent) { EFFECT_DETACH_KIND(agent, Hash40::new("mariod_smash_impact"), -1); EFFECT_DETACH_KIND(agent, Hash40::new("mariod_smash_aura"), -1); } @@ -367,13 +362,13 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { boma.select_cliff_hangdata_from_name("special_hi"); } - frame(lua_state, 3.0); + frame(lua_state, 4.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_REVERSE_LR); ATTACK(agent, 0, 1, Hash40::new("top"), 14.0, 50, 89, 0, 33, 6.0, 0.0, 6.0, 9.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); } - frame(lua_state, 4.0); + frame(lua_state, 5.0); if is_excute(agent) { if boma.is_stick_backward() { PostureModule::reverse_lr(boma); @@ -383,10 +378,10 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); - ATTACK(agent, 0, 1, Hash40::new("top"), 7.0, 74, 66, 0, 64, 4.0, 0.0, 6.5, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 1.0); if is_excute(agent) { + ATTACK(agent, 0, 1, Hash40::new("top"), 7.0, 74, 66, 0, 64, 4.0, 0.0, 6.5, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); SA_SET(agent, *SITUATION_KIND_AIR); } frame(lua_state, 20.0); @@ -412,15 +407,15 @@ unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handl"), 1.2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_aura"), Hash40::new("mariod_smash_aura"), Hash40::new("havel"), -1.5, 0, 0, 0, 0, 0, 0.5, true, *EF_FLIP_YZ); } - frame(lua_state, 3.0); + frame(lua_state, 4.0); if is_excute(agent) { - if PostureModule::lr(boma) > 0.0{ + if PostureModule::lr(boma) > 0.0 { EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mariod_superjump_fnish"), Hash40::new("handl"), 2.5, 0, 1, 0, 0, 0, 1.05, true); } else{ EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mariod_superjump_fnish"), Hash40::new("handl"), 2.5, 1, 0, 0, 0, 0, 1.05, true); } - EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_impact"), Hash40::new("mariod_smash_impact"), Hash40::new("havel"), 1.0, 0, 0, 0, 0, 0, 0.5, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mariod_smash_impact"), Hash40::new("mariod_smash_impact"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 0.5, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 0.75); EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mariod_superjump_power"), Hash40::new("handl"), 1.2, 0, 0, 0, 0, 0, 1.45, true); LAST_EFFECT_SET_RATE(agent, 2.0); @@ -428,9 +423,6 @@ unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { EFFECT_DETACH_KIND(agent, Hash40::new("mariod_superjump_fnish"), -1); - } - frame(lua_state, 7.0); - if is_excute(agent) { EFFECT_DETACH_KIND(agent, Hash40::new("mariod_smash_impact"), -1); EFFECT_DETACH_KIND(agent, Hash40::new("mariod_smash_aura"), -1); } @@ -467,11 +459,11 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0.0); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.6, 90, 100, 80, 0, 4.0, 0.0, 3.2, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 4, 0, Hash40::new("top"), 1.6, 105, 100, 45, 0, 4.5, 0.0, 9.0, -6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 0, 0, Hash40::new("top"), 1.6, 366, 100, 15, 0, 4.5, 0.0, 9.0, -6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.6, 105, 100, 45, 0, 4.5, 0.0, 9.0, 6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.6, 366, 100, 15, 0, 4.5, 0.0, 9.0, 6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.8, 90, 100, 80, 0, 4.0, 0.0, 3.2, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 4, 0, Hash40::new("top"), 1.8, 105, 100, 45, 0, 4.5, 0.0, 9.0, -6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 366, 100, 15, 0, 4.5, 0.0, 9.0, -6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.8, 105, 100, 45, 0, 4.5, 0.0, 9.0, 6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 366, 100, 15, 0, 4.5, 0.0, 9.0, 6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } frame(lua_state, 31.0); if is_excute(agent) { @@ -484,8 +476,8 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { } frame(lua_state, 40.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 46, 154, 0, 80, 6.0, 0.0, 12.0, 6.0, Some(0.0), Some(12.0), Some(-6.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 46, 154, 0, 80, 5.5, 0.0, 4.0, 2.5, Some(0.0), Some(4.0), Some(-2.5), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 45, 154, 0, 80, 6.0, 0.0, 12.0, 6.0, Some(0.0), Some(12.0), Some(-6.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 45, 154, 0, 80, 5.5, 0.0, 4.0, 2.5, Some(0.0), Some(4.0), Some(-2.5), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } wait(lua_state, 2.0); if is_excute(agent) { @@ -556,11 +548,11 @@ unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0.0); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.6, 90, 100, 80, 0, 4.0, 0.0, 3.2, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 4, 0, Hash40::new("top"), 1.6, 105, 100, 45, 0, 4.5, 0.0, 9.0, -6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 0, 0, Hash40::new("top"), 1.6, 366, 100, 15, 0, 4.5, 0.0, 9.0, -6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.6, 105, 100, 45, 0, 4.5, 0.0, 9.0, 6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.6, 366, 100, 15, 0, 4.5, 0.0, 9.0, 6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.8, 90, 100, 80, 0, 4.0, 0.0, 3.2, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 4, 0, Hash40::new("top"), 1.8, 105, 100, 45, 0, 4.5, 0.0, 9.0, -6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 366, 100, 15, 0, 4.5, 0.0, 9.0, -6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.8, 105, 100, 45, 0, 4.5, 0.0, 9.0, 6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 366, 100, 15, 0, 4.5, 0.0, 9.0, 6.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } frame(lua_state, 31.0); if is_excute(agent) { @@ -574,8 +566,8 @@ unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 40.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 46, 154, 0, 80, 6.0, 0.0, 12.0, 6.0, Some(0.0), Some(12.0), Some(-6.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 46, 154, 0, 80, 5.5, 0.0, 4.0, 2.5, Some(0.0), Some(4.0), Some(-2.5), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 45, 154, 0, 80, 6.0, 0.0, 12.0, 6.0, Some(0.0), Some(12.0), Some(-6.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 45, 154, 0, 80, 5.5, 0.0, 4.0, 2.5, Some(0.0), Some(4.0), Some(-2.5), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/mariod/src/acmd/throws.rs b/fighters/mariod/src/acmd/throws.rs index cbf979f777..5a05c08d78 100644 --- a/fighters/mariod/src/acmd/throws.rs +++ b/fighters/mariod/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.6, 4.3, Some(0.0), Some(6.6), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.6, 4.3, Some(0.0), Some(6.6), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-14.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 6.6, -5.3, Some(0.0), Some(6.6), Some(-14.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -67,7 +66,7 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 48, 60, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 48, 54, 0, 51, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 12.0); @@ -136,19 +135,56 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 85, 42, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 85, 37, 0, 76, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 17.0); + frame(lua_state, 0.0); + FT_MOTION_RATE_RANGE(agent, 0.0, 18.0, 15.0); + frame(lua_state, 18.0); + FT_MOTION_RATE_RANGE(agent, 18.0, 19.0, 2.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 2.0, 0.0); } - frame(lua_state, 18.0); + frame(lua_state, 19.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); } } +unsafe extern "C" fn effect_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 1); + } + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("throw"), 0, 6, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + wait(lua_state, 14.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_03")); + PLAY_SEQUENCE(agent, Hash40::new("seq_mariod_rnd_attack")); + } + wait(lua_state, 4.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_down_l_01")); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); @@ -161,4 +197,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); + agent.acmd("effect_throwlw", effect_throwlw, Priority::Low); + agent.acmd("sound_throwlw", sound_throwlw, Priority::Low); } diff --git a/fighters/mariod/src/acmd/tilts.rs b/fighters/mariod/src/acmd/tilts.rs index 15252244c3..2623e65b30 100644 --- a/fighters/mariod/src/acmd/tilts.rs +++ b/fighters/mariod/src/acmd/tilts.rs @@ -88,19 +88,17 @@ unsafe extern "C" fn effect_attacks3lw(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 4.0); // effectively frame 5 - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 5.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("head"), 9.0, 84, 85, 0, 50, 4.0, -0.5, -0.8, 0.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 9.0, 84, 85, 0, 50, 5.0, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 9.0, 84, 85, 0, 50, 5.0, 4.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 84, 85, 0, 50, 5.0, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handr"), 9.0, 84, 85, 0, 50, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 2.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("head"), 9.0, 84, 85, 0, 50, 4.0, -0.5, -0.8, 0.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 9.0, 84, 85, 0, 50, 4.0, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 9.0, 84, 85, 0, 50, 4.0, 4.0, -1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 84, 85, 0, 50, 4.0, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 9.0, 84, 85, 0, 50, 4.0, 4.0, -1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 5.0); if is_excute(agent) { @@ -111,11 +109,11 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 4.0); + frame(lua_state, 5.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_c"), Hash40::new("sys_attack_arc_c"), Hash40::new("top"), 2, 11, 2, -12, 16, 95, 0.9, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_c"), Hash40::new("sys_attack_arc_c"), Hash40::new("top"), 6.4, 9.8, 3.4, -12, 16, 95, 0.9, true, *EF_FLIP_YZ); } - frame(lua_state, 24.0); + frame(lua_state, 25.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke_s"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); } @@ -151,9 +149,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 120, 70, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 120, 70, 0, 40, 3.2, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 120, 70, 0, 40, 4.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 120, 70, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 120, 70, 0, 40, 3.2, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 120, 70, 0, 40, 4.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 4.0); @@ -168,7 +166,7 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 4.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 3, 0, -3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), -2, 3, 4, -1, 12, -172, 0.95, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), -2, 3, 4, -1, 12, 8, 0.95, true, *EF_FLIP_YZ); } frame(lua_state, 10.0); if is_excute(agent) { diff --git a/fighters/mariod/src/drcapsule/acmd.rs b/fighters/mariod/src/drcapsule/acmd.rs index a4b7003f94..fbb5d76f09 100644 --- a/fighters/mariod/src/drcapsule/acmd.rs +++ b/fighters/mariod/src/drcapsule/acmd.rs @@ -4,12 +4,12 @@ unsafe extern "C" fn game_regular(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 65, 30, 0, 50, 1.7, 0.0, 1.7, 0.0, Some(0.0), Some(-1.7), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2.5, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIOD_CAPSULE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 65, 27, 0, 50, 1.7, 0.0, 1.7, 0.0, Some(0.0), Some(-1.7), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIOD_CAPSULE, *ATTACK_REGION_NONE); AttackModule::enable_safe_pos(boma); } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 65, 30, 0, 50, 1.7, 0.0, 1.7, 0.0, Some(0.0), Some(-1.7), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2.5, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIOD_CAPSULE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 65, 27, 0, 50, 1.7, 0.0, 1.7, 0.0, Some(0.0), Some(-1.7), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARIOD_CAPSULE, *ATTACK_REGION_NONE); } } diff --git a/fighters/mariod/src/lib.rs b/fighters/mariod/src/lib.rs index fc14fb8aae..fe2026846e 100644 --- a/fighters/mariod/src/lib.rs +++ b/fighters/mariod/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/mariod/src/status/special_n.rs b/fighters/mariod/src/status/special_n.rs index 80ba00f70b..792d64fe82 100644 --- a/fighters/mariod/src/status/special_n.rs +++ b/fighters/mariod/src/status/special_n.rs @@ -24,7 +24,7 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV return 1.into(); } } - if fighter.status_frame() == 10 && (ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL_RAW)) { + if fighter.check_hold_input(0, 10, Buttons::SpecialAll) { VarModule::on_flag(fighter.object(), vars::mariod::status::SPECIAL_N_CHILL_PILL); let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("special_n_chill") } else { Hash40::new("special_air_n_chill") }; MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); diff --git a/fighters/marth/Cargo.toml b/fighters/marth/Cargo.toml index 1698a5ca71..1a94d7443a 100644 --- a/fighters/marth/Cargo.toml +++ b/fighters/marth/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/marth/src/acmd/aerials.rs b/fighters/marth/src/acmd/aerials.rs index 7440db7af8..229e3d7fac 100644 --- a/fighters/marth/src/acmd/aerials.rs +++ b/fighters/marth/src/acmd/aerials.rs @@ -9,18 +9,10 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - // Ground-only hitboxes - ATTACK(agent, 0, 0, Hash40::new("sword2"), 4.0, 90, 50, 0, 40, 3.5, 0.0, -1.0, 6.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 4.0, 100, 50, 0, 50, 4.0, 0.0, -1.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 4.0, 100, 50, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("hip"), 4.0, 100, 50, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - // Air-only hitboxes - ATTACK(agent, 4, 0, Hash40::new("sword2"), 4.0, 90, 50, 0, 40, 3.5, 0.0, -1.0, 6.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("sword2"), 4.0, 100, 50, 0, 40, 4.0, 0.0, -1.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 6, 0, Hash40::new("armr"), 4.0, 100, 50, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 7, 0, Hash40::new("hip"), 4.0, 100, 50, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - //ATK_SET_SHIELD_SETOFF_MUL_arg5(agent, 0, 1, 2, 3, 0.1); - //ATK_SET_SHIELD_SETOFF_MUL(agent, 4, 0.1); + ATTACK(agent, 0, 0, Hash40::new("bust"), 4.0, 100, 50, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 4.0, 100, 50, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 4.0, 90, 50, 0, 50, 3.5, 0.0, -1.0, 6.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 4.0, 100, 50, 0, 40, 4.0, 0.0, -1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -28,10 +20,10 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 361, 80, 0, 50, 4.0, 0.0, -1.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 80, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 10.0, 361, 80, 0, 50, 4.0, 0.0, -1.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("hip"), 10.0, 361, 80, 0, 55, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("bust"), 10.0, 361, 80, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 80, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 361, 80, 0, 42, 4.0, 0.0, -1.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 10.0, 361, 80, 0, 45, 4.0, 0.0, -1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 7.0); if is_excute(agent) { @@ -46,7 +38,7 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 4.0); + frame(lua_state, 5.0); if is_excute(agent) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_marth_sword_hdr"), Hash40::new("tex_marth_sword2"), 8, Hash40::new("sword1"), 0, 0, 0.5, Hash40::new("sword1"), -0.0, -0.0, 12.6, true, Hash40::new("marth_sword_blue"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } @@ -76,7 +68,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 6.0); // f5 if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 361, 70, 0, 30, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 361, 70, 0, 30, 4.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("claviclec"), 9.0, 361, 70, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 67, 70, 0, 42, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } @@ -115,7 +107,7 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 361, 70, 0, 30, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 361, 70, 0, 30, 4.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("claviclec"), 9.0, 361, 70, 0, 25, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 361, 70, 0, 30, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } @@ -123,6 +115,7 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 10.0, 18.0, 2.0); frame(lua_state, 18.0); FT_MOTION_RATE_RANGE(agent, 18.0, 23.0, 16.0); + frame(lua_state, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -156,9 +149,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); FT_MOTION_RATE_RANGE(agent, 5.0, 13.0, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 13.0, 90, 70, 0, 45, 3.5, 1.5, 0.0, 6.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 10.0, 80, 70, 0, 30, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("claviclec"), 9.0, 80, 70, 0, 18, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("claviclec"), 10.0, 80, 70, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 13.0, 90, 70, 0, 40, 3.0, 1.5, 0.0, 7.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 10.0, 80, 70, 0, 30, 3.5, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); @@ -191,11 +184,16 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 5.25, 1.0); + frame(lua_state, 5.25); + FT_MOTION_RATE_RANGE(agent, 5.25, 6.0, 1.0); frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 13.0, 290, 54, 0, 32, 3.5, 1.5, 0.0, 6.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 10.0, 80, 70, 0, 40, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 9.0, 361, 70, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 10.0, 80, 70, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 13.0, 290, 54, 0, 32, 3.0, 1.5, 0.0, 7.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 10.0, 80, 70, 0, 40, 3.5, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 10.0); if is_excute(agent) { diff --git a/fighters/marth/src/acmd/ground.rs b/fighters/marth/src/acmd/ground.rs index d8cdb72db9..f557c96ffa 100644 --- a/fighters/marth/src/acmd/ground.rs +++ b/fighters/marth/src/acmd/ground.rs @@ -3,9 +3,13 @@ use super::*; unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 2.0, 3.0); + frame(lua_state, 2.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 3.0, 78, 30, 0, 55, 4.0, 0.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 3.0, 78, 30, 0, 55, 4.0, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 3.0, 65, 30, 0, 55, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword2"), 5.0, 90, 30, 0, 55, 4.0, 0.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } @@ -55,7 +59,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 4.0, 45, 75, 0, 62, 3.5, 0.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 4.0, 45, 75, 0, 62, 3.5, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 4.0, 45, 75, 0, 62, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword2"), 6.0, 45, 75, 0, 62, 4.5, 0.0, 0.0, 5.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } @@ -84,9 +88,9 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 110, 55, 0, 70, 4.0, 0.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 361, 60, 0, 35, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 110, 55, 0, 70, 4.0, 0.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 110, 55, 0, 70, 4.0, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 45, 60, 0, 35, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 110, 55, 0, 70, 4.0, 0.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } frame(lua_state, 17.0); if is_excute(agent) { diff --git a/fighters/marth/src/acmd/other.rs b/fighters/marth/src/acmd/other.rs index 2310140c1a..aa76f7995f 100644 --- a/fighters/marth/src/acmd/other.rs +++ b/fighters/marth/src/acmd/other.rs @@ -77,16 +77,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -97,10 +93,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/marth/src/acmd/smashes.rs b/fighters/marth/src/acmd/smashes.rs index 15f30d6d63..bea6d21ac9 100644 --- a/fighters/marth/src/acmd/smashes.rs +++ b/fighters/marth/src/acmd/smashes.rs @@ -14,9 +14,9 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { frame(lua_state, 10.25); FT_MOTION_RATE_RANGE(agent, 10.25, 11.0, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 14.0, 38, 72, 0, 52, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 14.0, 38, 72, 0, 52, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 20.0, 361, 81, 0, 65, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.15, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 14.0, 361, 70, 0, 60, 4.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 14.0, 361, 70, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 20.0, 361, 70, 0, 80, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.15, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } frame(lua_state, 11.0); @@ -65,11 +65,10 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("sword1"), 14.0, 89, 85, 0, 40, 5.8, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 18.0, 89, 80, 0, 60, 4.6, 0.0, 0.0, 8.3, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword1"), 14.0, 90, 85, 0, 40, 5.8, 0.0, 0.0, -3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 1, Hash40::new("top"), 3.0, 125, 100, 155, 0, 4.0, 0.0, 5.0, 5.0, Some(0.0), Some(5.0), Some(-5.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 10, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); - AttackModule::set_optional_hit_sound(boma, 2, Hash40::new("se_common_sword_hit_l")); + ATTACK(agent, 0, 1, Hash40::new("top"), 3.0, 120, 100, 155, 0, 4.0, 0.0, 5.0, 5.0, Some(0.0), Some(5.0), Some(-5.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 10, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 15.0, 90, 80, 0, 30, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 15.0, 90, 80, 0, 30, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 18.0, 90, 80, 0, 60, 5.0, 0.0, 0.0, 6.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -115,10 +114,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.5); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 75, 93, 0, 60, 4.0, 0.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 93, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 10.0, 361, 93, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 15.0, 80, 93, 0, 50, 4.0, 0.0, 0.0, 6.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 75, 100, 0, 60, 4.0, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 100, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 10.0, 361, 100, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 15.0, 70, 100, 0, 60, 4.0, 0.0, 0.0, 6.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -129,10 +128,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 21.0); FT_MOTION_RATE(agent, 1.5); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 11.0, 75, 93, 0, 40, 4.0, 0.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 11.0, 361, 93, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 11.0, 361, 93, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword2"), 16.0, 80, 89, 0, 50, 4.0, 0.0, 0.0, 6.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 75, 100, 0, 60, 4.0, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 100, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 10.0, 361, 100, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 15.0, 70, 100, 0, 60, 4.0, 0.0, 0.0, 6.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); diff --git a/fighters/marth/src/acmd/specials/mod.rs b/fighters/marth/src/acmd/specials/mod.rs index 500a88b8ca..07c3564d60 100644 --- a/fighters/marth/src/acmd/specials/mod.rs +++ b/fighters/marth/src/acmd/specials/mod.rs @@ -112,21 +112,16 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 5.0); - frame(lua_state, 3.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } frame(lua_state, 5.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 0, 0, Hash40::new("sword2"), 11.0, 361, 89, 0, 70, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 11.0, 361, 89, 0, 70, 4.0, 2.0, 0.0, 1.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 10.0, 74, 74, 0, 70, 3.5, 1.5, 0.0, 6.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 10.0, 74, 74, 0, 70, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 7.0, 74, 90, 0, 20, 4.0, 2.0, 0.0, 0.6, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 7.0, 74, 90, 0, 20, 4.0, 2.0, 0.0, 1.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 361, 90, 0, 20, 3.5, 1.5, 0.0, 6.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 7.0, 74, 90, 0, 20, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); WorkModule::on_flag(boma, *FIGHTER_MARTH_STATUS_SPECIAL_HI_FLAG_SPECIAL_HI_SET_LR); diff --git a/fighters/marth/src/acmd/specials/special_n.rs b/fighters/marth/src/acmd/specials/special_n.rs index 03b0b167ff..8b9d34e0e0 100644 --- a/fighters/marth/src/acmd/specials/special_n.rs +++ b/fighters/marth/src/acmd/specials/special_n.rs @@ -6,17 +6,17 @@ unsafe extern "C" fn game_specialairnend(agent: &mut L2CAgentBase) { } frame(agent.lua_state_agent, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(8.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 8.5, 25.0, Some(0.0), Some(8.5), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 7.5, 17.0, Some(0.0), Some(7.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 7.5, 23.5, Some(0.0), Some(7.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(8.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 8.5, 25.0, Some(0.0), Some(8.5), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 7.5, 17.0, Some(0.0), Some(7.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 7.5, 23.5, Some(0.0), Some(7.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } if WorkModule::get_int(agent.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 5.0, 8.0, Some(0.0), Some(5.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 5.0, 25.0, Some(0.0), Some(5.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 5.0, 17.0, Some(0.0), Some(5.0), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 5.0, 23.5, Some(0.0), Some(5.0), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 5.0, 8.0, Some(0.0), Some(5.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 5.0, 25.0, Some(0.0), Some(5.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 5.0, 17.0, Some(0.0), Some(5.0), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 5.0, 23.5, Some(0.0), Some(5.0), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } } frame(agent.lua_state_agent, 9.0); @@ -36,18 +36,18 @@ unsafe extern "C" fn game_specialairnendhi(agent: &mut L2CAgentBase) { } frame(agent.lua_state_agent, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(12.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 14.0, 25.0, Some(0.0), Some(14.6), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 9.8, 17.0, Some(0.0), Some(12.3), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 13.0, 23.5, Some(0.0), Some(14.7), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(12.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 14.0, 25.0, Some(0.0), Some(14.6), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 9.8, 17.0, Some(0.0), Some(12.3), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 13.0, 23.5, Some(0.0), Some(14.7), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(agent.module_accessor, AttackHeight(*ATTACK_HEIGHT_HIGH), false); } if WorkModule::get_int(agent.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(10.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 11.5, 25.0, Some(0.0), Some(12.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 9.0, 17.0, Some(0.0), Some(10.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 11.0, 23.5, Some(0.0), Some(12.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(10.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 11.5, 25.0, Some(0.0), Some(12.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 9.0, 17.0, Some(0.0), Some(10.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 11.0, 23.5, Some(0.0), Some(12.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(agent.module_accessor, AttackHeight(*ATTACK_HEIGHT_HIGH), false); } } @@ -68,18 +68,18 @@ unsafe extern "C" fn game_specialairnendlw(agent: &mut L2CAgentBase) { } frame(agent.lua_state_agent, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(4.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 3.0, 25.0, Some(0.0), Some(2.7), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 5.6, 17.0, Some(0.0), Some(3.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 3.0, 23.5, Some(0.0), Some(1.7), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(4.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 3.0, 25.0, Some(0.0), Some(2.7), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 5.6, 17.0, Some(0.0), Some(3.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 3.0, 23.5, Some(0.0), Some(1.7), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(agent.module_accessor, AttackHeight(*ATTACK_HEIGHT_LOW), false); } if WorkModule::get_int(agent.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 4.5, 8.0, Some(0.0), Some(1.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, -0.5, 25.0, Some(0.0), Some(-1.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 2.0, 17.0, Some(0.0), Some(0.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 0.0, 23.5, Some(0.0), Some(-1.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 4.5, 8.0, Some(0.0), Some(1.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, -0.5, 25.0, Some(0.0), Some(-1.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 2.0, 17.0, Some(0.0), Some(0.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 0.0, 23.5, Some(0.0), Some(-1.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(agent.module_accessor, AttackHeight(*ATTACK_HEIGHT_LOW), false); } } @@ -191,17 +191,17 @@ unsafe extern "C" fn game_specialairnendmaxlw(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialnend(agent: &mut L2CAgentBase) { frame(agent.lua_state_agent, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(8.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 8.5, 25.0, Some(0.0), Some(8.5), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 7.5, 17.0, Some(0.0), Some(7.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 7.5, 23.5, Some(0.0), Some(7.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(8.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 8.5, 25.0, Some(0.0), Some(8.5), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 7.5, 17.0, Some(0.0), Some(7.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 7.5, 23.5, Some(0.0), Some(7.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } if WorkModule::get_int(agent.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 5.0, 8.0, Some(0.0), Some(5.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 5.0, 25.0, Some(0.0), Some(5.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 5.0, 17.0, Some(0.0), Some(5.0), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 5.0, 23.5, Some(0.0), Some(5.0), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 5.0, 8.0, Some(0.0), Some(5.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 5.0, 25.0, Some(0.0), Some(5.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 5.0, 17.0, Some(0.0), Some(5.0), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 5.0, 23.5, Some(0.0), Some(5.0), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } } frame(agent.lua_state_agent, 9.0); @@ -218,18 +218,18 @@ unsafe extern "C" fn game_specialnend(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialnendhi(agent: &mut L2CAgentBase) { frame(agent.lua_state_agent, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(12.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 14.0, 25.0, Some(0.0), Some(14.6), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 9.8, 17.0, Some(0.0), Some(12.3), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 13.0, 23.5, Some(0.0), Some(14.7), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 8.5, 8.0, Some(0.0), Some(12.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 14.0, 25.0, Some(0.0), Some(14.6), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 9.8, 17.0, Some(0.0), Some(12.3), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 13.0, 23.5, Some(0.0), Some(14.7), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(agent.module_accessor, AttackHeight(*ATTACK_HEIGHT_HIGH), false); } if WorkModule::get_int(agent.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(10.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 11.5, 25.0, Some(0.0), Some(12.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 9.0, 17.0, Some(0.0), Some(10.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 11.0, 23.5, Some(0.0), Some(12.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(10.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 11.5, 25.0, Some(0.0), Some(12.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 9.0, 17.0, Some(0.0), Some(10.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 11.0, 23.5, Some(0.0), Some(12.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(agent.module_accessor, AttackHeight(*ATTACK_HEIGHT_HIGH), false); } } @@ -247,18 +247,18 @@ unsafe extern "C" fn game_specialnendhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialnendlw(agent: &mut L2CAgentBase) { frame(agent.lua_state_agent, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(4.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 3.0, 25.0, Some(0.0), Some(2.7), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 5.6, 17.0, Some(0.0), Some(3.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 3.0, 23.5, Some(0.0), Some(1.7), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 6.5, 8.0, Some(0.0), Some(4.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, 3.0, 25.0, Some(0.0), Some(2.7), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 5.6, 17.0, Some(0.0), Some(3.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 3.0, 23.5, Some(0.0), Some(1.7), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(agent.module_accessor, AttackHeight(*ATTACK_HEIGHT_LOW), false); } if WorkModule::get_int(agent.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_KIND) == *FIGHTER_KIND_KIRBY { if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 4.5, 8.0, Some(0.0), Some(1.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, -0.5, 25.0, Some(0.0), Some(-1.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 2.0, 17.0, Some(0.0), Some(0.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 0.0, 23.5, Some(0.0), Some(-1.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 45, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 3.0, 0.0, 4.5, 8.0, Some(0.0), Some(1.5), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 3.0, 0.0, -0.5, 25.0, Some(0.0), Some(-1.0), Some(27.0), 1.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 90, 0, 30, 0.9, 0.0, 2.0, 17.0, Some(0.0), Some(0.5), Some(21.9), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 60, 0.9, 0.0, 0.0, 23.5, Some(0.0), Some(-1.5), Some(28.6), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 40, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_HEAD, false, Hash40::new("collision_attr_marth_shield_breaker"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(agent.module_accessor, AttackHeight(*ATTACK_HEIGHT_LOW), false); } } diff --git a/fighters/marth/src/acmd/specials/special_s3.rs b/fighters/marth/src/acmd/specials/special_s3.rs index bc551417a0..2b32c173ed 100644 --- a/fighters/marth/src/acmd/specials/special_s3.rs +++ b/fighters/marth/src/acmd/specials/special_s3.rs @@ -9,9 +9,9 @@ unsafe extern "C" fn game_specials3hi(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 80, 60, 0, 60, 4.5, 0.0, 7.0, 7.5, Some(0.0), Some(13.5), Some(7.5), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 85, 40, 0, 60, 4.5, 0.0, 6.0, 13.0, Some(0.0), Some(16.0), Some(13.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 60, 60, 0, 60, 4.5, 0.0, 9.0, 3.0, Some(0.0), Some(11.0), Some(3.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 80, 60, 0, 60, 4.5, 0.0, 7.0, 7.5, Some(0.0), Some(13.5), Some( 7.5), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 85, 40, 0, 60, 4.5, 0.0, 6.0, 13.0, Some(0.0), Some(16.0), Some(13.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 60, 60, 0, 60, 4.5, 0.0, 9.0, 3.0, Some(0.0), Some(11.0), Some( 3.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 9.0); if is_excute(agent) { @@ -68,9 +68,9 @@ unsafe extern "C" fn game_specials3s(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 50, 30, 0, 52, 6.5, 0.0, 9.0, 11.0, Some(0.0), Some(11.0), Some(11.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 55, 30, 0, 45, 6.5, 0.0, 7.5, 18.0, Some(0.0), Some(11.5), Some(18.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 40, 30, 0, 59, 5.5, 0.0, 9.0, 7.0, Some(0.0), Some(9.0), Some(7.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 50, 30, 0, 52, 6.5, 0.0, 9.0, 11.0, Some(0.0), Some(11.0), Some(11.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 55, 30, 0, 45, 6.5, 0.0, 7.5, 18.0, Some(0.0), Some(11.5), Some(18.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 40, 30, 0, 59, 5.5, 0.0, 9.0, 7.0, Some(0.0), Some( 9.0), Some( 7.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 8.0); if is_excute(agent) { @@ -124,8 +124,8 @@ unsafe extern "C" fn game_specials3lw(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 270, 65, 0, 41, 4.8, 0.0, 5.6, 12.5, Some(0.0), Some(7.0), Some( 8.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 270, 65, 0, 41, 5.4, 0.0, 4.0, 19.4, Some(0.0), Some(7.0), Some(10.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 280, 57, 0, 32, 4.8, 0.0, 5.6, 12.5, Some(0.0), Some(7.0), Some( 8.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 280, 57, 0, 32, 5.4, 0.0, 4.0, 19.4, Some(0.0), Some(7.0), Some(10.0), 1.0, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } frame(lua_state, 9.0); if is_excute(agent) { diff --git a/fighters/marth/src/acmd/throws.rs b/fighters/marth/src/acmd/throws.rs index ba8e89a48a..1bdc33fd2b 100644 --- a/fighters/marth/src/acmd/throws.rs +++ b/fighters/marth/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(12.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 7.0, Some(0.0), Some(8.0), Some(12.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -4.0, Some(0.0), Some(7.0), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -5.0, Some(0.0), Some(7.0), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/marth/src/acmd/tilts.rs b/fighters/marth/src/acmd/tilts.rs index db4c215648..93c78519c2 100644 --- a/fighters/marth/src/acmd/tilts.rs +++ b/fighters/marth/src/acmd/tilts.rs @@ -6,11 +6,11 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { } frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.000); - ATTACK(agent, 0, 0, Hash40::new("sword2"), 8.0, 361, 75, 0, 40, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 8.0, 361, 75, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 11.5, 361, 80, 0, 70, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 8.0, 361, 75, 0, 30, 4.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 8.0, 361, 75, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 361, 80, 0, 65, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } wait(lua_state, 4.0); if is_excute(agent) { @@ -37,17 +37,17 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 9.0, 110, 120, 0, 40, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 9.0, 361, 118, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 110, 100, 0, 50, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 9.0, 110, 120, 0, 40, 4.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 8.0, 95, 120, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 110, 100, 0, 50, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } frame(lua_state, 7.0); FT_MOTION_RATE_RANGE(agent, 7.0, 13.0, 5.0); frame(lua_state, 9.0); if is_excute(agent){ - ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 85, 120, 0, 40, 4.0, 2.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 9.0, 361, 118, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 80, 100, 0, 50, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.0, 80, 120, 0, 40, 4.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 9.0, 95, 120, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 80, 100, 0, 50, 4.0, 2.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); } frame(lua_state, 15.0); FT_MOTION_RATE(agent, 1.0); @@ -92,9 +92,10 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 9.0, 30, 40, 0, 40, 4.0, 0.0, 0.0, 0.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 8.0, 30, 40, 0, 25, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 10.0, 30, 40, 0, 50, 4.0, 0.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 8.0, 30, 40, 0, 40, 3.5, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 30, 40, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 8.0, 30, 40, 0, 25, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword2"), 10.0, 30, 40, 0, 50, 3.5, 0.0, 0.0, 6.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MARTH_SWORD, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 3.0); diff --git a/fighters/marth/src/lib.rs b/fighters/marth/src/lib.rs index 82a713fd63..b65c4abe95 100644 --- a/fighters/marth/src/lib.rs +++ b/fighters/marth/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/marth/src/status/special_s.rs b/fighters/marth/src/status/special_s.rs index 0a85168a51..448db748e3 100644 --- a/fighters/marth/src/status/special_s.rs +++ b/fighters/marth/src/status/special_s.rs @@ -84,6 +84,45 @@ pub unsafe extern "C" fn special_s_init(fighter: &mut L2CFighterCommon) -> L2CVa 0.into() } +pub unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_S)(fighter); + special_s_set_hangdata(fighter); + + return ret; +} + +pub unsafe extern "C" fn special_s2_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_MARTH_STATUS_KIND_SPECIAL_S2)(fighter); + special_s_set_hangdata(fighter); + + return ret; +} + +pub unsafe extern "C" fn special_s3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_MARTH_STATUS_KIND_SPECIAL_S3)(fighter); + special_s_set_hangdata(fighter); + + return ret; +} + +pub unsafe extern "C" fn special_s4_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_MARTH_STATUS_KIND_SPECIAL_S4)(fighter); + special_s_set_hangdata(fighter); + + return ret; +} + +unsafe fn special_s_set_hangdata(fighter: &mut L2CFighterCommon) { + // prevents marth from grabbing the ledge behind him for the *entire status* + let back_cliff_hangdata = fighter.get_back_cliff_hangdata(); + fighter.set_back_cliff_hangdata(0.0, back_cliff_hangdata.y); +} + pub fn install(agent: &mut Agent) { agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_init); + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); + + agent.status(Main, *FIGHTER_MARTH_STATUS_KIND_SPECIAL_S2, special_s2_main); + agent.status(Main, *FIGHTER_MARTH_STATUS_KIND_SPECIAL_S3, special_s3_main); + agent.status(Main, *FIGHTER_MARTH_STATUS_KIND_SPECIAL_S4, special_s4_main); } diff --git a/fighters/master/Cargo.toml b/fighters/master/Cargo.toml index 5dd3cf33e2..5dc65f66a7 100644 --- a/fighters/master/Cargo.toml +++ b/fighters/master/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -smash_rs = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } \ No newline at end of file +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/master/src/acmd/ground.rs b/fighters/master/src/acmd/ground.rs index b0ab02726f..b52537a934 100644 --- a/fighters/master/src/acmd/ground.rs +++ b/fighters/master/src/acmd/ground.rs @@ -11,6 +11,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 80, 18, 0, 31, 3.0, 0.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 80, 18, 0, 31, 3.5, 0.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("arml"), 3.0, 80, 18, 0, 31, 4.0, 3.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 10, 0, 20, 2.5, 0.0, 5.0, 5.5, Some(0.0), Some(5.0), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); AttackModule::set_add_reaction_frame(boma, 1, 2.0, false); @@ -31,21 +32,22 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 3.0, 75, 18, 0, 31, 3.5, 0.0, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 75, 18, 0, 31, 4.0, 0.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 3.0, 75, 18, 0, 31, 4.5, 4.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 3.0, 75, 25, 0, 31, 3.5, 0.0, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 75, 25, 0, 31, 4.0, 0.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 3.0, 75, 25, 0, 31, 4.5, 4.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 10, 0, 20, 2.5, 0.0, 5.0, 5.5, Some(0.0), Some(5.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 2.0, false); AttackModule::set_down_only(boma, 3, false); } frame(lua_state, 7.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } + frame(lua_state, 9.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } frame(lua_state, 10.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); diff --git a/fighters/master/src/acmd/other.rs b/fighters/master/src/acmd/other.rs index ec16344136..93a947f672 100644 --- a/fighters/master/src/acmd/other.rs +++ b/fighters/master/src/acmd/other.rs @@ -79,15 +79,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -97,10 +93,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn expression_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/master/src/acmd/smashes.rs b/fighters/master/src/acmd/smashes.rs index 35ff374b4b..4880824626 100644 --- a/fighters/master/src/acmd/smashes.rs +++ b/fighters/master/src/acmd/smashes.rs @@ -133,15 +133,16 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { if PostureModule::lr(boma) > 0.0 { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), -20, 18, 13.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), -20, 15, 9.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } - else{ - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), -8, 17, 13.25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + else { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), -8, 15, 9.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } } frame(lua_state, 15.0); if is_excute(agent) { if VarModule::is_flag(agent.battle_object, ATTACK_S4_SPECIAL) { + EFFECT_FOLLOW(agent, Hash40::new("sys_unblockable_flash"), Hash40::new("top"), 0, 12, 9.5, 0, 0, 0, 0.85, true); EFFECT_FOLLOW(agent, Hash40::new("master_spear_aura"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); EffectModule::enable_sync_init_pos_last(boma); EFFECT_FLW_POS(agent, Hash40::new("master_spear_aura_particle"), Hash40::new("haver"), -8, 6, 0, 0, 0, 0, 1, true); diff --git a/fighters/master/src/acmd/specials.rs b/fighters/master/src/acmd/specials.rs index 28bf755471..608fbd996d 100644 --- a/fighters/master/src/acmd/specials.rs +++ b/fighters/master/src/acmd/specials.rs @@ -662,7 +662,9 @@ unsafe extern "C" fn effect_speciallw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_v"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_v"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } EFFECT_FOLLOW(agent, Hash40::new("master_axe_hold"), Hash40::new("haver"), 0, 13, 0.6, 0, 0, 0, 1, true); } frame(lua_state, 40.0); diff --git a/fighters/master/src/acmd/throws.rs b/fighters/master/src/acmd/throws.rs index b92178060b..c3f13ce01c 100644 --- a/fighters/master/src/acmd/throws.rs +++ b/fighters/master/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.6, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(11.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.6, 0.0, 8.0, 3.6, Some(0.0), Some(8.0), Some(11.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/master/src/arrow2/acmd.rs b/fighters/master/src/arrow2/acmd.rs index e42045bd13..56d9301065 100644 --- a/fighters/master/src/arrow2/acmd.rs +++ b/fighters/master/src/arrow2/acmd.rs @@ -4,9 +4,9 @@ unsafe extern "C" fn game_search(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 30.0, 361, 60, 0, 53, 1.5, 2.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 33, 0.0, 0, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_ARROW_MAX, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 30.0, 361, 60, 0, 53, 1.5, -2.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 33, 0.0, 0, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_ARROW_MAX, *ATTACK_REGION_ENERGY); - ATTACK(agent, 2, 0, Hash40::new("top"), 30.0, 361, 60, 0, 53, 1.5, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 33, 0.0, 0, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_ARROW_MAX, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 30.0, 361, 60, 0, 53, 1.5, 2.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 26, 0.0, 0, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_ARROW_MAX, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 30.0, 361, 60, 0, 53, 1.5, -2.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 26, 0.0, 0, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_ARROW_MAX, *ATTACK_REGION_ENERGY); + ATTACK(agent, 2, 0, Hash40::new("top"), 30.0, 361, 60, 0, 53, 1.5, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 26, 0.0, 0, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_ARROW_MAX, *ATTACK_REGION_ENERGY); AttackModule::disable_tip(boma); } } diff --git a/fighters/master/src/axe/acmd.rs b/fighters/master/src/axe/acmd.rs index d13329ac5d..13002e6b48 100644 --- a/fighters/master/src/axe/acmd.rs +++ b/fighters/master/src/axe/acmd.rs @@ -248,10 +248,10 @@ unsafe extern "C" fn game_speciallwhit(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("haver"), 15.0, 70, 85, 0, 75, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_AXE, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("haver"), 15.0, 70, 85, 0, 75, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_AXE, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("haver"), 15.0, 70, 85, 0, 75, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_AXE, *ATTACK_REGION_OBJECT); - ATTACK(agent, 4, 0, Hash40::new("haver"), 15.0, 70, 85, 0, 75, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_AXE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("haver"), 15.0, 70, 85, 0, 75, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_AXE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("haver"), 15.0, 70, 85, 0, 75, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_AXE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("haver"), 15.0, 70, 85, 0, 75, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_AXE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 4, 0, Hash40::new("haver"), 15.0, 70, 85, 0, 75, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MASTER_AXE, *ATTACK_REGION_OBJECT); AttackModule::clear(boma, 0, false); WorkModule::on_flag(boma, *WEAPON_MASTER_AXE_INSTANCE_WORK_ID_FLAG_MOVE_ATTACK); } diff --git a/fighters/master/src/lib.rs b/fighters/master/src/lib.rs index 046fc9ec37..30a7215a0a 100644 --- a/fighters/master/src/lib.rs +++ b/fighters/master/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -50,8 +51,8 @@ use smashline::*; unsafe extern "C" fn master_link_event_inner( vtable: u64, fighter: &mut Fighter, - event: &mut smash_rs::app::LinkEvent, - original: extern "C" fn(u64, &mut Fighter, &mut smash_rs::app::LinkEvent) -> bool + event: &mut smash2::app::LinkEvent, + original: extern "C" fn(u64, &mut Fighter, &mut smash2::app::LinkEvent) -> bool ) -> bool { let kind = event.link_event_kind.0; let (enable_flag, early_return) = match kind { diff --git a/fighters/metaknight/Cargo.toml b/fighters/metaknight/Cargo.toml index d3074b6c5e..41f12d8f7e 100644 --- a/fighters/metaknight/Cargo.toml +++ b/fighters/metaknight/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/metaknight/src/acmd/aerials.rs b/fighters/metaknight/src/acmd/aerials.rs index d5c2d5e88e..714da44aa6 100644 --- a/fighters/metaknight/src/acmd/aerials.rs +++ b/fighters/metaknight/src/acmd/aerials.rs @@ -8,19 +8,19 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); ATTACK(agent, 0, 0, Hash40::new("haver"), 12.0, 361, 100, 0, 30, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 361, 100, 0, 30, 4.5, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 361, 100, 0, 30, 7.0, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 361, 100, 0, 30, 7.0, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 30, 4.0, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 361, 100, 0, 30, 6.5, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 20, 4.0, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 361, 100, 0, 20, 6.5, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 4.0, 361, 100, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 361, 100, 0, 20, 3.5, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 361, 100, 0, 20, 6.0, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 6.0, 361, 100, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 6.0, 361, 100, 0, 20, 3.5, 0.0, 5.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 361, 100, 0, 20, 6.0, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 21.0); if is_excute(agent) { @@ -62,23 +62,21 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); + FT_MOTION_RATE_RANGE(agent, 9.0, 9.6, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 70, 100, 40, 0, 6.5, 0.0, 5.0, 11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 70, 100, 40, 0, 6.5, 0.0, 1.5, 9.0, Some(0.0), Some(8.5), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 65, 60, 0, 50, 6.0, 0.0, 4.5, 12.0, Some(0.0), Some(5.5), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 65, 60, 0, 50, 6.0, 0.0, 1.0, 10.0, Some(0.0), Some(9.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 2.0); - frame(lua_state, 10.5); + frame(lua_state, 9.6); + FT_MOTION_RATE_RANGE(agent, 9.6, 12.0, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 1.0); frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 130, 0, 30, 7.0, 0.0, 4.0, 11.5, Some(0.0), Some(6.0), Some(11.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 130, 0, 30, 7.0, 0.0, 1.5, 9.0, Some(0.0), Some(8.5), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 130, 0, 30, 6.5, 0.0, 3.5, 12.0, Some(0.0), Some(6.5), Some(12.0), 1.0, 1.15, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 130, 0, 30, 6.5, 0.0, 1.0, 9.5, Some(0.0), Some(9.0), Some( 9.5), 1.0, 1.15, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -139,13 +137,13 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 361, 114, 0, 28, 4.0, 0.0, 4.0, -11.5, Some(0.0), Some(11.0), Some(-12.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 361, 114, 0, 28, 4.0, 0.0, 16.5, -9.5, Some(0.0), Some(11.0), Some(-12.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 361, 114, 0, 28, 4.0, 0.0, -1.5, -6.5, Some(0.0), Some(4.0), Some(-11.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 12.0, 361, 114, 0, 28, 4.0, 0.0, -1.5, -6.5, Some(0.0), Some(16.5), Some(-9.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 361, 114, 0, 28, 4.0, 0.0, 2.6, -11.3, Some(0.0), Some(11.0), Some(-12.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 361, 114, 0, 28, 4.0, 0.0, 16.5, -9.5, Some(0.0), Some(11.0), Some(-12.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 361, 114, 0, 28, 4.0, 0.0, -2.525, -5.3, Some(0.0), Some(2.6), Some(-11.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 12.0, 361, 114, 0, 28, 4.0, 0.0, -2.525, -5.3, Some(0.0), Some(16.5), Some(-9.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 14.0); - if is_excute(agent) { + if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 41.0); @@ -209,10 +207,10 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 67, 128, 0, 30, 4.4, 0.0, 18.074, 0.844, Some(0.0), Some(17.032), Some(-5.065), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 67, 128, 0, 30, 4.4, 0.0, 18.074, 0.844, Some(0.0), Some(17.059), Some(6.608), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 67, 128, 0, 30, 4.4, 0.0, 17.032, -5.065, Some(0.0), Some(14.107), Some(-10.134), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 67, 128, 0, 30, 4.4, 0.0, 14.107, -10.134, Some(0.0), Some(17.059), Some(6.608), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 68, 105, 0, 35, 4.4, 0.0, 18.074, 0.844, Some(0.0), Some(17.032), Some(-5.065), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 68, 105, 0, 35, 4.4, 0.0, 18.074, 0.844, Some(0.0), Some(17.059), Some(6.608), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 68, 105, 0, 35, 4.4, 0.0, 17.032, -5.065, Some(0.0), Some(14.107), Some(-10.134), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 68, 105, 0, 35, 4.4, 0.0, 14.107, -10.134, Some(0.0), Some(17.059), Some(6.608), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -248,10 +246,10 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 4.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 70, 108, 0, 30, 4.0, 0.0, -6.5, 2.0, Some(0.0), Some(-6.5), Some(-4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 70, 108, 0, 30, 4.0, 0.0, -6.5, 2.0, Some(0.0), Some(-4.5), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 70, 108, 0, 30, 4.0, 0.0, -6.5, -4.0, Some(0.0), Some(-4.5), Some(-9.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 6.0, 70, 108, 0, 30, 4.0, 0.0, -4.5, -9.5, Some(0.0), Some(-4.5), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 72, 108, 0, 30, 4.0, 0.0, -6.5, 2.0, Some(0.0), Some(-6.5), Some(-4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 72, 108, 0, 30, 4.0, 0.0, -6.5, 2.0, Some(0.0), Some(-4.5), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 72, 108, 0, 30, 4.0, 0.0, -6.5, -4.0, Some(0.0), Some(-4.5), Some(-9.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 6.0, 72, 108, 0, 30, 4.0, 0.0, -4.5, -9.5, Some(0.0), Some(-4.5), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/metaknight/src/acmd/ground.rs b/fighters/metaknight/src/acmd/ground.rs index 9495277865..435ec6f22e 100644 --- a/fighters/metaknight/src/acmd/ground.rs +++ b/fighters/metaknight/src/acmd/ground.rs @@ -5,7 +5,7 @@ unsafe extern "C" fn game_attack100(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 8, 0, 40, 7.0, 0.0, 6.5, 8.0, Some(0.0), Some(6.5), Some(13.5), 0.5, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 8, 0, 30, 6.5, 0.0, 6.5, 7.5, Some(0.0), Some(6.5), Some(13.0), 0.5, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_add_reaction_frame(boma, 0, 3.0, false); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 4); } @@ -15,7 +15,7 @@ unsafe extern "C" fn game_attack100(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 8, 0, 40, 7.0, 0.0, 6.5, 8.0, Some(0.0), Some(6.5), Some(13.5), 0.5, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 8, 0, 30, 6.5, 0.0, 6.5, 7.5, Some(0.0), Some(6.5), Some(13.0), 0.5, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_add_reaction_frame(boma, 0, 3.0, false); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 4); } @@ -25,7 +25,8 @@ unsafe extern "C" fn game_attack100(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 8, 0, 40, 4.0, 0.0, 6.0, -3.0, Some(0.0), Some(6.0), Some(-9.5), 0.5, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 8, 0, 30, 4.0, 0.0, 6.0, -3.0, Some(0.0), Some(6.0), Some(-9.5), 0.5, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + AttackModule::set_add_reaction_frame(boma, 0, 3.0, false); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 4); } frame(lua_state, 11.0); diff --git a/fighters/metaknight/src/acmd/other.rs b/fighters/metaknight/src/acmd/other.rs index 1517653ab0..a98082170d 100644 --- a/fighters/metaknight/src/acmd/other.rs +++ b/fighters/metaknight/src/acmd/other.rs @@ -81,16 +81,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -101,10 +97,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { @@ -291,6 +284,15 @@ unsafe extern "C" fn effect_win3(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_jumpaerialf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 21.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_JUMP_FLY_NEXT); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_cliffescape", acmd_stub, Priority::Low); @@ -314,4 +316,10 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_win1", effect_win1, Priority::Low); agent.acmd("effect_win3", effect_win3, Priority::Low); + + agent.acmd("game_jumpaerialf1", game_jumpaerialf, Priority::Low); + agent.acmd("game_jumpaerialf2", game_jumpaerialf, Priority::Low); + agent.acmd("game_jumpaerialf3", game_jumpaerialf, Priority::Low); + agent.acmd("game_jumpaerialf4", game_jumpaerialf, Priority::Low); + agent.acmd("game_jumpaerialf5", game_jumpaerialf, Priority::Low); } diff --git a/fighters/metaknight/src/acmd/specials/mod.rs b/fighters/metaknight/src/acmd/specials/mod.rs index 70c8a53717..7bf00de62a 100644 --- a/fighters/metaknight/src/acmd/specials/mod.rs +++ b/fighters/metaknight/src/acmd/specials/mod.rs @@ -94,9 +94,9 @@ unsafe extern "C" fn game_specialsdrill(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { JostleModule::set_status(boma, false); - ATTACK(agent, 0, 0, Hash40::new("haver"), 1.1, 367, 50, 30, 80, 3.5, 0.0, 5.0, 0.0, None, None, None, 0.6, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 1.1, 367, 50, 30, 80, 3.5, 0.0, 1.0, 0.0, None, None, None, 0.6, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.1, 367, 50, 30, 80, 6.0, 0.0, 6.5, 1.0, None, None, None, 0.6, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 0.0, 0, 0, 0, 0, 3.5, 0.0, 5.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 0.0, 0, 0, 0, 0, 3.5, 0.0, 1.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 0.0, 0, 0, 0, 0, 6.0, 0.0, 6.5, 1.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, f32::NAN, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } frame(lua_state, 21.0); @@ -153,8 +153,8 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 55, 93, 0, 43, 3.5, 0.0, 0.0, 5.5, Some(0.0), Some(12.0), Some(7.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 55, 93, 0, 43, 3.5, 0.0, 0.0, 12.5, Some(0.0), Some(12.0), Some(14.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 56, 93, 0, 43, 3.5, 0.0, 0.0, 5.5, Some(0.0), Some(12.0), Some(7.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 56, 93, 0, 43, 3.5, 0.0, 0.0, 12.5, Some(0.0), Some(12.0), Some(14.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 9.0); if is_excute(agent) { diff --git a/fighters/metaknight/src/acmd/specials/special_lw.rs b/fighters/metaknight/src/acmd/specials/special_lw.rs index b9926a899e..8eecf25c3c 100644 --- a/fighters/metaknight/src/acmd/specials/special_lw.rs +++ b/fighters/metaknight/src/acmd/specials/special_lw.rs @@ -105,9 +105,9 @@ unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { JostleModule::set_status(boma, true); } - frame(lua_state, 21.0); + frame(lua_state, 26.0); if is_excute(agent) { - KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::change_kinetic(agent.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); } } @@ -208,9 +208,9 @@ unsafe extern "C" fn game_specialairlwf(agent: &mut L2CAgentBase) { if is_excute(agent) { JostleModule::set_status(boma, true); } - frame(lua_state, 21.0); + frame(lua_state, 26.0); if is_excute(agent) { - KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::change_kinetic(agent.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); } } @@ -321,9 +321,9 @@ unsafe extern "C" fn game_specialairlwb(agent: &mut L2CAgentBase) { if is_excute(agent) { JostleModule::set_status(boma, true); } - frame(lua_state, 21.0); + frame(lua_state, 26.0); if is_excute(agent) { - KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::change_kinetic(agent.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); } } diff --git a/fighters/metaknight/src/acmd/throws.rs b/fighters/metaknight/src/acmd/throws.rs index 6486b832ae..1beabe1666 100644 --- a/fighters/metaknight/src/acmd/throws.rs +++ b/fighters/metaknight/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.5, 0.0, Some(0.0), Some(6.5), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.5, 4.0, Some(0.0), Some(6.5), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); frame(lua_state, 9.0); @@ -24,6 +24,7 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.9); frame(lua_state, 10.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); @@ -67,23 +68,23 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 65, 140, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 64, 140, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } wait(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("toer"), 6.0, 40, 100, 0, 10, 6.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("toer"), 6.0, 64, 87, 0, 58, 6.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("toer"), 6.0, 60, 100, 0, 10, 6.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 60, 100, 0, 10, 4.0, 0.0, 8.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("toer"), 6.0, 64, 87, 0, 58, 6.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 64, 87, 0, 58, 4.0, 0.0, 8.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); } frame(lua_state, 10.0); - if is_excute(agent) { - ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); + if is_excute(agent) { + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); } } @@ -92,14 +93,14 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 45, 140, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 54, 140, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 16.0); if is_excute(agent) { REVERSE_LR(agent); - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 75, 100, 0, 10, 6.0, 0.0, 5.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 75, 100, 0, 10, 4.0, 0.0, 5.5, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 54, 78, 0, 69, 6.0, 0.0, 5.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 54, 78, 0, 69, 4.0, 0.0, 5.5, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_catch_only_all(boma, true, false); } frame(lua_state, 18.0); @@ -149,7 +150,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { FT_LEAVE_NEAR_OTTOTTO(agent, -2.5, 2.5); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 10.0, 83, 85, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 2.0, 90, 150, 0, 98, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 7.0); @@ -163,6 +164,9 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { } frame(lua_state, 45.0); if is_excute(agent) { + AttackModule::clear_all(boma); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 90, 60, 0, 112, 7.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 3, 0); } frame(lua_state, 46.0); @@ -180,7 +184,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); FT_MOTION_RATE(agent, 0.8); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 2.0, 60, 130, 0, 62, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 2.0, 32, 60, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 100, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 11.0); @@ -195,18 +199,19 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { } wait(lua_state, 3.0); } - frame(lua_state, 73.0); + frame(lua_state, 72.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 80, 200, 0, 60, 7.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 32, 80, 0, 70, 7.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 2, 0); } - frame(lua_state, 75.0); + frame(lua_state, 73.0); + FT_MOTION_RATE_RANGE(agent, 73.0, 80.0, 14.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); } - frame(lua_state, 82.0); + frame(lua_state, 80.0); FT_MOTION_RATE(agent, 1.0); } diff --git a/fighters/metaknight/src/acmd/tilts.rs b/fighters/metaknight/src/acmd/tilts.rs index b98461852f..98755490a1 100644 --- a/fighters/metaknight/src/acmd/tilts.rs +++ b/fighters/metaknight/src/acmd/tilts.rs @@ -55,9 +55,9 @@ unsafe extern "C" fn game_attacks3s2(agent: &mut L2CAgentBase) { } frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 72, 54, 0, 23, 4.0, 0.0, 6.0, 7.5, Some(0.0), Some(4.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 72, 54, 0, 23, 4.0, 0.0, 6.0, 7.5, Some(0.0), Some(4.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 72, 54, 0, 23, 3.6, 0.0, 5.0, 16.5, Some(0.0), Some(5.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 361, 54, 0, 23, 4.0, 0.0, 6.0, 7.5, Some(0.0), Some(4.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 361, 54, 0, 23, 4.0, 0.0, 6.0, 7.5, Some(0.0), Some(4.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 361, 54, 0, 23, 3.6, 0.0, 5.0, 16.5, Some(0.0), Some(5.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); @@ -95,8 +95,8 @@ unsafe extern "C" fn game_attacks3s3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 75, 100, 0, 51, 6.0, 0.0, 15.0, 8.0, Some(0.0), Some(9.0), Some(11.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 75, 100, 0, 51, 5.0, 0.0, 7.2, 14.0, Some(0.0), Some(7.2), Some(7.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 68, 100, 0, 51, 6.0, 0.0, 15.0, 8.0, Some(0.0), Some(9.0), Some(11.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 68, 100, 0, 51, 5.0, 0.0, 7.2, 14.0, Some(0.0), Some(7.2), Some(7.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -140,8 +140,8 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { wait(lua_state, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("haver"), 6.0, 95, 140, 0, 48, 4.0, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 6.0, 95, 140, 0, 48, 4.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 95, 130, 0, 40, 4.0, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 6.0, 95, 140, 0, 48, 4.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 95, 130, 0, 40, 4.0, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 6.0); if is_excute(agent) { @@ -178,12 +178,15 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 3.0, 3.0); - frame(lua_state, 3.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 1.2, 3.0); + frame(lua_state, 1.2); + FT_MOTION_RATE_RANGE(agent, 1.2, 2.0, 1.0); + frame(lua_state, 2.0); FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 40, 116, 0, 30, 3.5, 0.0, 2.1, 8.0, Some(0.0), Some(2.5), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.25, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 40, 116, 0, 30, 2.2, 0.0, 1.3, 13.0, Some(0.0), Some(2.5), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.25, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 64, 60, 0, 50, 3.5, 0.0, 2.5, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 44, 116, 0, 30, 2.2, 0.0, 1.3, 13.0, Some(0.0), Some(2.5), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -191,8 +194,8 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 0.75); - frame(lua_state, 22.0); + FT_MOTION_RATE_RANGE(agent, 10.0, 23.0, 8.0); + frame(lua_state, 23.0); FT_MOTION_RATE(agent, 1.0); } diff --git a/fighters/metaknight/src/lib.rs b/fighters/metaknight/src/lib.rs index 42b4f95c4c..b2f23748fc 100644 --- a/fighters/metaknight/src/lib.rs +++ b/fighters/metaknight/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/metaknight/src/status/special_lw.rs b/fighters/metaknight/src/status/special_lw.rs index d5832d1445..48dc50d0c2 100644 --- a/fighters/metaknight/src/status/special_lw.rs +++ b/fighters/metaknight/src/status/special_lw.rs @@ -91,6 +91,8 @@ pub unsafe extern "C" fn motion_handling(fighter: &mut L2CFighterCommon) -> L2CV } else { MotionModule::change_motion(fighter.module_accessor, Hash40::new_raw(motion), 0.0, 1.0, false, 0.0, false, false); ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_METAKNIGHT_GENERATE_ARTICLE_MANTLE, Hash40::new_raw(mantle), true, -1.0); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 2.0, 0.0); } fighter.on_flag(*FIGHTER_METAKNIGHT_STATUS_SPECIAL_LW_FLAG_CONTINUE_MOT); return 1.into(); @@ -102,6 +104,8 @@ pub unsafe extern "C" fn motion_handling(fighter: &mut L2CFighterCommon) -> L2CV } else { MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new_raw(motion), -1.0, 1.0, 0.0, false, false); ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_METAKNIGHT_GENERATE_ARTICLE_MANTLE, Hash40::new_raw(mantle), true, frame); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 2.0, 0.0); } 0.into() } diff --git a/fighters/mewtwo/Cargo.toml b/fighters/mewtwo/Cargo.toml index b198e1cf4f..0ac00b55dd 100644 --- a/fighters/mewtwo/Cargo.toml +++ b/fighters/mewtwo/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/mewtwo/src/acmd/aerials.rs b/fighters/mewtwo/src/acmd/aerials.rs index 2f969a572e..67a6ade44e 100644 --- a/fighters/mewtwo/src/acmd/aerials.rs +++ b/fighters/mewtwo/src/acmd/aerials.rs @@ -4,7 +4,7 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 7.0); for _ in 0..5 { @@ -30,7 +30,7 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 41.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } @@ -39,22 +39,22 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 84, 96, 0, 43, 4.0, 0.0, 7.2, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 84, 96, 0, 43, 5.0, 0.0, 4.2, 9.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 84, 101, 0, 41, 4.0, 0.0, 7.2, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 84, 101, 0, 41, 5.0, 0.0, 4.2, 9.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 84, 96, 0, 43, 4.0, 0.0, 7.2, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 84, 96, 0, 43, 5.0, 0.0, 5.0, 10.9, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 84, 101, 0, 41, 4.0, 0.0, 7.2, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 84, 101, 0, 41, 5.0, 0.0, 5.0, 10.9, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 84, 96, 0, 43, 4.0, 0.0, 7.7, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 84, 96, 0, 43, 5.0, 0.0, 7.7, 9.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 84, 101, 0, 41, 4.0, 0.0, 7.7, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 84, 101, 0, 41, 5.0, 0.0, 7.7, 9.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 9.0); if is_excute(agent) { @@ -62,7 +62,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 35.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } @@ -96,31 +96,24 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { MotionModule::set_rate(boma, (12.0 - 1.0) / 7.3); frame(lua_state, 3.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - HIT_NO(agent, 12, *HIT_STATUS_NORMAL); - HIT_NO(agent, 13, *HIT_STATUS_NORMAL); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 12.0); MotionModule::set_rate(boma, 1.0); frame(lua_state, 13.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("s_tail1"), 13.0, 361, 105, 0, 5, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("s_tail5"), 12.0, 361, 95, 0, 5, 4.1, -1.0, -2.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("s_tail7"), 11.0, 361, 95, 0, 5, 3.8, 1.0, -1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("s_tail5"), 12.0, 50, 105, 0, 5, 4.1, -1.0, -2.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 2, 0, Hash40::new("s_tail7"), 11.0, 50, 105, 0, 5, 3.8, 1.0, -1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); } frame(lua_state, 18.0); - MotionModule::set_rate(boma, (37.0 - 18.0) / 19.0);//32 + MotionModule::set_rate(boma, (37.0 - 18.0) / 19.0); // 32 if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 20.5);//3f after clear - if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_OFF); - HIT_NO(agent, 13, *HIT_STATUS_OFF); - } frame(lua_state, 31.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } @@ -129,100 +122,60 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 13.0); if is_excute(agent) { - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - match color { - 0 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - 1 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - 2 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - 3 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - 4 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - 5 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - 6 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - 7 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - _ => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ), - }; + EFFECT_FOLLOW_FLIP(agent, Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new("top"), 0, 13, -5.8, 180, 45, 90, 1.05, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.15); } frame(lua_state, 18.5); if is_excute(agent) { - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_01"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_02"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_03"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_04"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_05"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_06"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_07"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_08"), true, true); + EffectModule::kill_kind(boma, Hash40::new(GET_COLOR_EFF_NAME(boma)), true, true); } } unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - MotionModule::set_rate(boma, (9.0 - 1.0) / 7.0); frame(lua_state, 3.0); if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_NORMAL); - HIT_NO(agent, 13, *HIT_STATUS_NORMAL); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 9.0); - MotionModule::set_rate(boma, 1.0); + frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("s_tail2"), 10.0, 55, 100, 0, 0, 4.5, 1.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("s_tail5"), 11.0, 55, 100, 0, 0, 4.1, 0.3, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("s_tail7"), 12.0, 55, 114, 0, 0, 3.5, 1.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("s_tail1"), 10.0, 50, 105, 0, 0, 4.5, 2.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("s_tail5"), 11.0, 50, 105, 0, 0, 4.1, -1.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 2, 0, Hash40::new("s_tail7"), 12.0, 50, 111, 0, 0, 3.5, 1.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); } - frame(lua_state, 11.0); + frame(lua_state, 10.0); if is_excute (agent) { - ATTACK(agent, 0, 0, Hash40::new("s_tail2"), 7.0, 65, 100, 0, 0, 4.5, 1.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("s_tail5"), 8.0, 65, 100, 0, 0, 4.1, 0.3, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("s_tail7"), 9.0, 65, 100, 0, 0, 3.5, 1.0, 1.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("s_tail1"), 7.0, 66, 111, 0, 0, 4.5, 2.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("s_tail5"), 8.0, 66, 111, 0, 0, 4.1, -1.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 2, 0, Hash40::new("s_tail7"), 9.0, 66, 111, 0, 0, 3.5, 1.0, 1.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); } frame(lua_state, 14.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 16.0); + frame(lua_state, 17.0); + MotionModule::set_rate(boma, (34.0 - 17.0) / 15.0); + frame(lua_state, 30.0); // 29 ingame still if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_OFF); - HIT_NO(agent, 13, *HIT_STATUS_OFF); - } - frame(lua_state, 30.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 34.0); + MotionModule::set_rate(boma, 1.0); // 32 } unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 9.0); + frame(lua_state, 8.0); if is_excute(agent) { - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - match color { - 0 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - 1 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - 2 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - 3 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - 4 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - 5 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - 6 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - 7 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - _ => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), -1.5, 9.1, -2.1, 0, 7, 90, 1.12, true, *EF_FLIP_YZ), - }; + EFFECT_FOLLOW(agent, Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new("top"), -1.5, 8.4, -1.9, 0, 20, 90.0, 1.21, true); LAST_EFFECT_SET_RATE(agent, 1.27); + LAST_EFFECT_SET_SCALE_W(agent, 1.28, 1.28, 1.17); } frame(lua_state, 15.0); if is_excute(agent) { - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_01"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_02"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_03"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_04"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_05"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_06"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_07"), true, true); - EffectModule::kill_kind(boma, Hash40::new("mewtwo_tail_attack_a_08"), true, true); + EffectModule::kill_kind(boma, Hash40::new(GET_COLOR_EFF_NAME(boma)), true, true); } } @@ -239,6 +192,15 @@ unsafe extern "C" fn expression_attackairhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_landingairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EffectModule::kill_kind(boma, Hash40::new(GET_COLOR_EFF_NAME(boma)), true, true); + } +} + unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -246,21 +208,42 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { MotionModule::set_rate(boma, (19.0 - 1.0) / 14.0); frame(lua_state, 4.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 19.0); MotionModule::set_rate(boma, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 270, 62, 0, 11, 5.5, 0.0, -7.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 70, 105, 0, 20, 7.5, 0.0, -5.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 13.0, 70, 107, 0, 17, 3.75, -0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 13.0, 70, 107, 0, 17, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("toel"), 16.0, 270, 61, 0, 11, 4.25, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 23.0); + frame(lua_state, 24.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 46.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + } +} + +unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, -8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.8); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_hand"), Hash40::new("mewtwo_pk_hand"), Hash40::new("toel"), 2.5, 0, 0, 0, 0, 0, 1.0, true, *EF_FLIP_NONE); + } + frame(lua_state, 19.0); + if is_excute(agent) { + EFFECT_FLIP(agent, Hash40::new("mewtwo_pk_attack_b"), Hash40::new("mewtwo_pk_attack_b"), Hash40::new("top"), 3, -4.5, 0, 90, 0, 0, 1, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.5); + EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), false, false); } } @@ -272,10 +255,13 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairb", game_attackairb, Priority::Low); agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); + agent.acmd("effect_landingairb", effect_landingairhi, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); agent.acmd("effect_attackairhi", effect_attackairhi, Priority::Low); agent.acmd("expression_attackairhi", expression_attackairhi, Priority::Low); + agent.acmd("effect_landingairhi", effect_landingairhi, Priority::Low); agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); + agent.acmd("effect_attackairlw", effect_attackairlw, Priority::Low); } diff --git a/fighters/mewtwo/src/acmd/ground.rs b/fighters/mewtwo/src/acmd/ground.rs index 45d0945a1d..8c4118911d 100644 --- a/fighters/mewtwo/src/acmd/ground.rs +++ b/fighters/mewtwo/src/acmd/ground.rs @@ -4,62 +4,80 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.6); - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 3.0); frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 83, 27, 0, 20, 3.5, 0.0, 11.0, 5.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 83, 27, 0, 20, 4.5, 0.0, 11.8, 9.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 83, 27, 0, 20, 4.0, 0.0, 9.0, 13.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 6.0, 361, 20, 0, 20, 2.5, 1.0, 3.0, 5.0, Some(1.0), Some(3.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("havel"), 4.0, 83, 36, 0, 20, 3.9, -3.5, 0.0, -2.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 83, 36, 0, 20, 3.0, 1.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 4.0, 83, 36, 0, 20, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 361, 20, 0, 20, 2.5, 1.0, 3.0, 5.0, Some(1.0), Some(3.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); AttackModule::set_down_only(boma, 3, true); } - frame(lua_state, 8.0); + frame(lua_state, 9.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } - frame(lua_state, 14.0); + frame(lua_state, 12.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + agent.off_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } -unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), -3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_hand"), Hash40::new("mewtwo_pk_hand"), Hash40::new("havel"), -1, 0, 1, 0, 0, 0, 0.7, true, *EF_FLIP_YZ); + } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 90, 0, 40, 5.5, 0.0, 10.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 90, 0, 40, 5.5, 0.0, 10.5, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_attack_d"), Hash40::new("mewtwo_pk_attack_d"), Hash40::new("havel"), -3.5, 0, -2, 0, 0, 0, 0.28, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 7.0/6.0); } - frame(lua_state, 9.0); + frame(lua_state, 11.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), false, false); } } -unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 7.0); + FT_MOTION_RATE_RANGE(agent, 7.0, 14.0, 5.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), true, false); + ATTACK(agent, 0, 0, Hash40::new("havel"), 5.5, 55, 105, 0, 40, 4.5, -3.75, 0.0, 0.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 5.5, 55, 105, 0, 40, 3.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 5.5, 55, 105, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } - frame(lua_state, 1.0); + frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 1.0); // 29 faf if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_hand"), Hash40::new("mewtwo_pk_hand"), Hash40::new("havel"), -1.5, 0, 1.3, 0, 0, 0, 1, true, *EF_FLIP_YZ); + AttackModule::clear_all(boma); } - frame(lua_state, 3.0); +} + +unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_attack_g"), Hash40::new("mewtwo_pk_attack_g"), Hash40::new("top"), 0, 12, 8, 0, 10, 115, 1, true, *EF_FLIP_YZ); + EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), true, false); } - frame(lua_state, 5.0); + frame(lua_state, 4.0); if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_hand"), Hash40::new("mewtwo_pk_hand"), Hash40::new("havel"), -1, 0, 1, 0, 0, 0, 0.8, true, *EF_FLIP_YZ); FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 11.0); + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_attack_d"), Hash40::new("mewtwo_pk_attack_d"), Hash40::new("havel"), -3.75, 0, 0.25, 0, 0, 0, 0.38, true, *EF_FLIP_YZ); + } + frame(lua_state, 13.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), false, false); } @@ -68,10 +86,9 @@ unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { unsafe extern "C" fn sound_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); + frame(lua_state, 2.0); if is_excute(agent) { - STOP_SE(agent, Hash40::new("se_mewtwo_attack100")); - PLAY_SE(agent, Hash40::new("se_mewtwo_attack100_02")); + PLAY_SE(agent, Hash40::new("se_mewtwo_attackhard_s01")); PLAY_SEQUENCE(agent, Hash40::new("seq_mewtwo_rnd_attack")); } } @@ -86,11 +103,11 @@ unsafe extern "C" fn expression_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_erase"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 4.0); + frame(lua_state, 5.0); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 6.0); + frame(lua_state, 7.0); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); } @@ -152,23 +169,21 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.85); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.875); FighterAreaModuleImpl::enable_fix_jostle_area(boma, 8.5, 3.0); } - frame(lua_state, 10.0); + frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 54, 90, 0, 50, 4.3, 0.0, 8.2, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 54, 90, 0, 50, 5.5, 0.0, 8.6, 13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 12.0, 54, 90, 0, 50, 3.9, -0.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 54, 90, 0, 50, 4.3, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } - frame(lua_state, 12.0); - FT_MOTION_RATE_RANGE(agent, 13.0, 21.0, 9.0); + frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 60, 97, 0, 47, 3.7, 0.0, 8.2, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 60, 97, 0, 47, 4.5, 0.0, 8.6, 13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 7.0, 60, 97, 0, 47, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("haver"), 7.0, 60, 97, 0, 47, 3.8, 0.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); FighterAreaModuleImpl::enable_fix_jostle_area(boma, 3.5, 3.0); } - frame(lua_state, 21.0); //43 - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 22.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -179,22 +194,32 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 9.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_a"), Hash40::new("top"), 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_attack_e"), Hash40::new("mewtwo_pk_attack_e"), Hash40::new("haver"), 1.5, 0, 1, 0, 180, 0, 0.4, true, *EF_FLIP_YZ); + EffectModule::enable_sync_init_pos_last(boma); + LAST_EFFECT_SET_RATE(agent, 0.75); + let effect = EffectModule::get_last_handle(boma) as u64; + VarModule::set_int64(agent.battle_object, vars::mewtwo::status::EFFECT_HANDLER, effect); } frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FLW_POS(agent, Hash40::new("mewtwo_pk_attack_e"), Hash40::new("haver"), 1.9 * PostureModule::lr(boma), 0, 0, 0, 0, 0, 0.9, true); - EffectModule::enable_sync_init_pos_last(boma); - //LAST_EFFECT_SET_RATE(fighter, 1.5); + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_a"), Hash40::new("top"), 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 11.0); + if is_excute(agent) { + let effect = VarModule::get_int64(agent.battle_object, vars::mewtwo::status::EFFECT_HANDLER); + EffectModule::set_scale(boma, effect as u32, &Vector3f::new(0.7, 0.7, 0.7)); + EffectModule::set_rate(boma, effect as u32, 1.0); } - frame(lua_state, 21.0); + frame(lua_state, 14.0); if is_excute(agent) { - EffectModule::kill_kind(boma, Hash40::new("mewtwo_pk_attack_e"), true, true); + let effect = VarModule::get_int64(agent.battle_object, vars::mewtwo::status::EFFECT_HANDLER); + EffectModule::set_scale(boma, effect as u32, &Vector3f::new(0.6, 0.6, 0.6)); } } pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); + agent.acmd("effect_attack11", effect_attack11, Priority::Low); agent.acmd("game_attack12", game_attack12, Priority::Low); agent.acmd("effect_attack12", effect_attack12, Priority::Low); diff --git a/fighters/mewtwo/src/acmd/mod.rs b/fighters/mewtwo/src/acmd/mod.rs index d8a22387b4..0e20a74ad2 100644 --- a/fighters/mewtwo/src/acmd/mod.rs +++ b/fighters/mewtwo/src/acmd/mod.rs @@ -8,6 +8,30 @@ mod specials; mod throws; mod other; +pub unsafe fn GET_COLOR_EFF_NAME(boma: &mut BattleObjectModuleAccessor) -> &str { + return match boma.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_COLOR) { + 0 => "mewtwo_tail_attack_a_01", + 1 => "mewtwo_tail_attack_a_02", + 2 => "mewtwo_tail_attack_a_03", + 3 => "mewtwo_tail_attack_a_04", + 4 => "mewtwo_tail_attack_a_05", + 5 => "mewtwo_tail_attack_a_06", + 6 => "mewtwo_tail_attack_a_07", + 7 => "mewtwo_tail_attack_a_08", + _ => "mewtwo_tail_attack_a_01", + }; //matches glow color +} + +//pub unsafe fn TOGGLE_TAIL(agent: &mut L2CAgentBase, toggle: bool) { +// if toggle { +// //HIT_NO(agent, 12, *HIT_STATUS_NORMAL); +// HIT_NO(agent, 13, *HIT_STATUS_NORMAL); +// } else { +// //HIT_NO(agent, 12, *HIT_STATUS_NORMAL); +// HIT_NO(agent, 13, *HIT_STATUS_OFF); +// } +//} + pub fn install(agent: &mut Agent) { ground::install(agent); tilts::install(agent); diff --git a/fighters/mewtwo/src/acmd/other.rs b/fighters/mewtwo/src/acmd/other.rs index 983ee4c5bc..6cdea66ccf 100644 --- a/fighters/mewtwo/src/acmd/other.rs +++ b/fighters/mewtwo/src/acmd/other.rs @@ -79,7 +79,6 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); @@ -89,10 +88,7 @@ unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { VisibilityModule::set_whole(boma, true); ArticleModule::remove(boma, *FIGHTER_MEWTWO_GENERATE_ARTICLE_ESCAPEAIRDUMMY, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -107,9 +103,24 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { VisibilityModule::set_whole(boma, true); ArticleModule::remove(boma, *FIGHTER_MEWTWO_GENERATE_ARTICLE_ESCAPEAIRDUMMY, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); } - frame(lua_state, 39.0); + +} + +unsafe extern "C" fn sound_fuwafuwa(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + let sfx_handle = SoundModule::play_status_se(boma, Hash40::new("se_common_spirits_pfog_loop"), true, false, false); + SoundModule::set_se_vol(boma, sfx_handle as i32, 1.1, 0); + } +} + +unsafe extern "C" fn expression_fuwafuwa(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + ControlModule::set_rumble(boma, Hash40::new("rbkind_13_floating"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); } } @@ -131,10 +142,10 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_fuwafuwastart", acmd_stub, Priority::Low); agent.acmd("effect_fuwafuwastart", acmd_stub, Priority::Low); - agent.acmd("sound_fuwafuwastart", acmd_stub, Priority::Low); - agent.acmd("expression_fuwafuwastart", acmd_stub, Priority::Low); + agent.acmd("sound_fuwafuwastart", sound_fuwafuwa, Priority::Low); + agent.acmd("expression_fuwafuwastart", expression_fuwafuwa, Priority::Low); agent.acmd("game_fuwafuwa", acmd_stub, Priority::Low); agent.acmd("effect_fuwafuwa", acmd_stub, Priority::Low); - agent.acmd("sound_fuwafuwa", acmd_stub, Priority::Low); - agent.acmd("expression_fuwafuwa", acmd_stub, Priority::Low); + agent.acmd("sound_fuwafuwa", sound_fuwafuwa, Priority::Low); + agent.acmd("expression_fuwafuwa", expression_fuwafuwa, Priority::Low); } \ No newline at end of file diff --git a/fighters/mewtwo/src/acmd/smashes.rs b/fighters/mewtwo/src/acmd/smashes.rs index 008ce21c93..ac15134451 100644 --- a/fighters/mewtwo/src/acmd/smashes.rs +++ b/fighters/mewtwo/src/acmd/smashes.rs @@ -9,7 +9,7 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 12.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 18.0); if is_excute(agent) { @@ -31,7 +31,7 @@ unsafe extern "C" fn game_attacks4hi(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 12.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 18.0); if is_excute(agent) { @@ -53,7 +53,7 @@ unsafe extern "C" fn game_attacks4lw(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 12.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 18.0); if is_excute(agent) { @@ -66,12 +66,40 @@ unsafe extern "C" fn game_attacks4lw(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attacks4x(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 10, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 18.0); + if is_excute(agent) { + let mut pos_y = 10.0; + let mut rot_x = 0.0; + if agent.is_motion(Hash40::new("attack_s4_lw")) { + pos_y = 6.5; + rot_x = 30.0; + } + if agent.is_motion(Hash40::new("attack_s4_hi")) { + pos_y = 13.5; + rot_x = -30.0; + } + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_attack_b"), Hash40::new("mewtwo_pk_attack_b"), Hash40::new("top"), 0, pos_y, 16.5, rot_x, 0, 0, 0.85, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_SCALE_W(agent, 0.9, 0.65, 0.9); + LAST_EFFECT_SET_RATE(agent, 19.0/17.0); + } + frame(lua_state, 20.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } +} + unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 9.0); if is_excute(agent) { @@ -122,7 +150,7 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), false, false); EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("mewtwo_pk_attack_a"), Hash40::new("mewtwo_pk_attack_a"), Hash40::new("top"), -2.5, 21.5, 0, 0, 0, 0, 0.95, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 1.2); + LAST_EFFECT_SET_RATE(agent, 1.25); } frame(lua_state, 9.0); if is_excute(agent) { @@ -135,15 +163,17 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 16.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 21.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 55, 115, 0, 20, 11.0, 0.0, 4.0, 13.7, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 60, 99, 0, 30, 4.5, 0.0, 4.5, 12.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 55, 111, 0, 20, 10.0, 0.0, 4.5, 12.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 18, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } wait(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 55, 118, 0, 20, 5.0, 0.0, 4.0, 13.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 55, 118, 0, 20, 4.5, 0.0, 4.5, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 13, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + AttackModule::clear(boma, 1, false); } wait(lua_state, 7.0); if is_excute(agent) { @@ -151,13 +181,50 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 15, -6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_hand"), Hash40::new("mewtwo_pk_hand"), Hash40::new("havel"), -1.5, 0, 2, 0, 0, 0, 0.7, true, *EF_FLIP_YZ); + } + frame(lua_state, 19.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), true, true); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_hand"), Hash40::new("mewtwo_pk_hand"), Hash40::new("havel"), 0, 1, 3, 0, 0, 0, 1.3, true, *EF_FLIP_YZ); + } + frame(lua_state, 21.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_pk_attack_c"), Hash40::new("mewtwo_pk_attack_c"), Hash40::new("top"), 0, 3.5, 11.5, 0, 0, 0, 0.8, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 6.0/3.0); + let effect = EffectModule::get_last_handle(boma) as u64; + VarModule::set_int64(agent.battle_object, vars::mewtwo::status::EFFECT_HANDLER, effect); + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 13, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + FOOT_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 24.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), false, false); + let effect = VarModule::get_int64(agent.battle_object, vars::mewtwo::status::EFFECT_HANDLER); + EffectModule::set_rate(boma, effect as u32, 1.0); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); agent.acmd("game_attacks4hi", game_attacks4hi, Priority::Low); agent.acmd("game_attacks4lw", game_attacks4lw, Priority::Low); + agent.acmd("effect_attacks4", effect_attacks4x, Priority::Low); + agent.acmd("effect_attacks4hi", effect_attacks4x, Priority::Low); + agent.acmd("effect_attacks4lw", effect_attacks4x, Priority::Low); + agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); agent.acmd("effect_attackhi4", effect_attackhi4, Priority::Low); agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); + agent.acmd("effect_attacklw4", effect_attacklw4, Priority::Low); } \ No newline at end of file diff --git a/fighters/mewtwo/src/acmd/specials.rs b/fighters/mewtwo/src/acmd/specials.rs index 03abbd995d..66f07e02e9 100644 --- a/fighters/mewtwo/src/acmd/specials.rs +++ b/fighters/mewtwo/src/acmd/specials.rs @@ -1,44 +1,89 @@ +use smash::app::sv_animcmd::EFFECT_FLW_POS_UNSYNC_VIS; +use core::f32; + use super::*; +unsafe extern "C" fn effect_specialnhold(agent: &mut L2CAgentBase) { + if is_excute(agent) && agent.is_situation(*SITUATION_KIND_GROUND) { + FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -10, 0, 0, 0, 0, 0, 0.5, 10, 0, 4, 0, 0, 0, false); + } + wait(agent.lua_state_agent, 8.0); +} + +unsafe extern "C" fn sound_specialnhold(agent: &mut L2CAgentBase) { + if is_excute(agent) { + PLAY_STATUS(agent, Hash40::new("se_mewtwo_special_n01")); + } +} + +unsafe extern "C" fn effect_specialnmax(agent: &mut L2CAgentBase) { + if agent.is_prev_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_N_HOLD) { + if is_excute(agent) { + EFFECT_FLW_POS(agent, Hash40::new("mewtwo_shadowball_max_sign"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1.4, true); + EffectModule::enable_sync_init_pos_last(agent.module_accessor); + } + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -10, 0, 0, 0, 0, 0, 0.8, 10, 0, 4, 0, 0, 0, false); + } + FLASH(agent, 0.9, 0.7, 1, 0.5); + } + wait(agent.lua_state_agent, 1.0); + if is_excute(agent) { + FLASH_FRM(agent, 5, 0.9, 0.4, 1, 0.1); + } + wait(agent.lua_state_agent, 8.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + wait(agent.lua_state_agent, 1.0); + } else { + return effect_specialnhold(agent); + } +} + +unsafe extern "C" fn sound_specialnmax(agent: &mut L2CAgentBase) { + if agent.is_prev_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_N_HOLD) { + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_mewtwo_special_n02")); + STOP_SE(agent, Hash40::new("se_mewtwo_special_n01")); + PLAY_STATUS(agent, Hash40::new("se_mewtwo_special_n07")); + } + } else { + if is_excute(agent) { + PLAY_STATUS(agent, Hash40::new("se_mewtwo_special_n07")); + } + } +} + unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 8.0); + frame(lua_state, 9.0); if is_excute(agent) { shield!(agent, *MA_MSC_CMD_SHIELD_ON, *COLLISION_KIND_REFLECTOR, *FIGHTER_MEWTWO_REFLECTOR_KIND_REFLECTOR, *FIGHTER_REFLECTOR_GROUP_EXTEND); } frame(lua_state, 12.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 7.4, 0.0, 8.4, 17.0, None, None, None, *FIGHTER_STATUS_KIND_MEWTWO_THROWN, *COLLISION_SITUATION_MASK_GA); - CATCH(agent, 1, Hash40::new("top"), 10.2, 0.0, 8.4, 17.0, None, None, None, *FIGHTER_STATUS_KIND_MEWTWO_THROWN, *COLLISION_SITUATION_MASK_G); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 280, 16, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + CATCH(agent, 0, Hash40::new("top"), 7.4, 0.0, 9.3, 14.3, None, None, None, *FIGHTER_STATUS_KIND_MEWTWO_THROWN, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 1, Hash40::new("top"), 9.5, 0.0, 9.3, 14.3, None, None, None, *FIGHTER_STATUS_KIND_MEWTWO_THROWN, *COLLISION_SITUATION_MASK_G); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 0.0, 361, 100, 0, 100, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW_MEWTWO, 0, 1.0, 280, 50, 0, 100, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); AttackModule::set_catch_only(boma, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW_MEWTWO, true, true); } - wait(lua_state, 4.0); + frame(lua_state, 16.0); if is_excute(agent) { grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); } - frame(lua_state, 20.0); - for _ in 0..6 { - wait(lua_state, 2.0); - if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_MEWTWO_STATUS_SPECIAL_S_WORK_INT_TARGET_OBJECT_ID); - let target_group = WorkModule::get_int64(boma, *FIGHTER_MEWTWO_STATUS_SPECIAL_S_WORK_INT_THROWN_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_MEWTWO_STATUS_SPECIAL_S_WORK_INT_THROWN_HIT_NO); - ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW_MEWTWO, Hash40::new("throw"), target, target_group, target_no); - } - } - frame(lua_state, 32.0); + frame(lua_state, 33.0); if is_excute(agent) { shield!(agent, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, *FIGHTER_MEWTWO_REFLECTOR_KIND_REFLECTOR, *FIGHTER_REFLECTOR_GROUP_EXTEND); agent.on_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_S_FLAG_GRAVITY_NORMAL); } - frame(lua_state, 40.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MEWTWO_STATUS_SPECIAL_S_FLAG_HIT); - } + frame(lua_state, 36.0); + FT_MOTION_RATE_RANGE(agent, 36.0, 45.0, 14.0); // 50 faf + frame(lua_state, 45.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { @@ -50,8 +95,10 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mewtwo_nenriki"), Hash40::new("top"), 0, 9, 17, 0, 90, 0, 0.45, true); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("mewtwo_nenriki"), Hash40::new("top"), 0, 9.3, 14.3, 0, 90, 0, 0.36, true); EffectModule::enable_sync_init_pos_last(boma); + let effect = EffectModule::get_last_handle(boma) as u64; + VarModule::set_int64(agent.battle_object, vars::mewtwo::status::EFFECT_HANDLER, effect); } frame(lua_state, 14.0); if is_excute(agent) { @@ -61,126 +108,151 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), false, false); } - frame(lua_state, 35.0); + frame(lua_state, 33.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_nenriki"), false, true); } } -unsafe extern "C" fn game_specialairhistart(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialsthrow(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 10.0); + frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 48.0, 50.0); + for _ in 0..4 { + if is_excute(agent) { + let target = agent.get_int64(*FIGHTER_MEWTWO_STATUS_SPECIAL_S_WORK_INT_TARGET_OBJECT_ID); + let target_group = agent.get_int64(*FIGHTER_MEWTWO_STATUS_SPECIAL_S_WORK_INT_THROWN_HIT_GROUP); + let target_no = agent.get_int64(*FIGHTER_MEWTWO_STATUS_SPECIAL_S_WORK_INT_THROWN_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW_MEWTWO, Hash40::new("throw"), target, target_group, target_no); + } + wait(lua_state, 6.0); + } + frame(lua_state, 48.0); + FT_MOTION_RATE_RANGE(agent, 48.0, 59.0, 14.0); if is_excute(agent) { - KineticModule::clear_speed_all(boma); + let final_pos = VarModule::get_vec2(agent.battle_object, vars::mewtwo::status::SPECIAL_S_THROW_POS); + let pos_diff = Vector2f{x: (final_pos.x - 14.3)*boma.lr(), y: final_pos.y - 9.5}; + if pos_diff.x.abs() + pos_diff.y.abs() > 0.0 { + let angle_max = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_s.angle_max"); + let angle_diff = pos_diff.y.atan2(pos_diff.x * boma.lr()); + let comb_angle = (angle_diff.to_degrees() + 75.0)/2.0; + let mut angle_norm = if comb_angle-75.0 > angle_max {(75.0+angle_max) as u64} else {comb_angle.round() as u64}; + if comb_angle-75.0 < -angle_max {angle_norm = (75.0-angle_max) as u64;} + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, angle_norm, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, false, Hash40::new("collision_attr_grudge"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + AttackModule::set_add_reaction_frame(boma, 0, -1.0, false); // eq to 15 frames endlag + agent.on_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_S_FLAG_GRAVITY_NORMAL); + agent.on_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_S_FLAG_HIT); } + frame(lua_state, 59.0); + FT_MOTION_RATE(agent, 1.0); } -unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_specialsthrow(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - GroundModule::select_cliff_hangdata(boma, *FIGHTER_MEWTWO_CLIFF_HANG_DATA_SPECIAL_HI as u32); + frame(lua_state, 15.0); + for _ in 0..4 { + if is_excute(agent) { + PLAY_STATUS(agent, Hash40::new("se_mewtwo_attack100")); + } + wait(lua_state, 6.0); } - frame(lua_state, 6.0); + frame(lua_state, 45.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + PLAY_SE(agent, Hash40::new("vc_mewtwo_attack03")); + PLAY_SE(agent, Hash40::new("se_mewtwo_attack100_02")); } - frame(lua_state, 15.0); - if is_excute(agent) { - agent.on_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_FLAG_1); - } //make use of unused flag to enable drift } -unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_specialsthrow(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 16.0); + frame(lua_state, 39.0); if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_MEWTWO_GENERATE_ARTICLE_BINDBALL, false, -1); + EFFECT_FOLLOW(agent, Hash40::new("mewtwo_kanasibari_eye"), Hash40::new("head"), 0.7, 1.9, -1.4*boma.lr(), 0, 0, 0, 0.25, true); } - frame(lua_state, 24.0); + frame(lua_state, 43.0); + if is_excute(agent) { + let eff_offset = VarModule::get_vec2(agent.battle_object, vars::mewtwo::status::SPECIAL_S_THROW_CAPTURED_POS_OFFSET); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, eff_offset.y, eff_offset.x, 0, 0, 0, 0.9, true); + LAST_EFFECT_SET_COLOR(agent, 0.4, 0.0, 1.0); + LAST_EFFECT_SET_RATE(agent, 6.0/7.0); + } + frame(lua_state, 50.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 20.0/(53.0-24.0)); + EffectModule::kill_kind(boma, Hash40::new("mewtwo_final_aura"), false, true); + EFFECT_OFF_KIND(agent, Hash40::new("mewtwo_pk_hand"), false, false); } } -unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { +unsafe extern "C" fn expression_specialsthrow(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 16.0); if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_MEWTWO_GENERATE_ARTICLE_BINDBALL, false, -1); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); } - frame(lua_state, 24.0); + frame(lua_state, 17.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 20.0/(53.0-24.0)); + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); } -} - -unsafe extern "C" fn effect_specialnhold(agent: &mut L2CAgentBase) { - if is_excute(agent) && agent.is_situation(*SITUATION_KIND_GROUND) { - FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -10, 0, 0, 0, 0, 0, 0.5, 10, 0, 4, 0, 0, 0, false); + frame(lua_state, 35.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); + } + frame(lua_state, 44.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + ControlModule::set_rumble(boma, Hash40::new("rbkind_attackl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + QUAKE(agent, *CAMERA_QUAKE_KIND_S); } - wait(agent.lua_state_agent, 8.0); } -unsafe extern "C" fn sound_specialnhold(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialairhistart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 10.0); if is_excute(agent) { - PLAY_STATUS(agent, Hash40::new("se_mewtwo_special_n01")); + KineticModule::clear_speed_all(boma); } } -unsafe extern "C" fn effect_specialnmax(agent: &mut L2CAgentBase) { - if agent.is_prev_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_N_HOLD) { - if is_excute(agent) { - EFFECT_FLW_POS(agent, Hash40::new("mewtwo_shadowball_max_sign"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1.4, true); - EffectModule::enable_sync_init_pos_last(agent.module_accessor); - } - if is_excute(agent) { - if agent.is_situation(*SITUATION_KIND_GROUND) { - FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -10, 0, 0, 0, 0, 0, 0.8, 10, 0, 4, 0, 0, 0, false); - } - FLASH(agent, 0.9, 0.7, 1, 0.5); - } - wait(agent.lua_state_agent, 1.0); - if is_excute(agent) { - FLASH_FRM(agent, 5, 0.9, 0.4, 1, 0.1); - } - wait(agent.lua_state_agent, 8.0); - if is_excute(agent) { - COL_NORMAL(agent); - } - wait(agent.lua_state_agent, 1.0); - } else { - return effect_specialnhold(agent); +unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + GroundModule::select_cliff_hangdata(boma, *FIGHTER_MEWTWO_CLIFF_HANG_DATA_SPECIAL_HI as u32); } + frame(lua_state, 6.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + } + frame(lua_state, 15.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_FLAG_1); + } // make use of unused flag to enable drift } -unsafe extern "C" fn sound_specialnmax(agent: &mut L2CAgentBase) { - if agent.is_prev_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_N_HOLD) { - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_mewtwo_special_n02")); - STOP_SE(agent, Hash40::new("se_mewtwo_special_n01")); - PLAY_STATUS(agent, Hash40::new("se_mewtwo_special_n07")); - } - } else { - if is_excute(agent) { - PLAY_STATUS(agent, Hash40::new("se_mewtwo_special_n07")); - } +unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 6.0); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 16.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_MEWTWO_GENERATE_ARTICLE_BINDBALL, false, -1); } + frame(lua_state, 24.0); + FT_MOTION_RATE_RANGE(agent, 24.0, 53.0, 21.0); + frame(lua_state, 53.0); + FT_MOTION_RATE(agent, 1.0); } pub fn install(agent: &mut Agent) { - agent.acmd("game_specials", game_specials, Priority::Low); - agent.acmd("effect_specials", effect_specials, Priority::Low); - - agent.acmd("game_specialairhistart", game_specialairhistart, Priority::Low); - agent.acmd("game_specialairhi", game_specialairhi, Priority::Low); - - agent.acmd("game_speciallw", game_speciallw, Priority::Low); - agent.acmd("game_specialairlw", game_specialairlw, Priority::Low); - agent.acmd("effect_specialnhold", effect_specialnhold, Priority::Low); agent.acmd("sound_specialnhold", sound_specialnhold, Priority::Low); agent.acmd("effect_specialnmax", effect_specialnmax, Priority::Low); @@ -189,4 +261,18 @@ pub fn install(agent: &mut Agent) { agent.acmd("sound_specialairnhold", sound_specialnhold, Priority::Low); agent.acmd("effect_specialairnmax", effect_specialnmax, Priority::Low); agent.acmd("sound_specialairnmax", sound_specialnmax, Priority::Low); + + agent.acmd("game_specials", game_specials, Priority::Low); + agent.acmd("effect_specials", effect_specials, Priority::Low); + + agent.acmd("game_specialsthrow", game_specialsthrow, Priority::Low); + agent.acmd("effect_specialsthrow", effect_specialsthrow, Priority::Low); + agent.acmd("sound_specialsthrow", sound_specialsthrow, Priority::Low); + agent.acmd("expression_specialsthrow", expression_specialsthrow, Priority::Low); + + agent.acmd("game_specialairhistart", game_specialairhistart, Priority::Low); + agent.acmd("game_specialairhi", game_specialairhi, Priority::Low); + + agent.acmd("game_speciallw", game_speciallw, Priority::Low); + agent.acmd("game_specialairlw", game_speciallw, Priority::Low); } diff --git a/fighters/mewtwo/src/acmd/throws.rs b/fighters/mewtwo/src/acmd/throws.rs index 8363bd5d9f..57c919dbc0 100644 --- a/fighters/mewtwo/src/acmd/throws.rs +++ b/fighters/mewtwo/src/acmd/throws.rs @@ -3,15 +3,16 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); - FT_MOTION_RATE_RANGE(agent, 6.0, 8.0, 1.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 6.0); + FT_MOTION_RATE_RANGE(agent, 6.0, 8.0, 1.0); frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.8, 0.0, 10.0, 0.0, Some(0.0), Some(10.0), Some(10.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.8, 0.0, 10.0, 4.8, Some(0.0), Some(10.0), Some(10.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -33,7 +34,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.8, 0.0, 8.5, 4.5, Some(0.0), Some(8.5), Some(11.25), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.8, 0.0, 8.5, 4.8, Some(0.0), Some(8.5), Some(11.25), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -55,7 +56,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { frame(lua_state, 12.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.8, 0.0, 8.5, -4.5, Some(0.0), Some(8.5), Some(-17.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.8, 0.0, 8.5, -4.8, Some(0.0), Some(8.5), Some(-17.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -74,7 +75,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 43.0); - FT_MOTION_RATE_RANGE(agent, 43.0, 78.0, 27.0); + FT_MOTION_RATE_RANGE(agent, 43.0, 78.0, 26.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); @@ -87,19 +88,19 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 74, 57, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 76, 64, 0, 68, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 16.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("s_tail7"), 4.0, 80, 104, 0, 40, 3.9, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("s_tail5"), 4.0, 80, 105, 0, 40, 3.1, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("s_tail5"), 4.0, 80, 104, 0, 40, 3.1, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_TAIL); ATTACK(agent, 2, 0, Hash40::new("s_tail3"), 4.0, 80, 104, 0, 40, 3.1, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_TAIL); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 13, 0); } frame(lua_state, 18.0); - FT_MOTION_RATE(agent, 0.85); + FT_MOTION_RATE_RANGE(agent, 18.0, 58.0, 35.0); if is_excute(agent) { let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); diff --git a/fighters/mewtwo/src/acmd/tilts.rs b/fighters/mewtwo/src/acmd/tilts.rs index b86d067282..d02201075c 100644 --- a/fighters/mewtwo/src/acmd/tilts.rs +++ b/fighters/mewtwo/src/acmd/tilts.rs @@ -5,11 +5,6 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 4.375); - frame(lua_state, 4.0); - if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_NORMAL); - HIT_NO(agent, 13, *HIT_STATUS_NORMAL); - } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); @@ -22,11 +17,6 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - wait(lua_state, 3.0); - if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_OFF); - HIT_NO(agent, 13, *HIT_STATUS_OFF); - } } unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { @@ -34,18 +24,7 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - match color { - 0 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - 1 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - 2 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - 3 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - 4 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - 5 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - 6 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - 7 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - _ => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ), - }; + EFFECT_FOLLOW_FLIP(agent, Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new("top"), 2, 8.0, 6.2, 0, -85, -15.3, 1, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 1.3); } frame(lua_state, 11.0); @@ -59,18 +38,7 @@ unsafe extern "C" fn effect_attacks3hi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - match color { - 0 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - 1 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - 2 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - 3 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - 4 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - 5 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - 6 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - 7 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - _ => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ), - }; + EFFECT_FOLLOW_FLIP(agent, Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new("top"), 2, 11.0, 6.4, -34, -72, 49.6, 1, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 1.3); } frame(lua_state, 11.0); @@ -84,18 +52,7 @@ unsafe extern "C" fn effect_attacks3lw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - match color { - 0 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - 1 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - 2 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - 3 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - 4 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - 5 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - 6 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - 7 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - _ => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ), - }; + EFFECT_FOLLOW_FLIP(agent, Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new("top"), 2, 5, 6.5, 82, -85, -95.5, 1, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 1.3); } frame(lua_state, 11.0); @@ -125,36 +82,29 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.714); - frame(lua_state, 3.0); - if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_NORMAL); - HIT_NO(agent, 13, *HIT_STATUS_NORMAL); - } + FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 5.0); frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 8.0); + frame(lua_state, 8.0); // 7 if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("s_tail1"), 9.0, 80, 81, 0, 63, 3.8, 0.0, 1.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("s_tail3"), 8.0, 85, 81, 0, 54, 4.2, 0.0, 1.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("s_tail5"), 6.0, 67, 71, 0, 45, 3.5, 0.8, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 3, 0, Hash40::new("s_tail7"), 5.0, 67, 71, 0, 45, 3.3, 1.0, 0.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("s_tail1"), 9.0, 65, 115, 0, 25, 4.3, 0.0, 1.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("s_tail3"), 8.0, 70, 115, 0, 25, 4.5, -0.2, 1.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 2, 0, Hash40::new("s_tail5"), 5.0, 80, 125, 0, 25, 3.5, 1.0, 1.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 3, 0, Hash40::new("s_tail7"), 5.0, 80, 125, 0, 25, 3.3, 1.0, 0.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("s_tail1"), 9.0, 74, 81, 0, 45, 3.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("s_tail3"), 8.0, 74, 81, 0, 45, 4.2, 0.0, 1.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 3, 0, Hash40::new("s_tail7"), 5.0, 67, 71, 0, 45, 3.3, 1.0, 0.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("s_tail1"), 9.0, 65, 115, 0, 25, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("s_tail3"), 8.0, 70, 115, 0, 25, 4.2, 0.0, 1.3, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 3, 0, Hash40::new("s_tail7"), 5.0, 80, 125, 0, 25, 3.3, 1.0, 0.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); } frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 33.0, 15.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 18.0); - if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_OFF); - HIT_NO(agent, 13, *HIT_STATUS_OFF); - } + frame(lua_state, 33.0); // 29 + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { @@ -166,18 +116,7 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - match color { - 0 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - 1 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - 2 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - 3 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - 4 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - 5 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - 6 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - 7 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - _ => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ), - }; + EFFECT_FOLLOW_FLIP(agent, Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new("top"), 0, 14, 1.5, 0, 5, 90, 1.05, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 0.9); } } @@ -185,27 +124,17 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 3.0); - if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_NORMAL); - HIT_NO(agent, 13, *HIT_STATUS_NORMAL); - } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("s_tail2"), 9.0, 80, 80, 0, 40, 4.3, -0.2, -0.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("s_tail4"), 8.0, 80, 80, 0, 40, 4.0, 1.2, 0.3, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("s_tail7"), 5.0, 90, 80, 0, 40, 3.8, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("s_tail2"), 9.0, 77, 80, 0, 40, 4.3, -0.2, -0.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("s_tail4"), 8.0, 77, 80, 0, 40, 4.0, 1.2, 0.3, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); + ATTACK(agent, 2, 0, Hash40::new("s_tail7"), 5.0, 92, 80, 0, 40, 3.8, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_TAIL); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 8.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 11.0); - if is_excute(agent) { - HIT_NO(agent, 12, *HIT_STATUS_OFF); - HIT_NO(agent, 13, *HIT_STATUS_OFF); - } } unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { @@ -213,18 +142,7 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - match color { - 0 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - 1 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("mewtwo_tail_attack_a_02"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - 2 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("mewtwo_tail_attack_a_03"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - 3 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("mewtwo_tail_attack_a_04"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - 4 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("mewtwo_tail_attack_a_05"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - 5 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("mewtwo_tail_attack_a_06"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - 6 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("mewtwo_tail_attack_a_07"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - 7 => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("mewtwo_tail_attack_a_08"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - _ => EFFECT_FOLLOW_FLIP(agent, Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("mewtwo_tail_attack_a_01"), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ), - }; + EFFECT_FOLLOW_FLIP(agent, Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new(GET_COLOR_EFF_NAME(boma)), Hash40::new("top"), 0, 5, 4.5, 0, -70, 190, 1.0, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 1.3); } frame(lua_state, 7.0); diff --git a/fighters/mewtwo/src/bindball/acmd.rs b/fighters/mewtwo/src/bindball/acmd.rs index efc7484b09..81caf50078 100644 --- a/fighters/mewtwo/src/bindball/acmd.rs +++ b/fighters/mewtwo/src/bindball/acmd.rs @@ -4,20 +4,19 @@ unsafe extern "C" fn game_shoot(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 30, 80, 0, 50, 3.0, 0.0, -1.7, 0.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_FEB, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bind_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 361, 140, 0, 0, 2.3, 0.0, -1.7, 0.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_FEB, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bind_extra"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 361, 120, 0, 5, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_FEB, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bind_extra"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 30, 84, 0, 42, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FEB, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bind_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_NONE); } } unsafe extern "C" fn effect_shoot(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 2.0); if is_excute(agent) { - agent.clear_lua_stack(); - lua_args!(agent, Hash40::new("mewtwo_kanasibari"), Hash40::new("top"), 0, -1, -1.1, 0, 0, 0, 1, false); - sv_animcmd::EFFECT_FLW_POS_UNSYNC_VIS(agent.lua_state_agent); - LAST_EFFECT_SET_SCALE_W(agent, 1.1, 0.78, 1.1); - LAST_EFFECT_SET_RATE(agent, 1.23); + EFFECT_FOLLOW(agent, Hash40::new("mewtwo_kanasibari"), Hash40::new("top"), 0, 0.2, -2.2, 0, 20, 0, 1, true); + LAST_EFFECT_SET_SCALE_W(agent, 1.5, 0.85, 0.95); + LAST_EFFECT_SET_RATE(agent, 9.0 / 4.0); } } diff --git a/fighters/mewtwo/src/lib.rs b/fighters/mewtwo/src/lib.rs index 9b0563e057..f858d7e99a 100644 --- a/fighters/mewtwo/src/lib.rs +++ b/fighters/mewtwo/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/mewtwo/src/opff.rs b/fighters/mewtwo/src/opff.rs index 57c5ba07d6..3e9064c68b 100644 --- a/fighters/mewtwo/src/opff.rs +++ b/fighters/mewtwo/src/opff.rs @@ -2,92 +2,6 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; - -unsafe fn teleport_logic(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) && !VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT) { - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { - VarModule::on_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT); - } //touching ground at any point counts as a grounded start - } - if fighter.is_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2) { - if StatusModule::is_changing(boma) { - if boma.get_num_used_jumps() < boma.get_jump_count_max() { - VarModule::on_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_TELEPORT_CANCEL); - if !VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT) { - WorkModule::inc_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_FLOAT); - } - } else {//takes jump and float frame 0, takes away tourney winner if teleport is used - VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_FLOAT); - VarModule::off_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_TELEPORT_CANCEL); - } - VarModule::off_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT); - } else if MotionModule::is_end(boma) { - if VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_TELEPORT_CANCEL) { - PostureModule::set_stick_lr(boma, 0.0); - PostureModule::update_rot_y_lr(boma); - }// Allows M2 to turnaround based on stick position when reappearing - } - } - if fighter.is_prev_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3) { - if StatusModule::is_changing(fighter.module_accessor) && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { - VarModule::on_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL); - } - } - // Actionability when double jump isn't burned - if fighter.is_motion(Hash40::new("special_air_hi")) - && !VarModule::is_flag(boma.object(), vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL) - && VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_TELEPORT_CANCEL) - && fighter.motion_frame() > 9.0 { - VarModule::on_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL); - CancelModule::enable_cancel(boma); - } -} - -unsafe fn dj_upB_jump_refresh(fighter: &mut L2CFighterCommon) { - if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) - && fighter.is_prev_status(*FIGHTER_STATUS_KIND_JUMP_AERIAL) - && fighter.global_table[PREV_STATUS_FRAME].get_i32() <= 3 { - // Grants 1 extra jump if all jumps used up - if fighter.get_num_used_jumps() == fighter.get_jump_count_max() { - WorkModule::dec_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - } - } -} - -pub unsafe fn mewtwo_teleport_wall_ride(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, status_kind: i32, id: usize) { - // Wall Ride momentum fixes - if boma.is_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2) { - let init_speed_x = VarModule::get_float(boma.object(), vars::common::status::TELEPORT_INITIAL_SPEED_X); - let init_speed_y = VarModule::get_float(boma.object(), vars::common::status::TELEPORT_INITIAL_SPEED_Y); - if GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_FLAG_SIDE as u32) - || (!GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_ID_NONE as u32) && init_speed_x.abs() <= 0.01) - { //now only bypasses floor-ride if angled straight down - if !VarModule::is_flag(boma.object(), vars::common::status::IS_TELEPORT_WALL_RIDE) { - VarModule::on_flag(boma.object(), vars::common::status::IS_TELEPORT_WALL_RIDE); - } - } - if GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_FLAG_SIDE as u32) { - if init_speed_y > 0.0 { - fighter.clear_lua_stack(); - lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, init_speed_y); - app::sv_kinetic_energy::set_speed(fighter.lua_state_agent); - } - } else if VarModule::is_flag(boma.object(), vars::common::status::IS_TELEPORT_WALL_RIDE) { - fighter.clear_lua_stack(); - lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, init_speed_x, init_speed_y); - app::sv_kinetic_energy::set_speed(fighter.lua_state_agent); - } - } - else if boma.is_status(*FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3) { - if GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_FLAG_SIDE as u32) { - if KineticModule::get_sum_speed_y(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) > 0.0 { - let wall_ride = Vector3f{x: 0.0, y: 1.0, z: 1.0}; - KineticModule::mul_speed(boma, &wall_ride, *FIGHTER_KINETIC_ENERGY_ID_STOP); - } - } - } -} unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() @@ -107,9 +21,6 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { - teleport_logic(fighter, boma); - mewtwo_teleport_wall_ride(fighter, boma, status_kind, id); - dj_upB_jump_refresh(fighter); fastfall_specials(fighter); } diff --git a/fighters/mewtwo/src/status/float.rs b/fighters/mewtwo/src/status/float.rs index 921cc30c94..f91601b7f6 100644 --- a/fighters/mewtwo/src/status/float.rs +++ b/fighters/mewtwo/src/status/float.rs @@ -18,14 +18,11 @@ unsafe extern "C" fn float_pre(fighter: &mut L2CFighterCommon) -> L2CValue { unsafe extern "C" fn float_main(fighter: &mut L2CFighterCommon) -> L2CValue { EffectModule::req_follow(fighter.module_accessor, Hash40::new("mewtwo_final_aura"), Hash40::new("hip"), &Vector3f::zero(), &Vector3f::zero(), 1.25, true, 0, 0, 0, 0, 0, false, false); - if fighter.get_num_used_jumps() < fighter.get_jump_count_max() { - WorkModule::inc_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - } - float_main_common(fighter) } unsafe extern "C" fn float_end(fighter: &mut L2CFighterCommon) -> L2CValue { + STOP_SE(fighter, Hash40::new("se_common_spirits_pfog_loop")); EffectModule::kill_kind(fighter.module_accessor, Hash40::new("mewtwo_final_aura"), false, true); float_end_common(fighter) } diff --git a/fighters/mewtwo/src/status/jump_aerial.rs b/fighters/mewtwo/src/status/jump_aerial.rs index 6d348325ea..b2e3d73469 100644 --- a/fighters/mewtwo/src/status/jump_aerial.rs +++ b/fighters/mewtwo/src/status/jump_aerial.rs @@ -3,12 +3,28 @@ use super::*; // FIGHTER_STATUS_KIND_JUMP_AERIAL unsafe extern "C" fn jump_aerial_main(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_FLOAT); MotionModule::set_trans_move_speed_no_scale(fighter.module_accessor, true); + fighter.global_table[SUB_STATUS3].assign(&L2CValue::Ptr(consume_resource as *const () as _)); fighter.status_JumpAerial(); 0.into() } +unsafe extern "C" fn consume_resource(fighter: &mut L2CFighterCommon) -> L2CValue { + let buffer = ControlModule::get_command_life_count_max(fighter.module_accessor) as i32; + if fighter.global_table[CURRENT_FRAME].get_i32() == buffer { + VarModule::on_flag(fighter.battle_object, vars::common::instance::DISABLE_FLOAT); + } + 0.into() +} + +unsafe extern "C" fn jump_aerial_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[STATUS_KIND].get_i32() != statuses::mewtwo::FLOAT { + VarModule::on_flag(fighter.battle_object, vars::common::instance::DISABLE_FLOAT); + } + return smashline::original_status(End, fighter, *FIGHTER_STATUS_KIND_JUMP_AERIAL)(fighter); +} + pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_JUMP_AERIAL, jump_aerial_main); + agent.status(End, *FIGHTER_STATUS_KIND_JUMP_AERIAL, jump_aerial_end); } \ No newline at end of file diff --git a/fighters/mewtwo/src/status/landing.rs b/fighters/mewtwo/src/status/landing.rs new file mode 100644 index 0000000000..70a742fdc4 --- /dev/null +++ b/fighters/mewtwo/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.empty_landing"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.empty_landing"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/mewtwo/src/status/mod.rs b/fighters/mewtwo/src/status/mod.rs index 15fb95d8d2..f6e889ef98 100644 --- a/fighters/mewtwo/src/status/mod.rs +++ b/fighters/mewtwo/src/status/mod.rs @@ -2,13 +2,15 @@ use super::*; use globals::*; // status script import -mod jump_aerial; mod attack_air; -mod float; mod fall; +mod float; +mod jump_aerial; +mod landing; +mod special_n; +mod special_s; mod special_hi; mod special_lw; -mod special_n; extern "Rust" { #[link_name = "float_check_air_jump"] @@ -26,6 +28,7 @@ unsafe extern "C" fn air_jump_aerial_uniq(fighter: &mut L2CFighterCommon) -> L2C } unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + // once per airtime teleport actionability if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { VarModule::off_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL); @@ -48,12 +51,13 @@ pub fn install(agent: &mut Agent) { // comment out to disable float agent.on_start(on_start); - jump_aerial::install(agent); attack_air::install(agent); - float::install(agent); fall::install(agent); - special_hi::install(agent); - special_lw::install(agent); + float::install(agent); + jump_aerial::install(agent); + landing::install(agent); special_n::install(agent); + special_s::install(agent); special_hi::install(agent); + special_lw::install(agent); } \ No newline at end of file diff --git a/fighters/mewtwo/src/status/special_hi.rs b/fighters/mewtwo/src/status/special_hi.rs index f89573e275..4f8e3fe26f 100644 --- a/fighters/mewtwo/src/status/special_hi.rs +++ b/fighters/mewtwo/src/status/special_hi.rs @@ -1,21 +1,37 @@ +use core::f32; + use super::*; use smash::cpp::root::app::KineticEnergy; +unsafe extern "C" fn special_hi_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + // dj leniency window + let teleport_jump_aerial_refresh_frame = ParamModule::get_int(fighter.battle_object, ParamType::Common, "teleport_jump_aerial_refresh_frame"); + let jump_max = fighter.get_jump_count_max(); + if fighter.get_num_used_jumps() == jump_max && fighter.is_prev_status(*FIGHTER_STATUS_KIND_JUMP_AERIAL) && fighter.global_table[PREV_STATUS_FRAME].get_i32() <= teleport_jump_aerial_refresh_frame { + fighter.set_int(jump_max - 1, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + fighter.clear_lua_stack(); + lua_args!(fighter, Hash40::new("sys_jump_aerial"), true, true); + smash::app::sv_animcmd::EFFECT_OFF_KIND(fighter.lua_state_agent); + } + // touching ground at any point counts as a grounded start + if !VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT) && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + VarModule::on_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT); + } + 0.into() +} + unsafe extern "C" fn special_hi2_pre(fighter: &mut L2CFighterCommon) -> L2CValue { - StatusModule::init_settings( - fighter.module_accessor, + StatusModule::init_settings(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), *FIGHTER_KINETIC_TYPE_UNIQ, *GROUND_CORRECT_KIND_KEEP as u32, app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES), - false, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + false, *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, *FS_SUCCEEDS_KEEP_ATTACK as i32 ); - FighterStatusModuleImpl::set_fighter_status_data( - fighter.module_accessor, + FighterStatusModuleImpl::set_fighter_status_data(fighter.module_accessor, false, *FIGHTER_TREADED_KIND_NO_REAC, false, @@ -26,11 +42,210 @@ unsafe extern "C" fn special_hi2_pre(fighter: &mut L2CFighterCommon) -> L2CValue *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_HI as u32, 0 ); + 0.into() +} - return 0.into(); +unsafe extern "C" fn angler(fighter: &mut L2CFighterCommon) -> L2CValue { + let stick_x = fighter.left_stick_x(); + let stick_y = fighter.left_stick_y(); + let mut length = sv_math::vec2_length(stick_x, stick_y); + let wrap_stick = fighter.get_param_float("param_special_hi", "wrap_stick"); + + PostureModule::set_stick_lr(fighter.module_accessor, 0.0); + PostureModule::update_rot_y_lr(fighter.module_accessor); + let lr = fighter.lr(); + let mut angle = if length >= wrap_stick { + stick_y.atan2(stick_x * lr) + } else { + 90.0_f32.to_radians() + }; + let test_angle = if angle < f32::consts::PI {angle} else {angle - f32::consts::PI}; + let mut detach = false; + if test_angle < f32::consts::PI && test_angle > 0.0 { + detach = true; + } + let wrap_speed_multi = fighter.get_param_float("param_special_hi", "wrap_speed_multi"); + let wrap_speed_add = fighter.get_param_float("param_special_hi", "wrap_speed_add"); + let mut speed_x = 0.0; + let mut speed_y = wrap_speed_multi + wrap_speed_add; + // if angled w/ stick + if length > wrap_stick { + let length_mul = wrap_speed_multi * length; + let speed = length_mul + wrap_speed_add; + let cos = angle.cos(); + speed_x = speed * cos; + speed_x *= lr; + + let sin = angle.sin(); + speed_y = speed * sin; + } + // If teleport angle is upwards or you are already in air + // force airborne state + if detach || fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::set_attach_ground(fighter.module_accessor, false); + GroundModule::set_correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + KineticModule::unable_energy_all(fighter.module_accessor); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_FREE, speed_x, speed_y, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, -1.0, -1.0); + sv_kinetic_energy!(enable, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP); + HitModule::set_whole(fighter.module_accessor, HitStatus(*HIT_STATUS_XLU), 0); + GroundModule::clear_cliff_point(fighter.module_accessor); + 0.into() +} + +unsafe extern "C" fn special_hi2_main(fighter: &mut L2CFighterCommon) -> L2CValue { + HitModule::set_whole(fighter.module_accessor, smash::app::HitStatus(*HIT_STATUS_XLU), 0); + VisibilityModule::set_whole(fighter.module_accessor, false); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x1f20a9d549), false); + fighter.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NAME_CURSOR); + GroundModule::set_passable_check(fighter.module_accessor, true); + fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_NONE.into()); + fighter.set_int(0, *FIGHTER_MEWTWO_STATUS_SPECIAL_HI_WORK_INT_FRAME); + angler(fighter); + fighter.sub_shift_status_main(L2CValue::Ptr(special_hi2_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_hi2_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + let frame = fighter.get_int(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_WORK_INT_FRAME); + let move_time = fighter.get_param_int("param_special_hi", "move_time"); + if frame >= move_time { + fighter.change_status(FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3.into(), true.into()) + } + if StatusModule::is_changing(fighter.module_accessor) || StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + // slide-offs keep jump + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND + && GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) { // prevent weird interactions with sloped ledge? + VarModule::on_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT); + } + } + // substatus + if !StatusModule::is_changing(fighter.module_accessor) + & !StopModule::is_stop(fighter.module_accessor) { + fighter.inc_int(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_WORK_INT_FRAME); + let move_xlu = fighter.get_param_int("param_special_hi", "move_xlu"); // time ignoring platforms + let cliff_check_frame = fighter.get_param_int("param_special_hi", "move_cliff_check"); + if frame == move_xlu { + GroundModule::set_passable_check(fighter.module_accessor, false); + } + if frame == cliff_check_frame { + fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES.into()); + } + if frame == 1 { + fighter.on_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_FLAG_CHECK_GROUND); + } + } + // floor ride + special_hi_2_check_ground(fighter); + 0.into() +} + +// Copies nasty vanilla math +// with adjusted logic to control wall-ride/floor-ride behavior +unsafe extern "C" fn special_hi_2_check_ground(fighter: &mut L2CFighterCommon) { + let init_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_X); + let init_speed_y = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_Y); + let floor_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_FLOOR_SPEED_X); + if floor_speed_x.abs() > 0.0 && init_speed_y < 0.0 && init_speed_x.abs() > 0.0 + && (GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) && !GroundModule::is_passable_ground(fighter.module_accessor)) { + // Travel speed for diagonally-down floor-rides + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, floor_speed_x, 0.0, 0.0); + } else { + // Travel speed for all other scenarios + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, init_speed_x, init_speed_y, 0.0); + } + // If on a platform, + // skip floor-ride speed redirection + if GroundModule::is_passable_check(fighter.module_accessor) && GroundModule::is_passable_ground(fighter.module_accessor) { + return; + } + let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed = Vector2f {x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; + // If not a diagonally-down teleport, + // or if already grounded, + // skip floor-ride speed redirection + if !GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) + || (speed.x.abs() < 0.001 || speed.y > -0.001) + || fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_AIR { + return; + } + // Compute a new ground-aligned velocity vector + // for intended floor-ride speed redirection + // + // Only intended to run on the first frame you land during the travel + let mut length = sv_math::vec3_length(speed.x, speed.y, 0.0); + if length > 0.0 { + let touch_x = GroundModule::get_touch_normal_x(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); + let touch_y = GroundModule::get_touch_normal_y(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); + + let touch = fighter.Vector3__create(touch_x.into(), touch_y.into(), 0.0_f32.into()); + let something = fighter.Vector3__create(0.0_f32.into(), 0.0_f32.into(), 1.0_f32.into()); + let mut cross = fighter.Vector3__cross(touch.clone(), something); + + let math = 1.0 / length; + let speed_mul = Vector3f { + x: speed.x * math, + y: speed.y * math, + z: 0.0, + }; + let mut final_dot = sv_math::vec3_dot(cross["x"].get_f32(), cross["y"].get_f32(), cross["z"].get_f32(), speed_mul.x, speed_mul.y, speed_mul.z); + if -0.00001 <= final_dot && final_dot <= 0.00001 { + final_dot = sv_math::vec3_dot(cross["x"].get_f32(), cross["y"].get_f32(), cross["z"].get_f32(), fighter.lr(), 0.0, 0.0); + } + + if final_dot < 0.0 { + let x = cross["x"].get_f32(); + let y = cross["y"].get_f32(); + let z = cross["z"].get_f32(); + cross["x"].assign(&L2CValue::F32(x * -1.0)); + cross["y"].assign(&L2CValue::F32(y * -1.0)); + cross["z"].assign(&L2CValue::F32(z * -1.0)); + } + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, cross["x"].get_f32() * length, cross["y"].get_f32() * length, cross["z"].get_f32() * length); + // set new speed to be reapplied each frame + VarModule::set_float(fighter.battle_object, vars::common::status::TELEPORT_FLOOR_SPEED_X, cross["x"].get_f32() * length); + } } unsafe extern "C" fn special_hi2_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + 0.into() +} + +unsafe extern "C" fn special_hi2_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { + // enable cancel + VarModule::on_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL); + if fighter.get_num_used_jumps() < fighter.get_jump_count_max() { + VarModule::off_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL); + } + // dj resource handling + if !VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT) { + let jump_max = fighter.get_jump_count_max(); + fighter.set_int(jump_max, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + VarModule::on_flag(fighter.battle_object, vars::common::instance::DISABLE_FLOAT); + } + VarModule::off_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_GROUNDED_TELEPORT); + } + // reverse re-appearance + if StatusModule::status_kind_next(fighter.module_accessor) == *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3 { + //if !VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL) { + if fighter.left_stick_x() * fighter.lr() + <= fighter.get_param_float("common", "turn_stick_x") { + // prevents turning around with buffered aerials + PostureModule::reverse_lr(fighter.module_accessor); + PostureModule::update_rot_y_lr(fighter.module_accessor); + } + //} + } else { + VisibilityModule::set_whole(fighter.module_accessor, true); + } return 0.into(); } @@ -63,30 +278,27 @@ unsafe extern "C" fn special_hi3_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } -unsafe extern "C" fn special_hi3_init(fighter: &mut L2CFighterCommon) -> L2CValue { - let init_speed_x: f32 = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_X); - let init_speed_y = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_Y); - sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, init_speed_x, init_speed_y); //fix gr reappearance - return smashline::original_status(Init, fighter, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3)(fighter); - 0.into() -} - unsafe extern "C" fn special_hi3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); if fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); fighter.set_int(*SITUATION_KIND_GROUND, *FIGHTER_MEWTWO_STATUS_SPECIAL_HI_WORK_INT_START_SITUATION); MotionModule::change_motion(fighter.module_accessor, "special_hi".to_hash(), 0.0, 1.0, false, 0.0, false, false); } else { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); fighter.set_int(*SITUATION_KIND_AIR, *FIGHTER_MEWTWO_STATUS_SPECIAL_HI_WORK_INT_START_SITUATION); - MotionModule::change_motion(fighter.module_accessor, "special_air_hi".to_hash(), 0.0, 1.0, false, 0.0, false, false); - let landing_lag = fighter.get_param_float("param_special_hi", "landing_frame"); - WorkModule::set_float(fighter.module_accessor, landing_lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); - //special fall speed - let x_max = fighter.get_param_float("param_special_hi", "fall_x_mull_value"); - WorkModule::set_float(fighter.module_accessor, x_max, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); - } - + if !VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL) { + MotionModule::change_motion(fighter.module_accessor, "special_air_hi_cancel".to_hash(), 0.0, 1.0, false, 0.0, false, false); + VarModule::on_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); + } else { + MotionModule::change_motion(fighter.module_accessor, "special_air_hi".to_hash(), 0.0, 1.0, false, 0.0, false, false); + let landing_lag = fighter.get_param_float("param_special_hi", "landing_frame"); + fighter.set_float(landing_lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + // special fall speed + let x_max = fighter.get_param_float("param_special_hi", "fall_x_mull_value"); + fighter.set_float(x_max, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); + } + } fighter.main_shift(special_hi3_main_loop) } @@ -94,66 +306,93 @@ unsafe extern "C" fn special_hi3_main_loop(fighter: &mut L2CFighterCommon) -> L2 let control = ControlModule::get_attack_air_kind(fighter.module_accessor); if control == *FIGHTER_COMMAND_ATTACK_AIR_KIND_NONE { FighterControlModuleImpl::update_attack_air_kind(fighter.module_accessor, true); - } //? + } // ? if fighter.sub_transition_group_check_air_cliff().get_bool() { - return 0.into(); + return 1.into(); } if CancelModule::is_enable_cancel(fighter.module_accessor) { - if fighter.sub_wait_ground_check_common(false.into()).get_bool() - || fighter.sub_air_check_fall_common().get_bool() { - return 1.into(); + if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); } } if MotionModule::is_end(fighter.module_accessor) { if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()) } else { - if !VarModule::is_flag(fighter.battle_object, vars::mewtwo::instance::SPECIAL_HI_TELEPORT_CANCEL) { - fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); + // special fall based on resource + if fighter.is_motion(Hash40::new("special_air_hi_cancel")) { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()) } else { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()) } } - return 1.into(); } if StatusModule::is_situation_changed(fighter.module_accessor) { if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); - return 1.into(); + if fighter.is_motion(Hash40::new("special_air_hi_cancel")) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.empty_landing"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + } + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()) } else { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - return 1.into(); + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()) } } - //momentum and fastfall + // momentum and fastfall if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { - fighter.sub_air_check_dive(); - if fighter.is_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_FLAG_1) { //drift enable frame - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); - fighter.off_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_FLAG_1); - } else { - if fighter.status_frame() < 7 { //should run 8 times frames like pm? - let stop_energy: *mut KineticEnergy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; - let speed = Vector2f{x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; - sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x, speed.y *0.9); - } else if fighter.status_frame() == 7 { - let stop_energy: *mut KineticEnergy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; - let speed = Vector2f{x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; - sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x, 0.0); - sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed.y); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - } - } + reappearance_decel_drift(fighter); + } + return 0.into(); +} + +unsafe extern "C" fn reappearance_decel_drift(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_air_check_dive(); + // drift / fastfall enable flag + if fighter.is_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_FLAG_1) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + fighter.off_flag(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_FLAG_1); } + if fighter.status_frame() < 7 { + let stop_energy: *mut KineticEnergy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed = Vector2f { + x: lua_bind::KineticEnergy::get_speed_x(stop_energy), + y: lua_bind::KineticEnergy::get_speed_y(stop_energy), + }; + let hi3_brake_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.hi3_brake_y_mul"); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x, speed.y * hi3_brake_y_mul); + } else if fighter.status_frame() == 7 { + let stop_energy: *mut KineticEnergy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed = Vector2f { + x: lua_bind::KineticEnergy::get_speed_x(stop_energy), + y: lua_bind::KineticEnergy::get_speed_y(stop_energy), + }; + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed.y); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } + return 0.into(); +} +unsafe extern "C" fn special_hi3_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL { + if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_FALL_SPECIAL { + fighter.set_float(1.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); + fighter.set_float(0.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + } + } + VisibilityModule::set_whole(fighter.module_accessor, true); return 0.into(); } pub fn install(agent: &mut Agent) { + agent.status(Exec, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_exec); + agent.status(Pre, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2, special_hi2_pre); + agent.status(Main, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2, special_hi2_main); agent.status(Exec, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2, special_hi2_exec); - + agent.status(End, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_2, special_hi2_end); + agent.status(Pre, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3, special_hi3_pre); - agent.status(Init, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3, special_hi3_init); agent.status(Main, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3, special_hi3_main); -} \ No newline at end of file + agent.status(End, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_HI_3, special_hi3_end); +} diff --git a/fighters/mewtwo/src/status/special_n.rs b/fighters/mewtwo/src/status/special_n.rs index b226289500..ec2d85866e 100644 --- a/fighters/mewtwo/src/status/special_n.rs +++ b/fighters/mewtwo/src/status/special_n.rs @@ -139,10 +139,6 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> return 0.into(); } - // if fighter.check_jump_cancel(false) { - // return 0.into(); - // } - if special_n_check_cancel(fighter).get_bool() { fighter.change_status(FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_N_CANCEL.into(), true.into()); return 0.into(); @@ -184,10 +180,6 @@ unsafe extern "C" fn special_n_max_main_loop(fighter: &mut L2CFighterCommon) -> return 0.into(); } - // if fighter.check_jump_cancel(false) { - // return 0.into(); - // } - if special_n_check_cancel(fighter).get_bool() { fighter.change_status(FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_N_CANCEL.into(), true.into()); return 0.into(); diff --git a/fighters/mewtwo/src/status/special_s.rs b/fighters/mewtwo/src/status/special_s.rs new file mode 100644 index 0000000000..a8bb4ce5c6 --- /dev/null +++ b/fighters/mewtwo/src/status/special_s.rs @@ -0,0 +1,62 @@ +use super::*; + +// FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_S_THROW + +unsafe extern "C" fn special_s_throw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_S_THROW)(fighter); + // kill ref + shield!(fighter, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, *FIGHTER_MEWTWO_REFLECTOR_KIND_REFLECTOR, *FIGHTER_REFLECTOR_GROUP_EXTEND); + // fx + let effect_2 = EffectModule::req_follow(fighter.module_accessor, Hash40::new("mewtwo_final_aura"), Hash40::new("top"), &Vector3f::zero(), &Vector3f::zero(), 1.1, true, 0, 0, 0, 0, 0, false, false); + VarModule::set_int64(fighter.battle_object, vars::mewtwo::status::EFFECT_HANDLER_2, effect_2); + VarModule::set_vec2(fighter.battle_object, vars::mewtwo::status::SPECIAL_S_THROW_POS, Vector2f{x: 14.3 * fighter.lr(), y: 9.3}); + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(move_to_center as *const () as _)); + ret +} + +unsafe extern "C" fn move_to_center(fighter: &mut L2CFighterCommon) -> L2CValue { + let lr = fighter.lr(); + let captured_id = LinkModule::get_node_object_id(fighter.module_accessor, *LINK_NO_CAPTURE) as u32; + let captured_boma = sv_battle_object::module_accessor(captured_id); + let move_end_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.move_end_frame"); + if fighter.motion_frame() < move_end_frame { // stop moving ~6f? b4 the finisher starts + let add_per_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.add_per_frame"); + let last_pos = VarModule::get_vec2(fighter.battle_object, vars::mewtwo::status::SPECIAL_S_THROW_POS); + let mut add_stick = Vector2f{x: last_pos.x + add_per_frame*fighter.left_stick_x(), y: last_pos.y + add_per_frame*fighter.left_stick_y()}; + // prevent them from being inside mewtwo? if weird can just add reverse hit check + if add_stick.x < 11.5 && add_stick.x > -11.5 {add_stick.x = last_pos.x}; + VarModule::set_vec2(fighter.battle_object, vars::mewtwo::status::SPECIAL_S_THROW_POS, Vector2f{x: add_stick.x, y: add_stick.y}); + } + if StatusModule::status_kind(captured_boma) == *FIGHTER_STATUS_KIND_MEWTWO_THROWN { + let offset_from_mewtwo = VarModule::get_vec2(fighter.battle_object, vars::mewtwo::status::SPECIAL_S_THROW_POS); + LinkModule::remove_model_constraint(captured_boma, true); + let mewtwo_pos = *PostureModule::pos(fighter.module_accessor); + let captured_pos = *PostureModule::pos(captured_boma); + let mut hip_offset = Vector3f::zero(); + ModelModule::joint_global_offset_from_top(captured_boma, Hash40::new("hip"), &mut hip_offset); + let target_hip_loc = &Vector2f{x: mewtwo_pos.x - hip_offset.x + (offset_from_mewtwo.x), y: mewtwo_pos.y - hip_offset.y + offset_from_mewtwo.y}; + let diff = &Vector2f{x: (captured_pos.x - target_hip_loc.x), y: captured_pos.y - target_hip_loc.y}; + PostureModule::add_pos_2d(captured_boma, &Vector2f{x: -diff.x / 6.0, y: -diff.y / 6.0}); + // eff + let captured_hip_pos = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + ModelModule::joint_global_position(captured_boma, Hash40::new("hip"), captured_hip_pos, false); + let target_effect_loc = &Vector2f{x: (captured_hip_pos.x - mewtwo_pos.x) * lr, y: captured_hip_pos.y - mewtwo_pos.y}; + let effect = VarModule::get_int64(fighter.battle_object, vars::mewtwo::status::EFFECT_HANDLER); + let effect_2 = VarModule::get_int64(fighter.battle_object, vars::mewtwo::status::EFFECT_HANDLER_2); + EffectModule::set_pos(fighter.module_accessor, effect as u32, &Vector3f{x: 0.0, y: target_effect_loc.y, z: target_effect_loc.x}); + EffectModule::set_pos(fighter.module_accessor, effect_2 as u32, &Vector3f{x: 0.0, y: target_effect_loc.y, z: target_effect_loc.x}); + VarModule::set_vec2(fighter.battle_object, vars::mewtwo::status::SPECIAL_S_THROW_CAPTURED_POS_OFFSET, Vector2f{x: target_effect_loc.x, y: target_effect_loc.y}); + } + 0.into() +} + +unsafe extern "C" fn special_s_throw_end(fighter: &mut L2CFighterCommon) -> L2CValue { + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("mewtwo_final_aura"), false, true); + EFFECT_OFF_KIND(fighter, Hash40::new("mewtwo_nenriki"), false, true); + smashline::original_status(End, fighter, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_S_THROW)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_S_THROW, special_s_throw_main); + agent.status(End, *FIGHTER_MEWTWO_STATUS_KIND_SPECIAL_S_THROW, special_s_throw_end); +} \ No newline at end of file diff --git a/fighters/miifighter/Cargo.toml b/fighters/miifighter/Cargo.toml index 7c6a0db540..ad9f192e30 100644 --- a/fighters/miifighter/Cargo.toml +++ b/fighters/miifighter/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/miifighter/src/acmd/aerials.rs b/fighters/miifighter/src/acmd/aerials.rs index 3e2127d04b..c384ba18b6 100644 --- a/fighters/miifighter/src/acmd/aerials.rs +++ b/fighters/miifighter/src/acmd/aerials.rs @@ -52,9 +52,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("kneer"), 5.0, 366, 100, 48, 0, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("legr"), 5.0, 366, 100, 48, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); // Ground-only - ATTACK(agent, 3, 0, Hash40::new("kneer"), 5.0, 75, 35, 0, 35, 3.7, 4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneer"), 5.0, 75, 35, 0, 35, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("legr"), 5.0, 75, 35, 0, 35, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 5.0, 70, 35, 0, 35, 3.7, 4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("kneer"), 5.0, 70, 35, 0, 35, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("legr"), 5.0, 70, 35, 0, 35, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 11.0); if is_excute(agent) { @@ -62,9 +62,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 6.0, 361, 110, 0, 40, 4.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 6.0, 361, 110, 0, 40, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legl"), 6.0, 361, 110, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 7.0, 361, 140, 0, 20, 4.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 7.0, 361, 140, 0, 20, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legl"), 7.0, 361, 140, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 21.0); if is_excute(agent) { diff --git a/fighters/miifighter/src/acmd/ground.rs b/fighters/miifighter/src/acmd/ground.rs index 3892d77e17..b3b1b407f0 100644 --- a/fighters/miifighter/src/acmd/ground.rs +++ b/fighters/miifighter/src/acmd/ground.rs @@ -5,9 +5,16 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 2.0, 361, 25, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 2.0, 361, 25, 0, 25, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handl"), 2.0, 361, 15, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 2.0, 70, 100, 10, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 2.0, 75, 100, 13, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handl"), 2.0, 80, 100, 15, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitboxes + ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 2.0, 361, 15, 0, 30, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("arml"), 2.0, 361, 15, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 5, 0, Hash40::new("handl"), 2.0, 361, 15, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); + AttackModule::set_down_only(boma, 4, true); + AttackModule::set_down_only(boma, 5, true); } frame(lua_state, 4.0); if is_excute(agent) { @@ -24,8 +31,11 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 3.0, 0.0, 7.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 3.5, 0.0, 7.5, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 45, 100, 15, 0, 3.0, 0.0, 7.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 94, 100, 25, 0, 3.5, 0.0, 7.5, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 3.0, 0.0, 3.5, 7.0, Some(0.0), Some(3.5), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 2, true); } frame(lua_state, 4.0); if is_excute(agent) { @@ -138,18 +148,24 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { FighterAreaModuleImpl::enable_fix_jostle_area_xy(boma, 5.5, 6.5, 6.5, 1.5); } frame(lua_state, 6.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.5); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 10.0, 49, 110, 0, 35, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 49, 110, 0, 35, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 10.0, 49, 110, 0, 35, 4.0, 3.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 49, 120, 0, 34, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 49, 120, 0, 34, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 49, 120, 0, 34, 4.0, 3.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } + frame(lua_state, 7.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.8); + frame(lua_state, 8.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 6.0, 68, 110, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 6.0, 68, 110, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 6.0, 68, 110, 0, 35, 3.25, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 5.0, 49, 125, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 5.0, 49, 125, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 5.0, 49, 125, 0, 20, 3.25, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 18.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.9); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -159,6 +175,30 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } } + +unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_line"), Hash40::new("sys_attack_line"), Hash40::new("top"), -1, 7, -8, -4, 0, 0, 1.1, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_ALPHA(agent, 0.4); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_speedline"), Hash40::new("sys_attack_speedline"), Hash40::new("top"), -1, 8, -2, -4, 0, 0, 0.6, true, *EF_FLIP_YZ); + } + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 8, 12, 0, 0, 0, 1, 0, 0, 0, 0, 0, 360, true, 0.5); + } + frame(lua_state, 21.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); @@ -172,4 +212,5 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attack100end", game_attack100end, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); + agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); } \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/other.rs b/fighters/miifighter/src/acmd/other.rs index 198e75500f..7c4a49981a 100644 --- a/fighters/miifighter/src/acmd/other.rs +++ b/fighters/miifighter/src/acmd/other.rs @@ -73,15 +73,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -91,9 +87,49 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); + +} + +extern "Rust" { + fn gimmick_flash(boma: &mut BattleObjectModuleAccessor); +} + +unsafe extern "C" fn game_appeallw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 10.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + if app::smashball::is_training_mode() + && agent.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_CUSTOMIZE_SPECIAL_LW_NO) == 2 + && ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_APPEAL_LW) { + gimmick_flash(boma); + let stage = VarModule::get_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE); + match stage { + 0 => { + let handle = EffectModule::req_follow(boma, Hash40::new("sys_steam1"), Hash40::new("head"), &Vector3f::new(3.0, 0.0, 0.0), &Vector3f::zero(), 0.8, false, 0, 0, 0, 0, 0, false, false); + EffectModule::set_alpha(boma, handle as u32, 3.0); + VarModule::set_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1, handle as i32); + VarModule::inc_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE); + }, + 1 => { + //let handle = EffectModule::req_follow(boma, Hash40::new("sys_steam2"), Hash40::new("head"), &Vector3f::new(3.0, 0.0, 0.0), &Vector3f::zero(), 0.8, false, 0, 0, 0, 0, 0, false, false); + //EffectModule::set_alpha(boma, handle as u32, 3.0); + //VarModule::set_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2, handle as i32); + VarModule::inc_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE); + VarModule::set_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_TIMER, 300); + } + _ => { + VarModule::set_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE, 0); + let handle = VarModule::get_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1) as u32; + EffectModule::kill(boma, handle, false, false); + //let handle2 = VarModule::get_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2) as u32; + //EffectModule::kill(boma, handle2, false, false); + VarModule::set_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1, -1); + //VarModule::set_int(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2, -1); + ColorBlendModule::cancel_main_color(boma, 0); + } + } + } } } @@ -112,4 +148,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_escapeair", game_escapeair, Priority::Low); agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); + + agent.acmd("game_appeallwl", game_appeallw, Priority::Low); + agent.acmd("game_appeallwr", game_appeallw, Priority::Low); } diff --git a/fighters/miifighter/src/acmd/smashes.rs b/fighters/miifighter/src/acmd/smashes.rs index d7d3c9d60d..90eebb2655 100644 --- a/fighters/miifighter/src/acmd/smashes.rs +++ b/fighters/miifighter/src/acmd/smashes.rs @@ -35,7 +35,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("kneer"), 15.0, 84, 101, 0, 35, 4.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneer"), 15.0, 84, 101, 0, 35, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 12.0); + frame(lua_state, 11.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneer"), 10.0, 96, 93, 0, 32, 3.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 96, 93, 0, 32, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); @@ -54,13 +54,14 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 9.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.8); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handl"), 13.0, 32, 85, 0, 41, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 13.0, 32, 85, 0, 41, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 13.0, 35, 88, 0, 50, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 13.0, 35, 88, 0, 50, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("handl"), 13.0, 40, 92, 0, 41, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 13.0, 40, 92, 0, 41, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 13.0, 40, 92, 0, 41, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 13.0, 40, 92, 0, 41, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - wait(lua_state, 2.0); + frame(lua_state, 12.0); if is_excute(agent) { AttackModule::clear_all(boma); } diff --git a/fighters/miifighter/src/acmd/specials/special_hi.rs b/fighters/miifighter/src/acmd/specials/special_hi.rs deleted file mode 100644 index 1dcd8f4b22..0000000000 --- a/fighters/miifighter/src/acmd/specials/special_hi.rs +++ /dev/null @@ -1,431 +0,0 @@ -use super::*; - -// ================================================================================================ -// ======================================== SOARING AXE KICK ====================================== -// ================================================================================================ - -unsafe extern "C" fn effect_specialhi1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("top"), 4, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 8.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("miifighter_tenchi_start"), Hash40::new("toel"), 0, 0, 0, 90, 0, 0, 2, true); - } -} - -unsafe extern "C" fn game_specialhi12(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 3.0); - if is_excute(agent) { - PostureModule::add_pos(boma, &Vector3f::new(0.0, 0.2, 0.0)); - GroundModule::correct(boma, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - GroundModule::set_attach_ground(boma, false); - } - frame(lua_state, 7.0); - FT_MOTION_RATE_RANGE(agent, 7.0, 8.5, 2.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - VarModule::off_flag(agent.object(), vars::common::status::DISABLE_ECB_SHIFT); - GroundModule::set_attach_ground(boma, true); - // HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); - // HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("legr"), 14.0, 52, 74, 0, 56, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 14.0, 52, 74, 0, 56, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 14.0, 52, 74, 0, 56, 5.0, 5.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 8.5); - FT_MOTION_RATE_RANGE(agent, 8.5, 11.0, 3.0); - if is_excute(agent) { - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) && agent.is_stick_backward() { - PostureModule::reverse_lr(boma); - PostureModule::update_rot_y_lr(boma); - } - AttackModule::clear(boma, 2, false); - // HitModule::set_status_all(boma, HitStatus(*HIT_STATUS_NORMAL), 0); - ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 45, 80, 0, 40, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 45, 80, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } - frame(lua_state, 17.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 19.0); - if is_excute(agent) { - //WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_TENCHI_KICK_SHIFT); - } - frame(lua_state, 30.0); - if is_excute(agent) { - //WorkModule::off_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_TENCHI_KICK_SHIFT); - WorkModule::off_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); - WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_CHANGE_KINE); - KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } - frame(lua_state, 40.0); - if is_excute(agent) { - KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); - let air_speed_x_stable = WorkModule::get_param_float(boma, hash40("air_speed_x_stable"), 0); - let fall_x_mul = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_flash_kick.fall_x_mul"); - let fall_acl_y_mul = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_flash_kick.fall_acl_y_mul"); - sv_kinetic_energy!(set_stable_speed, agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * fall_x_mul, 0.0); - sv_kinetic_energy!(set_accel_y_mul, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, fall_acl_y_mul); - } -} - -unsafe extern "C" fn effect_specialhi12(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 7.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("miifighter_tenchi_arc"), Hash40::new("top"), 0, 13, -1, 0, 15, 90, 1.0, true); - LAST_EFFECT_SET_RATE(agent, 1.25); - } - frame(lua_state, 9.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("miifighter_tenchi_arc"), -1); - } -} - -unsafe extern "C" fn sound_specialhi12(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_special_c1_h01")); - PLAY_SE(agent, Hash40::new("se_miifighter_special_h01")); - } -} - -unsafe extern "C" fn expression_specialhi12(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 7.0); - if is_excute(agent) { - RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); - } - frame(lua_state, 9.0); - if is_excute(agent) { - RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); - ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); - } -} - -unsafe extern "C" fn game_specialhi13(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); - GroundModule::set_passable_check(boma, true); - } - frame(lua_state, 2.0); - if is_excute(agent) { - GroundModule::set_passable_check(boma, false); - } - frame(lua_state, 3.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 270, 13, 0, 64, 4.0, 0.0, 6.5, 8.5, Some(0.0), Some(6.5), Some(5.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } -} - -unsafe extern "C" fn game_specialhi14(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 45, 170, 0, 45, 5.0, 0.0, 4.0, 10.5, Some(0.0), Some(4.0), Some(1.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - wait(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 45, 170, 0, 45, 5.0, 0.0, 4.0, 8.5, Some(0.0), Some(4.0), Some(-1.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 10.0); // f5 - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -// ================================================================================================ -// ======================================= HELICOPTER KICK ======================================== -// ================================================================================================ - -unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 8.0); - if is_excute(agent) { - if boma.is_situation(*SITUATION_KIND_GROUND) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 75, 100, 90, 0, 6.5, 0.0, 9.0, 6.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 75, 75, 90, 0, 4.0, 0.0, 14.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - else { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 367, 100, 70, 0, 4.5, 0.0, 11.5, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 80, 100, 80, 0, 4.5, 0.0, 11.5, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 366, 100, 160, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_SYOTEN_KICK_FLAG_AIR_START); - } - frame(lua_state, 10.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 15.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 367, 100, 70, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 80, 100, 60, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 68, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 20.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 367, 100, 70, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 80, 100, 60, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 68, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 26.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 367, 100, 70, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 80, 100, 60, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 68, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 31.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 367, 100, 70, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 80, 100, 60, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 68, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } - frame(lua_state, 33.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_SYOTEN_KICK_FLAG_SET_FINISH_ANGLE); - } - frame(lua_state, 36.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("rot"), 6.0, 45, 116, 0, 65, 6.5, 0.0, 8.0, 7.0, Some(0.0), Some(0.0), Some(2.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - wait(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 49.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_SYOTEN_KICK_END_FLAG_NORMAL_ACCEL_Y); - } - frame(lua_state, 51.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_SYOTEN_KICK_FLAG_SET_ROLL_BACK_ANGLE); - } -} - -// ================================================================================================ -// ======================================= THRUST UPPERCUT ======================================== -// ================================================================================================ - -unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - boma.select_cliff_hangdata_from_name("special_hi3"); - } - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 4.0, 5.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); - } - frame(lua_state, 3.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } - frame(lua_state, 4.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - SA_SET(agent, *SITUATION_KIND_AIR); - WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_REVERSE_LR); - // HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 80, 100, 170, 0, 3.5, 0.0, 5.5, 3.5, Some(0.0), Some(12.5), Some(3.5), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 105, 100, 160, 0, 5.0, 0.0, 8.0, 5.0, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 6.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 7.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 367, 100, 80, 0, 5.0, 0.0, 13.0, 4.0, Some(0.0), Some(14.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 70, 100, 90, 0, 4.0, 0.0, 15.0, 4.0, Some(0.0), Some(15.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 9.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - // HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_NORMAL); - } - frame(lua_state, 10.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 367, 100, 80, 0, 5.0, 0.0, 13.0, 4.0, Some(0.0), Some(15.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 70, 100, 90, 0, 4.0, 0.0, 16.0, 4.0, Some(0.0), Some(16.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 12.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 13.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 367, 100, 80, 0, 5.0, 0.0, 14.0, 4.0, Some(0.0), Some(14.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 70, 100, 90, 0, 4.0, 0.0, 15.0, 4.0, Some(0.0), Some(15.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 15.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 16.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 367, 100, 80, 0, 5.0, 0.0, 14.0, 4.0, Some(0.0), Some(14.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 367, 100, 50, 0, 5.0, 0.0, 14.0, 4.0, Some(0.0), Some(14.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 17.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 21.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 82, 99, 0, 50, 7.0, 0.0, 14.0, 2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 23.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } - frame(lua_state, 37.0); - if is_excute(agent) { - KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } -} - -unsafe extern "C" fn effect_specialhi3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 4.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 3, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 5.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_pistonpunch_arc"), Hash40::new("miifighter_pistonpunch_arc"), Hash40::new("top"), 0, -5, -1.5, 10, 0, 0, 0.75, true, *EF_FLIP_XY); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miifighter_pistonpunch"), Hash40::new("top"), 0, 18, 3, 10, 0, 0, 0.7, true); - } - frame(lua_state, 7.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("miifighter_pistonpunch_impact"), Hash40::new("top"), 0, 18, 3, 0, 0, 0, 1, true); - } - frame(lua_state, 11.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("miifighter_pistonpunch_arc"), -1); - } - frame(lua_state, 20.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_pistonpunch_line"), Hash40::new("miifighter_pistonpunch_line"), Hash40::new("top"), 0, -7, 2, -90, 0, 0, 0.8, true, *EF_FLIP_XY); - EFFECT_FOLLOW(agent, Hash40::new("miifighter_pistonpunch_impact"), Hash40::new("top"), 0, 15, 1, 0, 0, 0, 1, true); - } - frame(lua_state, 21.0); - if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miifighter_pistonpunch"), Hash40::new("top"), 0, 15, 1, 10, 0, 0, 1, true); - } -} - -unsafe extern "C" fn effect_specialairhi3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 4.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 3, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 5.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_pistonpunch_arc"), Hash40::new("miifighter_pistonpunch_arc"), Hash40::new("top"), 0, -5, -1.5, 10, 0, 0, 0.75, true, *EF_FLIP_XY); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miifighter_pistonpunch"), Hash40::new("top"), 0, 18, 3, 10, 0, 0, 0.7, true); - } - frame(lua_state, 7.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("miifighter_pistonpunch_impact"), Hash40::new("top"), 0, 18, 3, 0, 0, 0, 1, true); - } - frame(lua_state, 11.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("miifighter_pistonpunch_arc"), -1); - } - frame(lua_state, 20.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_pistonpunch_line"), Hash40::new("miifighter_pistonpunch_line"), Hash40::new("top"), 0, -7, 2, -90, 0, 0, 0.8, true, *EF_FLIP_XY); - EFFECT_FOLLOW(agent, Hash40::new("miifighter_pistonpunch_impact"), Hash40::new("top"), 0, 15, 1, 0, 0, 0, 1, true); - } - frame(lua_state, 21.0); - if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miifighter_pistonpunch"), Hash40::new("top"), 0, 15, 1, 10, 0, 0, 1, true); - } -} - -pub fn install(agent: &mut Agent) {; - agent.acmd("game_specialhi1", acmd_stub, Priority::Low); - agent.acmd("effect_specialhi1", effect_specialhi1, Priority::Low); - agent.acmd("effect_specialairhi1", effect_specialhi1, Priority::Low); - agent.acmd("game_specialhi12", game_specialhi12, Priority::Low); - agent.acmd("game_specialairhi12", game_specialhi12, Priority::Low); - agent.acmd("effect_specialhi12", effect_specialhi12, Priority::Low); - agent.acmd("effect_specialairhi12", effect_specialhi12, Priority::Low); - agent.acmd("sound_specialhi12", sound_specialhi12, Priority::Low); - agent.acmd("sound_specialairhi12", sound_specialhi12, Priority::Low); - agent.acmd("expression_specialhi12", expression_specialhi12, Priority::Low); - agent.acmd("expression_specialairhi12", expression_specialhi12, Priority::Low); - agent.acmd("game_specialhi13", game_specialhi13, Priority::Low); - agent.acmd("game_specialairhi13", game_specialhi13, Priority::Low); - agent.acmd("game_specialhi14", game_specialhi14, Priority::Low); - agent.acmd("game_specialairhi14", game_specialhi14, Priority::Low); - - agent.acmd("game_specialhi2", game_specialhi2, Priority::Low); - agent.acmd("game_specialairhi2", game_specialhi2, Priority::Low); - - agent.acmd("game_specialhi3", game_specialhi3, Priority::Low); - agent.acmd("game_specialairhi3", game_specialhi3, Priority::Low); - agent.acmd("effect_specialhi3", effect_specialhi3, Priority::Low); - agent.acmd("effect_specialairhi3", effect_specialairhi3, Priority::Low); - - agent.acmd("game_specialhi14", game_specialhi14, Priority::Low); - agent.acmd("game_specialairhi14", game_specialhi14, Priority::Low); -} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_hi/mod.rs b/fighters/miifighter/src/acmd/specials/special_hi/mod.rs new file mode 100644 index 0000000000..219d018b17 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_hi/mod.rs @@ -0,0 +1,11 @@ +use super::*; + +mod special_hi1; +mod special_hi2; +mod special_hi3; + +pub fn install(agent: &mut Agent) {; + special_hi1::install(agent); + special_hi2::install(agent); + special_hi3::install(agent); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_hi/special_hi1.rs b/fighters/miifighter/src/acmd/specials/special_hi/special_hi1.rs new file mode 100644 index 0000000000..30837a2037 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_hi/special_hi1.rs @@ -0,0 +1,180 @@ +use super::*; + +// ================================================================================================ +// ======================================= SOARING AXE KICK ======================================= +// ================================================================================================ + +unsafe extern "C" fn game_specialhi1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 3.0); + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialhi1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 8, 4, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_tenchi_start"), Hash40::new("toel"), 0, 0, 0, 90, 0, 0, 2, true); + } +} + +unsafe extern "C" fn game_specialhi12(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + VarModule::off_flag(agent.object(), vars::common::status::DISABLE_ECB_SHIFT); + ATTACK(agent, 0, 0, Hash40::new("legl"), 12.0, 78, 93, 0, 40, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 78, 93, 0, 40, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 12.0, 78, 93, 0, 40, 5.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 3.0); + if is_excute(agent) { + if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) && agent.is_stick_backward() { + PostureModule::reverse_lr(boma); + PostureModule::update_rot_y_lr(boma); + } + ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 60, 20, 0, 50, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 60, 20, 0, 50, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 8.0, 60, 20, 0, 50, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 6.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 45, 100, 40, 0, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 45, 100, 40, 0, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::clear(boma, 2, false); + } + frame(lua_state, 10.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 17.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_TENCHI_KICK_SHIFT); + } + frame(lua_state, 23.0); + if is_excute(agent) { + WorkModule::off_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); + WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_CHANGE_KINE); + KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + frame(lua_state, 26.0); + if is_excute(agent) { + WorkModule::off_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_TENCHI_KICK_SHIFT); + } + frame(lua_state, 33.0); + if is_excute(agent) { + KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); + let air_speed_x_stable = WorkModule::get_param_float(boma, hash40("air_speed_x_stable"), 0); + let fall_x_mul = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_flash_kick.fall_x_mul"); + let fall_acl_y_mul = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_flash_kick.fall_acl_y_mul"); + sv_kinetic_energy!(set_stable_speed, agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * fall_x_mul, 0.0); + sv_kinetic_energy!(set_accel_y_mul, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, fall_acl_y_mul); + } +} + +unsafe extern "C" fn effect_specialhi12(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_tenchi_arc"), Hash40::new("top"), 0, 13, -1, 0, 15, 90, 1.0, true); + } + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("miifighter_tenchi_arc"), -1); + } +} + +unsafe extern "C" fn sound_specialhi12(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_special_c1_h01")); + PLAY_SE(agent, Hash40::new("se_miifighter_special_h01")); + } +} + +unsafe extern "C" fn expression_specialhi12(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); + } + frame(lua_state, 3.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + +unsafe extern "C" fn game_specialhi13(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); + GroundModule::set_passable_check(boma, true); + } + frame(lua_state, 2.0); + if is_excute(agent) { + GroundModule::set_passable_check(boma, false); + } + frame(lua_state, 3.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 45, 110, 0, 60, 4.0, 0.0, 6.5, 8.5, Some(0.0), Some(6.5), Some(5.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } +} + +unsafe extern "C" fn game_specialhi14(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 60, 140, 0, 45, 5.0, 0.0, 4.0, 8.5, Some(0.0), Some(4.0), Some(-1.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 8.0); // f5 + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialhi1", game_specialhi1, Priority::Low); + agent.acmd("game_specialairhi1", game_specialhi1, Priority::Low); + agent.acmd("effect_specialhi1", effect_specialhi1, Priority::Low); + agent.acmd("effect_specialairhi1", effect_specialhi1, Priority::Low); + + agent.acmd("game_specialhi12", game_specialhi12, Priority::Low); + agent.acmd("game_specialairhi12", game_specialhi12, Priority::Low); + agent.acmd("effect_specialhi12", effect_specialhi12, Priority::Low); + agent.acmd("effect_specialairhi12", effect_specialhi12, Priority::Low); + agent.acmd("sound_specialhi12", sound_specialhi12, Priority::Low); + agent.acmd("sound_specialairhi12", sound_specialhi12, Priority::Low); + agent.acmd("expression_specialhi12", expression_specialhi12, Priority::Low); + agent.acmd("expression_specialairhi12", expression_specialhi12, Priority::Low); + + agent.acmd("game_specialhi13", game_specialhi13, Priority::Low); + agent.acmd("game_specialairhi13", game_specialhi13, Priority::Low); + + agent.acmd("game_specialhi14", game_specialhi14, Priority::Low); + agent.acmd("game_specialairhi14", game_specialhi14, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_hi/special_hi2.rs b/fighters/miifighter/src/acmd/specials/special_hi/special_hi2.rs new file mode 100644 index 0000000000..b4aacfc9d3 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_hi/special_hi2.rs @@ -0,0 +1,98 @@ +use super::*; + +// ================================================================================================ +// ======================================= HELICOPTER KICK ======================================== +// ================================================================================================ + +unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + if boma.is_situation(*SITUATION_KIND_GROUND) { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 75, 100, 90, 0, 6.5, 0.0, 9.0, 6.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 75, 75, 90, 0, 4.0, 0.0, 14.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + else { + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 367, 100, 70, 0, 4.5, 0.0, 11.5, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 80, 100, 80, 0, 4.5, 0.0, 11.5, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 366, 100, 160, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_SYOTEN_KICK_FLAG_AIR_START); + } + frame(lua_state, 10.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 367, 100, 70, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 80, 100, 60, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 68, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 20.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 367, 100, 70, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 80, 100, 60, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 68, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 26.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 367, 100, 70, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 80, 100, 60, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 68, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 31.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 367, 100, 70, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 80, 100, 60, 0, 6.0, 0.0, 12.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 367, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 68, 100, 130, 0, 4.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + } + frame(lua_state, 33.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_SYOTEN_KICK_FLAG_SET_FINISH_ANGLE); + } + frame(lua_state, 36.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("rot"), 6.0, 42, 118, 0, 65, 6.5, 0.0, 8.0, 7.0, Some(0.0), Some(0.0), Some(2.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 49.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_SYOTEN_KICK_END_FLAG_NORMAL_ACCEL_Y); + } + frame(lua_state, 51.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_SYOTEN_KICK_FLAG_SET_ROLL_BACK_ANGLE); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialhi2", game_specialhi2, Priority::Low); + agent.acmd("game_specialairhi2", game_specialhi2, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_hi/special_hi3.rs b/fighters/miifighter/src/acmd/specials/special_hi/special_hi3.rs new file mode 100644 index 0000000000..eb782fe7f8 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_hi/special_hi3.rs @@ -0,0 +1,129 @@ +use super::*; + +// ================================================================================================ +// ======================================= THRUST UPPERCUT ======================================== +// ================================================================================================ + +unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + boma.select_cliff_hangdata_from_name("special_hi3"); + } + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 4.0, 5.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); + } + frame(lua_state, 3.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + } + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + SA_SET(agent, *SITUATION_KIND_AIR); + WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_REVERSE_LR); + ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 80, 100, 170, 0, 3.5, 0.0, 5.5, 3.5, Some(0.0), Some(12.5), Some(3.5), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 105, 100, 160, 0, 5.0, 0.0, 8.0, 5.0, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 6.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 7.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 367, 100, 80, 0, 5.0, 0.0, 13.0, 4.0, Some(0.0), Some(14.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 70, 100, 90, 0, 4.0, 0.0, 15.0, 4.0, Some(0.0), Some(15.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 9.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 367, 100, 80, 0, 5.0, 0.0, 13.0, 4.0, Some(0.0), Some(15.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 70, 100, 90, 0, 4.0, 0.0, 16.0, 4.0, Some(0.0), Some(16.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 12.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 13.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 367, 100, 80, 0, 5.0, 0.0, 14.0, 4.0, Some(0.0), Some(14.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 70, 100, 90, 0, 4.0, 0.0, 15.0, 4.0, Some(0.0), Some(15.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 15.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 16.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 0.8, 367, 100, 80, 0, 5.0, 0.0, 14.0, 4.0, Some(0.0), Some(14.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 0.8, 367, 100, 50, 0, 5.0, 0.0, 14.0, 4.0, Some(0.0), Some(14.0), Some(4.0), 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 17.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 21.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 82, 99, 0, 50, 7.0, 0.0, 14.0, 2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 23.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + frame(lua_state, 37.0); + if is_excute(agent) { + KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } +} + +unsafe extern "C" fn effect_specialhi3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 3, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_pistonpunch_arc"), Hash40::new("miifighter_pistonpunch_arc"), Hash40::new("top"), 0, -5, -1.5, 10, 0, 0, 0.75, true, *EF_FLIP_XY); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miifighter_pistonpunch"), Hash40::new("top"), 0, 18, 3, 10, 0, 0, 0.7, true); + } + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_pistonpunch_impact"), Hash40::new("top"), 0, 18, 3, 0, 0, 0, 1, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("miifighter_pistonpunch_arc"), -1); + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_pistonpunch_line"), Hash40::new("miifighter_pistonpunch_line"), Hash40::new("top"), 0, -7, 2, -90, 0, 0, 0.8, true, *EF_FLIP_XY); + EFFECT_FOLLOW(agent, Hash40::new("miifighter_pistonpunch_impact"), Hash40::new("top"), 0, 15, 1, 0, 0, 0, 1, true); + } + frame(lua_state, 21.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miifighter_pistonpunch"), Hash40::new("top"), 0, 15, 1, 10, 0, 0, 0.7, true); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialhi3", game_specialhi3, Priority::Low); + agent.acmd("game_specialairhi3", game_specialhi3, Priority::Low); + agent.acmd("effect_specialhi3", effect_specialhi3, Priority::Low); + agent.acmd("effect_specialairhi3", effect_specialhi3, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_lw.rs b/fighters/miifighter/src/acmd/specials/special_lw.rs deleted file mode 100644 index 63daef0cea..0000000000 --- a/fighters/miifighter/src/acmd/specials/special_lw.rs +++ /dev/null @@ -1,452 +0,0 @@ -use super::*; - -// ================================================================================================ -// ======================================= EARTHQUAKE FIST ======================================== -// ================================================================================================ - -unsafe extern "C" fn game_speciallw1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - VarModule::set_int(agent.object(), vars::miifighter::status::SPECIAL_LW1_CHARGE, 0); - VarModule::set_float(agent.object(), vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE, 0.0); - } - frame(lua_state, 13.0); - if is_excute(agent) { - let charge_distance = VarModule::get_float(agent.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE); - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 90, 54, 0, 45, 2.5, 0.0, 2.0, 11.0 + charge_distance, Some(0.0), Some(2.0), Some(13.0 + charge_distance), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 90, 100, 0, 10, 2.5, 0.0, 2.0, 12.0 + charge_distance, Some(0.0), Some(8.0), Some(12.0 + charge_distance), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 70, 64, 0, 35, 2.5, 0.0, 2.0, 12.0 + charge_distance, Some(0.0), Some(2.0), Some(19.0 + charge_distance), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 110, 64, 0, 35, 2.5, 0.0, 2.0, 5.0 + charge_distance, Some(0.0), Some(2.0), Some(12.0 + charge_distance), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("top"), 8.0, 45, 60, 0, 60, 3.0, 0.0, 3.0, 7.0, Some(0.0), Some(3.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_KICK); - } - frame(lua_state, 16.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn effect_speciallw1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), -3, 12, 5, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true); - } - frame(lua_state, 4.0); - if is_excute(agent) { - let eff_handle = EffectModule::req_follow(boma, Hash40::new("sys_windwave"), Hash40::new("top"), &Vector3f::new(0.0, 0.0, 10.0), &Vector3f::zero(), 0.4, false, 0, 0, 0, 0, 0, false, false); - EffectModule::set_rate(boma, eff_handle as u32, 0.4); - VarModule::set_int64(agent.battle_object, vars::miifighter::instance::SPECIAL_LW1_QUAKE_EFFECT_HANDLE, eff_handle as u64); - EFFECT_FOLLOW(agent, Hash40::new("miifighter_sidekick_flash"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.6, true); - EFFECT_FOLLOW(agent, Hash40::new("miifighter_sidekick_hold"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.8, true); - LAST_EFFECT_SET_RATE(agent, 0.4); - } - frame(lua_state, 9.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_ground_shockwave"), Hash40::new("top"), 8.0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 10.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("miifighter_sidekick_hold"), true, true); - } - frame(lua_state, 13.0); - let charge_distance = VarModule::get_float(agent.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("miifighter_sidekick_flash"), true, true); - LANDING_EFFECT(agent, Hash40::new("miifighter_headbut_v_smoke"), Hash40::new("top"), 8.0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); - LANDING_EFFECT(agent, Hash40::new("miifighter_headbut_v_smoke"), Hash40::new("top"), 12.0 + charge_distance, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); - LAST_EFFECT_SET_SCALE_W(agent, 0.6, 1.1, 0.6); - EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 12.0 + charge_distance, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); - EFFECT(agent, Hash40::new("sys_quake"), Hash40::new("top"), 12.0 + charge_distance, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); - EFFECT(agent, Hash40::new("sys_damage_fire"), Hash40::new("top"), 12.0 + charge_distance, 3.0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, false); - } -} - -unsafe extern "C" fn sound_speciallw1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 9.0); - if is_excute(agent) { - PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_attack03")); - } - frame(lua_state, 13.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_miifighter_smash_s03")); - PLAY_SE(agent, Hash40::new("se_miifighter_special_l03")); - PLAY_SE(agent, Hash40::new("se_miifighter_special_s03")); - PLAY_SE_REMAIN(agent, Hash40::new("se_miifighter_special_c2_s02")); - } -} - -unsafe extern "C" fn expression_speciallw1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ItemModule::set_have_item_visibility(boma, false, 0); - }; - frame(lua_state, 13.0); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_NONE); - QUAKE(agent, *CAMERA_QUAKE_KIND_L); - ControlModule::set_rumble(boma, Hash40::new("rbkind_impact"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); - AREA_WIND_2ND_arg10(agent, 0, 2, 80, 300, 0.8, 4, 8, 44, 16, 50); - } - wait(lua_state, 18.0); - if is_excute(agent) { - AreaModule::erase_wind(boma, 0); - } - wait(lua_state, 18.0); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_L, 3); - } - wait(lua_state, 3.0); - if is_excute(agent) { - ItemModule::set_have_item_visibility(boma, true, 0); - } - frame(lua_state, 52.0); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 4); - } -} - -unsafe extern "C" fn effect_specialairlw1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 12.0, 5.0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true); - } -} - -unsafe extern "C" fn sound_specialairlw1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 7.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_miifighter_special_l02")); - PLAY_SE(agent, Hash40::new("se_miifighter_final06")); - } - frame(lua_state, 13.0); - if is_excute(agent) { - PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_special_c1_l01")); - } -} - -unsafe extern "C" fn game_speciallw1loop(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - agent.clear_lua_stack(); - lua_args!(agent, FIGHTER_KINETIC_ENERGY_ID_DAMAGE); - app::sv_kinetic_energy::clear_speed(lua_state); - KineticModule::clear_speed_all(boma); - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_MOTION_AIR); - SET_SPEED_EX(agent, 3.0, -2.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - ATTACK(agent, 0, 0, Hash40::new("hip"), 16.0, 361, 66, 0, 60, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 12.0); //f9 - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 13.0, 361, 66, 0, 60, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } -} - -unsafe extern "C" fn effect_speciallw1loop(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - for _ in 0..24 { - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 6, 0, 220, 0, 0, 1, true); - } - wait(lua_state, 2.0); - } -} - -unsafe extern "C" fn game_speciallw1landing(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - SET_SPEED_EX(agent, 1.5, 0.0, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - } - frame(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 60, 105, 0, 70, 4.0, 0.0, 4.0, 5.0, Some(0.0), Some(4.0), Some(-6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - } - frame(lua_state, 5.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - - -unsafe extern "C" fn sound_speciallw1landing(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - STOP_SE(agent, Hash40::new("se_miifighter_final06")); - PLAY_SE(agent, Hash40::new("se_miifighter_special_l03")); - } -} - -// ================================================================================================ -// ======================================== FEINT JUMP ============================================ -// ================================================================================================ - -unsafe extern "C" fn game_speciallw2start(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 1.5, 3.0); - frame(lua_state, 1.5); - FT_MOTION_RATE_RANGE(agent, 1.5, 2.0, 1.0); - frame(lua_state, 2.0); - FT_MOTION_RATE_RANGE(agent, 2.0, 43.0, 36.0); - sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.5); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_KICK_ENABLE_LANDING); - } - frame(lua_state, 3.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_START_WAIT_INPUT); - } - frame(lua_state, 13.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } - frame(lua_state, 19.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_KICK_ENABLE); - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_REVERSE); - } - frame(lua_state, 27.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_WALL_JUMP_ENABLE); - if !VarModule::is_flag(agent.battle_object, vars::miifighter::status::SPECIAL_LW2_CHECK_HOLD) { - SEARCH(agent, 0, 0, Hash40::new("hip"), 3.5, 1.0, 0.0, 0.0, Some(-3.0), Some(0.0), Some(0.0), *COLLISION_KIND_MASK_HIT, *HIT_STATUS_MASK_ALL, 0, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIEB, *COLLISION_PART_MASK_ALL, false); - } - } - frame(lua_state, 43.0); - if is_excute(agent) { - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); - } -} - -unsafe extern "C" fn game_specialairlw2kick(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - SET_SPEED_EX(agent, 0, 0.8, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - } - frame(lua_state, 7.0); - if is_excute(agent) { - SET_SPEED_EX(agent, -2.5, -1.0, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - } - frame(lua_state, 8.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 10.0, 35, 75, 0, 65, 4.5, 0.0, 0.0, 0.0, Some(-2.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 60, 75, 0, 65, 4.5, 0.0, 0.0, 0.0, Some(-2.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 22.0); - FT_MOTION_RATE(agent, 1.5); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn effect_specialairlw2kick(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 8.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("miifighter_illusion_line"), Hash40::new("top"), 0, 0, -5, 140, 0, 0, 0.9, true); - } -} - -unsafe extern "C" fn game_specialairlw2autoattack(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 80, 40, 0, 95, 4.0, 0.0, 0.0, -2.0, Some(0.0), Some(0.0), Some(3.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 80, 40, 0, 95, 3.5, 0.0, 5.0, -2.0, Some(0.0), Some(5.0), Some(3.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 3.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -// ================================================================================================ -// ============================================ WILD THROW ======================================== -// ================================================================================================ - -unsafe extern "C" fn game_speciallw3catch(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 3.5, 7.0); - if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - frame(lua_state, 3.5); - FT_MOTION_RATE_RANGE(agent, 3.5, 6.0, 3.0); - if is_excute(agent) { - GrabModule::set_rebound(boma, true); - CATCH(agent, 2, Hash40::new("top"), 5.0, 0.0, 7.0, 9.0, Some(0.0), Some(7.0), Some(10.5), *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_THROWN, *COLLISION_SITUATION_MASK_GA); - } - frame(lua_state, 6.0); - FT_MOTION_RATE(agent, 1.2); - if is_excute(agent) { - grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); - GrabModule::set_rebound(boma, false); - } -} - -unsafe extern "C" fn game_speciallw3throw(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - WHOLE_HIT(agent, *HIT_STATUS_INVINCIBLE); - REVERSE_LR(agent); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 10.0, 275, 100, 25, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - frame(lua_state, 1.0); - if is_excute(agent) { - FT_CATCH_STOP(agent, 5, 1); - } - frame(lua_state, 9.0); - if is_excute(agent) { - ATTACK_IGNORE_THROW(agent, 0, 0, Hash40::new("armr"), 9.0, 361, 85, 0, 80, 5.0, 6.0, 0.0, 0.0, Some(6.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 12.0); - if is_excute(agent) { - ATTACK_IGNORE_THROW(agent, 0, 0, Hash40::new("top"), 9.0, 361, 85, 0, 80, 4.0, 0.0, 3.0, -5.0, Some(0.0), Some(3.0), Some(-11.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 13.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - FT_CATCH_STOP(agent, 5, 1); - } - frame(lua_state, 14.0); - FT_MOTION_RATE(agent, 0.5); - if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); - let opponent_boma = agent.get_grabbed_opponent_boma(); - if opponent_boma.is_fighter() { - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); - } - ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); - WHOLE_HIT(agent, *HIT_STATUS_NORMAL); - } -} - -unsafe extern "C" fn game_specialairlw3throw(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_COUNTER_THROW_FLAG_THROW_AFTER_LANDING); - WHOLE_HIT(agent, *HIT_STATUS_INVINCIBLE); - REVERSE_LR(agent); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 1.0, 270, 100, 1, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - frame(lua_state, 1.0); - if is_excute(agent) { - FT_CATCH_STOP(agent, 5, 1); - } - frame(lua_state, 9.0); - if is_excute(agent) { - ATTACK_IGNORE_THROW(agent, 0, 0, Hash40::new("armr"), 9.0, 361, 85, 0, 80, 5.0, 6.0, 0.0, 0.0, Some(6.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 11.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - FT_CATCH_STOP(agent, 5, 1); - } - frame(lua_state, 13.0); - if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); - let opponent_boma = agent.get_grabbed_opponent_boma(); - if opponent_boma.is_fighter() { - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); - } - ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); - WHOLE_HIT(agent, *HIT_STATUS_NORMAL); - } - frame(lua_state, 14.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("throw"), 13.0, 280, 44, 0, 36, 12.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_nomal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_KICK); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn effect_specialairlw3throw(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - COL_PRI(agent, 101); - FLASH(agent, 1, 1, 1, 0); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_catch"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.8, true); - LAST_EFFECT_SET_RATE(agent, 0.8); - } - frame(lua_state, 3.0); - if is_excute(agent) { - COL_NORMAL(agent); - } - frame(lua_state, 8.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_counter_arc"), Hash40::new("miifighter_counter_arc"), Hash40::new("top"), -1, 8, 1, 0, 112, 90, 0.8, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 0.8); - } - frame(lua_state, 12.0); - if is_excute(agent) { - FLASH(agent, 1, 1, 1, 0); - } - frame(lua_state, 15.0); - if is_excute(agent) { - COL_NORMAL(agent); - } -} - -pub fn install(agent: &mut Agent) {; - agent.acmd("game_speciallw1", game_speciallw1, Priority::Low); - agent.acmd("effect_speciallw1", effect_speciallw1, Priority::Low); - agent.acmd("sound_speciallw1", sound_speciallw1, Priority::Low); - agent.acmd("expression_speciallw1", expression_speciallw1, Priority::Low); - agent.acmd("effect_specialairlw1", effect_specialairlw1, Priority::Low); - agent.acmd("sound_specialairlw1", sound_specialairlw1, Priority::Low); - - agent.acmd("game_speciallw1loop", game_speciallw1loop, Priority::Low); - agent.acmd("effect_speciallw1loop", effect_speciallw1loop, Priority::Low); - - agent.acmd("game_speciallw1landing", game_speciallw1landing, Priority::Low); - agent.acmd("sound_speciallw1landing", sound_speciallw1landing, Priority::Low); - - agent.acmd("game_speciallw2start", game_speciallw2start, Priority::Low); - agent.acmd("game_specialairlw2start", game_speciallw2start, Priority::Low); - - agent.acmd("game_specialairlw2kick", game_specialairlw2kick, Priority::Low); - agent.acmd("effect_specialairlw2kick", effect_specialairlw2kick, Priority::Low); - agent.acmd("game_specialairlw2autoattack", game_specialairlw2autoattack, Priority::Low); - - agent.acmd("game_speciallw3catch", game_speciallw3catch, Priority::Low); - agent.acmd("game_specialairlw3catch", game_speciallw3catch, Priority::Low); - - agent.acmd("game_speciallw3throw", game_speciallw3throw, Priority::Low); - agent.acmd("game_specialairlw3throw", game_specialairlw3throw, Priority::Low); - agent.acmd("effect_specialairlw3throw", effect_specialairlw3throw, Priority::Low); -} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_lw/mod.rs b/fighters/miifighter/src/acmd/specials/special_lw/mod.rs new file mode 100644 index 0000000000..1bae77f12e --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_lw/mod.rs @@ -0,0 +1,11 @@ +use super::*; + +mod special_lw1; +mod special_lw2; +mod special_lw3; + +pub fn install(agent: &mut Agent) {; + special_lw1::install(agent); + special_lw2::install(agent); + special_lw3::install(agent); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_lw/special_lw1.rs b/fighters/miifighter/src/acmd/specials/special_lw/special_lw1.rs new file mode 100644 index 0000000000..deaf18e181 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_lw/special_lw1.rs @@ -0,0 +1,206 @@ +use super::*; + +// ================================================================================================ +// ======================================== EARTHQUAKE FIST ======================================= +// ================================================================================================ + +unsafe extern "C" fn game_speciallw1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 11.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_LW1_HOLD); + } + frame(lua_state, 40.0); + if is_excute(agent) { + let charge_distance = VarModule::get_float(agent.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 90, 54, 0, 45, 2.5, 0.0, 2.0, 10.0 + charge_distance, Some(0.0), Some(2.0), Some(14.0 + charge_distance), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 90, 100, 0, 10, 3.5, 0.0, 3.0, 12.0 + charge_distance, Some(0.0), Some(8.0), Some(12.0 + charge_distance), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 70, 64, 0, 35, 2.5, 0.0, 2.0, 12.0 + charge_distance, Some(0.0), Some(2.0), Some(21.0 + charge_distance), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 110, 64, 0, 35, 2.5, 0.0, 2.0, 3.0 + charge_distance, Some(0.0), Some(2.0), Some(12.0 + charge_distance), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("top"), 8.0, 45, 60, 0, 60, 3.0, 0.0, 3.0, 7.0, Some(0.0), Some(3.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_KICK); + } + frame(lua_state, 43.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_speciallw1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), -3, 12, 5, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_sidekick_flash"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.6, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + let eff_handle = EffectModule::req_follow(boma, Hash40::new("sys_windwave"), Hash40::new("top"), &Vector3f::new(0.0, 0.0, 10.0), &Vector3f::zero(), 0.4, false, 0, 0, 0, 0, 0, false, false); + EffectModule::set_rate(boma, eff_handle as u32, 0.4); + VarModule::set_int64(agent.battle_object, vars::miifighter::status::SPECIAL_LW1_QUAKE_EFFECT_HANDLE, eff_handle as u64); + EFFECT_FOLLOW(agent, Hash40::new("miifighter_sidekick_hold"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 0.4); + } + frame(lua_state, 38.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_sidekick_hold"), true, true); + } + frame(lua_state, 40.0); + if is_excute(agent) { + let charge_distance = VarModule::get_float(agent.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE); + EFFECT(agent, Hash40::new("sys_ground_shockwave"), Hash40::new("top"), 8.0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_sidekick_flash"), true, true); + LANDING_EFFECT(agent, Hash40::new("miifighter_headbut_v_smoke"), Hash40::new("top"), 8.0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + LANDING_EFFECT(agent, Hash40::new("miifighter_headbut_v_smoke"), Hash40::new("top"), 12.0 + charge_distance, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_SCALE_W(agent, 0.6, 1.1, 0.6); + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 12.0 + charge_distance, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_quake"), Hash40::new("top"), 12.0 + charge_distance, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_damage_fire"), Hash40::new("top"), 12.0 + charge_distance, 3.0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_speciallw1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 38.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_attack03")); + } + frame(lua_state, 40.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_smash_s03")); + PLAY_SE(agent, Hash40::new("se_miifighter_special_l03")); + PLAY_SE(agent, Hash40::new("se_miifighter_special_s03")); + PLAY_SE_REMAIN(agent, Hash40::new("se_miifighter_special_c2_s02")); + } +} + +unsafe extern "C" fn expression_speciallw1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, false, 0); + }; + frame(lua_state, 10.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_smashhold1"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 40.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_NONE); + QUAKE(agent, *CAMERA_QUAKE_KIND_L); + ControlModule::set_rumble(boma, Hash40::new("rbkind_impact"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); + AREA_WIND_2ND_arg10(agent, 0, 2, 80, 300, 0.8, 4, 8, 44, 16, 50); + } + frame(lua_state, 55.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 3); + AreaModule::erase_wind(boma, 0); + } + frame(lua_state, 58.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + } +} + +unsafe extern "C" fn effect_specialairlw1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 12.0, 5.0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true); + } +} + +unsafe extern "C" fn sound_specialairlw1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_special_l02")); + PLAY_SE(agent, Hash40::new("se_miifighter_final06")); + } + frame(lua_state, 13.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_special_c1_l01")); + } +} + +unsafe extern "C" fn game_speciallw1loop(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + agent.clear_lua_stack(); + lua_args!(agent, FIGHTER_KINETIC_ENERGY_ID_DAMAGE); + app::sv_kinetic_energy::clear_speed(lua_state); + KineticModule::clear_speed_all(boma); + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + SET_SPEED_EX(agent, 2.75, -2.25, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + ATTACK(agent, 0, 0, Hash40::new("hip"), 16.0, 361, 66, 0, 60, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 12.0); //f9 + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("hip"), 13.0, 361, 66, 0, 60, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } +} + +unsafe extern "C" fn effect_speciallw1loop(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + for _ in 0..24 { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 6, 0, 220, 0, 0, 1, true); + } + wait(lua_state, 2.0); + } +} + +unsafe extern "C" fn game_speciallw1landing(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + SET_SPEED_EX(agent, 1.5, 0.0, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + } + frame(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 60, 105, 0, 70, 4.0, 0.0, 4.0, 5.0, Some(0.0), Some(4.0), Some(-6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + } + frame(lua_state, 5.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + + +unsafe extern "C" fn sound_speciallw1landing(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_miifighter_final06")); + PLAY_SE(agent, Hash40::new("se_miifighter_special_l03")); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_speciallw1", game_speciallw1, Priority::Low); + agent.acmd("effect_speciallw1", effect_speciallw1, Priority::Low); + agent.acmd("sound_speciallw1", sound_speciallw1, Priority::Low); + agent.acmd("expression_speciallw1", expression_speciallw1, Priority::Low); + agent.acmd("effect_specialairlw1", effect_specialairlw1, Priority::Low); + agent.acmd("sound_specialairlw1", sound_specialairlw1, Priority::Low); + + agent.acmd("game_speciallw1loop", game_speciallw1loop, Priority::Low); + agent.acmd("effect_speciallw1loop", effect_speciallw1loop, Priority::Low); + + agent.acmd("game_speciallw1landing", game_speciallw1landing, Priority::Low); + agent.acmd("sound_speciallw1landing", sound_speciallw1landing, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_lw/special_lw2.rs b/fighters/miifighter/src/acmd/specials/special_lw/special_lw2.rs new file mode 100644 index 0000000000..9f35f6dd1b --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_lw/special_lw2.rs @@ -0,0 +1,98 @@ +use super::*; + +// ================================================================================================ +// ======================================== FEINT JUMP ============================================ +// ================================================================================================ + +unsafe extern "C" fn game_speciallw2start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 1.5, 3.0); + frame(lua_state, 1.5); + FT_MOTION_RATE_RANGE(agent, 1.5, 2.0, 1.0); + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 43.0, 36.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.5); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_KICK_ENABLE_LANDING); + } + frame(lua_state, 3.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_START_WAIT_INPUT); + } + frame(lua_state, 13.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + } + frame(lua_state, 19.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_KICK_ENABLE); + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_REVERSE); + } + frame(lua_state, 27.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_REVERSAL_KICK_FLAG_WALL_JUMP_ENABLE); + if VarModule::is_flag(agent.battle_object, vars::common::status::CHECK_HOLD_INPUT) { + SEARCH(agent, 0, 0, Hash40::new("hip"), 3.5, 1.0, 0.0, 0.0, Some(-3.0), Some(0.0), Some(0.0), *COLLISION_KIND_MASK_HIT, *HIT_STATUS_MASK_ALL, 0, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIEB, *COLLISION_PART_MASK_ALL, false); + } + } + frame(lua_state, 43.0); + if is_excute(agent) { + search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); + } +} + +unsafe extern "C" fn game_specialairlw2kick(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + SET_SPEED_EX(agent, 0, 0.8, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + } + frame(lua_state, 7.0); + if is_excute(agent) { + SET_SPEED_EX(agent, -2.15, -1.1, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + } + frame(lua_state, 8.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneer"), 10.0, 35, 75, 0, 65, 4.5, 0.0, 0.0, 0.0, Some(-2.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 60, 75, 0, 65, 4.5, 0.0, 0.0, 0.0, Some(-2.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 22.0); + FT_MOTION_RATE(agent, 1.5); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_specialairlw2kick(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_illusion_line"), Hash40::new("top"), 0, 0, -5, 140, 0, 0, 0.9, true); + } +} + +unsafe extern "C" fn game_specialairlw2autoattack(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 80, 40, 0, 95, 4.0, 0.0, 0.0, -2.0, Some(0.0), Some(0.0), Some(3.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 80, 40, 0, 95, 3.5, 0.0, 5.0, -2.0, Some(0.0), Some(5.0), Some(3.5), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 3.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_speciallw2start", game_speciallw2start, Priority::Low); + agent.acmd("game_specialairlw2start", game_speciallw2start, Priority::Low); + + agent.acmd("game_specialairlw2kick", game_specialairlw2kick, Priority::Low); + agent.acmd("effect_specialairlw2kick", effect_specialairlw2kick, Priority::Low); + agent.acmd("game_specialairlw2autoattack", game_specialairlw2autoattack, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_lw/special_lw3.rs b/fighters/miifighter/src/acmd/specials/special_lw/special_lw3.rs new file mode 100644 index 0000000000..555dfb0fdc --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_lw/special_lw3.rs @@ -0,0 +1,521 @@ +use super::*; + +// ================================================================================================ +// ======================================== BOILING PUNT ========================================== +// ================================================================================================ + +unsafe extern "C" fn game_speciallw31g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 17.0, 12.0); + frame(lua_state, 17.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneel"), 7.0, 70, 112, 0, 40, 4.0, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legl"), 7.0, 70, 112, 0, 40, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::enable_safe_pos(boma); + } + frame(lua_state, 25.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_speciallw31g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 15.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 3.5, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 7, -4, 180, 0, 0, 0.7, true); + EFFECT(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 6.5, 10.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } +} + +unsafe extern "C" fn sound_speciallw31g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 17.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_swing_m")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_attack01")); + } +} + +unsafe extern "C" fn expression_speciallw31g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, false, 0); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 17.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); + } + frame(lua_state, 39.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + } +} + +unsafe extern "C" fn game_speciallw31a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneel"), 7.0, 65, 112, 0, 40, 4.0, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legl"), 7.0, 65, 112, 0, 40, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 11.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_BOUNCE); + } + frame(lua_state, 13.0); + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + FT_MOTION_RATE_RANGE(agent, 13.0, 29.0, 25.0); + } + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 29.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_LANDING); + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); + } +} + +unsafe extern "C" fn effect_speciallw31a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_c"), Hash40::new("sys_attack_arc_c"), Hash40::new("top"), 2, 7, -2, 75, -151, 70, 0.9, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("sys_attack_impact"), Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, -1, 2.5, 0, 0, 0, 1.0, true, *EF_FLIP_YZ); + } +} + +unsafe extern "C" fn sound_speciallw31a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_swing_m")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_attack01")); + } +} + +unsafe extern "C" fn expression_speciallw31a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 9.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); + } +} + +unsafe extern "C" fn game_speciallw32g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 17.0, 12.0); + frame(lua_state, 17.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneel"), 12.0, 60, 80, 0, 56, 4.0, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legl"), 12.0, 60, 80, 0, 56, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::enable_safe_pos(boma); + } + frame(lua_state, 18.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 2.25); + frame(lua_state, 25.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_speciallw32g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 15.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 3.5, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_boiling2"), Hash40::new("miifighter_boiling2"), Hash40::new("top"), -2, 4.7, 1.5, -16, -43, 15, 1, true, *EF_FLIP_AXIS_YZ); + LAST_EFFECT_SET_COLOR(agent, 3.0, 1.0, 0.0); + LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 7, -4, 180, 0, 0, 0.7, true); + LAST_EFFECT_SET_COLOR(agent, 2.0, 0.5, 0.0); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 6.5, 10.5, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 3.0, 0.0, 0.0); + } + frame(lua_state, 19.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("sys_attack_impact"), 0); + } +} + +unsafe extern "C" fn sound_speciallw32g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 17.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_swing_l")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_attack02")); + } +} + +unsafe extern "C" fn expression_speciallw32g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, false, 0); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 17.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } + frame(lua_state, 39.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + } +} + +unsafe extern "C" fn game_speciallw32a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneel"), 12.0, 60, 80, 0, 56, 4.0, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 60, 80, 0, 56, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 11.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_BOUNCE); + } + frame(lua_state, 13.0); + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + FT_MOTION_RATE_RANGE(agent, 13.0, 29.0, 25.0); + } + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 29.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_LANDING); + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); + } +} + +unsafe extern "C" fn effect_speciallw32a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_boiling_air2"), Hash40::new("miifighter_boiling_air2"), Hash40::new("top"), 2, 7, -2, 75, -151, 70, 0.9, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, 2.0, 1.0, 0.0); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("sys_attack_impact"), Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, -1, 2.5, 0, 0, 0, 1.0, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, 3.0, 0.0, 0.0); + } +} + +unsafe extern "C" fn sound_speciallw32a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_swing_l")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_attack02")); + } +} + +unsafe extern "C" fn expression_speciallw32a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); + } + frame(lua_state, 9.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + +unsafe extern "C" fn game_speciallw33g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 43.0, 9.0); + frame(lua_state, 43.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 50.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_STALL); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 24.0, 45, 78, 0, 45, 4.5, 3.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 24.0, 45, 78, 0, 45, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_KICK); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_kick_hit_l")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_kick_hit_l")); + AttackModule::enable_safe_pos(boma); + } + frame(lua_state, 51.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 3.3); + frame(lua_state, 54.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::miifighter::instance::SPECIAL_LW3_STALL); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 20.4, 50, 60, 0, 30, 3.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 20.4, 50, 60, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 61.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_speciallw33g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let mut handle = 0; + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_hyakuretsukick"), Hash40::new("top"), -4, 12, 7, 0, 0, 0, 0.4, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_sp_flash"), Hash40::new("top"), -4, 12, 7, 0, 0, 0, 0.5, true); + LAST_EFFECT_SET_RATE(agent, 0.5); + } + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_sidekick_hold"), Hash40::new("toel"), 0, 0, 0, 0, 0, 0, 0.8, true); + handle = EffectModule::req_follow(boma, Hash40::new("miifighter_sidekick_flash"), Hash40::new("toel"), &Vector3f::zero(), &Vector3f::zero(), 1.0, true, 0, 0, 0, 0, 0, false, false); + EffectModule::set_rate(boma, handle as u32, (43.0 - 1.0)/12.0); + } + frame(lua_state, 29.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_hyakuretsukick"), true, true); + } + frame(lua_state, 31.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("sys_sp_flash"), true, true); + } + frame(lua_state, 33.0); + for _ in 0..4 { + if is_excute(agent) { + FLASH(agent, 1, 1, 0.392, 0.392); + } + wait(lua_state, 1.0); + if is_excute(agent) { + FLASH(agent, 1, 0.392, 0, 0.353); + } + wait(lua_state, 1.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + wait(lua_state, 1.0); + } + frame(lua_state, 43.0); + if is_excute(agent) { + EFFECT_FLW_POS(agent, Hash40::new("miifighter_sidekick"), Hash40::new("toel"), 0, 0, 0, 0, 0, 0, 1, true); + EffectModule::enable_sync_init_pos_last(boma); + EffectModule::set_rate(boma, handle as u32, 1.0); + } + frame(lua_state, 49.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 3.5, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 50.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_sidekick_hold"), true, true); + } + frame(lua_state, 60.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_sidekick_flash"), true, true); + } +} + +unsafe extern "C" fn sound_speciallw33g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + let handle = SoundModule::play_se(boma, Hash40::new("se_miifighter_special_c3_n01"), true, false, false, false, app::enSEType(0)); + SoundModule::set_se_speed(boma, handle as i32, 3.0); + } + frame(lua_state, 48.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_special_c3_n02")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_special_c3_n01")); + } +} + +unsafe extern "C" fn expression_speciallw33g(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 7.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_smashhold1"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 47.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_erase"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 48.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, false, 0); + } + frame(lua_state, 50.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackll"), 0); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitll"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + QUAKE(agent, *CAMERA_QUAKE_KIND_M); + } + frame(lua_state, 77.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + } +} + +unsafe extern "C" fn game_speciallw33a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneel"), 19.2, 284, 36, 0, 42, 4.5, 3.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 19.2, 284, 36, 0, 42, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_KICK); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_kick_hit_l")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_kick_hit_l")); + } + frame(lua_state, 14.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("kneel"), 19.2, 284, 36, 0, 42, 4.5, 3.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 19.2, 284, 36, 0, 42, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_KICK); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_kick_hit_l")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_kick_hit_l")); + } + frame(lua_state, 17.0); + if is_excute(agent) { + //VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_BOUNCE); + AttackModule::clear_all(boma); + } + frame(lua_state, 20.0); + FT_MOTION_RATE_RANGE(agent, 20.0, 40.0, 25.0); + frame(lua_state, 34.0); // f38 + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_LANDING); + } + frame(lua_state, 40.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_speciallw33a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_hyakuretsukick"), Hash40::new("top"), -4, 12, 7, 0, 0, 0, 0.4, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_sp_flash"), Hash40::new("top"), -4, 12, 7, 0, 0, 0, 0.5, true); + LAST_EFFECT_SET_RATE(agent, 0.5); + } + frame(lua_state, 11.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_hyakuretsukick"), true, true); + EFFECT_OFF_KIND(agent, Hash40::new("sys_sp_flash"), true, true); + } + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_boiling_air3"), Hash40::new("miifighter_boiling_air3"), Hash40::new("top"), -1, 5, 0, 90, 90, 0, 0.72, true, *EF_FLIP_YZ); + EFFECT_FOLLOW(agent, Hash40::new("miifighter_boiling_firearc"), Hash40::new("top"), -1, 5, 0, 90, 0, 0, 0.72, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT_FOLLOW(agent, Hash40::new("miifighter_boiling_firearc"), Hash40::new("top"), -1, 5, 0, 90, 0, 0, 0.72, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } +} + +unsafe extern "C" fn sound_speciallw33a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_special_c3_n01")); + } + frame(lua_state, 11.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_swing_ll")); + PLAY_SE(agent, Hash40::new("se_common_fire_m")); + } +} + +unsafe extern "C" fn expression_speciallw33a(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 11.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_speciallw31g", game_speciallw31g, Priority::Low); + agent.acmd("effect_speciallw31g", effect_speciallw31g, Priority::Low); + agent.acmd("sound_speciallw31g", sound_speciallw31g, Priority::Low); + agent.acmd("expression_speciallw31g", expression_speciallw31g, Priority::Low); + + agent.acmd("game_speciallw31a", game_speciallw31a, Priority::Low); + agent.acmd("effect_speciallw31a", effect_speciallw31a, Priority::Low); + agent.acmd("sound_speciallw31a", sound_speciallw31a, Priority::Low); + agent.acmd("expression_speciallw31a", expression_speciallw31a, Priority::Low); + + agent.acmd("game_speciallw32g", game_speciallw32g, Priority::Low); + agent.acmd("effect_speciallw32g", effect_speciallw32g, Priority::Low); + agent.acmd("sound_speciallw32g", sound_speciallw32g, Priority::Low); + agent.acmd("expression_speciallw32g", expression_speciallw32g, Priority::Low); + + agent.acmd("game_speciallw32a", game_speciallw32a, Priority::Low); + agent.acmd("effect_speciallw32a", effect_speciallw32a, Priority::Low); + agent.acmd("sound_speciallw32a", sound_speciallw32a, Priority::Low); + agent.acmd("expression_speciallw32a", expression_speciallw32a, Priority::Low); + + agent.acmd("game_speciallw33g", game_speciallw33g, Priority::Low); + agent.acmd("effect_speciallw33g", effect_speciallw33g, Priority::Low); + agent.acmd("sound_speciallw33g", sound_speciallw33g, Priority::Low); + agent.acmd("expression_speciallw33g", expression_speciallw33g, Priority::Low); + + agent.acmd("game_speciallw33a", game_speciallw33a, Priority::Low); + agent.acmd("effect_speciallw33a", effect_speciallw33a, Priority::Low); + agent.acmd("sound_speciallw33a", sound_speciallw33a, Priority::Low); + agent.acmd("expression_speciallw33a", expression_speciallw33a, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_n.rs b/fighters/miifighter/src/acmd/specials/special_n.rs deleted file mode 100644 index b6b0a4c737..0000000000 --- a/fighters/miifighter/src/acmd/specials/special_n.rs +++ /dev/null @@ -1,157 +0,0 @@ -use super::*; - -// ================================================================================================ -// ========================================= SHOT PUT ============================================= -// ================================================================================================ - -unsafe extern "C" fn game_specialn1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ArticleModule::generate_article_enable(boma, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, false, -1); - } - frame(lua_state, 28.0); - if is_excute(agent) { - ArticleModule::shoot_exist(boma, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); - } - frame(lua_state, 40.0); - FT_MOTION_RATE_RANGE(agent, 40.0, 80.0, 20.0); - frame(lua_state, 80.0); - FT_MOTION_RATE(agent, 1.0); -} - -// ================================================================================================ -// ==================================== FLASHING MACH PUNCH ======================================= -// ================================================================================================ - -unsafe extern "C" fn game_specialn2start(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 11.0, 5.0); - if is_excute(agent) { - WHOLE_HIT(agent, *HIT_STATUS_NORMAL); - } - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 12.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.4, 190, 100, 35, 0, 3.0, 0.0, 7.5, 16.5, Some(0.0), Some(8.5), Some(16.5), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.4, 80, 100, 50, 0, 2.0, 0.0, 4.5, 9.5, Some(0.0), Some(4.5), Some(15.5), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.4, 366, 100, 30, 0, 2.0, 0.0, 10.2, 9.5, Some(0.0), Some(10.2), Some(16.5), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 60, 100, 110, 0, 3.0, 0.0, 11.2, 10.5, Some(0.0), Some(11.2), Some(14.5), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 13.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 16.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.4, 366, 100, 20, 0, 4.0, 0.0, 5.0, 15.5, Some(0.0), Some(7.0), Some(15.5), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.4, 80, 100, 50, 0, 2.0, 0.0, 4.5, 9.5, Some(0.0), Some(4.5), Some(15.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.4, 366, 100, 30, 0, 2.0, 0.0, 11.2, 9.5, Some(0.0), Some(11.2), Some(15.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 60, 100, 110, 0, 3.0, 0.0, 11.2, 10.5, Some(0.0), Some(11.2), Some(15.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 17.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 19.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.4, 90, 100, 20, 0, 2.0, 0.0, 3.0, 15.5, Some(0.0), Some(9.0), Some(15.5), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.4, 80, 100, 50, 0, 2.0, 0.0, 4.5, 9.5, Some(0.0), Some(4.5), Some(13.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.4, 366, 100, 30, 0, 2.0, 0.0, 11.2, 9.5, Some(0.0), Some(11.2), Some(13.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 60, 100, 110, 0, 3.0, 0.0, 11.2, 10.5, Some(0.0), Some(11.2), Some(13.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 20.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 22.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.4, 90, 100, 20, 0, 2.0, 0.0, 3.5, 15.5, Some(0.0), Some(9.5), Some(15.5), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.4, 80, 100, 50, 0, 2.0, 0.0, 4.5, 9.5, Some(0.0), Some(4.5), Some(13.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 0.4, 366, 100, 30, 0, 2.0, 0.0, 11.2, 9.5, Some(0.0), Some(11.2), Some(13.0), 0.3, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 60, 100, 110, 0, 3.0, 0.0, 11.2, 10.5, Some(0.0), Some(11.2), Some(13.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 23.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - FT_MOTION_RATE(agent, 1.1); - frame(lua_state, 24.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_MACH_PUNCH_FLAG_PULL_FINISH_ATTACK); - ATTACK(agent, 0, 0, Hash40::new("top"), 0.4, 366, 100, 20, 0, 2.5, 0.0, 3.5, 17.0, Some(0.0), Some(9.5), Some(17.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.4, 366, 100, 40, 0, 6.0, 0.0, 6.5, 11.8, Some(0.0), Some(8.3), Some(11.8), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 60, 100, 40, 0, 4.0, 0.0, 4.5, 8.8, Some(0.0), Some(10.3), Some(8.8), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn game_specialn2finish(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - WHOLE_HIT(agent, *HIT_STATUS_INVINCIBLE); - } - frame(lua_state, 2.0); - FT_MOTION_RATE(agent, 0.8); - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - let kbg = if boma.is_situation(*SITUATION_KIND_GROUND) { 100 } else { 92 }; - ATTACK(agent, 0, 0, Hash40::new("top"), 10.5, 80, kbg, 0, 60, 5.5, 0.0, 7.5, 12.5, Some(0.0), Some(17.0), Some(12.5), 1.4, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 17.0); - if is_excute(agent) { - WHOLE_HIT(agent, *HIT_STATUS_NORMAL); - } - frame(lua_state, 18.0); - FT_MOTION_RATE(agent, 0.8); - frame(lua_state, 49.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_MACH_PUNCH_FLAG_SET_FALL_SPEED); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); - } - frame(lua_state, 68.0); - FT_MOTION_RATE(agent, 1.0); -} - -unsafe extern "C" fn game_specialn2miss(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 8.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_MACH_PUNCH_FLAG_SET_FALL_SPEED); - } - frame(lua_state, 18.0); - FT_MOTION_RATE_RANGE(agent, 18.0, 31.0, 21.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); - } - frame(lua_state, 31.0); - FT_MOTION_RATE(agent, 1.0); -} - -pub fn install(agent: &mut Agent) {; - agent.acmd("game_specialn1", game_specialn1, Priority::Low); - agent.acmd("game_specialairn1", game_specialn1, Priority::Low); - - agent.acmd("game_specialn2start", game_specialn2start, Priority::Low); - agent.acmd("game_specialairn2start", game_specialn2start, Priority::Low); - - agent.acmd("game_specialn2finish", game_specialn2finish, Priority::Low); - agent.acmd("game_specialairn2finish", game_specialn2finish, Priority::Low); - - agent.acmd("game_specialn2miss", game_specialn2miss, Priority::Low); - agent.acmd("game_specialairn2miss", game_specialn2miss, Priority::Low); -} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_n/mod.rs b/fighters/miifighter/src/acmd/specials/special_n/mod.rs new file mode 100644 index 0000000000..a6bd29f69e --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_n/mod.rs @@ -0,0 +1,11 @@ +use super::*; + +mod special_n1; +mod special_n2; +mod special_n3; + +pub fn install(agent: &mut Agent) {; + special_n1::install(agent); + special_n2::install(agent); + special_n3::install(agent); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_n/special_n1.rs b/fighters/miifighter/src/acmd/specials/special_n/special_n1.rs new file mode 100644 index 0000000000..839b052db4 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_n/special_n1.rs @@ -0,0 +1,121 @@ +use super::*; + +// ================================================================================================ +// ======================================== SHOT PUT ============================================== +// ================================================================================================ + +unsafe extern "C" fn game_specialn1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ArticleModule::generate_article_enable(boma, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, false, -1); + } + frame(lua_state, 15.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_N1_START_HOLD); + } + frame(lua_state, 25.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD); + } + frame(lua_state, 28.0); + if is_excute(agent) { + ArticleModule::shoot_exist(boma, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); + } + frame(lua_state, 40.0); + FT_MOTION_RATE_RANGE(agent, 40.0, 80.0, 20.0); + frame(lua_state, 80.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialn1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), -5, 8.5, -0.5, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 360, false); + } + frame(lua_state, 5.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 2, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 25.0); + if is_excute(agent) { + let eff_handle = VarModule::get_int(agent.battle_object, vars::miifighter::status::SPECIAL_N1_EFFECT_HANDLE) as u32; + if EffectModule::is_exist_effect(boma, eff_handle) { + EffectModule::kill(boma, eff_handle, true, true); + VarModule::set_int(agent.battle_object, vars::miifighter::status::SPECIAL_N1_EFFECT_HANDLE, -1); + } + } +} + +unsafe extern "C" fn game_specialn1bowl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 25.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD); + } + frame(lua_state, 28.0); + if is_excute(agent) { + ArticleModule::shoot_exist(boma, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); + } + frame(lua_state, 40.0); + FT_MOTION_RATE_RANGE(agent, 40.0, 80.0, 20.0); + frame(lua_state, 80.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialn1bowl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 25.0); + if is_excute(agent) { + let eff_handle = VarModule::get_int(agent.battle_object, vars::miifighter::status::SPECIAL_N1_EFFECT_HANDLE) as u32; + if EffectModule::is_exist_effect(boma, eff_handle) { + EffectModule::kill(boma, eff_handle, true, true); + VarModule::set_int(agent.battle_object, vars::miifighter::status::SPECIAL_N1_EFFECT_HANDLE, -1); + } + } +} + +unsafe extern "C" fn sound_specialn1bowl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 24.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miifighter_special_n02")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_special_c1_n01")); + } +} + +unsafe extern "C" fn expression_specialn1bowl(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 27.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_lightthrowitem"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 79.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialn1", game_specialn1, Priority::Low); + agent.acmd("game_specialairn1", game_specialn1, Priority::Low); + agent.acmd("effect_specialn1", effect_specialn1, Priority::Low); + agent.acmd("effect_specialairn1", effect_specialn1, Priority::Low); + + agent.acmd("game_specialn1bowl", game_specialn1bowl, Priority::Low); + agent.acmd("game_specialairn1bowl", game_specialn1bowl, Priority::Low); + agent.acmd("effect_specialn1bowl", effect_specialn1bowl, Priority::Low); + agent.acmd("effect_specialairn1bowl", effect_specialn1bowl, Priority::Low); + agent.acmd("sound_specialn1bowl", sound_specialn1bowl, Priority::Low); + agent.acmd("sound_specialairn1bowl", sound_specialn1bowl, Priority::Low); + agent.acmd("expression_specialn1bowl", expression_specialn1bowl, Priority::Low); + agent.acmd("expression_specialairn1bowl", expression_specialn1bowl, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_n/special_n2.rs b/fighters/miifighter/src/acmd/specials/special_n/special_n2.rs new file mode 100644 index 0000000000..002f735005 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_n/special_n2.rs @@ -0,0 +1,299 @@ +use super::*; + +// ================================================================================================ +// ======================================== ULTIMATE UPPERCUT ===================================== +// ================================================================================================ + +unsafe extern "C" fn game_specialn2start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 8.0); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn expression_specialn2start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } +} + +unsafe extern "C" fn effect_specialn2hold(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_hyakuretsukick"), Hash40::new("haver"), -0.75, 0, 0, 0, 0, 0, 0.5, true); + } + frame(lua_state, 2.0); + for h in 0..=12 { + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -8, 0, 0, 0, 0, 0, 1, 12, 0, 12, 0, 0, 0, false); + } + if h % 4 == 0 { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_hyakuretsukick"), true, true); + EFFECT_FOLLOW(agent, Hash40::new("miifighter_hyakuretsukick"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.5, true); + } + } + wait(lua_state, 12.0); + } +} + +unsafe extern "C" fn sound_specialn2hold(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + PLAY_STATUS(agent, Hash40::new("se_miifighter_special_n2_charge")); + } +} + +unsafe extern "C" fn expression_specialn2hold(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 2.0); + for _ in 0..=150 { + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_smashhold1"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); + } + wait(lua_state, 12.0); + } +} + +unsafe extern "C" fn expression_specialn2end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } +} + +unsafe extern "C" fn game_specialn2attack(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let ground_start = boma.is_situation(*SITUATION_KIND_GROUND); + let charge = VarModule::get_int(agent.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT); + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + SA_SET(agent, *SITUATION_KIND_AIR); + HIT_NODE(agent, Hash40::new("handr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + let damage = 10.0 + (0.1 * charge as f32); + let kbg = if ground_start { 58 } else { 50 }; + let sound_lvl = if charge <= 100 { *ATTACK_SOUND_LEVEL_M } else { *ATTACK_SOUND_LEVEL_L }; + ATTACK(agent, 0, 0, Hash40::new("handr"), damage, 90, kbg, 0, 57, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_lvl, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), damage, 90, kbg, 0, 57, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_lvl, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 12.0); + if is_excute(agent) { + let charge = VarModule::get_int(agent.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT); + let damage = 8.0 + (0.05 * charge as f32); + let kbg = if ground_start { 58 } else { 50 }; + ATTACK(agent, 0, 0, Hash40::new("handr"), damage, 90, kbg, 0, 57, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), damage, 90, kbg, 0, 57, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 15.0); + if charge >= ParamModule::get_int(agent.battle_object, ParamType::Agent, "special_n2.charge_frame") { + FT_MOTION_RATE_RANGE(agent, 15.0, 30.0, 20.0); + frame(lua_state, 16.0); + } + else { + frame(lua_state, 17.0); + } + if is_excute(agent) { + AttackModule::clear_all(boma); + HIT_NODE(agent, Hash40::new("handr"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_NORMAL); + } + frame(lua_state, 30.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialn2attack(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let charged = VarModule::get_int(agent.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT) + >= ParamModule::get_int(agent.battle_object, ParamType::Agent, "special_n2.charge_frame"); + frame(lua_state, 1.0); + if is_excute(agent) { + if charged { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_hyakuretsukick"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.65, true); + } + } + frame(lua_state, 5.0); + if is_excute(agent) { + if charged { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_pistonpunch_impact"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.8, true); + LAST_EFFECT_SET_COLOR(agent, 2.0, 0.5, 0.5); + LAST_EFFECT_SET_RATE(agent, 0.5); + } + } + frame(lua_state, 9.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 4, 0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miifighter_tenchi_arc"), Hash40::new("top"), 0, 8, -5, 0, 15, 90, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, 3.0, 0.25, 0.25); + if !charged { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.7, true); + } + } + let mut clearFrame1 = 16.0; + let mut clearFrame2 = 17.0; + if charged { + clearFrame1 = 15.5; + clearFrame2 = 16.0; + } + frame(lua_state, clearFrame1); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_tenchi_arc"), true, true); + } + frame(lua_state, clearFrame2); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_hyakuretsukick"), false, false); + } + frame(lua_state, 22.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_pistonpunch_impact"), true, true); + } +} + +unsafe extern "C" fn sound_specialn2attack(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + let charge = VarModule::get_int(agent.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT); + if charge < ParamModule::get_int(agent.battle_object, ParamType::Agent, "special_n2.charge_frame") { + PLAY_SE(agent, Hash40::new("se_miifighter_special_n2_swing")); + } + else { + PLAY_SE(agent, Hash40::new("se_miifighter_special_n2_swing_max")); + } + PLAY_SEQUENCE(agent, Hash40::new("seq_miifighter_rnd_attack03")); + } +} + +unsafe extern "C" fn expression_specialn2attack(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let charged = VarModule::get_int(agent.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT) + >= ParamModule::get_int(agent.battle_object, ParamType::Agent, "special_n2.charge_frame"); + frame(lua_state, 1.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + } + frame(lua_state, 7.0); + if is_excute(agent) { + if charged { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + else { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + } + frame(lua_state, 9.0); + if is_excute(agent) { + if charged { + QUAKE(agent, *CAMERA_QUAKE_KIND_L); + RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); + } + else { + QUAKE(agent, *CAMERA_QUAKE_KIND_S); + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } + } + frame(lua_state, 12.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } + frame(lua_state, 40.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + } +} + +unsafe extern "C" fn effect_specialn2landing(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_specialn2landing(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + PLAY_LANDING_SE(agent, Hash40::new("se_miifighter_landing03")); + } +} + +unsafe extern "C" fn expression_specialn2landing(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ControlModule::set_rumble(agent.module_accessor, Hash40::new("rbkind_landl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialn2start", game_specialn2start, Priority::Low); + agent.acmd("game_specialairn2start", game_specialn2start, Priority::Low); + agent.acmd("effect_specialn2start", acmd_stub, Priority::Low); + agent.acmd("effect_specialairn2start", acmd_stub, Priority::Low); + agent.acmd("sound_specialn2start", acmd_stub, Priority::Low); + agent.acmd("sound_specialairn2start", acmd_stub, Priority::Low); + agent.acmd("expression_specialn2start", expression_specialn2start, Priority::Low); + agent.acmd("expression_specialairn2start", expression_specialn2start, Priority::Low); + + agent.acmd("game_specialn2hold", acmd_stub, Priority::Low); + agent.acmd("game_specialairn2hold", acmd_stub, Priority::Low); + agent.acmd("effect_specialn2hold", effect_specialn2hold, Priority::Low); + agent.acmd("effect_specialairn2hold", effect_specialn2hold, Priority::Low); + agent.acmd("sound_specialn2hold", sound_specialn2hold, Priority::Low); + agent.acmd("sound_specialairn2hold", sound_specialn2hold, Priority::Low); + agent.acmd("expression_specialn2hold", expression_specialn2hold, Priority::Low); + agent.acmd("expression_specialairn2hold", expression_specialn2hold, Priority::Low); + + agent.acmd("game_specialn2end", acmd_stub, Priority::Low); + agent.acmd("game_specialairn2end", acmd_stub, Priority::Low); + agent.acmd("effect_specialn2end", acmd_stub, Priority::Low); + agent.acmd("effect_specialairn2end", acmd_stub, Priority::Low); + agent.acmd("sound_specialn2end", acmd_stub, Priority::Low); + agent.acmd("sound_specialairn2end", acmd_stub, Priority::Low); + agent.acmd("expression_specialn2end", expression_specialn2end, Priority::Low); + agent.acmd("expression_specialairn2end", expression_specialn2end, Priority::Low); + + agent.acmd("game_specialn2attack", game_specialn2attack, Priority::Low); + agent.acmd("game_specialairn2attack", game_specialn2attack, Priority::Low); + agent.acmd("effect_specialn2attack", effect_specialn2attack, Priority::Low); + agent.acmd("effect_specialairn2attack", effect_specialn2attack, Priority::Low); + agent.acmd("sound_specialn2attack", sound_specialn2attack, Priority::Low); + agent.acmd("sound_specialairn2attack", sound_specialn2attack, Priority::Low); + agent.acmd("expression_specialn2attack", expression_specialn2attack, Priority::Low); + agent.acmd("expression_specialairn2attack", expression_specialn2attack, Priority::Low); + + agent.acmd("game_specialn2landing", acmd_stub, Priority::Low); + agent.acmd("game_specialairn2landing", acmd_stub, Priority::Low); + agent.acmd("effect_specialn2landing", effect_specialn2landing, Priority::Low); + agent.acmd("effect_specialairn2landing", effect_specialn2landing, Priority::Low); + agent.acmd("sound_specialn2landing", sound_specialn2landing, Priority::Low); + agent.acmd("sound_specialairn2landing", sound_specialn2landing, Priority::Low); + agent.acmd("expression_specialn2landing", expression_specialn2landing, Priority::Low); + agent.acmd("expression_specialairn2landing", expression_specialn2landing, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_n/special_n3.rs b/fighters/miifighter/src/acmd/specials/special_n/special_n3.rs new file mode 100644 index 0000000000..db65f53f15 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_n/special_n3.rs @@ -0,0 +1,173 @@ +use super::*; + +// ================================================================================================ +// ======================================== WILD THROW ============================================ +// ================================================================================================ + +unsafe extern "C" fn game_specialn3catch(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 3.5, 7.0); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 3.5); + FT_MOTION_RATE_RANGE(agent, 3.5, 6.0, 3.0); + if is_excute(agent) { + GrabModule::set_rebound(boma, true); + CATCH(agent, 2, Hash40::new("top"), 5.0, 0.0, 7.0, 9.0, Some(0.0), Some(7.0), Some(9.5), *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_THROWN, *COLLISION_SITUATION_MASK_GA); + } + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.2); + if is_excute(agent) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); + GrabModule::set_rebound(boma, false); + } + frame(lua_state, 18.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_AIR) { + let air_accel_y = agent.get_param_float("air_accel_y", ""); + let air_speed_y_stable = agent.get_param_float("air_speed_y_stable", ""); + sv_kinetic_energy!(set_accel, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y); + sv_kinetic_energy!(set_limit_speed, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_speed_y_stable); + } + } +} + +unsafe extern "C" fn effect_specialn3catch(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("sys_guard_mark"), true, true); + EFFECT_FOLLOW(agent, Hash40::new("miifighter_counter_success"), Hash40::new("top"), -1, 7, 8, 0, 90, 0, 0.6, false); + } +} + +unsafe extern "C" fn game_specialn3throw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + WHOLE_HIT(agent, *HIT_STATUS_INVINCIBLE); + REVERSE_LR(agent); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 14.0, 275, 100, 25, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 1.0); + if is_excute(agent) { + FT_CATCH_STOP(agent, 7, 1); + } + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 7.0, 10.0); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 9.0); + if is_excute(agent) { + ATTACK_IGNORE_THROW(agent, 0, 0, Hash40::new("armr"), 9.0, 361, 85, 0, 80, 5.0, 6.0, 0.0, 0.0, Some(6.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 12.0); + if is_excute(agent) { + ATTACK_IGNORE_THROW(agent, 0, 0, Hash40::new("top"), 9.0, 361, 85, 0, 80, 4.0, 0.0, 3.0, -5.0, Some(0.0), Some(3.0), Some(-11.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 0.5); + if is_excute(agent) { + AttackModule::clear_all(boma); + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let opponent_boma = agent.get_grabbed_opponent_boma(); + if opponent_boma.is_fighter() && VarModule::has_var_module(opponent_boma.object()) { + VarModule::on_flag(opponent_boma.object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); + } + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + WHOLE_HIT(agent, *HIT_STATUS_NORMAL); + } + frame(lua_state, 47.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn game_specialairn3throw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_COUNTER_THROW_FLAG_THROW_AFTER_LANDING); + WHOLE_HIT(agent, *HIT_STATUS_INVINCIBLE); + REVERSE_LR(agent); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 14.0, 280, 28, 0, 33, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 1.0); + if is_excute(agent) { + FT_CATCH_STOP(agent, 7, 1); + } + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 7.0, 10.0); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 9.0); + if is_excute(agent) { + ATTACK_IGNORE_THROW(agent, 0, 0, Hash40::new("armr"), 9.0, 361, 85, 0, 80, 5.0, 6.0, 0.0, 0.0, Some(6.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 11.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 13.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let opponent_boma = agent.get_grabbed_opponent_boma(); + if opponent_boma.is_fighter() { + VarModule::on_flag(opponent_boma.object(), vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); + } + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + WHOLE_HIT(agent, *HIT_STATUS_NORMAL); + } + frame(lua_state, 15.0); + if is_excute(agent) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_specialairn3throw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + COL_PRI(agent, 101); + FLASH(agent, 1, 1, 1, 0); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_catch"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 3.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_counter_arc"), Hash40::new("miifighter_counter_arc"), Hash40::new("top"), -1, 8, 1, 0, 112, 90, 0.8, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 12.0); + if is_excute(agent) { + FLASH(agent, 1, 1, 1, 0); + } + frame(lua_state, 15.0); + if is_excute(agent) { + COL_NORMAL(agent); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_speciallw3catch", game_specialn3catch, Priority::Low); + agent.acmd("game_specialairlw3catch", game_specialn3catch, Priority::Low); + agent.acmd("effect_speciallw3catch", effect_specialn3catch, Priority::Low); + agent.acmd("effect_specialairlw3catch", effect_specialn3catch, Priority::Low); + + agent.acmd("game_speciallw3throw", game_specialn3throw, Priority::Low); + agent.acmd("game_specialairlw3throw", game_specialairn3throw, Priority::Low); + agent.acmd("effect_specialairlw3throw", effect_specialairn3throw, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_s/mod.rs b/fighters/miifighter/src/acmd/specials/special_s/mod.rs new file mode 100644 index 0000000000..e33c73286e --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_s/mod.rs @@ -0,0 +1,11 @@ +use super::*; + +mod special_s1; +mod special_s2; +mod special_s3; + +pub fn install(agent: &mut Agent) {; + special_s1::install(agent); + special_s2::install(agent); + special_s3::install(agent); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_s.rs b/fighters/miifighter/src/acmd/specials/special_s/special_s1.rs similarity index 58% rename from fighters/miifighter/src/acmd/specials/special_s.rs rename to fighters/miifighter/src/acmd/specials/special_s/special_s1.rs index 2c41606328..189e3c4c31 100644 --- a/fighters/miifighter/src/acmd/specials/special_s.rs +++ b/fighters/miifighter/src/acmd/specials/special_s/special_s1.rs @@ -1,7 +1,7 @@ use super::*; // ================================================================================================ -// ========================================= ONSLAUGHT ============================================ +// ======================================== ONSLAUGHT ============================================= // ================================================================================================ unsafe extern "C" fn game_specials1start(agent: &mut L2CAgentBase) { @@ -10,6 +10,10 @@ unsafe extern "C" fn game_specials1start(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING_MUL_SPEED_X); } + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 14.0, 12.0); + frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 14.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_MOTION_SPEED_MUL); @@ -41,7 +45,10 @@ unsafe extern "C" fn game_specialairs1start(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING_MUL_SPEED_X); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); } + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 14.0, 12.0); frame(lua_state, 14.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_MOTION_SPEED_MUL); } @@ -66,7 +73,7 @@ unsafe extern "C" fn game_specialairs1start(agent: &mut L2CAgentBase) { } frame(lua_state, 37.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); } } @@ -75,8 +82,8 @@ unsafe extern "C" fn game_specials1end(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 70, 100, 11, 0, 7.0, 0.0, 8.5, 8.5, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 70, 100, 11, 0, 7.0, 0.0, 8.5, 8.5, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 70, 100, 11, 0, 7.0, 0.0, 8.5, 8.5, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 40, 0, 6.0, 0.0, 7.5, 2.5, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 5.0); if is_excute(agent) { @@ -85,6 +92,7 @@ unsafe extern "C" fn game_specials1end(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 16, 0, 7.5, 0.0, 9.0, 9.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 40, 0, 6.0, 0.0, 8.0, 3.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 10.0); if is_excute(agent) { @@ -93,6 +101,7 @@ unsafe extern "C" fn game_specials1end(agent: &mut L2CAgentBase) { frame(lua_state, 12.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 50, 0, 6.5, 0.0, 9.0, 9.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 40, 0, 5.0, 0.0, 8.0, 3.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 13.0); if is_excute(agent) { @@ -101,6 +110,7 @@ unsafe extern "C" fn game_specials1end(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 50, 0, 6.5, 0.0, 9.0, 9.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 40, 0, 5.0, 0.0, 8.0, 3.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 16.0); if is_excute(agent) { @@ -109,8 +119,10 @@ unsafe extern "C" fn game_specials1end(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 270, 80, 44, 40, 6.5, 0.0, 8.0, 8.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 60, 70, 40, 30, 6.5, 0.0, 8.0, 8.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 60, 70, 40, 30, 5.0, 0.0, 7.0, 2.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 8.0); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 8.0); } frame(lua_state, 19.0); if is_excute(agent) { @@ -122,242 +134,156 @@ unsafe extern "C" fn game_specials1end(agent: &mut L2CAgentBase) { } frame(lua_state, 27.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("toer"), 5.5, 80, 169, 0, 78, 7.0, 0.0, 0.0, 0.0, Some(-6.0), Some(-2.0), Some(1.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("toer"), 5.5, 90, 184, 0, 58, 7.0, 0.0, 0.0, 0.0, Some(-6.0), Some(-2.0), Some(1.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.5, 90, 184, 0, 58, 7.0, 0.0, 10.0, 8.0, Some(0.0), Some(9.0), Some(12.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 29.0); if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING); AttackModule::clear_all(boma); } } -unsafe extern "C" fn game_specialairs1end(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_specials1end(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); if is_excute(agent) { - SET_SPEED_EX(agent, 1, 1, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING_MUL_SPEED_X); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - } - frame(lua_state, 3.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING_MUL_SPEED_X); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 30, 30, 7.0, 0.0, 8.0, 6.3, Some(0.0), Some(5.5), Some(6.3), 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 367, 100, 30, 30, 7.0, 0.0, 8.0, 6.3, Some(0.0), Some(5.5), Some(6.3), 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miifighter_hyakuretsukick_line"), Hash40::new("top"), -2, 8, -8, 0, 0, 0, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 1.2); } - frame(lua_state, 5.0); + frame(lua_state, 4.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("top"), -1, 8, 2, 17, -7, -170, 0.6, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.5); } frame(lua_state, 7.0); if is_excute(agent) { - SET_SPEED_EX(agent, 0.3, 0.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 16, 0, 6.5, 0.0, 8.0, 6.0, Some(0.0), Some(5.5), Some(6.0), 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("top"), -1, 8, 2, -2, 10, -154, 0.55, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.5); } frame(lua_state, 10.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("top"), -1, 10, 2, 6.5, -28, 265, 0.6, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.8); } frame(lua_state, 12.0); if is_excute(agent) { - SET_SPEED_EX(agent, 0.3, 0.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 50, 0, 6.5, 0.0, 9.0, 9.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 13.0); - if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("top"), -1, 8, 2, -12, -2, -267, 0.55, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.8); } frame(lua_state, 14.0); if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f{x: 0.3, y: 0.5, z: 0.0}); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 50, 0, 6.5, 0.0, 9.0, 9.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 16.0); - if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("top"), -1, 8, 2, 19, -45, -102.7, 0.55, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.8); } frame(lua_state, 17.0); if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f{x: -0.3, y: 0.7, z: 0.0}); - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 60, 70, 40, 30, 6.5, 0.0, 8.0, 8.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 1, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 8.0); + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("miifighter_hyakuretsukick_arc_02"), Hash40::new("top"), -1, 10, 2, 30, 5, -90, 0.6, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.5); } - frame(lua_state, 19.0); + frame(lua_state, 26.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_FOLLOW(agent, Hash40::new("miifighter_hyakuretsukick"), Hash40::new("toer"), 0, 0, 0, 0, 0, 0, 0.8, true); } frame(lua_state, 27.0); if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f{x: 0.85, y: 3.0, z: 0.0}); - ATTACK(agent, 0, 0, Hash40::new("top"), 5.5, 80, 158, 0, 58, 7.0, 0.0, 16.0, 9.5, Some(0.0), Some(10.0), Some(8.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + if agent.is_situation(*SITUATION_KIND_GROUND) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_hyakuretsukick_arc"), Hash40::new("miifighter_hyakuretsukick_arc"), Hash40::new("top"), -1, 13, 5, 0, 0, 90, 0.7, true, *EF_FLIP_YZ); + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 180, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + } + else { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("miifighter_hyakuretsukick_arc"), Hash40::new("miifighter_hyakuretsukick_arc"), Hash40::new("top"), -1, 8, 4, 0, 0, 90, 0.7, true, *EF_FLIP_YZ); + } } frame(lua_state, 30.0); if is_excute(agent) { - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING); - } - frame(lua_state, 48.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); - } - frame(lua_state, 55.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_CONTROL_X); + EFFECT_OFF_KIND(agent, Hash40::new("miifighter_hyakuretsukick"), false, false); } } -// ================================================================================================ -// ===================================== BURNING DROP KICK ======================================== -// ================================================================================================ - -unsafe extern "C" fn game_specialairs2start(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialairs1end(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); + SET_SPEED_EX(agent, 1, 1, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING_MUL_SPEED_X); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); } -} - -unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); + frame(lua_state, 3.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - boma.select_cliff_hangdata_from_name("special_s2"); + WorkModule::off_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING_MUL_SPEED_X); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 30, 30, 7.0, 0.0, 8.0, 6.3, Some(0.0), Some(5.5), Some(6.3), 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 40, 0, 6.0, 0.0, 6.75, 0.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 2.0); + frame(lua_state, 5.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 0, 0, Hash40::new("hip"), 13.0, 44, 60, 0, 70, 6.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - AttackModule::set_attack_keep_rumble(boma, 0, true); + AttackModule::clear_all(boma); } - frame(lua_state, 11.0); + frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 12.0, 44, 54, 0, 60, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - AttackModule::set_attack_keep_rumble(boma, 0, true); + SET_SPEED_EX(agent, 0.3, 0.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 16, 0, 6.5, 0.0, 8.0, 6.0, Some(0.0), Some(5.5), Some(6.0), 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 40, 0, 6.0, 0.0, 6.75, 0.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } - frame(lua_state, 17.0); + frame(lua_state, 10.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + AttackModule::clear_all(boma); } -} - -unsafe extern "C" fn game_specialairs2end(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); + frame(lua_state, 12.0); if is_excute(agent) { - boma.select_cliff_hangdata_from_name("special_s2"); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - SET_SPEED_EX(agent, 1.4, -0.019, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + SET_SPEED_EX(agent, 0.3, 0.5, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 50, 0, 6.5, 0.0, 9.0, 9.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 40, 0, 5.0, 0.0, 6.75, 0.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 8.0); + frame(lua_state, 13.0); if is_excute(agent) { - SET_SPEED_EX(agent, 1.1, -0.519, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + AttackModule::clear_all(boma); } -} - -unsafe extern "C" fn game_specials2end(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); + frame(lua_state, 14.0); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + KineticModule::add_speed(boma, &Vector3f{x: 0.3, y: 0.5, z: 0.0}); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 50, 0, 6.5, 0.0, 9.0, 9.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 40, 0, 5.0, 0.0, 6.75, 0.0, None, None, None, 0.7, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 16.0); - FT_MOTION_RATE(agent, 0.7); -} - -// ================================================================================================ -// ========================================== SUPLEX ============================================== -// ================================================================================================ - -unsafe extern "C" fn game_specials3dash(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + AttackModule::clear_all(boma); } - frame(lua_state, 4.0); - FT_MOTION_RATE_RANGE(agent, 4.0, 8.0, 8.0); + frame(lua_state, 17.0); if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area_xy(boma, 4.5, 4.5, 6.0, 6.0); + KineticModule::add_speed(boma, &Vector3f{x: -0.3, y: 0.7, z: 0.0}); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 60, 70, 40, 30, 6.5, 0.0, 8.0, 8.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 60, 70, 40, 30, 5.0, 0.0, 6.75, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 8.0); + ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 8.0); } - frame(lua_state, 8.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 19.0); if is_excute(agent) { - GrabModule::set_rebound(boma, true); + AttackModule::clear_all(boma); } - frame(lua_state, 9.0); - FT_MOTION_RATE_RANGE(agent, 9.0, 22.0, 13.0); + frame(lua_state, 27.0); if is_excute(agent) { - if agent.is_situation(*SITUATION_KIND_GROUND) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.5, Some(0.0), Some(8.0), Some(0.5), *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_THROWN, *COLLISION_SITUATION_MASK_G); - CATCH(agent, 1, Hash40::new("top"), 1.0, 0.0, 8.0, 3.5, Some(0.0), Some(8.0), Some(2.0), *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_THROWN, *COLLISION_SITUATION_MASK_GA); - } - else { - CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 6.0, -1.0, None, None, None, *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_AIR_CAPTURED, *COLLISION_SITUATION_MASK_G); - CATCH(agent, 1, Hash40::new("top"), 3.0, 0.0, 7.0, 1.0, Some(0.0), Some(8.0), Some(1.0), *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_AIR_CAPTURED, *COLLISION_SITUATION_MASK_GA); - } - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + AttackModule::clear_inflict_kind_status(boma); + KineticModule::add_speed(boma, &Vector3f{x: 0.85, y: 3.0, z: 0.0}); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.5, 85, 158, 0, 58, 7.0, 0.0, 16.0, 9.5, Some(0.0), Some(10.0), Some(8.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.5, 85, 158, 0, 58, 7.0, 0.0, 10.0, 12.0, Some(0.0), Some(10.0), Some(8.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 5, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 22.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 30.0); if is_excute(agent) { - grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); - GrabModule::set_rebound(boma, false); - if agent.is_situation(*SITUATION_KIND_AIR) { - WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_SUPLEX_FLAG_REQUEST_GRAVITY); + AttackModule::clear_all(boma); + if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING); } } - frame(lua_state, 26.0); - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area_xy(boma, 4.0, 3.0, 7.0, 7.0); - } - frame(lua_state, 28.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } frame(lua_state, 32.0); - FT_MOTION_RATE_RANGE(agent, 32.0, 52.0, 20.0); - frame(lua_state, 52.0); - FT_MOTION_RATE(agent, 1.0); -} - -unsafe extern "C" fn game_specialairs3landing(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 65, 230, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); - } - frame(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 65, 30, 0, 60, 4.0, 0.0, 4.0, 4.2, Some(0.0), Some(4.0), Some(-3.2), 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_catch_only_all(boma, true, false); - CHECK_FINISH_CAMERA(agent, -6, 7); - } - frame(lua_state, 3.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 0.8); - if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); - ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); - JostleModule::set_status(boma, false); - } - frame(lua_state, 16.0); - if is_excute(agent) { - REVERSE_LR(agent); + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_CONTROL_X); } - frame(lua_state, 29.0); + frame(lua_state, 48.0); if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - JostleModule::set_status(boma, true); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); } - frame(lua_state, 41.0); - FT_MOTION_RATE(agent, 1.0); } pub fn install(agent: &mut Agent) { @@ -365,12 +291,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialairs1start", game_specialairs1start, Priority::Low); agent.acmd("game_specials1end", game_specials1end, Priority::Low); agent.acmd("game_specialairs1end", game_specialairs1end, Priority::Low); - - agent.acmd("game_specialairs2start", game_specialairs2start, Priority::Low); - agent.acmd("game_specials2", game_specials2, Priority::Low); - agent.acmd("game_specialairs2end", game_specialairs2end, Priority::Low); - - agent.acmd("game_specials3dash", game_specials3dash, Priority::Low); - agent.acmd("game_specialairs3dash", game_specials3dash, Priority::Low); - agent.acmd("game_specialairs3landing", game_specialairs3landing, Priority::Low); + agent.acmd("effect_specials1end", effect_specials1end, Priority::Low); + agent.acmd("effect_specialairs1end", effect_specials1end, Priority::Low); } \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_s/special_s2.rs b/fighters/miifighter/src/acmd/specials/special_s/special_s2.rs new file mode 100644 index 0000000000..d938be1927 --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_s/special_s2.rs @@ -0,0 +1,68 @@ +use super::*; + +// ================================================================================================ +// ======================================== BURNING DROP KICK ===================================== +// ================================================================================================ + +unsafe extern "C" fn game_specialairs2start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); + } +} + +unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + boma.select_cliff_hangdata_from_name("special_s2"); + } + frame(lua_state, 2.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + ATTACK(agent, 0, 0, Hash40::new("hip"), 13.0, 44, 67, 0, 60, 6.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_kick_hit_l")); + AttackModule::set_attack_keep_rumble(boma, 0, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("hip"), 13.0, 44, 55, 0, 60, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_KICK); + AttackModule::set_attack_keep_rumble(boma, 0, true); + } + frame(lua_state, 17.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + } +} + +unsafe extern "C" fn game_specialairs2end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + boma.select_cliff_hangdata_from_name("special_s2"); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + SET_SPEED_EX(agent, 1.4, -0.019, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + } + frame(lua_state, 8.0); + if is_excute(agent) { + SET_SPEED_EX(agent, 1.1, -0.519, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + } +} + +unsafe extern "C" fn game_specials2end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + } + frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 0.7); +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialairs2start", game_specialairs2start, Priority::Low); + agent.acmd("game_specials2", game_specials2, Priority::Low); + agent.acmd("game_specialairs2end", game_specialairs2end, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/specials/special_s/special_s3.rs b/fighters/miifighter/src/acmd/specials/special_s/special_s3.rs new file mode 100644 index 0000000000..c0d9102d5a --- /dev/null +++ b/fighters/miifighter/src/acmd/specials/special_s/special_s3.rs @@ -0,0 +1,102 @@ +use super::*; + +// ================================================================================================ +// ======================================== SUPLEX ================================================ +// ================================================================================================ + +unsafe extern "C" fn game_specials3dash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + } + frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 8.0, 8.0); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area_xy(boma, 4.5, 4.5, 6.0, 6.0); + } + frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + GrabModule::set_rebound(boma, true); + } + frame(lua_state, 9.0); + FT_MOTION_RATE_RANGE(agent, 9.0, 22.0, 13.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.5, Some(0.0), Some(8.0), Some(0.5), *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_THROWN, *COLLISION_SITUATION_MASK_G); + CATCH(agent, 1, Hash40::new("top"), 1.0, 0.0, 8.0, 3.5, Some(0.0), Some(8.0), Some(2.0), *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_THROWN, *COLLISION_SITUATION_MASK_GA); + } + else { + CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 6.0, -1.0, None, None, None, *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_AIR_CAPTURED, *COLLISION_SITUATION_MASK_G); + CATCH(agent, 1, Hash40::new("top"), 3.0, 0.0, 7.0, 1.0, Some(0.0), Some(8.0), Some(1.0), *FIGHTER_STATUS_KIND_MIIFIGHTER_SUPLEX_AIR_CAPTURED, *COLLISION_SITUATION_MASK_GA); + } + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + } + frame(lua_state, 22.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); + GrabModule::set_rebound(boma, false); + if agent.is_situation(*SITUATION_KIND_AIR) { + WorkModule::on_flag(boma, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_SUPLEX_FLAG_REQUEST_GRAVITY); + } + } + frame(lua_state, 26.0); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area_xy(boma, 4.0, 3.0, 7.0, 7.0); + } + frame(lua_state, 28.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + } + frame(lua_state, 32.0); + FT_MOTION_RATE_RANGE(agent, 32.0, 52.0, 24.0); + frame(lua_state, 52.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn game_specialairs3landing(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 11.99); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 65, 230, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 65, 30, 0, 60, 4.0, 0.0, 4.0, 4.2, Some(0.0), Some(4.0), Some(-3.2), 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, -6, 7); + } + frame(lua_state, 3.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 0.8); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + JostleModule::set_status(boma, false); + } + frame(lua_state, 16.0); + if is_excute(agent) { + REVERSE_LR(agent); + } + frame(lua_state, 29.0); + if is_excute(agent) { + damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + JostleModule::set_status(boma, true); + } + frame(lua_state, 41.0); + FT_MOTION_RATE(agent, 1.0); +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specials3dash", game_specials3dash, Priority::Low); + agent.acmd("game_specialairs3dash", game_specials3dash, Priority::Low); + agent.acmd("game_specialairs3landing", game_specialairs3landing, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miifighter/src/acmd/throws.rs b/fighters/miifighter/src/acmd/throws.rs index 2f9514b209..7f818534fc 100644 --- a/fighters/miifighter/src/acmd/throws.rs +++ b/fighters/miifighter/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 5.0, Some(0.0), Some(6.6), Some(8.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -29,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(9.55), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(6.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-14.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-11.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -64,7 +64,7 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 45, 149, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 45, 125, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 13.0); @@ -102,12 +102,31 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 45, 70, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 48, 44, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 5.5); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, -2.0, -9.0), false, false); + } + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, 1.0, -10.0), false, false); + } + frame(lua_state, 7.0); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, 2.0, -10.0), false, false); + } + frame(lua_state, 8.0); + if is_excute(agent) { + ModelModule::set_joint_translate(boma, Hash40::new("throw"), &Vector3f::new(0.0, 2.0, -10.0), false, false); + } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 45, 130, 0, 50, 4.0, 0.0, 12.0, -12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 45, 130, 0, 50, 4.0, 0.0, 12.0, -12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); REVERSE_LR(agent); } @@ -148,7 +167,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 69, 65, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 61, 54, 0, 66, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 18.0); diff --git a/fighters/miifighter/src/acmd/tilts.rs b/fighters/miifighter/src/acmd/tilts.rs index 69e8c839fc..bc37d1781d 100644 --- a/fighters/miifighter/src/acmd/tilts.rs +++ b/fighters/miifighter/src/acmd/tilts.rs @@ -15,6 +15,27 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW_FLIP_ALPHA(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 7, 6, 4, -25, 183, 0.67, true, *EF_FLIP_YZ, 0.3); + LAST_EFFECT_SET_RATE(agent, 1.5); + } +} + +unsafe extern "C" fn effect_attacks3hi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW_FLIP_ALPHA(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 1, 7.75, 5.7, 35, -31, 177, 0.67, true, *EF_FLIP_YZ, 0.3); + } +} + unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -72,9 +93,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 77, 90, 0, 45, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 80, 90, 0, 45, 3.0, 0.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 85, 90, 0, 45, 3.5, 5.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 77, 76, 0, 45, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 80, 76, 0, 45, 3.0, 0.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 85, 76, 0, 45, 3.5, 5.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 10.0); @@ -128,6 +149,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attacks3", game_attacks3, Priority::Low); agent.acmd("game_attacks3hi", game_attacks3, Priority::Low); agent.acmd("game_attacks3lw", game_attacks3, Priority::Low); + agent.acmd("effect_attacks3", effect_attacks3, Priority::Low); + agent.acmd("effect_attacks3hi", effect_attacks3hi, Priority::Low); agent.acmd("game_attackhi3", game_attackhi3, Priority::Low); agent.acmd("effect_attackhi3", effect_attackhi3, Priority::Low); diff --git a/fighters/miifighter/src/lib.rs b/fighters/miifighter/src/lib.rs index ab5bbabe61..673b17057b 100644 --- a/fighters/miifighter/src/lib.rs +++ b/fighters/miifighter/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/miifighter/src/opff.rs b/fighters/miifighter/src/opff.rs index 8f7e11db9d..4c270c6ae9 100644 --- a/fighters/miifighter/src/opff.rs +++ b/fighters/miifighter/src/opff.rs @@ -7,51 +7,12 @@ unsafe fn feint_jump_jc(boma: &mut BattleObjectModuleAccessor) { if boma.is_motion_one_of(&[Hash40::new("special_lw2_start"),Hash40::new("special_air_lw2_start")]) { if MotionModule::frame(boma) > 31.0 { if !boma.is_in_hitlag() { - boma.check_jump_cancel(false, false); + boma.check_jump_cancel(false, false, true); } } } } -//Earthquake Punch -unsafe fn earthquake_punch(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if fighter.is_status(*FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW1_GROUND) { - let is_hold = ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL); - let charge = VarModule::get_int(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE); - let charge_distance = VarModule::get_float(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE) as f32; - let charge_start_frame = ParamModule::get_float(boma.object(), ParamType::Agent, "earthquake_fist_ground.charge_start_frame"); - let charge_end_frame = ParamModule::get_float(boma.object(), ParamType::Agent, "earthquake_fist_ground.charge_end_frame"); - let max_charge_frames = ParamModule::get_float(boma.object(), ParamType::Agent, "earthquake_fist_ground.max_charge_frames"); - let max_charge_distance = ParamModule::get_float(boma.object(), ParamType::Agent, "earthquake_fist_ground.max_charge_distance"); - let lr = PostureModule::lr(fighter.module_accessor); - let is_ground = GroundModule::ray_check( - fighter.module_accessor, - &Vector2f{ x: PostureModule::pos_x(fighter.module_accessor) + ((charge_distance + 12.0) * lr), y: PostureModule::pos_y(fighter.module_accessor)}, - &Vector2f{ x: 0.0, y: -6.0}, true - ) == 1; - if MotionModule::end_frame(boma) - fighter.motion_frame() < 2.0 { - // reimpl status - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_WAIT, false); - } - //println!("is_hold: {}, charge: {}, charge_distance: {}, is_ground: {}", is_hold, charge, charge_distance, is_ground); - if (charge_start_frame..charge_end_frame).contains(&fighter.motion_frame()) && charge < (max_charge_frames as i32) && is_hold { - MotionModule::set_rate(fighter.module_accessor, (charge_end_frame - charge_start_frame)/max_charge_frames); - let eff_handle = VarModule::get_int64(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW1_QUAKE_EFFECT_HANDLE); - let pos_offset = charge_distance + (max_charge_distance/max_charge_frames); - let mut eff_pos_offset = (charge as f32/max_charge_frames) + charge_distance + (max_charge_distance/max_charge_frames); - if is_ground { - VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE, pos_offset); - eff_pos_offset = (10.0 - 10.0 * (charge as f32/max_charge_frames)) + charge_distance + (max_charge_distance/max_charge_frames); - } - EffectModule::set_pos(boma, eff_handle as u32, &Vector3f::new(0.0, 0.0, eff_pos_offset)); - VarModule::set_int64(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW1_QUAKE_EFFECT_HANDLE, eff_handle as u64); - VarModule::set_int(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE, (charge + 1) as i32); - } else { - MotionModule::set_rate(fighter.module_accessor, 1.0); - } - } -} - // TODO: create cancel animation for aerial EQF cancel // Prevents aerial EQF cancel from grabbing ledge for first 7f unsafe fn eqf_cancel_ledgegrab_lockout(fighter: &mut L2CFighterCommon) { @@ -66,26 +27,32 @@ unsafe fn eqf_cancel_ledgegrab_lockout(fighter: &mut L2CFighterCommon) { } } +unsafe fn boiling_punt_timer(fighter: &mut L2CFighterCommon) { + if VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE) > 1 { + let timer = VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_TIMER); + if !VarModule::countdown_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_TIMER, 0) { + if timer % 60 == 0 { + let vec1 = Vector4f{ x: 0.85, y: 0.85, z: 0.85, w: 0.2}; + let vec2 = Vector4f{ x: 0.85, y: 0.0, z: 0.0, w: 0.5}; + ColorBlendModule::set_main_color(fighter.module_accessor, &vec1, &vec2, 1.0, 1.0, 7, true); + } + if timer % 60 == 52 { + ColorBlendModule::cancel_main_color(fighter.module_accessor, 0); + } + } + else { + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_TIMER, 300); + } + } +} + unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) && ( fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_SPECIAL_N]) - || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_1 - ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) - && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_S1_END, - *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_HI1_2 - ]) - ) || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_2 + *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_2 ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) && fighter.is_status_one_of(&[ *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_MISS, @@ -94,16 +61,11 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_HI2_END ]) ) - || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_3 + || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_3, + *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_3 ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, *FIGHTER_STATUS_KIND_SPECIAL_HI, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N3_TURN, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_S3_THROW, ]) ) @@ -115,8 +77,8 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { feint_jump_jc(boma); - earthquake_punch(fighter, boma); eqf_cancel_ledgegrab_lockout(fighter); + boiling_punt_timer(fighter); fastfall_specials(fighter); } diff --git a/fighters/miifighter/src/status/mod.rs b/fighters/miifighter/src/status/mod.rs index e8e5365cc8..70fdb74700 100644 --- a/fighters/miifighter/src/status/mod.rs +++ b/fighters/miifighter/src/status/mod.rs @@ -2,12 +2,15 @@ use super::*; use globals::*; // status script import +mod special_hi1; +mod special_hi3; mod special_lw1; mod special_lw2; mod special_lw3; +mod special_n1; mod special_n2; +mod special_n3; mod special_s1; -mod special_hi3; unsafe fn set_move_customizer(fighter: &mut L2CFighterCommon, customizer: unsafe extern "C" fn(&mut L2CFighterCommon) -> L2CValue) { if fighter.global_table["move_customizer_set"].get_bool() { @@ -34,18 +37,52 @@ unsafe extern "C" fn move_customizer(fighter: &mut L2CFighterCommon) -> L2CValue if let Some(original) = get_original_customizer(fighter) { original(fighter); } - if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_2 { + if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_1 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_n1::special_n1_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_n1::special_n1_end as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_2 { fighter.sv_set_status_func( FIGHTER_STATUS_KIND_SPECIAL_N.into(), LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), std::mem::transmute(special_n2::special_n2_pre as *const ()) ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_n2::special_n2_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_n2::special_n2_end as *const ()) + ); + } else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_3 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), + std::mem::transmute(special_n3::special_n3_pre as *const ()) + ); } else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_1 { fighter.sv_set_status_func( FIGHTER_STATUS_KIND_SPECIAL_S.into(), LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), std::mem::transmute(special_s1::special_s1_main as *const ()) ); + } else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_3 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_HI.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), + std::mem::transmute(special_hi3::special_hi3_pre as *const ()) + ); } else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_2 { // This is technically bad behavior because Waza Customize does NOT // handle exec statuses for the other specials. However, this @@ -70,11 +107,15 @@ unsafe extern "C" fn move_customizer(fighter: &mut L2CFighterCommon) -> L2CValue LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), std::mem::transmute(special_lw3::special_lw3_pre as *const ()) ); - } else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_3 { fighter.sv_set_status_func( - FIGHTER_STATUS_KIND_SPECIAL_HI.into(), - LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), - std::mem::transmute(special_hi3::special_hi3_pre as *const ()) + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_lw3::special_lw3_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_lw3::special_lw3_end as *const ()) ); } @@ -84,6 +125,7 @@ unsafe extern "C" fn move_customizer(fighter: &mut L2CFighterCommon) -> L2CValue unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { if [*SITUATION_KIND_GROUND, *SITUATION_KIND_CLIFF].contains(&fighter.global_table[SITUATION_KIND].get_i32()) || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { + VarModule::off_flag(fighter.battle_object, vars::miifighter::instance::SPECIAL_N3_STALL); VarModule::off_flag(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STALL); } true.into() @@ -93,12 +135,83 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { set_move_customizer(fighter, move_customizer); move_customizer(fighter); fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); + + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT, 0); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE, 0); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_TIMER, 0); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1, -1); + //VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2, -1); +} + +unsafe extern "C" fn entry_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_boiling_punt(fighter); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT, 0); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_ENTRY)(fighter) +} + + +unsafe extern "C" fn dead_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_boiling_punt(fighter); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT, 0); + EffectModule::remove_common(fighter.module_accessor, Hash40::new("charge_max")); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DEAD)(fighter) +} + +unsafe extern "C" fn rebirth_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_boiling_punt(fighter); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT, 0); + EffectModule::remove_common(fighter.module_accessor, Hash40::new("charge_max")); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_REBIRTH)(fighter) +} + +unsafe extern "C" fn win_main(fighter: &mut L2CFighterCommon) -> L2CValue { + EffectModule::remove_common(fighter.module_accessor, Hash40::new("charge_max")); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_WIN)(fighter) +} + +unsafe extern "C" fn damage_fly_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_boiling_punt(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DAMAGE_FLY)(fighter) +} + +unsafe extern "C" fn damage_fly_roll_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_boiling_punt(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL)(fighter) +} + +unsafe extern "C" fn damage_fly_meteor_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_boiling_punt(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR)(fighter) +} + +unsafe fn reset_boiling_punt(fighter: &mut L2CFighterCommon) { + if VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE) > 0 { + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE, 0); + //EFFECT_FOLLOW(fighter, Hash40::new("sys_flash"), Hash40::new("top"), -3, 13, -2.5, 0, 0, 0, 0.38, false); + let handle = VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1) as u32; + EffectModule::kill(fighter.module_accessor, handle, false, false); + //let handle2 = VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2) as u32; + //EffectModule::kill(fighter.module_accessor, handle2, false, false); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1, -1); + //VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2, -1); + ColorBlendModule::cancel_main_color(fighter.module_accessor, 0); + } } pub fn install(agent: &mut Agent) { agent.on_start(on_start); + special_hi1::install(agent); special_lw1::install(agent); special_lw2::install(agent); - special_lw3::install(agent); + special_n2::install(agent); + special_n3::install(agent); special_s1::install(agent); + + agent.status(Main, *FIGHTER_STATUS_KIND_ENTRY, entry_main); + agent.status(Main, *FIGHTER_STATUS_KIND_DEAD, dead_main); + agent.status(Main, *FIGHTER_STATUS_KIND_REBIRTH, rebirth_main); + agent.status(Main, *FIGHTER_STATUS_KIND_WIN, win_main); + agent.status(Main, *FIGHTER_STATUS_KIND_DAMAGE_FLY, damage_fly_main); + agent.status(Main, *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, damage_fly_roll_main); + agent.status(Main, *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR, damage_fly_meteor_main); } \ No newline at end of file diff --git a/fighters/miifighter/src/status/special_hi1.rs b/fighters/miifighter/src/status/special_hi1.rs new file mode 100644 index 0000000000..97dc6910c4 --- /dev/null +++ b/fighters/miifighter/src/status/special_hi1.rs @@ -0,0 +1,73 @@ +use super::*; + +unsafe extern "C" fn special_hi1_3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_int(0x50000000, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_INT_TENCHI_KICK_FALL_HIT_OBJECT_ID); + sub_special_hi1_3(fighter); + fighter.off_flag(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_FLAG_MOT_FRAME_INHERIT); + fighter.set_int64(hash40("special_air_hi1_3") as i64, *FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_INT_GROUND_MOT); + fighter.set_int64(hash40("special_air_hi1_3") as i64, *FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_INT_AIR_MOT); + special_hi_change_motion(fighter); + special_hi_set_control(fighter); + app::KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_MOTION, fighter.module_accessor); + let hi1_add_fall_speed_y = fighter.get_param_float("param_special_hi", "hi1_add_fall_speed_y"); + let hi1_add_fall_accel_y = fighter.get_param_float("param_special_hi", "hi1_add_fall_accel_y"); + let hi1_add_fall_speed_limit_y = fighter.get_param_float("param_special_hi", "hi1_add_fall_speed_limit_y"); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -hi1_add_fall_speed_y); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -hi1_add_fall_speed_y); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, hi1_add_fall_speed_limit_y); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + + fighter.main_shift(special_hi1_3_main_loop) +} + +unsafe fn sub_special_hi1_3(fighter: &mut L2CFighterCommon) { + fighter.off_flag(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_FLAG_MTRANS_SMPL_GROUND); + fighter.off_flag(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_FLAG_MTRANS_SMPL_AIR); + fighter.off_flag(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_FLAG_MTRANS_SMPL_MOTION_END); + fighter.off_flag(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_FLAG_MTRANS_SMPL_EX1); +} + +unsafe fn special_hi_change_motion(fighter: &mut L2CFighterCommon) { + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.get_int64(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_INT_GROUND_MOT) + } + else { + fighter.get_int64(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_INT_AIR_MOT) + }; + if fighter.is_flag(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_FLAG_MOT_FRAME_INHERIT) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new_raw(motion), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new_raw(motion), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIFIGHTER_INSTANCE_WORK_ID_FLAG_MOT_FRAME_INHERIT); + } +} + +unsafe fn special_hi_set_control(fighter: &mut L2CFighterCommon) { + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + let air_accel_x_mul = fighter.get_param_float("air_accel_x_mul", ""); + let hi1_jump_mul_x = fighter.get_param_float("param_special_hi", "hi1_jump_mul_x"); + let air_speed_x_stable = fighter.get_param_float("air_speed_x_stable", ""); + let hi1_control_limit_mul_x = fighter.get_param_float("param_special_hi", "hi1_control_limit_mul_x"); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(mul_x_speed_max, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_accel_x_mul * hi1_jump_mul_x); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable, 100.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * hi1_control_limit_mul_x, 0.0); +} + +unsafe extern "C" fn special_hi1_3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.change_status(FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_HI1_4.into(), false.into()); + return 1.into(); + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_HI1_3, special_hi1_3_main); +} \ No newline at end of file diff --git a/fighters/miifighter/src/status/special_lw1.rs b/fighters/miifighter/src/status/special_lw1.rs index b12e491d3e..ad7ae8fa69 100644 --- a/fighters/miifighter/src/status/special_lw1.rs +++ b/fighters/miifighter/src/status/special_lw1.rs @@ -31,13 +31,71 @@ unsafe extern "C" fn special_lw1_pre(fighter: &mut L2CFighterCommon) -> L2CValue // Forces Grounded Earthquake punch on the ground unsafe extern "C" fn special_lw1_ground_main(fighter: &mut L2CFighterCommon) -> L2CValue { - let ret = smashline::original_status(Main, fighter, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW1_GROUND)(fighter); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw1"), 0.0, 1.0, false, 0.0, false, false); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_10) + -1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_10) + -1); if StatusModule::situation_kind(fighter.module_accessor) == *SITUATION_KIND_AIR { GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); StatusModule::set_situation_kind(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_GROUND), false); KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); } - ret + VarModule::set_int(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE, 0); + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE, 0.0); + + fighter.main_shift(special_lw1_ground_main_loop) +} + +unsafe extern "C" fn special_lw1_ground_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + return 1.into(); + } + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_HOLD) { + let charge_end_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "earthquake_fist_ground.charge_end_frame"); + + if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + MotionModule::set_frame_sync_anim_cmd(fighter.module_accessor, charge_end_frame, true, true, false); + } + if fighter.motion_frame() >= charge_end_frame { + VarModule::off_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_HOLD); + } + else { + let charge = VarModule::get_int(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE); + let charge_distance = VarModule::get_float(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE) as f32; + let charge_distance_mod = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "earthquake_fist_ground.charge_distance_mod"); + let max_charge_distance = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "earthquake_fist_ground.max_charge_distance"); + let mut eff_pos_offset = (charge as f32/charge_distance_mod) + charge_distance + (max_charge_distance/charge_distance_mod); + let lr = PostureModule::lr(fighter.module_accessor); + + let is_ground = GroundModule::ray_check( + fighter.module_accessor, + &Vector2f{ x: PostureModule::pos_x(fighter.module_accessor) + ((charge_distance + 12.0) * lr), y: PostureModule::pos_y(fighter.module_accessor)}, + &Vector2f{ x: 0.0, y: -6.0}, true + ) == 1; + if is_ground { + let pos_offset = charge_distance + (max_charge_distance/charge_distance_mod); + + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE_DISTANCE, pos_offset); + eff_pos_offset = (10.0 - 10.0 * (charge as f32/charge_distance_mod)) + charge_distance + (max_charge_distance/charge_distance_mod); + } + + let eff_handle = VarModule::get_int64(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_QUAKE_EFFECT_HANDLE); + + EffectModule::set_pos(fighter.module_accessor, eff_handle as u32, &Vector3f::new(0.0, 0.0, eff_pos_offset)); + VarModule::set_int64(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_QUAKE_EFFECT_HANDLE, eff_handle as u64); + VarModule::set_int(fighter.battle_object, vars::miifighter::status::SPECIAL_LW1_CHARGE, (charge + 1) as i32); + } + } + + return 0.into(); } unsafe extern "C" fn special_lw1_air_main(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -61,14 +119,6 @@ unsafe extern "C" fn special_lw1_air_main(fighter: &mut L2CFighterCommon) -> L2C } unsafe extern "C" fn special_lw1_air_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - // Idk why this has to be done every frame to prevent ledgegrabbing - // but it do rn - GroundModule::set_cliff_check(fighter.module_accessor, app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE)); - - if fighter.sub_transition_group_check_air_cliff().get_bool() { - return 1.into(); - } - if CancelModule::is_enable_cancel(fighter.module_accessor) { if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { @@ -108,16 +158,19 @@ unsafe extern "C" fn special_lw1_air_main_loop(fighter: &mut L2CFighterCommon) - } } - //Allows EQF to be cancelled into freefall with second B press - if fighter.is_motion(Hash40::new("special_lw1_loop")) - && (ControlModule::check_button_on_trriger(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) || fighter.status_frame() >= 40) { - EffectModule::req_on_joint(fighter.module_accessor, Hash40::new("sys_smash_flash"), Hash40::new("top"), &Vector3f::new(1.0, 7.0, 5.0), &Vector3f::zero(), 0.5, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0); - SoundModule::stop_se(fighter.module_accessor, Hash40::new("se_miifighter_final06"), 0); - let handle = SoundModule::play_se(fighter.module_accessor, Hash40::new("se_miifighter_appeal_h01"), true, false, false, false, enSEType(0)); - SoundModule::set_se_vol(fighter.module_accessor, handle as i32, 1.5, 0); - fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); - return 1.into(); + if fighter.is_motion(Hash40::new("special_lw1_loop")) { + // Allows EQF to be cancelled into freefall with second B press + if (ControlModule::check_button_on_trriger(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) || fighter.status_frame() >= 40) { + EffectModule::req_on_joint(fighter.module_accessor, Hash40::new("sys_smash_flash"), Hash40::new("top"), &Vector3f::new(1.0, 7.0, 5.0), &Vector3f::zero(), 0.5, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0); + SoundModule::stop_se(fighter.module_accessor, Hash40::new("se_miifighter_final06"), 0); + let handle = SoundModule::play_se(fighter.module_accessor, Hash40::new("se_miifighter_appeal_h01"), true, false, false, false, enSEType(0)); + SoundModule::set_se_vol(fighter.module_accessor, handle as i32, 1.5, 0); + fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); + return 1.into(); + } + fighter.check_wall_jump_cancel(); } + return 0.into(); } diff --git a/fighters/miifighter/src/status/special_lw2.rs b/fighters/miifighter/src/status/special_lw2.rs index 2452a36331..e0974b2035 100644 --- a/fighters/miifighter/src/status/special_lw2.rs +++ b/fighters/miifighter/src/status/special_lw2.rs @@ -1,11 +1,7 @@ use super::*; pub unsafe extern "C" fn special_lw2_exec(fighter: &mut L2CFighterCommon) -> L2CValue { - if !ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { - VarModule::on_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW2_CHECK_HOLD); - } - - if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW2_CHECK_HOLD) { + if ControlModule::check_button_release(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { search!(fighter, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); } @@ -13,8 +9,8 @@ pub unsafe extern "C" fn special_lw2_exec(fighter: &mut L2CFighterCommon) -> L2C } unsafe extern "C" fn special_lw2_start_main(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::off_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW2_CHECK_HOLD); - original_status(Main, fighter, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW2_START)(fighter) + VarModule::on_flag(fighter.battle_object, vars::common::status::CHECK_HOLD_INPUT); + return original_status(Main, fighter, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW2_START)(fighter); } pub fn install (agent: &mut Agent) { diff --git a/fighters/miifighter/src/status/special_lw3.rs b/fighters/miifighter/src/status/special_lw3.rs index 5992af7957..1908139f0f 100644 --- a/fighters/miifighter/src/status/special_lw3.rs +++ b/fighters/miifighter/src/status/special_lw3.rs @@ -1,11 +1,6 @@ use super::*; pub unsafe extern "C" fn special_lw3_pre(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.set_status_kind_interrupt(*FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_CATCH); - return 1.into(); -} - -unsafe extern "C" fn special_lw3_catch_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), @@ -34,43 +29,46 @@ unsafe extern "C" fn special_lw3_catch_pre(fighter: &mut L2CFighterCommon) -> L2 return 0.into(); } -unsafe extern "C" fn special_lw3_catch_main(fighter: &mut L2CFighterCommon) -> L2CValue { - let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - KineticModule::unable_energy_all(fighter.module_accessor); +pub unsafe extern "C" fn special_lw3_main(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.is_situation(*SITUATION_KIND_GROUND) { - let brake_x = fighter.get_param_float("ground_brake", ""); - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, speed_x, 0.0, 0.0, 0.0, 0.0); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); - sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, brake_x, 0.0); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw3_catch"), 0.0, 1.0, false, 0.0, false, false); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); } else { - let air_brake_x = fighter.get_param_float("air_brake_x", ""); - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, speed_x * 0.5, 0.0, 0.0, 0.0, 0.0); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); - sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, air_brake_x, 0.0); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); - if !VarModule::is_flag(fighter.object(), vars::miifighter::instance::SPECIAL_LW3_STALL) { - VarModule::on_flag(fighter.object(), vars::miifighter::instance::SPECIAL_LW3_STALL); - let start_accel_y = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_lw"), hash40("lw3_throw_start_accel_y")); - let throw_speed_max_y = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_lw"), hash40("lw3_throw_speed_max_y")); - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, speed_y * 0.5, 0.0, 0.0, 0.0); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -start_accel_y); - sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, throw_speed_max_y); - } + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let air_speed_y_stable = fighter.get_param_float("air_speed_y_stable", ""); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, speed_y, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_speed_y_stable); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_speed_y_stable); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_catch"), 0.0, 1.0, false, 0.0, false, false); } + special_lw3_change_motion(fighter); - fighter.main_shift(special_lw3_catch_main_loop) + fighter.main_shift(special_lw3_main_loop) } -unsafe extern "C" fn special_lw3_catch_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe fn special_lw3_change_motion(fighter: &mut L2CFighterCommon) { + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { + match VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE) { + 0 => { Hash40::new("special_lw3_1g") }, + 1 => { Hash40::new("special_lw3_2g") }, + _ => { Hash40::new("special_lw3_3g") } + } + } + else { + match VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE) { + 0 => { Hash40::new("special_lw3_1a") }, + 1 => { Hash40::new("special_lw3_2a") }, + _ => { Hash40::new("special_lw3_3a") } + } + }; + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); +} + +unsafe extern "C" fn special_lw3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } @@ -80,32 +78,105 @@ unsafe extern "C" fn special_lw3_catch_main_loop(fighter: &mut L2CFighterCommon) return 1.into(); } } - if fighter.status_frame() < 15 { - StatusModule::set_keep_situation_air(fighter.module_accessor, true); - } else { - StatusModule::set_keep_situation_air(fighter.module_accessor, false); - } if MotionModule::is_end(fighter.module_accessor) { - let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_STATUS_KIND_WAIT } else { FIGHTER_STATUS_KIND_FALL }; - fighter.change_status(status.into(), false.into()); + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); } if StatusModule::is_situation_changed(fighter.module_accessor) { if fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_lw3_catch"), -1.0, 1.0, 0.0, false, false); + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_LANDING) { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); + } + else { + let landing_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "boiling_punt.landing_lag"); + fighter.set_float(landing_lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); + } } else { GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_lw3_catch"), -1.0, 1.0, 0.0, false, false); + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } + return 1.into(); } + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_BOUNCE) { + VarModule::off_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_ENABLE_BOUNCE); + if !VarModule::is_flag(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STALL) { + let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let mut sum_speed_y = 0.0; + + if !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { + // disable stall and limit vertical speed on whiff + VarModule::on_flag(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STALL); + let bounce_clamp_y_min = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "boiling_punt.bounce_clamp_y_min"); + let bounce_clamp_y_max = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "boiling_punt.bounce_clamp_y_max"); + sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL).clamp(bounce_clamp_y_min, bounce_clamp_y_max); + } - return 0.into() + let air_speed_x_stable = fighter.get_param_float("air_speed_x_stable", ""); + let speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "boiling_punt.speed_x_mul"); + KineticModule::clear_speed_all(fighter.module_accessor); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, sum_speed_y); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, sum_speed_x); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * speed_x_mul); + let bounce_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "boiling_punt.bounce_speed_x"); + let bounce_speed_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "boiling_punt.bounce_speed_y"); + KineticModule::add_speed(fighter.module_accessor, &Vector3f::new(bounce_speed_x, bounce_speed_y, 0.0)); + } + } + if !VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_INC_STAGE) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { + VarModule::on_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_INC_STAGE); + special_lw3_change_stage(fighter, VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE)); + } + + return 0.into(); +} + +unsafe fn special_lw3_change_stage(fighter: &mut L2CFighterCommon, stage: i32) { + match stage { + 0 => { + app::FighterUtil::flash_eye_info(fighter.module_accessor); + let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_steam1"), Hash40::new("head"), &Vector3f::new(3.0, 0.0, 0.0), &Vector3f::zero(), 0.8, false, 0, 0, 0, 0, 0, false, false); + EffectModule::set_alpha(fighter.module_accessor, handle as u32, 3.0); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1, handle as i32); + VarModule::inc_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE); + }, + 1 => { + app::FighterUtil::flash_eye_info(fighter.module_accessor); + //let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_steam2"), Hash40::new("head"), &Vector3f::new(3.0, 0.0, 0.0), &Vector3f::zero(), 0.8, false, 0, 0, 0, 0, 0, false, false); + //EffectModule::set_alpha(fighter.module_accessor, handle as u32, 3.0); + //VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2, handle as i32); + VarModule::inc_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_TIMER, 300); + } + _ => { + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STAGE, 0); + let handle = VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1) as u32; + EffectModule::detach(fighter.module_accessor, handle, 0); + //let handle2 = VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2) as u32; + //EffectModule::detach(fighter.module_accessor, handle2, 0); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_1, -1); + //VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_EFFECT_HANDLE_2, -1); + if fighter.is_motion(Hash40::new("special_lw3_3g")) + && VarModule::is_flag(fighter.battle_object, vars::miifighter::instance::SPECIAL_LW3_STALL) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) + && !VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_CLEAR_CRIT) { + VarModule::on_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_CLEAR_CRIT); + SlowModule::set_whole(fighter.module_accessor, 4, 1); + EffectModule::req_screen(fighter.module_accessor, Hash40::new("bg_criticalhit"), false, true, true); + } + ColorBlendModule::cancel_main_color(fighter.module_accessor, 0); + } + } } -pub fn install(agent: &mut Agent) { - agent.status(Pre, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_CATCH, special_lw3_catch_pre); - agent.status(Main, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_CATCH, special_lw3_catch_main); +pub unsafe extern "C" fn special_lw3_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_CLEAR_CRIT) { + SlowModule::clear_whole(fighter.module_accessor); + CameraModule::reset_all(fighter.module_accessor); + EffectModule::remove_screen(fighter.module_accessor, Hash40::new("bg_criticalhit"), 0); + } + + return 0.into(); } \ No newline at end of file diff --git a/fighters/miifighter/src/status/special_n1.rs b/fighters/miifighter/src/status/special_n1.rs new file mode 100644 index 0000000000..f10044aec1 --- /dev/null +++ b/fighters/miifighter/src/status/special_n1.rs @@ -0,0 +1,112 @@ +use super::*; + +pub unsafe extern "C" fn special_n1_main(fighter: &mut L2CFighterCommon) -> L2CValue { + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01) + -1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01) + -1); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + special_n_change_motion(fighter, Hash40::new("special_n1")); + } + else if fighter.is_situation(*SITUATION_KIND_AIR) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + special_n_change_motion(fighter, Hash40::new("special_air_n1")); + } + // don't ask why I have to hardcode these + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_ANGLE, 45.0); + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_SPEED, 2.25); + + fighter.main_shift(special_n1_main_loop) +} + +unsafe extern "C" fn special_n1_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + StatusModule::set_situation_kind(fighter.module_accessor, SituationKind(*SITUATION_KIND_GROUND), false); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + special_n_change_motion(fighter, Hash40::new("special_n1")); + } + else if fighter.is_situation(*SITUATION_KIND_AIR) { + StatusModule::set_situation_kind(fighter.module_accessor, SituationKind(*SITUATION_KIND_AIR), false); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + special_n_change_motion(fighter, Hash40::new("special_air_n1")); + } + } + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + fighter.sub_air_check_dive(); + let charge = VarModule::get_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_CHARGE) as f32; + let angle = 45.0 - charge * 0.75; + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_START_HOLD) { + if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + VarModule::inc_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_CHARGE); + if charge == 1.0 { + MotionModule::set_rate(fighter.module_accessor, 0.5); + EFFECT_FOLLOW_FLIP(fighter, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), 2, 12, -3, 0, 0, 0, 0.3, false, *EF_FLIP_AXIS_YZ); + } + if charge == 10.0 { + fighter.change_motion_inherit_frame_keep_rate_by_situation("special_n1_bowl", "special_air_n1_bowl", -1.0, 1.0, 0.0); + } + } + else { + MotionModule::set_rate(fighter.module_accessor, 1.0); + VarModule::on_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD); + } + } + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD) { + VarModule::off_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_START_HOLD); + VarModule::off_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_END_HOLD); + MotionModule::set_rate(fighter.module_accessor, 1.0); + let bowl_speed_ground = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_n1.bowl_speed_ground"); + let throw_speed = if fighter.is_situation(*SITUATION_KIND_GROUND) { bowl_speed_ground } else { bowl_speed_ground - (charge * 0.025) }; // 2.25-2.75 + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_ANGLE, angle); + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_SPEED, throw_speed); + } + if MotionModule::is_end(fighter.module_accessor) { + let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_STATUS_KIND_WAIT } else { FIGHTER_STATUS_KIND_FALL }; + fighter.change_status(status.into(), false.into()); + } + + return 0.into(); +} + +unsafe fn special_n_change_motion(fighter: &mut L2CFighterCommon, motion: Hash40) { + if fighter.is_flag(*FIGHTER_MIIFIGHTER_STATUS_WORK_ID_IRONBALL_FLAG_FIRST) { + let _motion = if fighter.is_motion(Hash40::new("special_n1_bowl")) { + let bowl_speed_air = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_n1.bowl_speed_air"); + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_SPEED, bowl_speed_air); + Hash40::new("special_air_n1_bowl") + } + else if fighter.is_motion(Hash40::new("special_air_n1_bowl")) { + let bowl_speed_ground = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_n1.bowl_speed_ground"); + VarModule::set_float(fighter.battle_object, vars::miifighter::status::SPECIAL_N1_SPEED, bowl_speed_ground); + Hash40::new("special_n1_bowl") + } + else { motion }; + MotionModule::change_motion_inherit_frame(fighter.module_accessor, _motion, -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIFIGHTER_STATUS_WORK_ID_IRONBALL_FLAG_FIRST); + } +} + +pub unsafe extern "C" fn special_n1_end(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_MIIFIGHTER_GENERATE_ARTICLE_IRONBALL, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + + return 0.into(); +} \ No newline at end of file diff --git a/fighters/miifighter/src/status/special_n2.rs b/fighters/miifighter/src/status/special_n2.rs index dec1d9a2e8..b70baca4b0 100644 --- a/fighters/miifighter/src/status/special_n2.rs +++ b/fighters/miifighter/src/status/special_n2.rs @@ -1,6 +1,277 @@ use super::*; +const SPECIAL_N2_CANCEL_TYPE_NONE: i32 = 0x0; +const SPECIAL_N2_CANCEL_TYPE_GROUND_JUMP: i32 = 0x1; +const SPECIAL_N2_CANCEL_TYPE_JUMP_AERIAL: i32 = 0x2; + +unsafe extern "C" fn special_n2_common_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + return 0.into(); +} + +unsafe extern "C" fn special_n2_common_end(fighter: &mut L2CFighterCommon) -> L2CValue { + let next_status = StatusModule::status_kind_next(fighter.module_accessor); + let death_statuses = + &[*FIGHTER_STATUS_KIND_DEAD, + *FIGHTER_STATUS_KIND_REBIRTH, + *FIGHTER_STATUS_KIND_WIN, + *FIGHTER_STATUS_KIND_LOSE, + *FIGHTER_STATUS_KIND_ENTRY]; + let damage_statuses = + &[*FIGHTER_STATUS_KIND_DAMAGE, + *FIGHTER_STATUS_KIND_DAMAGE_AIR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_LR, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_U, + *FIGHTER_STATUS_KIND_DAMAGE_FLY_REFLECT_D, + *FIGHTER_STATUS_KIND_DAMAGE_FALL]; + if death_statuses.contains(&next_status) || damage_statuses.contains(&next_status) { + EffectModule::remove_common(fighter.module_accessor, Hash40::new("charge_max")); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT, 0); + } + SoundModule::stop_se(fighter.module_accessor, Hash40::new("se_miifighter_special_n2_charge"), 0); + + return 0.into(); +} + pub unsafe extern "C" fn special_n2_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_status_pre_SpecialNCommon(); + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + return 0.into(); +} + +pub unsafe extern "C" fn special_n2_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let charge_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "special_n2.charge_frame"); + if VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT) >= charge_frame { + fighter.change_status(FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_FINISH.into(), false.into()); + return 1.into(); + } + special_n2_change_motion(fighter, Hash40::new("special_n2_start"), Hash40::new("special_air_n2_start"), false); + let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, sum_speed_x * 0.75, 0.0); // parameterize + + fighter.main_shift(special_n2_main_loop) +} + +unsafe extern "C" fn special_n2_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_situation_changed(fighter.module_accessor) { + special_n2_change_motion(fighter, Hash40::new("special_n2_start"), Hash40::new("special_air_n2_start"), false); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(statuses::miifighter::SPECIAL_N2_HOLD.into(), false.into()); + return 1.into(); + } + + return 0.into(); +} + +pub unsafe extern "C" fn special_n2_end(fighter: &mut L2CFighterCommon) -> L2CValue { + return 0.into(); +} + +unsafe extern "C" fn special_n2_change_motion(fighter: &mut L2CFighterCommon, ground_motion: Hash40, air_motion: Hash40, inherit: bool) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + fighter.set_situation(SITUATION_KIND_GROUND.into()); + if inherit { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, ground_motion, -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, ground_motion, 0.0, 1.0, false, 0.0, false, false); + } + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + fighter.set_situation(SITUATION_KIND_AIR.into()); + if inherit { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, air_motion, -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, air_motion, 0.0, 1.0, false, 0.0, false, false); + } + } +} + +unsafe extern "C" fn special_n2_hold_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + return 0.into(); +} + +unsafe extern "C" fn special_n2_hold_main(fighter: &mut L2CFighterCommon) -> L2CValue { + special_n2_change_motion(fighter, Hash40::new("special_n2_hold"), Hash40::new("special_air_n2_hold"), false); + fighter.enable_transition_term_many(&[ + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT_BUTTON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_FLY_BUTTON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_FLY, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_FLY_NEXT, + ]); + ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8); + + fighter.main_shift(special_n2_hold_main_loop) +} + +unsafe extern "C" fn special_n2_hold_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_situation_changed(fighter.module_accessor) { + special_n2_change_motion(fighter, Hash40::new("special_n2_hold"), Hash40::new("special_air_n2_hold"), true); + } + if fighter.is_pad_flag(PadFlag::SpecialTrigger) || fighter.is_pad_flag(PadFlag::AttackTrigger) { + fighter.change_status(FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_FINISH.into(), true.into()); + return 1.into(); + } + if fighter.is_situation(*SITUATION_KIND_GROUND) { + if fighter.sub_check_jump_in_charging().get_bool() { + VarModule::set_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N2_CANCEL_TYPE, SPECIAL_N2_CANCEL_TYPE_GROUND_JUMP); + fighter.change_status(statuses::miifighter::SPECIAL_N2_CANCEL.into(), true.into()); + return 1.into(); + } + if fighter.sub_check_command_guard().get_bool() || fighter.is_pad_flag(PadFlag::GuardTrigger) { + VarModule::set_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N2_CANCEL_TYPE, SPECIAL_N2_CANCEL_TYPE_NONE); + fighter.change_status(statuses::miifighter::SPECIAL_N2_CANCEL.into(), true.into()); + return 1.into(); + } + } + else { + if fighter.sub_check_command_guard().get_bool() || fighter.is_pad_flag(PadFlag::GuardTrigger) { + VarModule::set_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N2_CANCEL_TYPE, SPECIAL_N2_CANCEL_TYPE_NONE); + fighter.change_status(statuses::miifighter::SPECIAL_N2_CANCEL.into(), true.into()); + return 1.into(); + } + if fighter.get_num_used_jumps() < fighter.get_jump_count_max() + && fighter.sub_check_jump_in_charging().get_bool() { + VarModule::set_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N2_CANCEL_TYPE, SPECIAL_N2_CANCEL_TYPE_JUMP_AERIAL); + fighter.change_status(statuses::miifighter::SPECIAL_N2_JUMP_CANCEL.into(), true.into()); + return 1.into(); + } + } + if !fighter.global_table[IS_STOPPING].get_bool() { + VarModule::inc_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT); + let count = VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT); + let charge_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "special_n2.charge_frame"); + if charge_frame <= count { + EffectModule::req_common(fighter.module_accessor, Hash40::new("charge_max"), 0.0); + app::FighterUtil::flash_eye_info(fighter.module_accessor); + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT, count); + fighter.change_status(FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_MISS.into(), false.into()); + return 1.into(); + } + } + + return 0.into(); +} + +unsafe extern "C" fn special_n2_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + special_n2_change_motion(fighter, Hash40::new("special_n2_end"), Hash40::new("special_air_n2_end"), false); + EFFECT_FOLLOW_FLIP(fighter, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), 2, 12, -3, 0, 0, 0, 0.5, false, *EF_FLIP_AXIS_YZ); + SoundModule::play_se(fighter.module_accessor, Hash40::new("se_miifighter_special_n2_ready"), true, false, false, false, app::enSEType(0)); + ControlModule::set_rumble(fighter.module_accessor, Hash40::new("rbkind_attackm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + + fighter.main_shift(special_n2_end_main_loop) +} + +unsafe extern "C" fn special_n2_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + special_n2_change_motion(fighter, Hash40::new("special_n2_end"), Hash40::new("special_air_n2_end"), true); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + + return 0.into(); +} + +pub unsafe extern "C" fn special_n2_attack_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + let mut start_attr = 0; + let charge_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "special_n2.charge_frame"); + if VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT) >= charge_frame { + fighter.sub_status_pre_SpecialNCommon(); + start_attr = *FIGHTER_STATUS_ATTR_START_TURN as u32; + } StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), @@ -21,10 +292,217 @@ pub unsafe extern "C" fn special_n2_pre(fighter: &mut L2CFighterCommon) -> L2CVa false, false, (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, - *FIGHTER_STATUS_ATTR_START_TURN as u32, + start_attr, *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, 0 ); return 0.into(); +} + +unsafe extern "C" fn special_n2_attack_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); + fighter.set_situation(SITUATION_KIND_GROUND.into()); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + fighter.set_situation(SITUATION_KIND_AIR.into()); + } + let count = VarModule::get_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT); + let charge_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "special_n2.charge_frame"); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n2_attack"), 0.0, 1.0, false, 0.0, false, false); + if charge_frame > count { + let motion_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_n2.min_motion_mul"); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, motion_mul); + } + else if fighter.is_situation(*SITUATION_KIND_AIR) { + let motion_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_n2.air_motion_mul"); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, motion_mul); + } + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FREE, 0.0, 0.0, 0.0, 0.0, 0.0); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) + -1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) + -1); + EffectModule::remove_common(fighter.module_accessor, Hash40::new("charge_max")); + + fighter.main_shift(special_n2_attack_main_loop) +} + +unsafe extern "C" fn special_n2_attack_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + fighter.sub_air_check_dive(); + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + fighter.set_situation(SITUATION_KIND_GROUND.into()); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n2_landing"), 0.0, 1.0, false, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + } + } + + return 0.into(); +} + +unsafe extern "C" fn special_n2_attack_end(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::set_int(fighter.battle_object, vars::miifighter::instance::SPECIAL_N2_CHARGE_COUNT, 0); + return 0.into() +} + +unsafe extern "C" fn special_n2_cancel_main(fighter: &mut L2CFighterCommon) -> L2CValue { + special_n2_change_motion(fighter, Hash40::new("special_n2_end"), Hash40::new("special_air_n2_end"), false); + ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8); + + fighter.main_shift(special_n2_cancel_main_loop) +} + +unsafe extern "C" fn special_n2_cancel_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_check_charge_cancel_jump_mini_attack(); + fighter.sub_air_check_dive(); + let cancel_type = VarModule::get_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N2_CANCEL_TYPE); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + if ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_ATTACK) { + if cancel_type == SPECIAL_N2_CANCEL_TYPE_GROUND_JUMP { + FighterControlModuleImpl::update_attack_air_kind(fighter.module_accessor, true); + } + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + special_n2_change_motion(fighter, Hash40::new("special_n2_end"), Hash40::new("special_air_n2_end"), true); + if !StatusModule::is_changing(fighter.module_accessor) { + VarModule::set_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N2_CANCEL_TYPE, SPECIAL_N2_CANCEL_TYPE_NONE); + } + } + let mut shift_cancel_status = false; + if cancel_type != SPECIAL_N2_CANCEL_TYPE_NONE { + if MotionModule::is_end(fighter.module_accessor) + || CancelModule::is_enable_cancel(fighter.module_accessor) { + shift_cancel_status = true; + } + } + else { + if MotionModule::is_end(fighter.module_accessor) { + shift_cancel_status = true; + } + } + if shift_cancel_status { + match VarModule::get_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N2_CANCEL_TYPE) { + SPECIAL_N2_CANCEL_TYPE_GROUND_JUMP => fighter.change_status(FIGHTER_STATUS_KIND_JUMP_SQUAT.into(), false.into()), + SPECIAL_N2_CANCEL_TYPE_NONE => { fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); }, + _ => {}, + } + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + + return 0.into(); +} + +unsafe extern "C" fn special_n2_jump_cancel_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + 0.into() +} + +unsafe extern "C" fn special_n2_jump_cancel_main(fighter: &mut L2CFighterCommon) -> L2CValue { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n2_end"), 0.0, 1.0, false, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n2_end"), 0.0, 1.0, false, 0.0, false, false); + } + + fighter.main_shift(special_n2_jump_cancel_main_loop) +} + +unsafe extern "C" fn special_n2_jump_cancel_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); + return 1.into(); + } + if MotionModule::is_end(fighter.module_accessor) { + if VarModule::get_int(fighter.battle_object, vars::miifighter::status::SPECIAL_N2_CANCEL_TYPE) == SPECIAL_N2_CANCEL_TYPE_JUMP_AERIAL { + fighter.change_status(FIGHTER_STATUS_KIND_JUMP_AERIAL.into(), false.into()); + } + else { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + } + return 1.into(); + } + + return 0.into(); +} + +unsafe extern "C" fn special_n_jump_cancel_end(fighter: &mut L2CFighterCommon) -> L2CValue { + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, statuses::miifighter::SPECIAL_N2_HOLD, special_n2_common_pre); + agent.status(Main, statuses::miifighter::SPECIAL_N2_HOLD, special_n2_hold_main); + agent.status(End, statuses::miifighter::SPECIAL_N2_HOLD, special_n2_common_end); + + agent.status(Pre, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_MISS, special_n2_common_pre); + agent.status(Main, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_MISS, special_n2_end_main); + agent.status(End, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_MISS, special_n2_common_end); + + agent.status(Pre, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_FINISH, special_n2_attack_pre); + agent.status(Main, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_FINISH, special_n2_attack_main); + agent.status(End, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_N2_FINISH, special_n2_attack_end); + + agent.status(Pre, statuses::miifighter::SPECIAL_N2_CANCEL, special_n2_common_pre); + agent.status(Main, statuses::miifighter::SPECIAL_N2_CANCEL, special_n2_cancel_main); + agent.status(End, statuses::miifighter::SPECIAL_N2_CANCEL, special_n2_common_end); + + agent.status(Pre, statuses::miifighter::SPECIAL_N2_JUMP_CANCEL, special_n2_common_pre); + agent.status(Main, statuses::miifighter::SPECIAL_N2_JUMP_CANCEL, special_n2_jump_cancel_main); + agent.status(End, statuses::miifighter::SPECIAL_N2_JUMP_CANCEL, special_n2_common_end); } \ No newline at end of file diff --git a/fighters/miifighter/src/status/special_n3.rs b/fighters/miifighter/src/status/special_n3.rs new file mode 100644 index 0000000000..4f8f9445e5 --- /dev/null +++ b/fighters/miifighter/src/status/special_n3.rs @@ -0,0 +1,253 @@ +use super::*; + +pub unsafe extern "C" fn special_n3_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_status_kind_interrupt(*FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_CATCH); + return 1.into(); +} + +unsafe extern "C" fn special_n3_catch_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + return 0.into(); +} + +unsafe extern "C" fn special_n3_catch_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + KineticModule::unable_energy_all(fighter.module_accessor); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + let brake_x = fighter.get_param_float("ground_brake", ""); + let start_limit_speed_ground = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "wild_throw.start_limit_speed_ground"); + let start_brake_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "wild_throw.start_brake_x_mul"); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, speed_x, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, start_limit_speed_ground, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, brake_x * start_brake_x_mul, 0.0); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw3_catch"), 0.0, 1.0, false, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + let air_brake_x = fighter.get_param_float("air_brake_x", ""); + let start_air_speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "wild_throw.start_air_speed_x_mul"); + let start_air_brake_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "wild_throw.start_air_brake_x_mul"); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, speed_x * start_air_speed_x_mul, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, air_brake_x * start_air_brake_x_mul, 0.0); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + if !VarModule::is_flag(fighter.object(), vars::miifighter::instance::SPECIAL_N3_STALL) { + VarModule::on_flag(fighter.object(), vars::miifighter::instance::SPECIAL_N3_STALL); + let start_accel_y = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_lw"), hash40("lw3_throw_start_accel_y")); + let throw_speed_max_y = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_lw"), hash40("lw3_throw_speed_max_y")); + let start_air_speed_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "wild_throw.start_air_speed_y_mul"); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, speed_y * start_air_speed_y_mul, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -start_accel_y); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, throw_speed_max_y); + } + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_catch"), 0.0, 1.0, false, 0.0, false, false); + } + + fighter.main_shift(special_n3_catch_main_loop) +} + +unsafe extern "C" fn special_n3_catch_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if fighter.status_frame() < 15 { + StatusModule::set_keep_situation_air(fighter.module_accessor, true); + } else { + StatusModule::set_keep_situation_air(fighter.module_accessor, false); + } + if MotionModule::is_end(fighter.module_accessor) { + let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_STATUS_KIND_WAIT } else { FIGHTER_STATUS_KIND_FALL }; + fighter.change_status(status.into(), false.into()); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_lw3_catch"), -1.0, 1.0, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_lw3_catch"), -1.0, 1.0, 0.0, false, false); + } + } + + return 0.into() +} + +unsafe extern "C" fn special_n3_throw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + return 0.into(); +} + +unsafe extern "C" fn special_n3_throw_init(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_float(1.0, *FIGHTER_STATUS_THROW_WORK_FLOAT_MOTION_RATE); + smash::app::KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_MOTION, fighter.module_accessor); + smash::app::KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_CONTROL, fighter.module_accessor); + smash::app::KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_STOP, fighter.module_accessor); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + } + else { + let throw_accel_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "wild_throw.throw_accel_y"); + let throw_stable_speed_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "wild_throw.throw_stable_speed_y"); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, throw_accel_y); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, throw_stable_speed_y); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, throw_stable_speed_y); + } + + return 0.into(); +} + +unsafe extern "C" fn special_n3_throw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.clear_lua_stack(); + lua_args!(fighter, *MA_MSC_CMD_CATCH_SET_CATCH); + sv_module_access::_catch(fighter.lua_state_agent); + fighter.set_int(0, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + fighter.set_int(0, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let counter_attack_power = fighter.get_float(*FIGHTER_MIIFIGHTER_STATUS_COUNTER_THROW_FLOAT_ATTACK_POWER); + let attack_mul = fighter.get_param_float("param_special_lw", "lw3_attack_mul"); + let mut attack_power = counter_attack_power * attack_mul; + let attack_power_limit = fighter.get_param_float("param_special_lw", "lw3_attack_power_limit"); + if attack_power < attack_power_limit { + attack_power = 0.0; + } + if fighter.is_flag(*FIGHTER_MIIFIGHTER_STATUS_COUNTER_THROW_FLAG_IS_ATTACK_ENEMY) { + let attack_max_for_enemy = fighter.get_param_float("param_special_lw", "lw3_attack_max_for_enemy"); + if attack_max_for_enemy < attack_power { + attack_power = attack_max_for_enemy; + } + } + else { + let attack_max = fighter.get_param_float("param_special_lw", "lw3_attack_max"); + if attack_max < attack_power { + attack_power = attack_max + } + } + let get_node_object_id = LinkModule::get_node_object_id(fighter.module_accessor, *LINK_NO_CAPTURE); + fighter.set_float(attack_power, *FIGHTER_MIIFIGHTER_STATUS_COUNTER_THROW_FLOAT_ATTACK_POWER); + fighter.set_int(get_node_object_id as i32, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + fighter.sub_change_motion_by_situation(Hash40::new("special_lw3_throw").into(), Hash40::new("special_air_lw3_throw").into(), false.into()); + + fighter.main_shift(special_n3_throw_main_loop) +} + +unsafe extern "C" fn special_n3_throw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if !fighter.sub_wait_ground_check_common(false.into()).get_bool() { + if fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + } + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIIFIGHTER_STATUS_COUNTER_THROW_FLAG_THROW_AFTER_LANDING) { + if !fighter.is_prev_situation(*SITUATION_KIND_GROUND) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_lw3_throw"), -1.0, 1.0, 0.0, false, false); + } + } + } + let attack_power = fighter.get_float(*FIGHTER_MIIFIGHTER_STATUS_COUNTER_THROW_FLOAT_ATTACK_POWER); + if 0.0 < attack_power { + AttackModule::set_power(fighter.module_accessor, 0, attack_power, true); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 0.into(); + } + + return 0.into(); +} + +unsafe extern "C" fn special_n3_throw_end(fighter: &mut L2CFighterCommon) -> L2CValue { + CatchModule::catch_cut(fighter.module_accessor, false, false); + return 0.into(); +} + +unsafe extern "C" fn special_n3_throw_exit(fighter: &mut L2CFighterCommon) -> L2CValue { + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_CATCH, special_n3_catch_pre); + agent.status(Main, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_CATCH, special_n3_catch_main); + + agent.status(Pre, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_THROW, special_n3_throw_pre); + agent.status(Init, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_THROW, special_n3_throw_init); + agent.status(Main, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_THROW, special_n3_throw_main); + agent.status(End, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_THROW, special_n3_throw_end); + agent.status(Exit, *FIGHTER_MIIFIGHTER_STATUS_KIND_SPECIAL_LW3_THROW, special_n3_throw_exit); +} \ No newline at end of file diff --git a/fighters/miifighter/src/status/special_s1.rs b/fighters/miifighter/src/status/special_s1.rs index 05dc77fdf0..6da8922807 100644 --- a/fighters/miifighter/src/status/special_s1.rs +++ b/fighters/miifighter/src/status/special_s1.rs @@ -188,12 +188,16 @@ pub unsafe extern "C" fn special_s1_end_main_loop(fighter: &mut L2CFighterCommon if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } - if CancelModule::is_enable_cancel(fighter.module_accessor) { + if CancelModule::is_enable_cancel(fighter.module_accessor) + && WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING) { if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { return 1.into(); } } + if fighter.is_situation(*SITUATION_KIND_AIR) { + fighter.sub_air_check_dive(); + } if fighter.get_int(*FIGHTER_MIIFIGHTER_STATUS_WORK_ID_INT_100KICK_START_SITUATION) == *SITUATION_KIND_GROUND { if MotionModule::is_end(fighter.module_accessor) { fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); @@ -202,11 +206,15 @@ pub unsafe extern "C" fn special_s1_end_main_loop(fighter: &mut L2CFighterCommon } else { if MotionModule::is_end(fighter.module_accessor) { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + let status = if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING) + { FIGHTER_STATUS_KIND_FALL } else { FIGHTER_STATUS_KIND_FALL_SPECIAL }; + fighter.change_status(status.into(), false.into()); return 1.into(); } if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); + let status = if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIIFIGHTER_STATUS_WORK_ID_FLAG_100KICK_ENABLE_LANDING) + { FIGHTER_STATUS_KIND_LANDING } else { FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL }; + fighter.change_status(status.into(), false.into()); return 1.into(); } } diff --git a/fighters/miigunner/Cargo.toml b/fighters/miigunner/Cargo.toml index 9d35e41a25..52272ccdb2 100644 --- a/fighters/miigunner/Cargo.toml +++ b/fighters/miigunner/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/miigunner/src/acmd/aerials/attack_air_b.rs b/fighters/miigunner/src/acmd/aerials/attack_air_b.rs index 8d6f3824b2..ae264d5cb2 100644 --- a/fighters/miigunner/src/acmd/aerials/attack_air_b.rs +++ b/fighters/miigunner/src/acmd/aerials/attack_air_b.rs @@ -9,24 +9,27 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::miigunner::status::BOOSTED_AERIAL); + VarModule::on_flag(agent.battle_object, vars::miigunner::status::CHECK_BOOSTED_AERIAL); } frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 10.0, 361, 103, 0, 29, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 103, 0, 29, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handr"), 13.0, 361, 103, 0, 41, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("handr"), 13.0, 361, 103, 0, 41, 6.0, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 10.0, 361, 93, 0, 29, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 93, 0, 29, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handr"), 13.0, 361, 93, 0, 41, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handr"), 13.0, 361, 93, 0, 41, 6.0, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } frame(lua_state, 13.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 32.0); + FT_MOTION_RATE_RANGE(agent, 32.0, 42.0, 8.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 42.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { @@ -55,13 +58,12 @@ unsafe extern "C" fn game_attackairbboost(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - let addSpeed1 = Vector3f{ x: 0.66, y: 0.1, z: 0.0 }; - KineticModule::add_speed(boma, &addSpeed1); - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 50, 90, 0, 44, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 8.0, 50, 90, 0, 44, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 8.0, 50, 90, 0, 44, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("handr"), 10.0, 55, 90, 0, 44, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("handr"), 10.0, 55, 90, 0, 44, 6.0, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + KineticModule::add_speed(boma, &Vector3f::new(0.66, 0.1, 0.0)); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 45, 94, 0, 44, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 8.0, 45, 94, 0, 44, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 8.0, 45, 94, 0, 44, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handr"), 10.0, 120, 75, 0, 44, 4.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("handr"), 10.0, 120, 75, 0, 44, 6.0, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } frame(lua_state, 13.0); FT_MOTION_RATE_RANGE(agent, 13.0, 22.0, 7.0); @@ -73,16 +75,16 @@ unsafe extern "C" fn game_attackairbboost(agent: &mut L2CAgentBase) { AttackModule::clear(boma, 4, false); } frame(lua_state, 22.0); - FT_MOTION_RATE_RANGE(agent, 22.0, 32.0, 13.0); + FT_MOTION_RATE_RANGE(agent, 22.0, 42.0, 20.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 32.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 35.0); + frame(lua_state, 38.0); // f42 if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 42.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackairbboost(agent: &mut L2CAgentBase) { diff --git a/fighters/miigunner/src/acmd/aerials/attack_air_f.rs b/fighters/miigunner/src/acmd/aerials/attack_air_f.rs index ef79c57275..47930ced39 100644 --- a/fighters/miigunner/src/acmd/aerials/attack_air_f.rs +++ b/fighters/miigunner/src/acmd/aerials/attack_air_f.rs @@ -10,7 +10,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 6.0, 9.0, 4.0); frame(lua_state, 9.0); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::miigunner::status::BOOSTED_AERIAL); + VarModule::on_flag(agent.battle_object, vars::miigunner::status::CHECK_BOOSTED_AERIAL); } frame(lua_state, 10.0); if is_excute(agent) { @@ -59,9 +59,9 @@ unsafe extern "C" fn game_attackairfboost(agent: &mut L2CAgentBase) { ArticleModule::generate_article(boma, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_ATTACKAIRF_BULLET, false, 0); let addSpeed1 = Vector3f{ x: -0.85, y: 0.0, z: 0.0 }; KineticModule::add_speed(boma, &addSpeed1); - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 5.0, 60, 122, 0, 35, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 60, 122, 0, 35, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handr"), 5.0, 60, 122, 0, 35, 4.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 5.0, 70, 112, 0, 35, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 70, 112, 0, 35, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handr"), 5.0, 70, 112, 0, 35, 4.5, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 12.0); FT_MOTION_RATE(agent, 1.0); diff --git a/fighters/miigunner/src/acmd/aerials/attack_air_hi.rs b/fighters/miigunner/src/acmd/aerials/attack_air_hi.rs index 4c0d3f1ee7..b053cf3202 100644 --- a/fighters/miigunner/src/acmd/aerials/attack_air_hi.rs +++ b/fighters/miigunner/src/acmd/aerials/attack_air_hi.rs @@ -9,7 +9,7 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - VarModule::on_flag(agent.battle_object, vars::miigunner::status::BOOSTED_AERIAL); + VarModule::on_flag(agent.battle_object, vars::miigunner::status::CHECK_BOOSTED_AERIAL); } frame(lua_state, 17.0); FT_MOTION_RATE(agent, 1.0); @@ -31,7 +31,7 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 36.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 72, 159, 0, 50, 4.0, 0.0, 58.0, 0.0, Some(0.0), Some(16.0), Some(0.0), 1.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 78, 120, 0, 50, 4.0, 0.0, 58.0, 0.0, Some(0.0), Some(16.0), Some(0.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); } frame(lua_state, 39.0); if is_excute(agent) { @@ -102,8 +102,7 @@ unsafe extern "C" fn game_attackairhiboost(agent: &mut L2CAgentBase) { frame(lua_state, 17.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - let addSpeed = Vector3f{ x: 0.0, y: -4.0, z: 0.0 }; - KineticModule::add_speed(boma, &addSpeed); + KineticModule::add_speed(boma, &Vector3f::new(0.0, -3.25, 0.0)); ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 90, 77, 0, 27, 6.5, 0.0, 28.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 270, 38, 0, 56, 6.0, 0.0, 19.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); } diff --git a/fighters/miigunner/src/acmd/aerials/attack_air_lw.rs b/fighters/miigunner/src/acmd/aerials/attack_air_lw.rs index b3898fcf4b..529b5d3803 100644 --- a/fighters/miigunner/src/acmd/aerials/attack_air_lw.rs +++ b/fighters/miigunner/src/acmd/aerials/attack_air_lw.rs @@ -9,7 +9,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::miigunner::status::BOOSTED_AERIAL); + VarModule::on_flag(agent.battle_object, vars::miigunner::status::CHECK_BOOSTED_AERIAL); } frame(lua_state, 14.0); FT_MOTION_RATE_RANGE(agent, 14.0, 18.0, 1.0); @@ -68,10 +68,9 @@ unsafe extern "C" fn game_attackairlwboost(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 14.0, 20.0, 4.0); frame(lua_state, 20.0); FT_MOTION_RATE(agent, 1.0); + let charge = VarModule::get_float(agent.battle_object, vars::miigunner::status::ATTACK_CHARGE); + let charge_mul = 1.0 + (charge * 0.025); if is_excute(agent) { - let charge = VarModule::get_float(agent.battle_object, vars::miigunner::status::ATTACK_CHARGE); - let charge_mul = 1.0 + (charge * 0.025); - let mul = if VarModule::is_flag(agent.object(), vars::miigunner::instance::BOOSTED_ATTACK_AIR_LW_AIRTIME) { 0.5 } else { 0.735 }; if !VarModule::is_flag(agent.object(), vars::miigunner::instance::BOOSTED_ATTACK_AIR_LW_AIRTIME) { VarModule::on_flag(agent.object(), vars::miigunner::instance::BOOSTED_ATTACK_AIR_LW_AIRTIME); } @@ -79,24 +78,26 @@ unsafe extern "C" fn game_attackairlwboost(agent: &mut L2CAgentBase) { let speed_y_mul = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_charge.attack_air_lw_charge_speed_y_mul"); SET_SPEED_EX(agent, (KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) * PostureModule::lr(boma) * (20.0 - charge)/20.0) * speed_x_mul, - (1.0 + (0.125 * charge)) * speed_y_mul, + (1.125 + (0.125 * charge)) * speed_y_mul, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN ); - ATTACK(agent, 0, 0, Hash40::new("handr"), 12.0 * charge_mul, 80, 65, 0, 50, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handr"), 12.0 * charge_mul, 80, 65, 0, 50, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handr"), 14.0 * charge_mul, 80, 65, 0, 50, 5.5, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handr"), 12.0 * charge_mul, 90, 65, 0, 50, 4.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 12.0 * charge_mul, 90, 65, 0, 50, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handr"), 14.0 * charge_mul, 90, 65, 0, 50, 5.5, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } frame(lua_state, 24.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handr"), 8.0, 65, 90, 0, 30, 3.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handr"), 8.0, 65, 90, 0, 30, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handr"), 8.0, 65, 90, 0, 30, 4.5, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handr"), 8.0 * charge_mul, 75, 90, 0, 30, 3.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 8.0 * charge_mul, 75, 90, 0, 30, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handr"), 8.0 * charge_mul, 75, 90, 0, 30, 4.5, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 28.0); FT_MOTION_RATE(agent, 0.75); frame(lua_state, 43.0); - let charge_mul = if VarModule::is_flag(agent.battle_object, vars::miigunner::instance::BOOSTED_ATTACK_AIR_LW_AIRTIME) { 1.0 } else { 2.0 }; - FT_MOTION_RATE_RANGE(agent, 43.0, 50.0, 9.0 + charge_mul * VarModule::get_float(agent.battle_object, vars::miigunner::status::ATTACK_CHARGE)); + if charge > 5.0 { + let charge_mul = if VarModule::is_flag(agent.battle_object, vars::miigunner::instance::BOOSTED_ATTACK_AIR_LW_AIRTIME) { 1.0 } else { 2.0 }; + FT_MOTION_RATE_RANGE(agent, 43.0, 50.0, 9.0 + charge_mul * VarModule::get_float(agent.battle_object, vars::miigunner::status::ATTACK_CHARGE)); + } if is_excute(agent) { AttackModule::clear_all(boma); } @@ -104,9 +105,6 @@ unsafe extern "C" fn game_attackairlwboost(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } - frame(lua_state, 54.0); - if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } diff --git a/fighters/miigunner/src/acmd/aerials/attack_air_n.rs b/fighters/miigunner/src/acmd/aerials/attack_air_n.rs index 184cf22b74..0600c2ba01 100644 --- a/fighters/miigunner/src/acmd/aerials/attack_air_n.rs +++ b/fighters/miigunner/src/acmd/aerials/attack_air_n.rs @@ -27,6 +27,26 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc"), Hash40::new("top"), -1, 11, 0.4, 180, -90, 80, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.75); + } + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 11, 0.4, 180, -195, 75, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.75); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc"), Hash40::new("top"), 1, 11, 0.4, 180, -300, 70, 1, true); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); + agent.acmd("effect_attackairn", effect_attackairn, Priority::Low); } \ No newline at end of file diff --git a/fighters/miigunner/src/acmd/ground.rs b/fighters/miigunner/src/acmd/ground.rs index 7475310962..cdd2be54d4 100644 --- a/fighters/miigunner/src/acmd/ground.rs +++ b/fighters/miigunner/src/acmd/ground.rs @@ -3,102 +3,97 @@ use super::*; unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 5.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 361, 18, 0, 22, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 361, 18, 0, 22, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("handl"), 3.0, 361, 15, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 18, 0, 22, 2.5, 0.0, 3.5, 6.5, Some(0.0), Some(3.5), Some(11.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 2.0, false); - } - wait(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } + frame(lua_state, 5.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 70, 18, 0, 22, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 70, 18, 0, 22, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handl"), 3.0, 70, 15, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 20, 2.5, 0.0, 3.5, 6.5, Some(0.0), Some(3.5), Some(11.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } } unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 4.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 3.5, 361, 25, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.5, 361, 25, 0, 25, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 3.5, 361, 20, 0, 20, 4.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.5, 361, 25, 0, 25, 3.0, 0.0, 3.5, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame(boma, 0, 4.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 4.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 4.0, false); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 10.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); - } + frame(lua_state, 4.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("legr"), 3.0, 75, 25, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 75, 25, 0, 25, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 3.0, 75, 20, 0, 20, 4.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 3.0, 0.0, 3.5, 8.5, Some(0.0), Some(3.5), Some(12.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::set_down_only(boma, 3, true); + } + wait(lua_state, 4.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 10.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } } unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.8); - frame(lua_state, 6.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 350, 100, 20, 0, 4.0, 0.0, 7.0, 9.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 90, 100, 10, 0, 4.0, 0.0, 7.0, 13.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 3.0); - FT_MOTION_RATE(agent, 0.66); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.5, 361, 86, 0, 64, 7.5, 10.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 4.5, 361, 86, 0, 64, 4.0, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 4.5, 361, 86, 0, 64, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.8); + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 350, 100, 20, 0, 4.0, 0.0, 7.0, 9.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 90, 100, 10, 0, 4.0, 0.0, 7.0, 13.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + wait(lua_state, 3.0); + FT_MOTION_RATE(agent, 0.66); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 361, 86, 0, 64, 7.5, 10.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 361, 86, 0, 64, 4.0, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 5.0, 361, 86, 0, 64, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + } + wait(lua_state, 4.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } } unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.77); - frame(lua_state, 10.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handr"), 14.0, 361, 71, 0, 55, 5.0, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handr"), 14.0, 361, 71, 0, 55, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 14.0, 361, 71, 0, 55, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATK_SET_SHIELD_SETOFF_MUL_arg4(agent, 0, 1, 2, 1.5); - } - frame(lua_state, 14.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handr"), 10.0, 361, 71, 0, 40, 4.5, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handr"), 10.0, 361, 71, 0, 40, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 361, 71, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 18.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.77); + frame(lua_state, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("handr"), 14.0, 45, 71, 0, 55, 5.0, 8.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 14.0, 45, 71, 0, 55, 5.0, 2.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 14.0, 45, 71, 0, 55, 3.5, 0.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 14.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("handr"), 10.0, 45, 71, 0, 40, 4.5, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 10.0, 45, 71, 0, 40, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 45, 71, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 18.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } } pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); agent.acmd("game_attack12", game_attack12, Priority::Low); agent.acmd("game_attack13", game_attack13, Priority::Low); - + agent.acmd("game_attackdash", game_attackdash, Priority::Low); } \ No newline at end of file diff --git a/fighters/miigunner/src/acmd/other.rs b/fighters/miigunner/src/acmd/other.rs index 9215af81fd..73853e7d01 100644 --- a/fighters/miigunner/src/acmd/other.rs +++ b/fighters/miigunner/src/acmd/other.rs @@ -86,16 +86,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -106,9 +102,14 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); + +} + +unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + PostureModule::add_pos(boma, &Vector3f::new(0.0, -1.0, 0.0)); } } @@ -127,4 +128,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_escapeair", game_escapeair, Priority::Low); agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); -} + + agent.acmd("game_cliffjump2", game_cliffjump2, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miigunner/src/acmd/smashes.rs b/fighters/miigunner/src/acmd/smashes.rs index f26af33a7f..493a5ef9de 100644 --- a/fighters/miigunner/src/acmd/smashes.rs +++ b/fighters/miigunner/src/acmd/smashes.rs @@ -7,10 +7,14 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } + frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 180, 100, 7, 0, 3.0, 0.0, 7.5, 45.0, Some(0.0), Some(7.5), Some(45.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 0, 100, 5, 0, 3.0, 0.0, 7.5, 44.0, Some(0.0), Some(7.5), Some(7.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 180, 100, 7, 0, 3.0, 0.0, 7.5, 41.0, Some(0.0), Some(7.5), Some(41.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 0, 100, 5, 0, 3.0, 0.0, 7.5, 41.0, Some(0.0), Some(7.5), Some(7.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); } frame(lua_state, 39.0); if is_excute(agent) { @@ -19,11 +23,11 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { frame(lua_state, 40.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 7.5, 50, 163, 0, 47, 7.0, 0.0, 7.5, 20.0, Some(0.0), Some(7.5), Some(10.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 7.5, 50, 163, 0, 47, 3.5, 0.0, 7.5, 48.0, Some(0.0), Some(7.5), Some(10.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.5, 50, 163, 0, 47, 3.5, 0.0, 7.5, 44.0, Some(0.0), Some(7.5), Some(10.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); } frame(lua_state, 42.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.5, 50, 163, 0, 47, 3.0, 0.0, 7.5, 44.0, Some(0.0), Some(7.5), Some(10.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.5, 50, 163, 0, 47, 3.0, 0.0, 7.5, 36.5, Some(0.0), Some(7.5), Some(10.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); AttackModule::clear(boma, 1, false); } frame(lua_state, 43.0); @@ -41,10 +45,10 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 96, 100, 30, 70, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 3.0, 86, 100, 30, 10, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 90, 100, 30, 0, 2.0, 3.5, 3.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 3, 0, Hash40::new("armr"), 3.0, 361, 100, 0, 0, 7.0, 7.0, -1.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.0, 96, 100, 30, 70, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 86, 100, 30, 10, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("armr"), 2.0, 90, 100, 30, 0, 2.0, 3.5, 3.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 3, 0, Hash40::new("armr"), 2.0, 361, 100, 0, 0, 6.0, 6.0, -1.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); let hit1 = Vector2f { x: 8.0, y: 20.0 }; AttackModule::set_vec_target_pos(boma, 3, Hash40::new("top"), &hit1, 6, false); AttackModule::set_no_finish_camera(boma, 0, true, false); @@ -58,9 +62,8 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } wait(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 110, 100, 30, 100, 6.0, 7.2, -2.3, 0.0, Some(5.8), Some(-0.8), Some(0.0), 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.5, 110, 100, 30, 100, 7.0, 7.0, -1.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("armr"), 2.5, 361, 100, 0, 0, 7.0, 7.0, -1.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 110, 100, 30, 100, 6.0, 6.0, -1.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("armr"), 2.0, 361, 100, 0, 0, 6.0, 6.0, -1.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); let hit1 = Vector2f { x: -3.0, y: 20.0 }; AttackModule::set_vec_target_pos(boma, 2, Hash40::new("top"), &hit1, 6, false); AttackModule::set_no_finish_camera(boma, 0, true, false); @@ -73,8 +76,8 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } wait(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 90, 30, 25, 80, 7.0, 8.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.5, 361, 100, 0, 0, 7.0, 8.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.0, 90, 30, 25, 80, 6.0, 7.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 361, 100, 0, 0, 6.0, 7.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); let hit1 = Vector2f { x: -8.0, y: 16.0 }; AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 5, false); AttackModule::set_no_finish_camera(boma, 0, true, false); @@ -86,10 +89,10 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } wait(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 2.5, 120, 100, 30, 44, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.5, 116, 100, 30, 44, 6.5, 6.5, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("armr"), 2.5, 218, 100, 30, 26, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 3, 0, Hash40::new("armr"), 2.5, 218, 100, 30, 26, 6.5, 6.5, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("armr"), 2.0, 120, 100, 30, 44, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0, 116, 100, 30, 44, 6.0, 6.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("armr"), 2.0, 218, 100, 30, 26, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 3, 0, Hash40::new("armr"), 2.0, 218, 100, 30, 26, 6.0, 6.0, 0.0, 0.0, None, None, None, 0.5, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); let hit1 = Vector2f { x: -12.0, y: 12.0 }; AttackModule::set_vec_target_pos(boma, 2, Hash40::new("top"), &hit1, 5, false); AttackModule::set_vec_target_pos(boma, 3, Hash40::new("top"), &hit1, 5, false); @@ -105,7 +108,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { wait(lua_state, 2.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 90, 150, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0, 90, 150, 0, 50, 8.0, 7.8, -0.5, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0, 90, 150, 0, 50, 6.0, 6.8, -0.5, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } wait(lua_state, 2.0); if is_excute(agent) { @@ -113,6 +116,48 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("armr"), 4.289, -0.272, -0.135, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("miigunner_atk_shot5"), Hash40::new("armr"), -1, 0, 0, 0, 90, 0, 0.9, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + } + frame(lua_state, 12.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_v"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("miigunner_atk_shot5"), Hash40::new("armr"), -1, 0, 0, 0, 90, 0, 0.9, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + } + frame(lua_state, 19.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("miigunner_atk_shot5"), Hash40::new("armr"), -1, 0, 0, 0, 90, 0, 0.9, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + } + frame(lua_state, 23.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("miigunner_atk_shot5"), Hash40::new("armr"), -1, 0, 0, 0, 90, 0, 0.9, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + } + frame(lua_state, 27.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("miigunner_atk_shot5"), Hash40::new("armr"), -1, 0, 0, 0, 90, 0, 0.9, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + } + frame(lua_state, 30.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + } +} + unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -122,9 +167,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 11.5, 40, 110, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.5, 40, 110, 0, 40, 5.0, 0.0, 5.0, 17.0, Some(0.0), Some(5.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("armr"), 11.5, 40, 110, 0, 40, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 12.0, 45, 100, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 40, 83, 0, 40, 4.0, 0.0, 4.0, 17.5, Some(0.0), Some(4.0), Some(13.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("armr"), 16.0, 40, 83, 0, 40, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -133,9 +178,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 14.0, 40, 88, 0, 70, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 40, 88, 0, 70, 5.0, 0.0, 5.0, -17.0, Some(0.0), Some(5.0), Some(-14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("armr"), 14.0, 40, 88, 0, 70, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 14.0, 45, 100, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 18.0, 40, 83, 0, 40, 4.0, 0.0, 4.0, -17.5, Some(0.0), Some(4.0), Some(-13.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("armr"), 18.0, 40, 83, 0, 40, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 26.0); @@ -144,10 +189,35 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("haver"), 0, 5, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("miigunner_atk_shot5"), Hash40::new("armr"), 0, 0, 0, 0, 90, 0, 1, 0, 0, 0, 0, 0, 0, true); + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 22.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("miigunner_atk_shot5"), Hash40::new("armr"), 0, 0, 0, 0, 90, 0, 1.15, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.2); + } + frame(lua_state, 23.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 3, 0, 0, 0, 180, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); + agent.acmd("effect_attackhi4", effect_attackhi4, Priority::Low); agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); + agent.acmd("effect_attacklw4", effect_attacklw4, Priority::Low); } \ No newline at end of file diff --git a/fighters/miigunner/src/acmd/specials/special_hi.rs b/fighters/miigunner/src/acmd/specials/special_hi.rs index 626116cfa2..7a9422a545 100644 --- a/fighters/miigunner/src/acmd/specials/special_hi.rs +++ b/fighters/miigunner/src/acmd/specials/special_hi.rs @@ -7,14 +7,21 @@ use super::*; unsafe extern "C" fn game_specialhi1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_MIIGUNNER_STATUS_BOTTOM_SHOOT_FLAG_JUMP); } frame(lua_state, 12.0); + if VarModule::get_float(agent.battle_object, vars::miigunner::status::ATTACK_CHARGE) <= 10.0 { + FT_MOTION_RATE_RANGE(agent, 12.0, 38.0, 13.0); + } if is_excute(agent) { ArticleModule::generate_article(boma, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_BOTTOMSHOOT, false, 0); } + frame(lua_state, 38.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_specialhi1(agent: &mut L2CAgentBase) { @@ -29,13 +36,19 @@ unsafe extern "C" fn effect_specialhi1(agent: &mut L2CAgentBase) { if is_excute(agent) { let handle = VarModule::get_int64(agent.battle_object, vars::miigunner::instance::SPECIAL_HI1_LAUNCH_EFFECT_HANDLE); EffectModule::set_rate(boma, handle as u32, 1.0); - if VarModule::get_float(agent.battle_object, vars::miigunner::status::ATTACK_CHARGE) <= 10.0 && !VarModule::is_flag(agent.battle_object, vars::miigunner::instance::SPECIAL_HI1_LAUNCH_AIR_USED) { + if VarModule::get_float(agent.battle_object, vars::miigunner::status::ATTACK_CHARGE) <= 10.0 && !VarModule::is_flag(agent.battle_object, vars::miigunner::instance::SPECIAL_HI1_AIR_USED) { EffectModule::set_rgb(boma, handle as u32, 0.15, 0.55, 10.0); } } frame(lua_state, 12.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 38.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miigunner_bottom_shot"), false, false); } } @@ -88,11 +101,11 @@ unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 80, 83, 0, 68, 6.5, 0.0, 11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 80, 91, 0, 68, 6.5, 0.0, 11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 75, 105, 0, 58, 5.5, 0.0, 11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 99, 0, 58, 5.5, 0.0, 11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 23.0); if is_excute(agent) { @@ -105,21 +118,116 @@ unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { } // ================================================================================================ -// ======================================= JETPACK JOYRIDE ======================================== +// ========================================= JET STREAM =========================================== // ================================================================================================ unsafe extern "C" fn game_specialhi3start(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 1.5); + FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 14.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); + } + frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialhi3start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_sp_flash"), Hash40::new("sys_sp_flash"), Hash40::new("top"), -5, 12, -3, 0, 0, 0, 0.45, false, *EF_FLIP_AXIS_YZ); + LAST_EFFECT_SET_RATE(agent, 1.3); + } + frame(lua_state, 7.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_specialhi3start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + let sfx_handle = SoundModule::play_se(boma, Hash40::new("se_miigunner_appeal_s01"), true, false, false, false, app::enSEType(0)); + SoundModule::set_se_pitch_status(boma, 0.2); + } + frame(lua_state, 4.0); + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_miigunner_appeal_s01")); + SoundModule::set_se_pitch_status(boma, 1.0); + } } unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.85); + FT_MOTION_RATE_RANGE(agent, 1.0, 34.0, 4.0); + let rot = VarModule::get_float(agent.battle_object, vars::miigunner::instance::SPECIAL_HI3_ROT); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("bust"), 9.0, (rot + (90.0 - rot) / 1.5) as u64, 35, 0, 80, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 34.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 38.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("bust"), 8.0, (rot + (90.0 - rot) / 1.1) as u64, 42, 0, 80, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + // end_frame 39 +} + +unsafe extern "C" fn effect_specialhi3(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miigunner_gimmck_attack"), Hash40::new("rot"), 0, 12, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_SCALE_W(agent, 1, 1, 1); + EFFECT(agent, Hash40::new("miigunner_armrocket_start"), Hash40::new("rot"), -2.5, -4, 1.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT_FOLLOW(agent, Hash40::new("miigunner_armrocket"), Hash40::new("armr"), 0, 0, 0, 0, 0, 90, 1, true); + EffectModule::enable_sync_init_pos_last(boma); + } + frame(lua_state, 34.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miigunner_armrocket"), false, false); + } + frame(lua_state, 37.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miigunner_gimmck_attack"), false, false); + } +} + +unsafe extern "C" fn game_specialairhi3end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_specialairhi3end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + let rot = VarModule::get_float(agent.battle_object, vars::miigunner::instance::SPECIAL_HI3_ROT); + let (pos_y, pos_z) = match rot { + 0.0..=20.0 => (8.0, 10.0), + 20.0..=40.0 => (9.0, 8.0), + 40.0..=60.0 => (13.0, 6.0), + 60.0..90.0 => (13.0, 5.0), + _ => (13.0, 0.0) + }; + EFFECT_FOLLOW(agent, Hash40::new("miigunner_gimmck_attack"), Hash40::new("top"), 0, pos_y, pos_z, 90.0 - rot, 0, 0, 1, true); + } + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miigunner_gimmck_attack"), false, false); + } } unsafe extern "C" fn effect_landingfallspecial(agent: &mut L2CAgentBase) { @@ -145,9 +253,17 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialhi2", game_specialhi2, Priority::Low); agent.acmd("game_specialhi3start", game_specialhi3start, Priority::Low); + agent.acmd("effect_specialhi3start", effect_specialhi3start, Priority::Low); + agent.acmd("sound_specialhi3start", sound_specialhi3start, Priority::Low); agent.acmd("game_specialairhi3start", game_specialhi3start, Priority::Low); + agent.acmd("effect_specialairhi3start", effect_specialhi3start, Priority::Low); + agent.acmd("sound_specialairhi3start", sound_specialhi3start, Priority::Low); agent.acmd("game_specialhi3", game_specialhi3, Priority::Low); + agent.acmd("effect_specialhi3", effect_specialhi3, Priority::Low); + + agent.acmd("game_specialairhi3end", game_specialairhi3end, Priority::Low); + agent.acmd("effect_specialairhi3end", effect_specialairhi3end, Priority::Low); agent.acmd("effect_landingfallspecial", effect_landingfallspecial, Priority::Low); } \ No newline at end of file diff --git a/fighters/miigunner/src/acmd/specials/special_lw.rs b/fighters/miigunner/src/acmd/specials/special_lw.rs index 0711ebe477..ee310c61f9 100644 --- a/fighters/miigunner/src/acmd/specials/special_lw.rs +++ b/fighters/miigunner/src/acmd/specials/special_lw.rs @@ -18,7 +18,7 @@ unsafe extern "C" fn game_speciallw1start(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { let offset = if agent.is_situation(*SITUATION_KIND_GROUND) { 0.0 } else { 2.0 }; - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 69, 92, 0, 70, 8.0, 0.0, 6.5 + offset, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 69, 92, 0, 70, 8.0, 0.0, 6.5 + offset, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); } } @@ -65,7 +65,7 @@ unsafe extern "C" fn game_speciallw3start(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 7.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 6.0); frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.0); } @@ -96,7 +96,8 @@ unsafe extern "C" fn game_speciallw3hold(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 0.8); if is_excute(agent) { let offset_y = if agent.is_situation(*SITUATION_KIND_GROUND) { 6.5 } else { 9.5 }; - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 367, 100, 25, 0, 9.0, 0.0, offset_y, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 366, 100, 60, 0, 9.0, 0.0, offset_y, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + AttackModule::set_add_reaction_frame(boma, 0, 4.0, false); } frame(lua_state, 3.0); if is_excute(agent) { @@ -133,7 +134,8 @@ unsafe extern "C" fn game_speciallw3end(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { let offset_y = if agent.is_situation(*SITUATION_KIND_GROUND) { 6.5 } else { 9.5 }; - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 55, 70, 0, 30, 11.5, 0.0, offset_y, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 50, 0, 40, 11.5, 0.0, offset_y, 0.0, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 55, 70, 0, 30, 11.5, 0.0, offset_y, 0.0, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); } frame(lua_state, 3.0); if is_excute(agent) { diff --git a/fighters/miigunner/src/acmd/specials/special_n.rs b/fighters/miigunner/src/acmd/specials/special_n.rs index 2fb04745ea..f37fbfd61a 100644 --- a/fighters/miigunner/src/acmd/specials/special_n.rs +++ b/fighters/miigunner/src/acmd/specials/special_n.rs @@ -62,9 +62,9 @@ unsafe extern "C" fn game_specialn1neon(agent: &mut L2CAgentBase) { if is_excute(agent) { ArticleModule::remove_exist(boma, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_GUNNERCHARGE, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); WorkModule::on_flag(boma, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_FLAG_SHOOT); - ATTACK(agent, 0, 0, Hash40::new("top"), 25.0, 361, 74, 0, 61, 7.0, 0.0, 7.5, 8.0, Some(0.0), Some(7.5), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 22.0, 361, 74, 0, 61, 5.0, 0.0, 7.5, 8.0, Some(0.0), Some(7.5), Some(21.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); - } + ATTACK(agent, 0, 0, Hash40::new("top"), 25.0, 361, 76, 0, 45, 5.5, 0.0, 7.5, 8.0, Some(0.0), Some(7.5), Some(9.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 22.0, 361, 76, 0, 45, 4.0, 0.0, 7.5, 8.0, Some(0.0), Some(7.5), Some(21.5), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + } frame(lua_state, 5.0); FT_MOTION_RATE_RANGE(agent, 8.0, 40.0, 37.0); if is_excute(agent) { @@ -151,7 +151,7 @@ unsafe extern "C" fn game_specialn2loop(agent: &mut L2CAgentBase) { } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 6.0, 45, 100, 0, 30, 4.0, 2.0, 0.0, 0.0, Some(4.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 6.0, 45, 100, 0, 30, 4.0, 2.0, 0.0, 0.0, Some(4.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ArticleModule::generate_article(boma, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_RAPIDSHOT_BULLET, false, 0); } frame(lua_state, 6.0); diff --git a/fighters/miigunner/src/acmd/specials/special_s.rs b/fighters/miigunner/src/acmd/specials/special_s.rs index fa57d80ff1..57dde5c3ed 100644 --- a/fighters/miigunner/src/acmd/specials/special_s.rs +++ b/fighters/miigunner/src/acmd/specials/special_s.rs @@ -16,6 +16,10 @@ unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { } } +// ================================================================================================ +// ======================================== MAGNET BURST ========================================== +// ================================================================================================ + // ================================================================================================ // ======================================== PULSE MISSILE ========================================= // ================================================================================================ diff --git a/fighters/miigunner/src/acmd/throws.rs b/fighters/miigunner/src/acmd/throws.rs index 40311837d8..65074db58d 100644 --- a/fighters/miigunner/src/acmd/throws.rs +++ b/fighters/miigunner/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(11.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 6.0, Some(0.0), Some(6.6), Some(11.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 6.7, 0.0, Some(0.0), Some(6.7), Some(11.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.7, 5.0, Some(0.0), Some(6.7), Some(10.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 6.4, -4.0, Some(0.0), Some(6.4), Some(-14.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.4, -4.0, Some(0.0), Some(6.4), Some(-14.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -67,7 +66,7 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 361, 90, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 48, 90, 0, 48, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 10.0); @@ -240,10 +239,13 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 102, 48, 0, 93, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 102, 55, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 10.0); + FT_MOTION_RATE_RANGE(agent, 10.0, 15.0, 8.0); frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 0, 0); } diff --git a/fighters/miigunner/src/acmd/tilts.rs b/fighters/miigunner/src/acmd/tilts.rs index 29ddd2d4ec..21446984ab 100644 --- a/fighters/miigunner/src/acmd/tilts.rs +++ b/fighters/miigunner/src/acmd/tilts.rs @@ -8,34 +8,42 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 361, 56, 0, 56, 3.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 361, 56, 0, 56, 2.5, 0.0, 8.0, 8.0, Some(0.0), Some(8.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 76, 0, 36, 3.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 361, 56, 0, 56, 2.5, 0.0, 8.0, 8.0, Some(0.0), Some(8.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 51, 76, 0, 36, 2.0, 0.0, 8.0, 8.0, Some(0.0), Some(8.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_electric_hit_m")); } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 361, 56, 0, 56, 2.5, 0.0, 8.0, 6.0, Some(0.0), Some(15.5), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); - ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 361, 56, 0, 56, 2.5, 0.0, 8.0, 6.0, Some(0.0), Some(2.5), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 361, 56, 0, 56, 2.0, 0.0, 8.0, 6.0, Some(0.0), Some(13.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 4, 0, Hash40::new("top"), 13.0, 361, 56, 0, 56, 2.0, 0.0, 8.0, 6.0, Some(0.0), Some(3.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + AttackModule::set_optional_hit_sound(boma, 3, Hash40::new("se_common_electric_hit_m")); + AttackModule::set_optional_hit_sound(boma, 4, Hash40::new("se_common_electric_hit_m")); } frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 361, 56, 0, 56, 3.0, 0.0, 8.0, 6.0, Some(0.0), Some(8.0), Some(25.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 361, 56, 0, 56, 3.0, 0.0, 8.0, 6.0, Some(0.0), Some(8.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 51, 76, 0, 36, 2.5, 0.0, 8.0, 6.0, Some(0.0), Some(8.0), Some(23.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_electric_hit_m")); } frame(lua_state, 13.0); if is_excute(agent) { ATK_POWER(agent, 1, 10.0); - ATK_POWER(agent, 2, 10.0); ATK_POWER(agent, 3, 10.0); + ATK_POWER(agent, 4, 10.0); } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 361, 56, 0, 56, 1.5, 0.0, 8.0, 6.0, Some(0.0), Some(8.0), Some(25.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); - AttackModule::set_size(boma, 2, 2.0); - AttackModule::set_size(boma, 3, 2.0); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 361, 56, 0, 56, 2.0, 0.0, 8.0, 6.0, Some(0.0), Some(8.0), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 51, 76, 0, 36, 1.5, 0.0, 8.0, 6.0, Some(0.0), Some(8.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); } frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 17.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { @@ -84,9 +92,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 9.0, 85, 73, 0, 60, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.2, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 85, 73, 0, 60, 3.5, 4.5, 0.0, 0.0, Some(2.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.2, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 80, 85, 0, 60, 6.0, 0.0, 1.6, 17.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.2, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 9.0, 80, 78, 0, 44, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 80, 78, 0, 44, 3.5, 4.5, 0.0, 0.0, Some(2.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 85, 101, 0, 44, 6.0, 0.0, 1.6, 17.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 13.0); diff --git a/fighters/miigunner/src/attackairf_bullet/acmd.rs b/fighters/miigunner/src/attackairf_bullet/acmd.rs index 3d80d26965..ae30e213b0 100644 --- a/fighters/miigunner/src/attackairf_bullet/acmd.rs +++ b/fighters/miigunner/src/attackairf_bullet/acmd.rs @@ -4,11 +4,16 @@ unsafe extern "C" fn game_fly(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 48, 91, 0, 40, 2.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(-9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + let owner_boma = agent.get_owner_boma(); + if owner_boma.kind() != *FIGHTER_KIND_MIIGUNNER || !VarModule::is_flag(owner_boma.object(), vars::miigunner::instance::BOOSTED_AERIAL_LANDING) { + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 48, 91, 0, 40, 2.8, 0.0, 0.0, 0.0, Some(0.0), Some(-1.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 48, 91, 0, 40, 2.8, 0.0, -0.5, 0.0, Some(0.0), Some(-0.5), Some(-11.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + } } - wait(lua_state, 1.0); + frame(lua_state, 2.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 48, 91, 0, 40, 2.8, 0.0, 0.0, 0.0, Some(0.0), Some(-1.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + AttackModule::clear(boma, 1, false); } wait(lua_state, 4.0); if is_excute(agent) { diff --git a/fighters/miigunner/src/attackairf_bullet/mod.rs b/fighters/miigunner/src/attackairf_bullet/mod.rs index 737c53e5bf..6d08e9a401 100644 --- a/fighters/miigunner/src/attackairf_bullet/mod.rs +++ b/fighters/miigunner/src/attackairf_bullet/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod opff; pub fn install() { let agent = &mut Agent::new("miigunner_attackairf_bullet"); acmd::install(agent); + opff::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/miigunner/src/attackairf_bullet/opff.rs b/fighters/miigunner/src/attackairf_bullet/opff.rs new file mode 100644 index 0000000000..0c19edbf4e --- /dev/null +++ b/fighters/miigunner/src/attackairf_bullet/opff.rs @@ -0,0 +1,12 @@ +use super::*; + +unsafe extern "C" fn airfbullet_frame(weapon: &mut smash::lua2cpp::L2CFighterBase) { + if AttackModule::is_infliction_status(weapon.module_accessor, *COLLISION_KIND_MASK_PARRY | *COLLISION_KIND_MASK_REFLECTOR) { + StatusModule::change_status_request_from_script(weapon.module_accessor, *WEAPON_MIIGUNNER_ATTACKAIRF_BULLET_STATUS_KIND_FLY, false); + MotionModule::change_motion(weapon.module_accessor, Hash40::new("fly"), 0.0, 1.0, false, 0.0, false, false); + } +} + +pub fn install(agent: &mut Agent) { + agent.on_line(Main, airfbullet_frame); +} \ No newline at end of file diff --git a/fighters/miigunner/src/bottomshoot/acmd.rs b/fighters/miigunner/src/bottomshoot/acmd.rs index 6d03dcf721..102515efed 100644 --- a/fighters/miigunner/src/bottomshoot/acmd.rs +++ b/fighters/miigunner/src/bottomshoot/acmd.rs @@ -5,11 +5,12 @@ unsafe extern "C" fn game_shoot(agent: &mut L2CAgentBase) { let boma = agent.boma(); let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if is_excute(agent) { - if VarModule::get_float(owner_module_accessor.object(), vars::miigunner::status::ATTACK_CHARGE) <= 10.0 { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 80, 30, 0, 110, 9.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_ENERGY); + if VarModule::get_float(owner_module_accessor.object(), vars::miigunner::status::ATTACK_CHARGE) <= 10.0 + && !VarModule::is_flag(owner_module_accessor.object(), vars::miigunner::instance::SPECIAL_HI1_AIR_USED) { + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 80, 30, 0, 110, 7.0, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_ENERGY); } else { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 45, 100, 0, 60, 10.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 45, 100, 0, 60, 7.0, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_ENERGY); } } } diff --git a/fighters/miigunner/src/bottomshoot/mod.rs b/fighters/miigunner/src/bottomshoot/mod.rs index 2b62c61361..509fe313a9 100644 --- a/fighters/miigunner/src/bottomshoot/mod.rs +++ b/fighters/miigunner/src/bottomshoot/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod status; pub fn install() { let agent = &mut Agent::new("miigunner_bottomshoot"); acmd::install(agent); + status::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/miigunner/src/bottomshoot/status.rs b/fighters/miigunner/src/bottomshoot/status.rs new file mode 100644 index 0000000000..510e85c0b9 --- /dev/null +++ b/fighters/miigunner/src/bottomshoot/status.rs @@ -0,0 +1,10 @@ +use super::*; + +unsafe extern "C" fn shoot_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + ModelModule::set_scale(weapon.module_accessor, 0.7); + return smashline::original_status(Main, weapon, *WEAPON_MIIGUNNER_BOTTOMSHOOT_STATUS_KIND_SHOOT)(weapon); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *WEAPON_MIIGUNNER_BOTTOMSHOOT_STATUS_KIND_SHOOT, shoot_main); +} \ No newline at end of file diff --git a/fighters/miigunner/src/flamepillar/acmd.rs b/fighters/miigunner/src/flamepillar/acmd.rs new file mode 100644 index 0000000000..c3b3c5c039 --- /dev/null +++ b/fighters/miigunner/src/flamepillar/acmd.rs @@ -0,0 +1,42 @@ +use super::*; + +unsafe extern "C" fn game_shoot(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 80, 80, 0, 40, 3.0, 0.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_ENERGY); + AttackModule::enable_safe_pos(boma); + } +} + +unsafe extern "C" fn game_pillar(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.2, 120, 100, 15, 0, 6.0, 0.0, 2.0, 0.0, None, None, None, 0.6, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 8, true, true, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.2, 120, 100, 15, 0, 4.2, 0.0, 3.0, -1.5, Some(0.0), Some(3.0), Some(1.5), 0.6, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 8, true, true, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.2, 120, 100, 15, 0, 4.5, 0.0, 9.0, 0.0, None, None, None, 0.6, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 8, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + } + wait(lua_state, 30.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.8, 45, 86, 0, 54, 6.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.8, 45, 86, 0, 54, 4.2, 0.0, 3.0, -1.5, Some(0.0), Some(3.0), Some(1.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.8, 45, 86, 0, 54, 4.5, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + } +} + +unsafe extern "C" fn effect_pillar(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT(agent, Hash40::new("miigunner_flame_bomb"), Hash40::new("top"), 0, -2, 0, 0, 0, 0, 0.95, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.6); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_shoot", game_shoot, Priority::Low); + + agent.acmd("game_pillar", game_pillar, Priority::Low); + agent.acmd("effect_pillar", effect_pillar, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miigunner/src/flamepillar/mod.rs b/fighters/miigunner/src/flamepillar/mod.rs new file mode 100644 index 0000000000..fbbd06e14d --- /dev/null +++ b/fighters/miigunner/src/flamepillar/mod.rs @@ -0,0 +1,9 @@ +use super::*; + +mod acmd; + +pub fn install() { + let agent = &mut Agent::new("miigunner_flamepillar"); + acmd::install(agent); + agent.install(); +} \ No newline at end of file diff --git a/fighters/miigunner/src/groundbomb/acmd.rs b/fighters/miigunner/src/groundbomb/acmd.rs index acb8c405be..3c358e04d9 100644 --- a/fighters/miigunner/src/groundbomb/acmd.rs +++ b/fighters/miigunner/src/groundbomb/acmd.rs @@ -4,7 +4,7 @@ unsafe extern "C" fn game_fly(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 90, 100, 20, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 1, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 90, 100, 20, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 1, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 3.75); } } diff --git a/fighters/miigunner/src/gunnercharge/acmd.rs b/fighters/miigunner/src/gunnercharge/acmd.rs index b3f2e1561b..f5c3600f6c 100644 --- a/fighters/miigunner/src/gunnercharge/acmd.rs +++ b/fighters/miigunner/src/gunnercharge/acmd.rs @@ -6,7 +6,7 @@ unsafe extern "C" fn game_shoot(agent: &mut L2CAgentBase) { let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 42, 0, 14, 1.5, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 21.0, 50, 80, 0, 27, 6.0, 0.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -6.5, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 21.0, 50, 80, 0, 27, 5.5, 0.0, 0.0, 0.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -6.5, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); attack!(agent, *MA_MSC_CMD_ATTACK_SET_LERP, 0, 1); AttackModule::enable_safe_pos(boma); } diff --git a/fighters/miigunner/src/lib.rs b/fighters/miigunner/src/lib.rs index affa8a7288..dc59a7ea63 100644 --- a/fighters/miigunner/src/lib.rs +++ b/fighters/miigunner/src/lib.rs @@ -11,6 +11,7 @@ pub mod status; mod attackairf_bullet; mod bottomshoot; +mod flamepillar; mod fullthrottle; mod grenadelauncher; mod groundbomb; @@ -43,6 +44,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -61,6 +63,7 @@ pub fn install() { attackairf_bullet::install(); bottomshoot::install(); + flamepillar::install(); fullthrottle::install(); grenadelauncher::install(); groundbomb::install(); diff --git a/fighters/miigunner/src/opff.rs b/fighters/miigunner/src/opff.rs index e20e7a9245..9774447d10 100644 --- a/fighters/miigunner/src/opff.rs +++ b/fighters/miigunner/src/opff.rs @@ -50,60 +50,44 @@ unsafe fn special_waza_charge_handle(boma: &mut BattleObjectModuleAccessor) { } } -unsafe fn reflector_jc(boma: &mut BattleObjectModuleAccessor) { +unsafe fn reflector_jc(fighter: &mut smash::lua2cpp::L2CFighterCommon) { + let boma = fighter.boma(); if boma.is_motion_one_of(&[Hash40::new("special_lw1_start"), Hash40::new("special_air_lw1_start")]) && WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_FRAME_IN_AIR) <= 1 { GroundModule::correct(boma, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); } + + // resets the disable jump cancel flag if boma.is_status_one_of(&[ - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_HIT, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_END, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_LOOP]) { - if !boma.is_in_hitlag() { - if (boma.is_status(*FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_LOOP) && boma.status_frame() > 1) { - boma.check_jump_cancel(false, false); - } - } + *FIGHTER_STATUS_KIND_SPECIAL_LW, + ]) + && StatusModule::is_changing(boma) { + VarModule::off_flag(boma.object(), vars::miigunner::instance::SPECIAL_LW_DISABLE_JC); } -} - -unsafe fn laser_blaze_ff_land_cancel(fighter: &mut L2CFighterCommon) { - if fighter.is_motion_one_of(&[ - Hash40::new("special_air_n2_start"), - Hash40::new("special_air_n2_loop"), - Hash40::new("special_air_n2_end"), - Hash40::new("special_n2_start"), - Hash40::new("special_n2_loop"), - Hash40::new("special_n2_end") ]) { - let landing_lag = 6.0; - fighter.check_land_cancel(Some(landing_lag)); - if StatusModule::is_changing(fighter.module_accessor) - && fighter.is_situation(*SITUATION_KIND_AIR) { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + // disables jump cancels when parried between statuses + if boma.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, + *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_HIT, + *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_LOOP, + *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_END + ]) + && AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_PARRY) { + VarModule::on_flag(boma.object(), vars::miigunner::instance::SPECIAL_LW_DISABLE_JC); + if !fighter.is_status(*FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_END) + && !fighter.is_in_hitlag() { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_END.into(), false.into()); } } -} -unsafe fn remove_homing_missiles(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status(*FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_1_GROUND) { - StatusModule::change_status_request_from_script(boma, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_GROUND, false); - } - else if boma.is_status(*FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_1_AIR) { - StatusModule::change_status_request_from_script(boma, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR, false); - } -} - -unsafe fn missile_land_cancel(boma: &mut BattleObjectModuleAccessor) { if boma.is_status_one_of(&[ - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_1_AIR, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR ]) { - boma.check_land_cancel(None); - } -} - -unsafe fn stealth_burst_land_cancel(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status(*FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S2_END) { - boma.check_land_cancel(None); + *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_HIT, + *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_LOOP, + *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_END + ]) + && (boma.is_status(*FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_LOOP) && boma.status_frame() > 1) // TODO: this looks like a bug? + && !boma.is_in_hitlag() + && !VarModule::is_flag(boma.object(), vars::miigunner::instance::SPECIAL_LW_DISABLE_JC) { + boma.check_jump_cancel(false, false, false); } } @@ -121,61 +105,22 @@ unsafe fn vortex_item_grab_ac(fighter: &mut L2CFighterCommon) { } unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { - if !fighter.is_in_hitlag() - && !StatusModule::is_changing(fighter.module_accessor) - && ( - fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_S, - *FIGHTER_STATUS_KIND_SPECIAL_HI, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - ]) - || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_1 + if ( + ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_2 ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_S, - *FIGHTER_STATUS_KIND_SPECIAL_HI, *FIGHTER_STATUS_KIND_SPECIAL_LW, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_HOLD, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_START, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_END, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_HIT, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW1_LOOP - ]) - ) - || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_2 - ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) - && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S2_END, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI2_JUMP, ]) ) || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_3 ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) && fighter.is_status_one_of(&[ *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH_END, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW3_END, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW3_HIT, - *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_LW3_HOLD ]) ) ) + && !fighter.is_in_hitlag() + && !StatusModule::is_changing(fighter.module_accessor) && fighter.is_situation(*SITUATION_KIND_AIR) { fighter.sub_air_check_dive(); } @@ -183,11 +128,7 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { special_waza_charge_handle(boma); - reflector_jc(boma); - laser_blaze_ff_land_cancel(fighter); - remove_homing_missiles(boma); - missile_land_cancel(boma); - stealth_burst_land_cancel(boma); + reflector_jc(fighter); vortex_item_grab_ac(fighter); fastfall_specials(fighter); } diff --git a/fighters/miigunner/src/rapidshot_bullet/acmd.rs b/fighters/miigunner/src/rapidshot_bullet/acmd.rs index ddd06229b7..c7a960663e 100644 --- a/fighters/miigunner/src/rapidshot_bullet/acmd.rs +++ b/fighters/miigunner/src/rapidshot_bullet/acmd.rs @@ -11,17 +11,9 @@ unsafe extern "C" fn game_fly(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 100, 3, 0, 1.4, 0.0, 0.0, 0.8, Some(0.0), Some(0.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); } - frame(lua_state, 4.0); + frame(lua_state, 3.0); if is_excute(agent) { - ModelModule::set_scale(boma, 0.9); - } - frame(lua_state, 5.0); - if is_excute(agent) { - ModelModule::set_scale(boma, 0.8); - } - frame(lua_state, 6.0); - if is_excute(agent) { - ModelModule::set_scale(boma, 0.6); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 0, 0, 0, 1.4, 0.0, 0.0, 0.8, Some(0.0), Some(0.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); } frame(lua_state, 7.0); if is_excute(agent) { @@ -41,7 +33,7 @@ unsafe extern "C" fn game_flythrowhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 90, 140, 0, 66, 6.5, 0.0, 0.0, 0.8, Some(0.0), Some(0.0), Some(10.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 90, 140, 0, 64, 6.5, 0.0, 0.0, 0.8, Some(0.0), Some(0.0), Some(10.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MIIGUNNER_BLASTER, *ATTACK_REGION_ENERGY); } } diff --git a/fighters/miigunner/src/status/attack_air.rs b/fighters/miigunner/src/status/attack_air.rs index 9ff4b119a6..af7232bcae 100644 --- a/fighters/miigunner/src/status/attack_air.rs +++ b/fighters/miigunner/src/status/attack_air.rs @@ -1,6 +1,7 @@ use super::*; pub unsafe extern "C" fn attack_air_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::miigunner::status::BOOSTED_AERIAL); VarModule::off_flag(fighter.battle_object, vars::miigunner::instance::BOOSTED_AERIAL_LANDING); fighter.sub_attack_air(); fighter.main_shift(attack_air_main_loop) @@ -16,8 +17,14 @@ unsafe extern "C" fn attack_air_main_loop(fighter: &mut L2CFighterCommon) -> L2C // transition to boosted aerial motions if VarModule::is_flag(fighter.battle_object, vars::miigunner::status::BOOSTED_AERIAL) { - VarModule::off_flag(fighter.battle_object, vars::miigunner::status::BOOSTED_AERIAL); - if fighter.is_button_on(Buttons::Attack) { + // cancel boosted aerial input if not holding the button until the check frame + if fighter.is_button_release(Buttons::Attack) { + VarModule::off_flag(fighter.battle_object, vars::miigunner::status::BOOSTED_AERIAL); + } + if VarModule::is_flag(fighter.battle_object, vars::miigunner::status::CHECK_BOOSTED_AERIAL) + && VarModule::is_flag(fighter.battle_object, vars::miigunner::status::BOOSTED_AERIAL) { + VarModule::off_flag(fighter.battle_object, vars::miigunner::status::CHECK_BOOSTED_AERIAL); + VarModule::off_flag(fighter.battle_object, vars::miigunner::status::BOOSTED_AERIAL); VarModule::on_flag(fighter.battle_object, vars::miigunner::instance::BOOSTED_AERIAL_LANDING); let motion = if fighter.is_motion(Hash40::new("attack_air_f")) { Hash40::new("attack_air_f_boost") } else if fighter.is_motion(Hash40::new("attack_air_b")) { Hash40::new("attack_air_b_boost") } diff --git a/fighters/miigunner/src/status/mod.rs b/fighters/miigunner/src/status/mod.rs index 5dc0a4d681..1109385f6d 100644 --- a/fighters/miigunner/src/status/mod.rs +++ b/fighters/miigunner/src/status/mod.rs @@ -6,9 +6,16 @@ mod attack_air; //mod down; //mod landing_attack_air; mod landing_fall_special; -mod special_hi; -mod special_n; -mod special_s; + +mod special_hi1; +mod special_hi3; + +mod special_n1; +mod special_n2; +mod special_n3; + +mod special_s2; +mod special_s3; unsafe fn set_move_customizer(fighter: &mut L2CFighterCommon, customizer: unsafe extern "C" fn(&mut L2CFighterCommon) -> L2CValue) { if fighter.global_table["move_customizer_set"].get_bool() { @@ -35,21 +42,59 @@ unsafe extern "C" fn move_customizer(fighter: &mut L2CFighterCommon) -> L2CValue if let Some(original) = get_original_customizer(fighter) { original(fighter); } - if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_1 { + if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_2 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_n2::special_n2_main as *const ()) + ); + } + if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_2 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_s2::special_s2_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_s2::special_s2_end as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_3 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), + std::mem::transmute(special_s3::special_s3_pre as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_1 { fighter.sv_set_status_func( FIGHTER_STATUS_KIND_SPECIAL_HI.into(), LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), - std::mem::transmute(special_hi::special_hi1_pre as *const ()) + std::mem::transmute(special_hi1::special_hi1_pre as *const ()) ); fighter.sv_set_status_func( FIGHTER_STATUS_KIND_SPECIAL_HI.into(), LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), - std::mem::transmute(special_hi::special_hi1_main as *const ()) + std::mem::transmute(special_hi1::special_hi1_main as *const ()) ); fighter.sv_set_status_func( FIGHTER_STATUS_KIND_SPECIAL_HI.into(), LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), - std::mem::transmute(special_hi::special_hi1_end as *const ()) + std::mem::transmute(special_hi1::special_hi1_end as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_3 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_HI.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), + std::mem::transmute(special_hi3::special_hi3_pre as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_HI.into(), + LUA_SCRIPT_STATUS_FUNC_EXIT_STATUS.into(), + std::mem::transmute(special_hi3::special_hi3_exit as *const ()) ); } @@ -58,16 +103,24 @@ unsafe extern "C" fn move_customizer(fighter: &mut L2CFighterCommon) -> L2CValue // Prevents side special from being used if a missile is present unsafe extern "C" fn should_use_special_s_callback(fighter: &mut L2CFighterCommon) -> L2CValue { - // Grab the stored missile ID - let missile_object_id = VarModule::get_int(fighter.battle_object, vars::miigunner::instance::SPECIAL_S3_MISSILE_OBJECT_ID) as u32; - // Check if the stored object ID is *actually* a Gunner missile or not. - if sv_battle_object::is_active(missile_object_id) - && sv_battle_object::category(missile_object_id) == *BATTLE_OBJECT_CATEGORY_WEAPON - && sv_battle_object::kind(missile_object_id) == *WEAPON_KIND_MIIGUNNER_SUPERMISSILE { - false.into() - } else { - true.into() + if WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_CUSTOMIZE_SPECIAL_S_NO) == 1 { + if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB) + || ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB_S) { + return false.into(); + } + } + if WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_CUSTOMIZE_SPECIAL_S_NO) == 2 { + // Grab the stored missile ID + let missile_object_id = VarModule::get_int(fighter.battle_object, vars::miigunner::instance::SPECIAL_S3_MISSILE_OBJECT_ID) as u32; + // Check if the stored object ID is *actually* a Gunner missile or not. + if sv_battle_object::is_active(missile_object_id) + && sv_battle_object::category(missile_object_id) == *BATTLE_OBJECT_CATEGORY_WEAPON + && sv_battle_object::kind(missile_object_id) == *WEAPON_KIND_MIIGUNNER_SUPERMISSILE { + return false.into(); + } } + + return true.into(); } unsafe extern "C" fn should_use_special_lw_callback(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -81,7 +134,7 @@ unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { VarModule::off_flag(fighter.battle_object, vars::miigunner::instance::BOOSTED_ATTACK_AIR_LW_AIRTIME); - VarModule::off_flag(fighter.battle_object, vars::miigunner::instance::SPECIAL_HI1_LAUNCH_AIR_USED); + VarModule::off_flag(fighter.battle_object, vars::miigunner::instance::SPECIAL_HI1_AIR_USED); } true.into() } @@ -94,6 +147,21 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); } +unsafe extern "C" fn damage_fly_main(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB, ArticleOperationTarget(0)); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DAMAGE_FLY)(fighter) +} + +unsafe extern "C" fn damage_fly_roll_main(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB, ArticleOperationTarget(0)); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL)(fighter) +} + +unsafe extern "C" fn damage_fly_meteor_main(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB, ArticleOperationTarget(0)); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR)(fighter) +} + pub fn install(agent: &mut Agent) { agent.on_start(on_start); @@ -101,7 +169,13 @@ pub fn install(agent: &mut Agent) { //down::install(agent); //landing_attack_air::install(agent); landing_fall_special::install(agent); - special_hi::install(agent); - special_n::install(agent); - special_s::install(agent); + special_hi3::install(agent); + special_n1::install(agent); + special_n3::install(agent); + special_s3::install(agent); + special_s2::install(agent); + + agent.status(Main, *FIGHTER_STATUS_KIND_DAMAGE_FLY, damage_fly_main); + agent.status(Main, *FIGHTER_STATUS_KIND_DAMAGE_FLY_ROLL, damage_fly_roll_main); + agent.status(Main, *FIGHTER_STATUS_KIND_DAMAGE_FLY_METEOR, damage_fly_meteor_main); } \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_hi.rs b/fighters/miigunner/src/status/special_hi1.rs similarity index 52% rename from fighters/miigunner/src/status/special_hi.rs rename to fighters/miigunner/src/status/special_hi1.rs index 2f3a738940..1073efc22a 100644 --- a/fighters/miigunner/src/status/special_hi.rs +++ b/fighters/miigunner/src/status/special_hi1.rs @@ -57,13 +57,13 @@ unsafe extern "C" fn special_hi1_main_loop(fighter: &mut L2CFighterCommon) -> L2 } special_hi1_charge(fighter); // handle actionability - if fighter.status_frame() >= 35 && VarModule::get_float(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE) <= 10.0 { + if fighter.motion_frame() > 46.0 && VarModule::get_float(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE) <= 10.0 { // if already used once this airtime - if VarModule::is_flag(fighter.battle_object, vars::miigunner::instance::SPECIAL_HI1_LAUNCH_AIR_USED) { + if VarModule::is_flag(fighter.battle_object, vars::miigunner::instance::SPECIAL_HI1_AIR_USED) { VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); } else { - VarModule::on_flag(fighter.battle_object, vars::miigunner::instance::SPECIAL_HI1_LAUNCH_AIR_USED); + VarModule::on_flag(fighter.battle_object, vars::miigunner::instance::SPECIAL_HI1_AIR_USED); fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); return 1.into(); } @@ -102,89 +102,4 @@ unsafe extern "C" fn special_hi1_charge(fighter: &mut L2CFighterCommon) { pub unsafe extern "C" fn special_hi1_end(fighter: &mut L2CFighterCommon) -> L2CValue { EFFECT_OFF_KIND(fighter, Hash40::new("miigunner_bottom_shot"), false, false); return 0.into(); -} - -unsafe extern "C" fn special_hi3_rush_main(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.off_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE); - fighter.set_int(0, *FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_INT_RUSH_FRAME); - fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_special_hi3_rush as *const () as _)); - fighter.set_int(*FIGHTER_STATUS_KIND_FALL_SPECIAL, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_WORK_INT_STATUS_KIND_END); - - fighter.main_shift(special_hi3_rush_main_loop) -} - -unsafe extern "C" fn special_hi3_rush_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if StatusModule::is_changing(fighter.module_accessor) - || StatusModule::is_situation_changed(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.off_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_AIR); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_BRAKE); - if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE) { - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_hi3"), -1.0, 1.0, 0.0, false, false); - } - else { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi3"), 0.0, 1.0, false, 0.0, false, false); - fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE); - } - fighter.sub_fighter_cliff_check(L2CValue::I32(*GROUND_CLIFF_CHECK_KIND_NONE)); - } - else { - fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_AIR); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_BRAKE); - if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE) { - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_hi3"), -1.0, 1.0, 0.0, false, false); - } - else { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi3"), 0.0, 1.0, false, 0.0, false, false); - fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE); - } - fighter.sub_fighter_cliff_check(L2CValue::I32(*GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES)); - } - } - if fighter.sub_transition_group_check_air_cliff().get_bool() { - return 1.into(); - } - if MotionModule::is_end(fighter.module_accessor) || fighter.status_frame() > 16 { - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH_END.into(), false.into()); - } - - return 0.into(); -} - -unsafe extern "C" fn sub_special_hi3_rush(fighter: &mut L2CFighterCommon, param: bool) -> L2CValue { - if param { - fighter.inc_int(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_INT_RUSH_FRAME); - } - - return 0.into(); -} - -unsafe extern "C" fn special_hi3_rush_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi3_end"), 0.0, 1.0, false, 0.0, false, false); - fighter.set_int(*FIGHTER_STATUS_KIND_FALL_SPECIAL, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_WORK_INT_STATUS_KIND_END); - - fighter.main_shift(special_hi3_rush_end_main_loop) -} - -unsafe extern "C" fn special_hi3_rush_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.sub_transition_group_check_air_cliff().get_bool() { - return 1.into(); - } - if fighter.status_frame() > 11 - && !VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL) { - VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - } - if MotionModule::is_end(fighter.module_accessor) { - fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); - } - - return 0.into(); -} - -pub fn install(agent: &mut Agent) { - agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH, special_hi3_rush_main); - agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH_END, special_hi3_rush_end_main); } \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_hi3.rs b/fighters/miigunner/src/status/special_hi3.rs new file mode 100644 index 0000000000..57d6e286b7 --- /dev/null +++ b/fighters/miigunner/src/status/special_hi3.rs @@ -0,0 +1,156 @@ +use super::*; + +pub unsafe extern "C" fn special_hi3_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_MOTION_CLIFF_MOVE, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_HI | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_HI as u32, + 0 + ); + + return 0.into(); +} + +pub unsafe extern "C" fn special_hi3_exit(fighter: &mut L2CFighterCommon) -> L2CValue { + return 0.into(); +} + +unsafe extern "C" fn special_hi3_rush_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.off_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE); + fighter.set_int(0, *FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_INT_RUSH_FRAME); + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_special_hi3_rush as *const () as _)); + fighter.set_int(*FIGHTER_STATUS_KIND_FALL_SPECIAL, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_WORK_INT_STATUS_KIND_END); + + fighter.main_shift(special_hi3_rush_main_loop) +} + +unsafe extern "C" fn special_hi3_rush_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) + || StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.off_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_AIR); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_BRAKE); + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_hi3"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi3"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE); + } + fighter.sub_fighter_cliff_check(L2CValue::I32(*GROUND_CLIFF_CHECK_KIND_NONE)); + } + else { + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_AIR); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_BRAKE); + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_hi3"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi3"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLAG_CONTINUE); + } + fighter.sub_fighter_cliff_check(L2CValue::I32(*GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES)); + } + } + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + fighter.check_wall_jump_cancel(); + let rot = fighter.get_float(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_FLOAT_ROT_X); + VarModule::set_float(fighter.battle_object, vars::miigunner::instance::SPECIAL_HI3_ROT, rot); + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH_END.into(), false.into()); + } + + return 0.into(); +} + +unsafe extern "C" fn sub_special_hi3_rush(fighter: &mut L2CFighterCommon, param: bool) -> L2CValue { + if param { + fighter.inc_int(*FIGHTER_MIIGUNNER_STATUS_ARM_ROCKET_RUSH_INT_RUSH_FRAME); + } + + return 0.into(); +} + +unsafe extern "C" fn special_hi3_rush_exit(fighter: &mut L2CFighterCommon) -> L2CValue { + return 0.into(); +} + +unsafe extern "C" fn special_hi3_rush_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_AIR_STOP, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_MIIGUNNER_ARM_ROCKET_RUSH_END_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_MIIGUNNER_ARM_ROCKET_RUSH_END_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_MIIGUNNER_ARM_ROCKET_RUSH_END_FLOAT, + *FS_SUCCEEDS_KEEP_ATTACK + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_KEEP as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_HI as u32, + 0 + ); + + return 0.into(); +} + +unsafe extern "C" fn special_hi3_rush_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi3_end"), 0.0, 1.0, false, 0.0, false, false); + fighter.set_int(*FIGHTER_STATUS_KIND_FALL_SPECIAL, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_WORK_INT_STATUS_KIND_END); + + fighter.main_shift(special_hi3_rush_end_main_loop) +} + +unsafe extern "C" fn special_hi3_rush_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if fighter.motion_frame() <= 12.0 { + fighter.check_wall_jump_cancel(); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, *FIGHTER_STATUS_KIND_FALL_SPECIAL, false); + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH, special_hi3_rush_main); + agent.status(Exit, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH, special_hi3_rush_exit); + + agent.status(Pre, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH_END, special_hi3_rush_end_pre); + agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_HI3_RUSH_END, special_hi3_rush_end_main); +} \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_n.rs b/fighters/miigunner/src/status/special_n.rs deleted file mode 100644 index 4444117654..0000000000 --- a/fighters/miigunner/src/status/special_n.rs +++ /dev/null @@ -1,329 +0,0 @@ -use super::*; - -pub unsafe extern "C" fn special_n1_hold_main(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK, *GROUND_CORRECT_KIND_AIR); - fighter.sub_change_kinetic_type_by_situation(FIGHTER_KINETIC_TYPE_GROUND_STOP.into(), FIGHTER_KINETIC_TYPE_AIR_STOP.into()); - fighter.change_motion_by_situation("special_n1_hold", "special_air_n1_hold", 0.0, 1.0, false, 0.0, false, false); - fighter.set_int(*STATUS_KIND_NONE, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); - WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_GUARD); - WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_JUMP); - WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_ESCAPE); - ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8); - - fighter.main_shift(special_n1_hold_main_loop) -} - -pub unsafe extern "C" fn special_n1_hold_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.is_pad_flag(PadFlag::SpecialTrigger) - || fighter.is_pad_flag(PadFlag::AttackTrigger) { - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE.into(), false.into()); - return 1.into(); - } - if fighter.is_situation(*SITUATION_KIND_GROUND) { - if fighter.sub_check_command_guard().get_bool() || fighter.is_pad_flag(PadFlag::GuardTrigger) { - fighter.set_int(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), true.into()); - return 0.into(); - } - if fighter.sub_check_jump_in_charging_for_cancel_status((*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS).into()).get_bool() { - fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_SQUAT, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), true.into()); - return 0.into(); - } - } - else { - if fighter.is_cat_flag(Cat1::AirEscape) { - fighter.set_int(*STATUS_KIND_NONE, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), true.into()); - return 0.into(); - } - if fighter.sub_check_jump_in_charging_for_cancel_status((*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS).into()).get_bool() { - fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_AERIAL, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), true.into()); - return 0.into(); - } - } - if StatusModule::is_situation_changed(fighter.module_accessor) { - fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK, *GROUND_CORRECT_KIND_AIR); - fighter.sub_change_kinetic_type_by_situation(FIGHTER_KINETIC_TYPE_GROUND_STOP.into(), FIGHTER_KINETIC_TYPE_AIR_STOP.into()); - fighter.change_motion_inherit_frame_by_situation("special_n1_hold", "special_air_n1_hold", -1.0, 1.0, 0.0, false, false); - } - if !fighter.global_table[IS_STOPPING].get_bool() { - fighter.inc_int(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); - let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); - let n1_cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); - if charge_count as f32 >= n1_cshot_charge_frame { - fighter.set_int(n1_cshot_charge_frame as i32, *FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), false.into()); - return 1.into(); - } - else { - if fighter.is_pad_flag(PadFlag::SpecialTrigger) - || fighter.is_pad_flag(PadFlag::AttackTrigger) { - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE.into(), false.into()); - return 1.into(); - } - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x322bb60c04), charge_count as f32 / n1_cshot_charge_frame); - } - } - else { - let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); - let n1_cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x322bb60c04), charge_count as f32 / n1_cshot_charge_frame); - } - - return 0.into(); -} - -pub unsafe extern "C" fn special_n1_fire_main(fighter: &mut L2CFighterCommon) -> L2CValue { - let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_COUNT); - let n1_cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); - if (charge_count as f32) < n1_cshot_charge_frame { - let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { - Hash40::new("special_n1_fire") - } - else { - Hash40::new("special_air_n1_fire") - }; - MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); - } - else { - let motion = if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - Hash40::new("special_n1_neon") - } - else { - Hash40::new("special_air_n1_neon") - } - } - else { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - Hash40::new("special_n1_fire_max") - } - else { - Hash40::new("special_air_n1_fire_max") - } - }; - MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); - } - if fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - } - else { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); - } - fighter.set_int(0, *FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, *FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, *FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01 as i32 - 1); - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01) + -1); - - fighter.main_shift(special_n1_fire_main_loop) -} - -pub unsafe extern "C" fn special_n1_fire_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if CancelModule::is_enable_cancel(fighter.module_accessor) { - if fighter.sub_wait_ground_check_common(false.into()).get_bool() - || fighter.sub_air_check_fall_common().get_bool() { - return 1.into(); - } - } - if MotionModule::is_end(fighter.module_accessor) { - fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); - return 0.into(); - } - if !StatusModule::is_changing(fighter.module_accessor) - && StatusModule::is_situation_changed(fighter.module_accessor) { - fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK, *GROUND_CORRECT_KIND_AIR); - if (fighter.is_motion(Hash40::new("special_n1_fire")) || fighter.is_motion(Hash40::new("special_air_n1_fire"))) { - fighter.change_motion_inherit_frame_keep_rate_by_situation("special_n1_fire", "special_air_n1_fire", -1.0, 1.0, 0.0); - } - else if (fighter.is_motion(Hash40::new("special_n1_fire_max")) || fighter.is_motion(Hash40::new("special_air_n1_fire_max"))) { - fighter.change_motion_inherit_frame_keep_rate_by_situation("special_n1_fire_max", "special_air_n1_fire_max", -1.0, 1.0, 0.0); - } - else { - fighter.change_motion_inherit_frame_keep_rate_by_situation("special_n1_neon", "special_air_n1_neon", -1.0, 1.0, 0.0); - } - } - - return 0.into(); -} - -// pub unsafe extern "C" fn special_n1_cancel_main(fighter: &mut L2CFighterCommon) -> L2CValue { -// let cancel_status = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); -// if fighter.is_situation(*SITUATION_KIND_GROUND) { -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); -// KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); -// MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n1_cancel"), 0.0, 1.0, false, 0.0, false, false); -// } -// else { -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); -// KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); -// let motion = if cancel_status == *FIGHTER_STATUS_KIND_JUMP_AERIAL { -// Hash40::new("special_air_n1_jump_cancel") -// } else if cancel_status == *FIGHTER_STATUS_KIND_FLY { -// Hash40::new("special_air_n1_jump_cancel") -// } else { -// Hash40::new("special_air_n1_cancel") -// }; -// MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); -// } -// if cancel_status == *STATUS_KIND_NONE { -// ControlModule::set_rumble(fighter.module_accessor, Hash40::new("rbkind_attackm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32) -// } -// ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8); - -// fighter.main_shift(special_n1_cancel_main_loop) -// } - -// pub unsafe extern "C" fn special_n1_cancel_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { -// let cancel_status = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); -// fighter.sub_check_charge_cancel_jump_mini_attack(); -// if fighter.is_situation(*SITUATION_KIND_GROUND) { -// if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_ATTACK) -// && cancel_status == *FIGHTER_STATUS_KIND_JUMP_SQUAT { -// FighterControlModuleImpl::update_attack_air_kind(fighter.module_accessor, true); -// } -// } -// if cancel_status != *STATUS_KIND_NONE { -// // if !CancelModule::is_enable_cancel(fighter.module_accessor) { -// // if !MotionModule::is_end(fighter.module_accessor) { -// // // goto -// // } -// // } -// if cancel_status == *FIGHTER_STATUS_KIND_GUARD_ON { -// //if !ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_GUARD) {} -// fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); -// return 0.into(); -// } -// } -// if CancelModule::is_enable_cancel(fighter.module_accessor) { -// if fighter.sub_wait_ground_check_common(false.into()).get_bool() -// || !fighter.sub_air_check_fall_common().get_bool() { -// return 0.into(); -// } -// } -// if MotionModule::is_end(fighter.module_accessor) { -// fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); -// return 0.into(); -// } -// if StatusModule::is_situation_changed(fighter.module_accessor) { -// if fighter.is_situation(*SITUATION_KIND_GROUND) { -// let motion = if fighter.kind == *FIGHTER_KIND_KIRBY { Hash40::new("miigunner_special_air_n1_jump_cancel") } else { Hash40::new("special_air_n1_jump_cancel") }; -// if MotionModule::motion_kind(fighter.module_accessor) == motion { -// fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), true.into()); -// return 0.into(); -// } -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); -// KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); -// MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_n1_cancel"), -1.0, 1.0, 0.0, false, false); -// fighter.set_int(*STATUS_KIND_NONE, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); -// } -// else { -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); -// KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); -// MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_n1_cancel"), -1.0, 1.0, 0.0, false, false); -// fighter.set_int(*STATUS_KIND_NONE, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); -// } -// } - -// return 0.into(); -// } - -pub unsafe extern "C" fn special_n3_loop_main(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.sub_air_check_dive(); - if !StopModule::is_stop(fighter.module_accessor) { - sub_special_n3_loop(fighter, false.into()); - } - - fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_special_n3_loop as *const () as _)); - fighter.main_shift(special_n3_loop_main_loop) -} - -unsafe extern "C" fn sub_special_n3_loop(fighter: &mut L2CFighterCommon, param: L2CValue) -> L2CValue { - if param.get_bool() { - fighter.inc_int(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_WORK_INT_HOLD_COUNT); - } - // else { - // if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { - // fighter.global_table[SUB_STATUS2].assign(&L2CValue::I32(0)); - // fighter.global_table[SUB_STATUS].assign(&L2CValue::I32(0)); - // } - // else { - // let hold_count = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_WORK_INT_HOLD_COUNT); - // let max_hold = fighter.get_param_int("param_special_n", "n3_hold_max_frame"); - // if hold_count > max_hold { - // fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_MAX); - // fighter.global_table[SUB_STATUS2].assign(&L2CValue::I32(0)); - // fighter.global_table[SUB_STATUS].assign(&L2CValue::I32(0)); - // } - // } - // } - - return 0.into(); -} - -pub unsafe extern "C" fn special_n3_loop_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if StatusModule::is_changing(fighter.module_accessor) - || StatusModule::is_situation_changed(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); - if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_FIRST) { - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_n3_loop"), -1.0, 1.0, 0.0, false, false); - } else { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n3_loop"), 0.0, 1.0, false, 0.0, false, false); - fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_FIRST); - }; - } - else { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_FIRST) { - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_n3_loop"), -1.0, 1.0, 0.0, false, false); - } else { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n3_loop"), 0.0, 1.0, false, 0.0, false, false); - fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_FIRST); - }; - } - } - //special_n3_charge(fighter); - if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { - //|| fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_MAX) { - fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N3_END.into(), true.into()); - return 1.into(); - } - - return 0.into(); -} - -// unsafe extern "C" fn special_n3_charge(fighter: &mut L2CFighterCommon) { -// let charge = VarModule::get_float(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE); -// let mut charge_start_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_charge.special_n3_charge_start"); -// let mut charge_end_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_charge.special_n3_charge_end"); -// let mut max_charge_frames = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_charge.max_charge_frames"); -// if (charge_start_frame..charge_end_frame).contains(&fighter.motion_frame()) && charge < max_charge_frames -// && ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { -// let motion_rate = (charge_end_frame - charge_start_frame)/max_charge_frames; -// MotionModule::set_rate(fighter.module_accessor, motion_rate); -// VarModule::set_float(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE, charge + 1.0); -// } -// else { -// VarModule::set_float(fighter.battle_object, vars::miigunner::instance::SPECIAL_N3_CHARGE, charge); -// MotionModule::set_rate(fighter.module_accessor, 1.0); -// } -// } - -pub unsafe extern "C" fn special_n3_end_exec(fighter: &mut L2CFighterCommon) -> L2CValue { - fighter.sub_air_check_dive(); - return 0.into(); -} - -pub fn install(agent: &mut Agent) { - agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_HOLD, special_n1_hold_main); - agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE, special_n1_fire_main); - - agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N3_LOOP, special_n3_loop_main); - agent.status(Exec, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N3_END, special_n3_end_exec); -} \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_n1.rs b/fighters/miigunner/src/status/special_n1.rs new file mode 100644 index 0000000000..96b7d4a895 --- /dev/null +++ b/fighters/miigunner/src/status/special_n1.rs @@ -0,0 +1,227 @@ +use super::*; + +pub unsafe extern "C" fn special_n1_start_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n1_start"), 0.0, 1.0, false, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n1_start"), 0.0, 1.0, false, 0.0, false, false); + } + VarModule::on_flag(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE); + ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8); + + fighter.main_shift(special_n1_start_main_loop) +} + +pub unsafe extern "C" fn special_n1_start_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if ControlModule::check_button_release(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + VarModule::off_flag(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE); + } + if MotionModule::is_end(fighter.module_accessor) { + let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); + let cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); + if charge_count as f32 >= cshot_charge_frame { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE.into(), false.into()); + } + else { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_HOLD.into(), false.into()); + } + return 1.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_n1_start"), -1.0, 1.0, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_n1_start"), -1.0, 1.0, 0.0, false, false); + } + } + + return 0.into(); +} + +pub unsafe extern "C" fn special_n1_hold_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK, *GROUND_CORRECT_KIND_AIR); + fighter.sub_change_kinetic_type_by_situation(FIGHTER_KINETIC_TYPE_GROUND_STOP.into(), FIGHTER_KINETIC_TYPE_AIR_STOP.into()); + fighter.change_motion_by_situation("special_n1_hold", "special_air_n1_hold", 0.0, 1.0, false, 0.0, false, false); + fighter.set_int(*STATUS_KIND_NONE, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_GUARD); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_JUMP); + WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_ESCAPE); + ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8); + + fighter.main_shift(special_n1_hold_main_loop) +} + +pub unsafe extern "C" fn special_n1_hold_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_pad_flag(PadFlag::SpecialTrigger) + || fighter.is_pad_flag(PadFlag::AttackTrigger) { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE.into(), false.into()); + return 1.into(); + } + if fighter.is_situation(*SITUATION_KIND_GROUND) { + if fighter.sub_check_command_guard().get_bool() || fighter.is_pad_flag(PadFlag::GuardTrigger) { + fighter.set_int(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), true.into()); + return 0.into(); + } + if fighter.sub_check_jump_in_charging_for_cancel_status((*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS).into()).get_bool() { + fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_SQUAT, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), true.into()); + return 0.into(); + } + } + else { + if fighter.is_cat_flag(Cat1::AirEscape) { + fighter.set_int(*STATUS_KIND_NONE, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), true.into()); + return 0.into(); + } + if fighter.sub_check_jump_in_charging_for_cancel_status((*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS).into()).get_bool() { + fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_AERIAL, *FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_CANCEL_STATUS); + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), true.into()); + return 0.into(); + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK, *GROUND_CORRECT_KIND_AIR); + fighter.sub_change_kinetic_type_by_situation(FIGHTER_KINETIC_TYPE_GROUND_STOP.into(), FIGHTER_KINETIC_TYPE_AIR_STOP.into()); + fighter.change_motion_inherit_frame_by_situation("special_n1_hold", "special_air_n1_hold", -1.0, 1.0, 0.0, false, false); + } + if !fighter.global_table[IS_STOPPING].get_bool() { + fighter.inc_int(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); + let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); + let n1_cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); + if charge_count as f32 >= n1_cshot_charge_frame { + fighter.set_int(n1_cshot_charge_frame as i32, *FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_CANCEL.into(), false.into()); + return 1.into(); + } + else { + if fighter.is_pad_flag(PadFlag::SpecialTrigger) + || fighter.is_pad_flag(PadFlag::AttackTrigger) { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE.into(), false.into()); + return 1.into(); + } + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x322bb60c04), charge_count as f32 / n1_cshot_charge_frame); + } + } + else { + let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); + let n1_cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x322bb60c04), charge_count as f32 / n1_cshot_charge_frame); + } + + return 0.into(); +} + +pub unsafe extern "C" fn special_n1_fire_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let charge_count = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_GUNNER_CHARGE_WORK_INT_COUNT); + let n1_cshot_charge_frame = fighter.get_param_float("param_special_n", "n1_cshot_charge_frame"); + if (charge_count as f32) < n1_cshot_charge_frame { + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { + Hash40::new("special_n1_fire") + } + else { + Hash40::new("special_air_n1_fire") + }; + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + } + else { + let motion = if VarModule::is_flag(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + Hash40::new("special_n1_neon") + } + else { + Hash40::new("special_air_n1_neon") + } + } + else { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + Hash40::new("special_n1_fire_max") + } + else { + Hash40::new("special_air_n1_fire_max") + } + }; + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + } + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } + fighter.set_int(0, *FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_INT_GUNNER_CHARGE_COUNT); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, *FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, *FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01 as i32 - 1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01) + -1); + + fighter.main_shift(special_n1_fire_main_loop) +} + +pub unsafe extern "C" fn special_n1_fire_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 0.into(); + } + if !StatusModule::is_changing(fighter.module_accessor) { + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK, *GROUND_CORRECT_KIND_AIR); + if (fighter.is_motion(Hash40::new("special_n1_fire")) || fighter.is_motion(Hash40::new("special_air_n1_fire"))) { + fighter.change_motion_inherit_frame_keep_rate_by_situation("special_n1_fire", "special_air_n1_fire", -1.0, 1.0, 0.0); + } + else if (fighter.is_motion(Hash40::new("special_n1_fire_max")) || fighter.is_motion(Hash40::new("special_air_n1_fire_max"))) { + fighter.change_motion_inherit_frame_keep_rate_by_situation("special_n1_fire_max", "special_air_n1_fire_max", -1.0, 1.0, 0.0); + } + else { + fighter.change_motion_inherit_frame_keep_rate_by_situation("special_n1_neon", "special_air_n1_neon", -1.0, 1.0, 0.0); + } + } + if fighter.is_motion_one_of(&[Hash40::new("special_n1_neon"), Hash40::new("special_air_n1_neon")]) { + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) + && !VarModule::is_flag(fighter.battle_object, vars::miigunner::status::SPECIAL_N1_CLEAR_CRIT) { + VarModule::on_flag(fighter.battle_object, vars::miigunner::status::SPECIAL_N1_CLEAR_CRIT); + SlowModule::set_whole(fighter.module_accessor, 4, 5); + EffectModule::req_screen(fighter.module_accessor, Hash40::new("bg_criticalhit"), false, true, true); + } + } + } + + return 0.into(); +} + +pub unsafe extern "C" fn special_n1_fire_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::miifighter::status::SPECIAL_LW3_CLEAR_CRIT) { + SlowModule::clear_whole(fighter.module_accessor); + CameraModule::reset_all(fighter.module_accessor); + EffectModule::remove_screen(fighter.module_accessor, Hash40::new("bg_criticalhit"), 0); + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_START, special_n1_start_main); + + agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_HOLD, special_n1_hold_main); + + agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE, special_n1_fire_main); + agent.status(End, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N1_FIRE, special_n1_fire_end); +} \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_n2.rs b/fighters/miigunner/src/status/special_n2.rs new file mode 100644 index 0000000000..fa7611c71b --- /dev/null +++ b/fighters/miigunner/src/status/special_n2.rs @@ -0,0 +1,222 @@ +use super::*; + +pub unsafe extern "C" fn special_n2_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.off_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + fighter.set_int(*FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_START, *FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_INT_STEP_PREV); + special_n2_change_motion(fighter); + if !StopModule::is_stop(fighter.module_accessor) { + sub_special_n2(fighter, false.into()); + } + + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_special_n2 as *const () as _)); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) + -1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) + -1); + + fighter.main_shift(special_n2_main_loop) +} + +unsafe fn special_n2_change_motion(fighter: &mut L2CFighterCommon) { + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("special_n2_start") } else { Hash40::new("special_air_n2_start") }; + if fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, motion, -1.0, 1.0, 0.0); + } + else { + MotionModule::change_motion(fighter.module_accessor, motion, 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + } +} + +unsafe extern "C" fn sub_special_n2(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { + if param_1.get_bool() { + if fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_LOOP_ACCEPT) + && fighter.is_pad_flag(PadFlag::SpecialTrigger) { + fighter.on_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_LOOP); + } + } + + return 0.into(); +} + +unsafe extern "C" fn special_n2_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if fighter.is_situation(*SITUATION_KIND_AIR) { + fighter.sub_air_check_dive(); + } + fighter.check_land_cancel(Some(6.0)); + let mut step = fighter.get_int(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_INT_STEP); + let mut change_motion = false; + if !StatusModule::is_changing(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_START { + if MotionModule::is_end(fighter.module_accessor) { + fighter.off_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + change_motion = true; + } + else if fighter.is_prev_situation(*SITUATION_KIND_AIR) { + change_motion = true; + } + } + else if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_SHOT { + if MotionModule::is_end(fighter.module_accessor) { + fighter.off_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + change_motion = true; + } + else if fighter.is_prev_situation(*SITUATION_KIND_AIR) { + change_motion = true; + } + } + else if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_END { + if some_func_ass_func(fighter) { + return 0.into(); + } + if fighter.is_prev_situation(*SITUATION_KIND_AIR) { + change_motion = true; + } + } + } + else { + if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_START { + if MotionModule::is_end(fighter.module_accessor) { + fighter.off_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + change_motion = true; + } + else if fighter.is_prev_situation(*SITUATION_KIND_AIR) { + change_motion = true; + } + } + else if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_SHOT { + if MotionModule::is_end(fighter.module_accessor) { + fighter.off_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + change_motion = true; + } + else if fighter.is_prev_situation(*SITUATION_KIND_AIR) { + change_motion = true; + } + } + else if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_END { + if some_func_ass_func(fighter) { + return 0.into(); + } + if fighter.is_prev_situation(*SITUATION_KIND_GROUND) { + change_motion = true; + } + } + } + } + if change_motion { + if step != *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_SHOT { + if MotionModule::is_end(fighter.module_accessor) { + fighter.inc_int(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_INT_STEP); + } + } + else { + if MotionModule::is_end(fighter.module_accessor) { + if !fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_LOOP) { + fighter.set_int(*FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_END, *FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_INT_STEP); + } + else { + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2b94de0d96), FIGHTER_LOG_ACTION_CATEGORY_ATTACK, FIGHTER_LOG_ATTACK_KIND_SPECIAL_N, true); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_SHOOT_NUM); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) + -1); + } + fighter.off_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_LOOP); + ControlModule::clear_command(fighter.module_accessor, true); + } + } + step = fighter.get_int(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_INT_STEP); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_FALL); + if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_START { + func_two_electric_boogaloo(fighter); + } + else if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_SHOT { + if fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_n2_loop"), -1.0, 1.0, 0.0); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n2_loop"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + } + } + else if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_END { + if fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_n2_end"), -1.0, 1.0, 0.0); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n2_end"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + } + } + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_FALL); + if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_START { + func_three_please_kill_me(fighter); + } + else if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_SHOT { + if fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_air_n2_loop"), -1.0, 1.0, 0.0); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n2_loop"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + } + } + else if step == *FIGHTER_MIIGUNNER_RAPID_SHOT_STEP_END { + if fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_air_n2_end"), -1.0, 1.0, 0.0); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n2_end"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + } + } + } + } + + return 0.into(); +} + +unsafe fn some_func_ass_func(fighter: &mut L2CFighterCommon) -> bool { + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return true; + } + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_FALL) { + if fighter.is_situation(*SITUATION_KIND_AIR) { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return true; + } + } + + return false; +} + +unsafe fn func_two_electric_boogaloo(fighter: &mut L2CFighterCommon) { + if fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_n2_start"), -1.0, 1.0, 0.0); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n2_start"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + } +} + +unsafe fn func_three_please_kill_me(fighter: &mut L2CFighterCommon) { + if fighter.is_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE) { + MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor, Hash40::new("special_air_n2_start"), -1.0, 1.0, 0.0); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n2_start"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_RAPID_SHOT_STATUS_WORK_ID_FLAG_CONTINUE); + } +} \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_n3.rs b/fighters/miigunner/src/status/special_n3.rs new file mode 100644 index 0000000000..d57a38d60c --- /dev/null +++ b/fighters/miigunner/src/status/special_n3.rs @@ -0,0 +1,95 @@ +use super::*; + +pub unsafe extern "C" fn special_n3_loop_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_air_check_dive(); + if !StopModule::is_stop(fighter.module_accessor) { + sub_special_n3_loop(fighter, false.into()); + } + + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_special_n3_loop as *const () as _)); + fighter.main_shift(special_n3_loop_main_loop) +} + +unsafe extern "C" fn sub_special_n3_loop(fighter: &mut L2CFighterCommon, param: L2CValue) -> L2CValue { + if param.get_bool() { + fighter.inc_int(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_WORK_INT_HOLD_COUNT); + } + // else { + // if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + // fighter.global_table[SUB_STATUS2].assign(&L2CValue::I32(0)); + // fighter.global_table[SUB_STATUS].assign(&L2CValue::I32(0)); + // } + // else { + // let hold_count = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_WORK_INT_HOLD_COUNT); + // let max_hold = fighter.get_param_int("param_special_n", "n3_hold_max_frame"); + // if hold_count > max_hold { + // fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_MAX); + // fighter.global_table[SUB_STATUS2].assign(&L2CValue::I32(0)); + // fighter.global_table[SUB_STATUS].assign(&L2CValue::I32(0)); + // } + // } + // } + + return 0.into(); +} + +pub unsafe extern "C" fn special_n3_loop_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) + || StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_FIRST) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_n3_loop"), -1.0, 1.0, 0.0, false, false); + } else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n3_loop"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_FIRST); + }; + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_FIRST) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_n3_loop"), -1.0, 1.0, 0.0, false, false); + } else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n3_loop"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_FIRST); + }; + } + } + //special_n3_charge(fighter); + if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + //|| fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_GRENADE_LAUNCHER_FLAG_MAX) { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N3_END.into(), true.into()); + return 1.into(); + } + + return 0.into(); +} + +// unsafe extern "C" fn special_n3_charge(fighter: &mut L2CFighterCommon) { +// let charge = VarModule::get_float(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE); +// let mut charge_start_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_charge.special_n3_charge_start"); +// let mut charge_end_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_charge.special_n3_charge_end"); +// let mut max_charge_frames = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_charge.max_charge_frames"); +// if (charge_start_frame..charge_end_frame).contains(&fighter.motion_frame()) && charge < max_charge_frames +// && ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { +// let motion_rate = (charge_end_frame - charge_start_frame)/max_charge_frames; +// MotionModule::set_rate(fighter.module_accessor, motion_rate); +// VarModule::set_float(fighter.battle_object, vars::miigunner::status::ATTACK_CHARGE, charge + 1.0); +// } +// else { +// VarModule::set_float(fighter.battle_object, vars::miigunner::instance::SPECIAL_N3_CHARGE, charge); +// MotionModule::set_rate(fighter.module_accessor, 1.0); +// } +// } + +pub unsafe extern "C" fn special_n3_end_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_air_check_dive(); + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N3_LOOP, special_n3_loop_main); + agent.status(Exec, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_N3_END, special_n3_end_exec); +} \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_s.rs b/fighters/miigunner/src/status/special_s.rs deleted file mode 100644 index 66c57db092..0000000000 --- a/fighters/miigunner/src/status/special_s.rs +++ /dev/null @@ -1,161 +0,0 @@ -use super::*; - -// unsafe extern "C" fn special_s3_init(fighter: &mut L2CFighterCommon) -> L2CValue { -// let customize_to = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO); -// if customize_to != *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_3 { -// return original_status(Init, fighter, *FIGHTER_STATUS_KIND_SPECIAL_S)(fighter); -// } -// let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); -// let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); -// KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); -// KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); -// KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); -// KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); - -// sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR_BRAKE, 0.0, 0.0, 0.0, 0.0); -// fighter.clear_lua_stack(); -// lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP); -// let brake_y = sv_kinetic_energy::get_brake_x(fighter.lua_state_agent); -// let accel_x = fighter.get_param_float("param_special_s", "s3_acc_x"); -// sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, accel_x, brake_y); -// KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); - -// sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0); -// KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - -// return 0.into(); -// } - -// unsafe extern "C" fn special_s3_1_pre(fighter: &mut L2CFighterCommon) -> L2CValue { -// if fighter.is_situation(*SITUATION_KIND_GROUND) { -// fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_GROUND.into(), true.into()); -// } -// else { -// fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR.into(), true.into()); -// KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); -// } - -// return 1.into(); -// } - -unsafe extern "C" fn special_s3_2_pre(fighter: &mut L2CFighterCommon) -> L2CValue { - StatusModule::init_settings( - fighter.module_accessor, - app::SituationKind(*SITUATION_KIND_NONE), - *FIGHTER_KINETIC_TYPE_UNIQ, - *GROUND_CORRECT_KIND_KEEP as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), - true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, - 0 - ); - FighterStatusModuleImpl::set_fighter_status_data( - fighter.module_accessor, - false, - *FIGHTER_TREADED_KIND_NO_REAC, - false, - false, - false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON | - *FIGHTER_LOG_MASK_FLAG_SHOOT | *FIGHTER_LOG_MASK_FLAG_HAJIKI) as u64, - *FIGHTER_STATUS_ATTR_START_TURN as u32, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, - 0 - ); - - return 0.into(); -} - -// unsafe extern "C" fn special_s3_air_main(fighter: &mut L2CFighterCommon) -> L2CValue { -// PostureModule::set_stick_lr(fighter.module_accessor, 0.0); -// PostureModule::update_rot_y_lr(fighter.module_accessor); -// if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_MOT_RESTART) { -// fighter.off_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_MOT_RESTART); -// MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s3_2"), 0.0, 1.0, false, 0.0, false, false); -// } -// else { -// MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s3_2"), -1.0, 1.0, 0.0, false, false); -// } -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); -// notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_06) + -1); -// notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_06) + -1); - -// fighter.main_shift(special_s3_air_main_loop) -// } - -// unsafe extern "C" fn special_s3_air_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { -// if CancelModule::is_enable_cancel(fighter.module_accessor) { -// if fighter.sub_wait_ground_check_common(false.into()).get_bool() -// || fighter.sub_air_check_fall_common().get_bool() { -// return 1.into(); -// } -// } -// fighter.sub_air_check_dive(); -// if StatusModule::is_situation_changed(fighter.module_accessor) { -// if fighter.is_situation(*SITUATION_KIND_GROUND) { -// if fighter.status_frame() > 23 { -// // land cancel -// MotionModule::set_frame(fighter.module_accessor, 40.0, false); -// } -// else { -// MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_s3_2"), -1.0, 1.0, 0.0, false, false); -// } -// KineticModule::clear_speed_all(fighter.module_accessor); -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); -// KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); -// sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); -// KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); -// } -// else { -// MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s3_2"), -1.0, 1.0, 0.0, false, false); -// KineticModule::clear_speed_all(fighter.module_accessor); -// GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); -// KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); -// sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); -// KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); -// } -// special_s3_check_missile(fighter); -// } -// if MotionModule::is_end(fighter.module_accessor) { -// fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); -// return 1.into(); -// } - -// return 0.into(); -// } - -// unsafe extern "C" fn special_s3_check_missile(fighter: &mut L2CFighterCommon) { -// if fighter.global_table[IS_STOPPING].get_bool() -// || StatusModule::status_kind_interrupt(fighter.module_accessor) == *FIGHTER_STATUS_KIND_SPECIAL_S as u64 { -// return; -// } -// if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_WEAPON) { -// if !fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_WEAPON_GENERATED) -// && (!StatusModule::status_kind_interrupt(fighter.module_accessor) == *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_GROUND as u64 -// || StatusModule::status_kind_interrupt(fighter.module_accessor) == *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR as u64) { -// ArticleModule::generate_article_enable(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_SUPERMISSILE, false, -1); -// ArticleModule::shoot_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_SUPERMISSILE, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); -// fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_WEAPON_GENERATED); -// } -// } - -// return; -// } - -pub fn install(agent: &mut Agent) { - //agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s3_init); - - //agent.status(Pre, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_1_GROUND, special_s3_1_pre); - //agent.status(Init, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_1_GROUND, special_s3_1_air_init); - - //agent.status(Pre, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_1_AIR, special_s3_1_pre); - //agent.status(Init, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_1_AIR, special_s3_1_air_init); - - agent.status(Pre, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_GROUND, special_s3_2_pre); - - // agent.status(Init, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR, special_s3_1_air_init); - // agent.status(Pre, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR, special_s3_2_pre); - // agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR, special_s3_air_main); -} \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_s2.rs b/fighters/miigunner/src/status/special_s2.rs new file mode 100644 index 0000000000..759f93ef07 --- /dev/null +++ b/fighters/miigunner/src/status/special_s2.rs @@ -0,0 +1,98 @@ +use super::*; + +pub unsafe extern "C" fn special_s2_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let s2_stop_y = fighter.get_param_int("param_special_s", "s2_stop_y"); + fighter.set_int(s2_stop_y, *FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_WORK_INT_STOP_Y); + let s2_no_bang = fighter.get_param_int("param_special_s", "s2_no_bang"); + fighter.set_int(s2_no_bang, *FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_WORK_INT_NO_BANG); + fighter.off_flag(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_FLAG_MOT_CHANGE); + PostureModule::set_stick_lr(fighter.module_accessor, 0.0); + PostureModule::update_rot_y_lr(fighter.module_accessor); + if !StopModule::is_stop(fighter.module_accessor) { + sub_special_s2(fighter, false.into()); + } + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_special_s2 as *const () as _)); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_05) - 1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_05) - 1); + + fighter.main_shift(special_s2_main_loop) +} + +unsafe extern "C" fn sub_special_s2(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { + if param_1.get_bool() { + fighter.dec_int(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_WORK_INT_STOP_Y); + if ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB) { + fighter.dec_int(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_WORK_INT_NO_BANG); + } + } + else { + let stop_y = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_WORK_INT_STOP_Y); + if stop_y >= 0 { + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } + else { + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_FLAG_1) { + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB, false, -1); + fighter.off_flag(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_FLAG_1); + } + } + + return 0.into(); +} + +unsafe extern "C" fn special_s2_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) + || StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_FLAG_MOT_CHANGE) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_s2_start"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s2_start"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_FLAG_MOT_CHANGE); + } + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MIIGUNNER_SPECIAL_S2_AIR); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_FLAG_MOT_CHANGE) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s2_start"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s2_start"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_FLAG_MOT_CHANGE); + } + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S2_LOOP.into(), false.into()); + return 0.into(); + } + if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + let no_bang = fighter.get_int(*FIGHTER_MIIGUNNER_STATUS_STEALTH_BOMB_WORK_INT_NO_BANG); + if no_bang <= 0 && ArticleModule::is_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB) { + fighter.change_status(FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S2_END.into(), true.into()); + } + } + + return 0.into(); +} + +pub unsafe extern "C" fn special_s2_end(fighter: &mut L2CFighterCommon) -> L2CValue { + let status_next = StatusModule::status_kind_next(fighter.module_accessor); + if ![*FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S2_LOOP, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S2_END].contains(&status_next) { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB, ArticleOperationTarget(0)); + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(End, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S2_LOOP, special_s2_end); +} \ No newline at end of file diff --git a/fighters/miigunner/src/status/special_s3.rs b/fighters/miigunner/src/status/special_s3.rs new file mode 100644 index 0000000000..fb5108501b --- /dev/null +++ b/fighters/miigunner/src/status/special_s3.rs @@ -0,0 +1,113 @@ +use super::*; + +pub unsafe extern "C" fn special_s3_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.on_flag(*FIGHTER_MIIGUNNER_INSTANCE_WORK_ID_FLAG_ST_INIT); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + StatusModule::set_status_kind_interrupt(fighter.module_accessor, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_GROUND); + } + else { + StatusModule::set_status_kind_interrupt(fighter.module_accessor, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR); + } + + return 1.into(); +} + +unsafe extern "C" fn special_s3_2_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON | + *FIGHTER_LOG_MASK_FLAG_SHOOT | *FIGHTER_LOG_MASK_FLAG_HAJIKI) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + + return 0.into(); +} + +unsafe extern "C" fn special_s3_2_air_main(fighter: &mut L2CFighterCommon) -> L2CValue { + PostureModule::set_stick_lr(fighter.module_accessor, 0.0); + PostureModule::update_rot_y_lr(fighter.module_accessor); + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_MOT_RESTART) { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s3_2"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_MOT_RESTART); + } + else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s3_2"), -1.0, 1.0, 0.0, false, false); + } + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_06) - 1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_06) - 1); + + fighter.main_shift(special_s3_2_air_main_loop) +} + +unsafe extern "C" fn special_s3_2_air_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_s3_2"), -1.0, 1.0, 0.0, false, false); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + } + else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s3_2"), -1.0, 1.0, 0.0, false, false); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + } + } + sub_special_s3_2_air(fighter); + if fighter.status_frame() > 23 { + fighter.check_land_cancel(Some(12.0)); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + + return 0.into(); +} + +unsafe fn sub_special_s3_2_air(fighter: &mut L2CFighterCommon) { + if fighter.global_table[IS_STOPPING].get_bool() + || fighter.global_table[STATUS_KIND_INTERRUPT].get_i32() == *FIGHTER_STATUS_KIND_SPECIAL_S { + return; + } + if fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_WEAPON) { + if !fighter.is_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_WEAPON_GENERATED) { + ArticleModule::generate_article_enable(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_SUPERMISSILE, false, -1); + ArticleModule::shoot_exist(fighter.module_accessor, *FIGHTER_MIIGUNNER_GENERATE_ARTICLE_SUPERMISSILE, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); + fighter.on_flag(*FIGHTER_MIIGUNNER_STATUS_MIIMISSILE_FLAG_WEAPON_GENERATED); + } + } +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_GROUND, special_s3_2_pre); + agent.status(Main, *FIGHTER_MIIGUNNER_STATUS_KIND_SPECIAL_S3_2_AIR, special_s3_2_air_main); +} \ No newline at end of file diff --git a/fighters/miigunner/src/stealthbomb/acmd.rs b/fighters/miigunner/src/stealthbomb/acmd.rs index 622803dbe9..7acc1a7e53 100644 --- a/fighters/miigunner/src/stealthbomb/acmd.rs +++ b/fighters/miigunner/src/stealthbomb/acmd.rs @@ -7,45 +7,82 @@ unsafe extern "C" fn effect_tame(agent: &mut L2CAgentBase) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.15, 0, 0, 0, 0, 0, 0, true); LAST_EFFECT_SET_RATE(agent, 0.75); } - frame(lua_state, 50.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.20, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 5.0); - } - frame(lua_state, 100.0); + frame(lua_state, 40.0); if is_excute(agent) { let owner_id = WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; if sv_battle_object::kind(owner_id) == *FIGHTER_KIND_MIIGUNNER { let gunner = utils::util::get_battle_object_from_id(owner_id); - let flash_handle = EffectModule::req_follow(boma, Hash40::new("sys_smash_flash"), Hash40::new("top"), &Vector3f::zero(), &Vector3f::zero(), 0.5, false, 0, 0, 0, 0 ,0, false, false); - LAST_EFFECT_SET_COLOR(agent, 0.15, 0.15, 10.0); - EffectModule::set_rgb(boma, flash_handle as u32, 0.15, 0.15, 10.0); - EffectModule::set_rate(boma, flash_handle as u32, 0.3); + let flash_handle = EffectModule::req_follow(boma, Hash40::new("sys_smash_flash"), Hash40::new("top"), &Vector3f::zero(), &Vector3f::zero(), 0.2, false, 0, 0, 0, 0 ,0, false, false); + EffectModule::set_rgb(boma, flash_handle as u32, 0.5, 0.5, 5.0); + EffectModule::set_rate(boma, flash_handle as u32, 0.4); VarModule::set_int64(gunner, vars::miigunner::instance::SPECIAL_S2_STEALTHBOMB_EFFECT_HANDLE, flash_handle); } } - for h in 101..=120 { + frame(lua_state, 50.0); + for h in 1..=20 { if is_excute(agent) { let owner_id = WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; if sv_battle_object::kind(owner_id) == *FIGHTER_KIND_MIIGUNNER { let gunner = utils::util::get_battle_object_from_id(owner_id); let flash_handle = VarModule::get_int64(gunner, vars::miigunner::instance::SPECIAL_S2_STEALTHBOMB_EFFECT_HANDLE); - let start_color = Vector3f { x: 0.15, y: 0.15, z: 10.0 }; + let start_color = Vector3f { x: 0.5, y: 0.5, z: 5.0 }; let end_color = Vector3f { x: 10.0, y: 0.15, z: 0.15 }; // Smoothly interpolate from starting to ending color let blend_vector = Vector3f { - x: start_color.x + ((end_color.x - start_color.x) * (((h as f32) - 100.0) / 20.0)), - y: start_color.y + ((end_color.y - start_color.y) * (((h as f32) - 100.0) / 20.0)), - z: start_color.z + ((end_color.z - start_color.z) * (((h as f32) - 100.0) / 20.0)) + x: start_color.x + ((end_color.x - start_color.x) * ((h as f32) / 20.0)), + y: start_color.y + ((end_color.y - start_color.y) * ((h as f32) / 20.0)), + z: start_color.z + ((end_color.z - start_color.z) * ((h as f32) / 20.0)) }; // Apply color blend EffectModule::set_rgb(boma, flash_handle as u32, blend_vector.x, blend_vector.y, blend_vector.z); + if h == 5 { + EFFECT_FOLLOW(agent, Hash40::new("miigunner_sb_tama"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.75, true); + LAST_EFFECT_SET_RATE(agent, 0.05); + LAST_EFFECT_SET_COLOR(agent, 1.5, 0.75, 0.75); + } } } wait(lua_state, 1.0); } } +unsafe extern "C" fn game_turn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 366, 0, 0, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BOMB); + } +} + +unsafe extern "C" fn effect_turn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miigunner_sb_tama"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("miigunner_sb_tama"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.5, true); + LAST_EFFECT_SET_RATE(agent, 0.5); + LAST_EFFECT_SET_COLOR(agent, 1.5, 0.75, 0.75); + LAST_EFFECT_SET_ALPHA(agent, 2.0); + EFFECT_FOLLOW(agent, Hash40::new("miigunner_sb_tama"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.75, true); + LAST_EFFECT_SET_RATE(agent, 0.25); + LAST_EFFECT_SET_COLOR(agent, 1.5, 0.75, 0.75); + } +} + +unsafe extern "C" fn sound_turn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + let handle = SoundModule::play_status_se(boma, Hash40::new("se_miigunner_special_c2_s01"), false, false, false); + SoundModule::set_se_vol(boma, handle as i32, 0.5, 0); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("effect_tame", effect_tame, Priority::Low); + agent.acmd("sound_tame", acmd_stub, Priority::Low); + + agent.acmd("game_turn", game_turn, Priority::Low); + agent.acmd("effect_turn", effect_turn, Priority::Low); + agent.acmd("sound_turn", sound_turn, Priority::Low); } \ No newline at end of file diff --git a/fighters/miigunner/src/stealthbomb/mod.rs b/fighters/miigunner/src/stealthbomb/mod.rs index 9f626294fb..fe2a6e9747 100644 --- a/fighters/miigunner/src/stealthbomb/mod.rs +++ b/fighters/miigunner/src/stealthbomb/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod status; pub fn install() { let agent = &mut Agent::new("miigunner_stealthbomb"); acmd::install(agent); + status::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/miigunner/src/stealthbomb/status.rs b/fighters/miigunner/src/stealthbomb/status.rs new file mode 100644 index 0000000000..68b50a038c --- /dev/null +++ b/fighters/miigunner/src/stealthbomb/status.rs @@ -0,0 +1,393 @@ +use super::*; + +// vars since ParamModule does not work with articles +const FOLLOW_FRAME: i32 = 256; +//const TURN_INERTIA_FRAME: i32 = 50; +const ROT_SPEED: f32 = 22.0; +const ANGLE_X_BACK: f32 = -16.0; +const ACCEL: f32 = 0.047; +const SPEED_MIN: f32 = 0.3; +const TURN_DIST: f32 = 16.0; +const TURN_ANGLE: f32 = 0.75; +const SPEED_MAX: f32 = 3.0; +const SPEED_MUL: f32 = 1.0; +const TURN_FOLLOW_DIST: f32 = 19.0; + +unsafe extern "C" fn move_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + let life = weapon.get_param_float("param_stealthbomb", "life"); + weapon.set_float(life, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_LIFE); + weapon.set_float(0.0, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_COUNT); + MotionModule::change_motion(weapon.module_accessor, Hash40::new("move"), 0.0, 1.0, false, 0.0, false, false); + if !StopModule::is_stop(weapon.module_accessor) { + move_substatus(weapon, false.into()); + } + weapon.global_table[0x15].assign(&L2CValue::Ptr(move_substatus as *const () as _)); + + weapon.fastshift(L2CValue::Ptr(move_main_loop as *const () as _)) +} + +unsafe extern "C" fn move_substatus(weapon: &mut L2CWeaponCommon, param_1: L2CValue) -> L2CValue { + if param_1.get_bool() { + WorkModule::add_float(weapon.module_accessor, -1.0, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_LIFE); + WorkModule::add_float(weapon.module_accessor, 1.0, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_COUNT); + let count = weapon.get_param_float("param_stealthbomb", "count"); + if weapon.get_float(*WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_COUNT) > count { + weapon.set_float(count, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_COUNT); + } + } + + return 0.into(); +} + +unsafe extern "C" fn move_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { + if weapon.get_float(*WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_LIFE) <= 0.0 { + weapon.change_status(WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_KIND_TAME.into(), false.into()); + } + + return 0.into(); +} + +unsafe extern "C" fn move_end(weapon: &mut L2CWeaponCommon) -> L2CValue { + EffectModule::req_on_joint(weapon.module_accessor, Hash40::new("sys_misfire"), Hash40::new("top"), &Vector3f::zero(), &Vector3f::zero(), 1.0, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0); + let angle = weapon.get_float(*WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_ANGLE); + VarModule::set_float(weapon.battle_object, vars::miigunner_stealthbomb::instance::ANGLE, angle); + + return 0.into(); +} + +unsafe extern "C" fn tame_init(weapon: &mut L2CWeaponCommon) -> L2CValue { + let bang_time = weapon.get_param_float("param_stealthbomb", "bang_time"); + weapon.set_float(bang_time, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_LIFE); + let angle = VarModule::get_float(weapon.battle_object, vars::miigunner_stealthbomb::instance::ANGLE).to_degrees(); + //sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_ROT_NORMAL, 1.0 * angle.cos(), 1.0 * angle.sin()); + + return 0.into(); +} + +unsafe extern "C" fn tame_exec(weapon: &mut L2CWeaponCommon) -> L2CValue { + return 0.into(); +} + +unsafe extern "C" fn tame_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + EffectModule::kill_kind(weapon.module_accessor, Hash40::new("sys_misfire"), false, false); + MotionModule::change_motion(weapon.module_accessor, Hash40::new("tame"), 0.0, 1.0, false, 0.0, false, false); + if !StopModule::is_stop(weapon.module_accessor) { + tame_substatus(weapon, false.into()); + } + weapon.global_table[0x15].assign(&L2CValue::Ptr(tame_substatus as *const () as _)); + + weapon.fastshift(L2CValue::Ptr(tame_main_loop as *const () as _)) +} + +unsafe extern "C" fn tame_substatus(weapon: &mut L2CWeaponCommon, param_1: L2CValue) -> L2CValue { + if param_1.get_bool() { + WorkModule::add_float(weapon.module_accessor, -1.0, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_LIFE); + } + else { + if weapon.get_float(*WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_LIFE) <= 0.0 { + weapon.change_status(statuses::miigunner_stealthbomb::TURN.into(), false.into()); + } + } + + return 0.into(); +} + +unsafe extern "C" fn tame_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { + return 0.into(); +} + +unsafe extern "C" fn turn_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { + StatusModule::init_settings( + weapon.module_accessor, + SituationKind(*SITUATION_KIND_AIR), + *WEAPON_KINETIC_TYPE_NORMAL, + *GROUND_CORRECT_KIND_AIR as u32, + GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + false, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0, + ); + + return 0.into(); +} + +unsafe extern "C" fn turn_init(weapon: &mut L2CWeaponCommon) -> L2CValue { + sv_kinetic_energy!(set_accel, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); + + let angle = VarModule::get_float(weapon.battle_object, vars::miigunner_stealthbomb::instance::ANGLE); + let new_angle = if angle <= 0.0 { + angle + std::f32::consts::PI + } else { + angle - std::f32::consts::PI + }; + + VarModule::set_float(weapon.battle_object, vars::miigunner_stealthbomb::instance::ANGLE, new_angle); + VarModule::set_int(weapon.battle_object, vars::miigunner_stealthbomb::status::FOLLOW_FRAME, FOLLOW_FRAME); + WorkModule::set_float(weapon.module_accessor, FOLLOW_FRAME as f32, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_LIFE); + + let rot_x = PostureModule::rot_x(weapon.module_accessor, 0); + let rot_y = PostureModule::rot_y(weapon.module_accessor, 0); + let rot_z = PostureModule::rot_z(weapon.module_accessor, 0); + + VarModule::set_float(weapon.battle_object, vars::miigunner_stealthbomb::status::TURN_DIST, 0.0); + + let speed = WorkModule::get_float(weapon.module_accessor, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLOAT_SPEED); + let speed_diff = speed - SPEED_MIN; + let accel_diff = speed_diff / ACCEL; + let floor = accel_diff.floor(); + let idkman = ANGLE_X_BACK - rot_y; + let huh = idkman / floor; + + VarModule::set_int(weapon.battle_object, vars::miigunner_stealthbomb::status::BACK_ROT_FRAME, floor as i32); + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_ROT_NORMAL, ROT_SPEED, huh, 0.0); + + return 0.into(); +} + +unsafe extern "C" fn turn_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + MotionModule::change_motion(weapon.module_accessor, Hash40::new("turn"), 0.0, 1.0, false, 0.0, false, false); + if !StopModule::is_stop(weapon.module_accessor) { + if false { + turn_substatus_inner(weapon); + } + } + weapon.global_table[0x15].assign(&L2CValue::Ptr(turn_substatus as *const () as _)); + + weapon.fastshift(L2CValue::Ptr(turn_fastshift as *const () as _)) +} + +unsafe extern "C" fn turn_substatus(weapon: &mut L2CWeaponCommon, param_1: L2CValue) -> L2CValue { + if param_1.get_bool() { + turn_substatus_inner(weapon); + } + + return 0.into(); +} + +unsafe extern "C" fn turn_substatus_inner(weapon: &mut L2CWeaponCommon) { + if VarModule::countdown_int(weapon.battle_object, vars::miigunner_stealthbomb::status::FOLLOW_FRAME, 0) { + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + } +} + +unsafe extern "C" fn turn_fastshift(weapon: &mut L2CWeaponCommon) -> L2CValue { + if GroundModule::is_touch(weapon.module_accessor, *GROUND_TOUCH_FLAG_ALL as u32) { + weapon.clear_lua_stack(); + lua_args!(weapon, MA_MSC_CMD_ARTICLE_GENERATE_ARTICLE_LINK_PARENTS, WEAPON_LINK_NO_CONSTRAINT, FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB_S); + sv_module_access::article(weapon.lua_state_agent); + weapon.pop_lua_stack(1); + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + } + if AttackModule::is_infliction(weapon.module_accessor, *COLLISION_KIND_MASK_HIT) { + weapon.clear_lua_stack(); + lua_args!(weapon, MA_MSC_CMD_ARTICLE_GENERATE_ARTICLE_LINK_PARENTS, WEAPON_LINK_NO_CONSTRAINT, FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB_S); + sv_module_access::article(weapon.lua_state_agent); + weapon.pop_lua_stack(1); + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x27936dbb96d)); + } + if !StopModule::is_stop(weapon.module_accessor) { + if turn_fastshift_inner(weapon).get_bool() { + return 1.into(); + } + } + + return 0.into(); +} + +unsafe extern "C" fn turn_fastshift_inner(weapon: &mut L2CWeaponCommon) -> L2CValue { + let correct = GroundModule::get_correct(weapon.module_accessor); + if LinkModule::is_link(weapon.module_accessor, *LINK_NO_ARTICLE) { + let parent_id = LinkModule::get_parent_id(weapon.module_accessor, *LINK_NO_ARTICLE, true); + if !WorkModule::is_flag(weapon.module_accessor, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLAG_REFLECT) { + let team_owner_id = TeamModule::team_owner_id(weapon.module_accessor); + if parent_id == team_owner_id { + weapon.clear_lua_stack(); + lua_args!(weapon, FL_MA_MSC_LINK_GET_PARENT_MODEL_NODE_GLOBAL_POSITION_X, LINK_NO_ARTICLE, Hash40::new("waist"), true); + FL_sv_module_access::link(weapon.lua_state_agent); + let x = weapon.pop_lua_stack(1).get_f32(); + weapon.clear_lua_stack(); + lua_args!(weapon, FL_MA_MSC_LINK_GET_PARENT_MODEL_NODE_GLOBAL_POSITION_Y, LINK_NO_ARTICLE, Hash40::new("waist"), true); + FL_sv_module_access::link(weapon.lua_state_agent); + let y = weapon.pop_lua_stack(1).get_f32(); + weapon.clear_lua_stack(); + lua_args!(weapon, FL_MA_MSC_LINK_GET_PARENT_MODEL_NODE_GLOBAL_POSITION_Z, LINK_NO_ARTICLE, Hash40::new("waist"), true); + FL_sv_module_access::link(weapon.lua_state_agent); + let z = weapon.pop_lua_stack(1).get_f32(); + + let pos_x = PostureModule::pos_x(weapon.module_accessor); + let pos_y = PostureModule::pos_y(weapon.module_accessor); + let pos_z = PostureModule::pos_z(weapon.module_accessor); + + let length = sv_math::vec3_length(x - pos_x, y - pos_y, z - pos_z); + if length <= 9.0 { + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + return 1.into(); + } + } + } + + //if correct != *GROUND_CORRECT_KIND_NONE { + let parent_id = LinkModule::get_parent_id(weapon.module_accessor, *LINK_NO_ARTICLE, true); + let parent_module_accessor = sv_battle_object::module_accessor(parent_id as u32); + let parent_pos_y = PostureModule::pos_y(parent_module_accessor); + let pos_y = PostureModule::pos_y(weapon.module_accessor); + let diff = parent_pos_y - pos_y; + let dist = 4.0; + if diff.abs() >= dist * 10.0 { + GroundModule::set_correct(weapon.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_NONE)); + } + else { + GroundModule::set_correct(weapon.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + //} + } + + let dist = VarModule::get_float(weapon.battle_object, vars::miigunner_stealthbomb::status::TURN_DIST); + if TURN_DIST * 10.0 <= dist { + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + return 1.into(); + } + + if AttackModule::is_infliction_status(weapon.module_accessor, *COLLISION_KIND_MASK_PARRY | *COLLISION_KIND_MASK_REFLECTOR) { + WorkModule::on_flag(weapon.module_accessor, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLAG_REFLECT); + } + + return 0.into(); +} + +unsafe extern "C" fn turn_exec(weapon: &mut L2CWeaponCommon) -> L2CValue { + turn_exec_inner(weapon) +} + +unsafe extern "C" fn turn_exec_inner(weapon: &mut L2CWeaponCommon) -> L2CValue { + let mut angle = VarModule::get_float(weapon.battle_object, vars::miigunner_stealthbomb::instance::ANGLE); + //let prev_angle = angle; + if LinkModule::is_link(weapon.module_accessor, *LINK_NO_ARTICLE) { + if !WorkModule::is_flag(weapon.module_accessor, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_WORK_FLAG_REFLECT) + && VarModule::get_int(weapon.battle_object, vars::miigunner_stealthbomb::status::FOLLOW_FRAME) > 0 { + weapon.clear_lua_stack(); + lua_args!(weapon, FL_MA_MSC_LINK_GET_PARENT_MODEL_NODE_GLOBAL_POSITION_X, LINK_NO_ARTICLE, Hash40::new("waist"), true); + FL_sv_module_access::link(weapon.lua_state_agent); + let x = weapon.pop_lua_stack(1).get_f32(); + weapon.clear_lua_stack(); + lua_args!(weapon, FL_MA_MSC_LINK_GET_PARENT_MODEL_NODE_GLOBAL_POSITION_Y, LINK_NO_ARTICLE, Hash40::new("waist"), true); + FL_sv_module_access::link(weapon.lua_state_agent); + let y = weapon.pop_lua_stack(1).get_f32(); + weapon.clear_lua_stack(); + + let pos_x = PostureModule::pos_x(weapon.module_accessor); + let pos_y = PostureModule::pos_y(weapon.module_accessor); + + let diff_x = x - pos_x; + let diff_y = y - pos_y; + + let atan = diff_y.atan2(diff_x); + + let atan = if atan < -std::f32::consts::PI { + atan + std::f32::consts::PI * 2.0 + } + else { + if std::f32::consts::PI < atan { + atan - std::f32::consts::PI * 2.0 + } + else { + atan + } + }; + + let atan = atan - angle; + + let atan = if atan < -std::f32::consts::PI { + atan + std::f32::consts::PI * 2.0 + } + else { + if std::f32::consts::PI < atan { + atan - std::f32::consts::PI * 2.0 + } + else { + atan + } + }; + + let atan = if TURN_ANGLE < atan { + TURN_ANGLE + } + else { + if atan < -TURN_ANGLE { + -TURN_ANGLE + } + else { + atan + } + }; + + angle += atan; + + // let frame = weapon.status_frame(); + // let angle_mul = if frame > TURN_INERTIA_FRAME { 1.0 } else { (1.0 + frame as f32) / TURN_INERTIA_FRAME as f32 }; + // let angle -= prev_angle - prev_angle * angle_mul; + + VarModule::set_float(weapon.battle_object, vars::miigunner_stealthbomb::instance::ANGLE, angle); + VarModule::dec_int(weapon.battle_object, vars::miigunner_stealthbomb::status::FOLLOW_FRAME); + } + } + + weapon.clear_lua_stack(); + lua_args!(weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL); + let mut length = sv_kinetic_energy::get_speed_length(weapon.lua_state_agent); + length += ACCEL; + let speed_max = SPEED_MAX * SPEED_MUL; + if speed_max < length { + length = speed_max; + } + let cos = angle.cos(); + let sin = angle.sin(); + let vel_x = cos * length; + let vel_y = sin * length; + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, vel_x, vel_y); + + let turn_dist = VarModule::get_float(weapon.battle_object, vars::miigunner_stealthbomb::status::TURN_DIST); + VarModule::set_float(weapon.battle_object, vars::miigunner_stealthbomb::status::TURN_DIST, turn_dist + length); + + if TURN_FOLLOW_DIST * 10.0 <= turn_dist + length { + VarModule::set_int(weapon.battle_object, vars::miigunner_stealthbomb::status::FOLLOW_FRAME, 0); + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + } + + let back_rot_frame = VarModule::get_int(weapon.battle_object, vars::miigunner_stealthbomb::status::BACK_ROT_FRAME); + if back_rot_frame > 0 { + if back_rot_frame - 1 == 0 { + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_ROT_NORMAL, ROT_SPEED, 0.0, 0.0); + } + VarModule::dec_int(weapon.battle_object, vars::miigunner_stealthbomb::status::BACK_ROT_FRAME); + } + + return 0.into(); +} + +unsafe extern "C" fn turn_end(weapon: &mut L2CWeaponCommon) -> L2CValue { + if AttackModule::is_infliction(weapon.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { + weapon.clear_lua_stack(); + lua_args!(weapon, MA_MSC_CMD_ARTICLE_GENERATE_ARTICLE_LINK_PARENTS, WEAPON_LINK_NO_CONSTRAINT, FIGHTER_MIIGUNNER_GENERATE_ARTICLE_STEALTHBOMB_S); + sv_module_access::article(weapon.lua_state_agent); + weapon.pop_lua_stack(1); + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_KIND_MOVE, move_main); + agent.status(End, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_KIND_MOVE, move_end); + + agent.status(Init, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_KIND_TAME, tame_init); + agent.status(Main, *WEAPON_MIIGUNNER_STEALTHBOMB_STATUS_KIND_TAME, tame_main); + + agent.status(Pre, statuses::miigunner_stealthbomb::TURN, turn_pre); + agent.status(Init, statuses::miigunner_stealthbomb::TURN, turn_init); + agent.status(Main, statuses::miigunner_stealthbomb::TURN, turn_main); + agent.status(Exec, statuses::miigunner_stealthbomb::TURN, turn_exec); + agent.status(End, statuses::miigunner_stealthbomb::TURN, turn_end); +} \ No newline at end of file diff --git a/fighters/miigunner/src/stealthbomb_s/acmd.rs b/fighters/miigunner/src/stealthbomb_s/acmd.rs index 7aec82a9f8..1e21f055e2 100644 --- a/fighters/miigunner/src/stealthbomb_s/acmd.rs +++ b/fighters/miigunner/src/stealthbomb_s/acmd.rs @@ -5,30 +5,21 @@ unsafe extern "C" fn game_move(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 65, 94, 0, 48, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 100, 79, 0, 37, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } - frame(lua_state, 8.0); + frame(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 9.0); - if is_excute(agent) { - //AREA_WIND_2ND_RAD(0, 1, 0.02, 1000, 1, 0, 0, 12); - } - frame(lua_state, 15.0); - if is_excute(agent) { - //AreaModule::erase_wind(boma, 0); - } } unsafe extern "C" fn effect_move(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 5.0); + frame(lua_state, 1.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_bomb_a"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("sys_bomb_a"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.25, 0, 0, 0, 0, 0, 0, true); } } diff --git a/fighters/miigunner/src/supermissile/acmd.rs b/fighters/miigunner/src/supermissile/acmd.rs index dc8dec1a27..e5bca1583e 100644 --- a/fighters/miigunner/src/supermissile/acmd.rs +++ b/fighters/miigunner/src/supermissile/acmd.rs @@ -9,7 +9,7 @@ unsafe extern "C" fn game_straight(agent: &mut L2CAgentBase) { VarModule::set_int(gunner, vars::miigunner::instance::SPECIAL_S3_MISSILE_OBJECT_ID, agent.battle_object_id as i32); } if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 60, 90, 0, 50, 2.5, 0.0, 0.0, 1.2, Some(0.0), Some(0.0), Some(2.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 65, 30, 0, 50, 2.5, 0.0, 0.0, 1.2, Some(0.0), Some(0.0), Some(2.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } } @@ -34,7 +34,7 @@ unsafe extern "C" fn game_sburst(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { if VarModule::is_flag(agent.battle_object, vars::miigunner_supermissile::instance::PULSE_DETONATE) { - ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 50, 80, 0, 49, 10.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("top"), 20.0, 50, 80, 0, 49, 10.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 16, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_BOMB); } } frame(lua_state, 4.0); diff --git a/fighters/miigunner/src/supermissile/status.rs b/fighters/miigunner/src/supermissile/status.rs index 76423ca1ca..240bdd2a4b 100644 --- a/fighters/miigunner/src/supermissile/status.rs +++ b/fighters/miigunner/src/supermissile/status.rs @@ -24,7 +24,9 @@ unsafe extern "C" fn straight_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { } unsafe extern "C" fn straight_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + VarModule::set_int(weapon.battle_object, vars::miigunner_supermissile::status::PULSE_TIMER, PULSE_LIFE); MotionModule::change_motion(weapon.module_accessor, Hash40::new("straight"), 0.0, 1.0, false, 0.0, false, false); + weapon.fastshift(L2CValue::Ptr(straight_main_loop as *const () as _)) } diff --git a/fighters/miiswordsman/Cargo.toml b/fighters/miiswordsman/Cargo.toml index 08be05b72f..12d8ecc0e0 100644 --- a/fighters/miiswordsman/Cargo.toml +++ b/fighters/miiswordsman/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/miiswordsman/src/acmd/aerials.rs b/fighters/miiswordsman/src/acmd/aerials.rs index 60d02d3bf0..b0a91852df 100644 --- a/fighters/miiswordsman/src/acmd/aerials.rs +++ b/fighters/miiswordsman/src/acmd/aerials.rs @@ -4,23 +4,30 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.44); // 6F startup - frame(lua_state, 6.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 11.0, 4.0); + frame(lua_state, 7.0); // f4 if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 12.0); + FT_MOTION_RATE_RANGE(agent, 12.0, 15.5, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 85, 0, 34, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 361, 85, 0, 34, 3.0, 0.0, 3.25, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 85, 0, 34, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 361, 85, 0, 34, 3.0, 0.0, 2.75, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 361, 85, 0, 34, 3.0, 0.0, 9.0, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } + frame(lua_state, 15.5); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 16.5); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 18.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 19.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 7.0, 72, 85, 0, 34, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 7.0, 72, 85, 0, 34, 3.0, 0.0, 3.25, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 7.0, 72, 85, 0, 34, 3.0, 0.0, 2.75, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 72, 85, 0, 34, 3.0, 0.0, 9.0, -1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 20.0); @@ -30,7 +37,7 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - wait(lua_state, 8.0); + frame(lua_state, 36.0); // f28 if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -40,7 +47,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.77); // 10F startup + FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 5.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -48,12 +55,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 66, 100, 35, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 367, 100, 35, 0, 3.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 4.0, 367, 100, 35, 0, 3.5, 0.0, 8.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("armr"), 3.0, 66, 100, 35, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("haver"), 4.0, 367, 100, 35, 0, 3.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("haver"), 4.0, 367, 100, 35, 0, 3.5, 0.0, 8.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 70, 40, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 70, 40, 0, 30, 3.5, 0.0, 2.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 4.0, 70, 40, 0, 30, 3.5, 0.0, 8.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -61,9 +65,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 75, 100, 35, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 80, 100, 35, 0, 3.5, -0.5, 3.0, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 4.0, 80, 100, 35, 0, 3.5, -0.5, 8.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 70, 60, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 70, 60, 0, 30, 3.0, -0.5, 2.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 4.0, 70, 60, 0, 30, 3.0, -0.5, 8.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -71,15 +75,15 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 21.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 6.0, 50, 130, 0, 50, 4.0, -1.0, 3.0, 0.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 6.0, 50, 130, 0, 50, 4.0, -1.0, 8.5, 0.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 5.0, 50, 130, 0, 50, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 4.0, 50, 130, 0, 30, 3.0, -1.0, 2.5, 0.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 50, 130, 0, 30, 3.0, -1.0, 8.5, 0.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 50, 130, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 35.0); + frame(lua_state, 38.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -88,31 +92,50 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE(agent, 0.9); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 8.25, 6.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 3.0); - frame(lua_state, 8.0); + frame(lua_state, 8.25); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 9.25); + FT_MOTION_RATE_RANGE(agent, 9.25, 10.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 361, 112, 0, 10, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 361, 112, 0, 10, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 361, 99, 0, 10, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 361, 99, 0, 10, 3.0, 0.0, 2.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 14.0, 361, 112, 0, 10, 3.0, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("shoulderr"), 12.0, 361, 99, 0, 10, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 12.0); - FT_MOTION_RATE_RANGE(agent, 12.0, 37.0, 24.0); + FT_MOTION_RATE_RANGE(agent, 12.0, 37.0, 23.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 29.0); + frame(lua_state, 29.0); // f30 if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } +unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.75); + if is_excute(agent) { + let tex_sword = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD) as u64; + let sword_add = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD_ADD) as u64; + let sword_flare = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE) as u64; + AFTER_IMAGE4_ON_arg29(agent, Hash40::new_raw(tex_sword), Hash40::new_raw(sword_add), 5, Hash40::new("haver"), 0.0, 0.2, 0.0, Hash40::new("haver"), -0.0, 10.8, 0.0, true, Hash40::new_raw(sword_flare), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + } + frame(lua_state, 12.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 3); + } +} + unsafe extern "C" fn expression_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -140,14 +163,14 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 14.0, 80, 98, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 14.0, 80, 96, 0, 30, 3.0, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 16.0, 80, 96, 0, 30, 3.0, 0.0, 8.75, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 14.0, 90, 90, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 14.0, 90, 90, 0, 30, 3.0, 0.0, 2.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 16.0, 90, 90, 0, 30, 3.0, 0.0, 8.75, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 16.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 11.0, 80, 78, 0, 21, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 80, 78, 0, 21, 3.0, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 80, 78, 0, 21, 3.0, 0.0, 2.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 80, 78, 0, 21, 3.0, 0.0, 8.75, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 24.0); @@ -174,10 +197,10 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); FT_MOTION_RATE_RANGE(agent, 14.0, 34.0, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 2.0, 270, 49, 0, 33, 3.0, 0.0, 3.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 2.0, 270, 49, 0, 33, 3.0, 0.0, 8.75, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 2.0, 365, 100, 40, 0, 3.0, 0.0, 3.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 2.0, 365, 100, 40, 0, 3.0, 0.0, 8.75, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 2.0, 270, 40, 0, 33, 3.0, 0.0, 3.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 2.0, 270, 40, 0, 33, 3.0, 0.0, 8.75, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 2.0, 365, 40, 0, 33, 3.0, 0.0, 3.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 2.0, 365, 40, 0, 33, 3.0, 0.0, 8.75, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 34.0); FT_MOTION_RATE(agent, 1.0); @@ -230,6 +253,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairf", game_attackairf, Priority::Low); agent.acmd("game_attackairb", game_attackairb, Priority::Low); + agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); agent.acmd("expression_attackairb", expression_attackairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); diff --git a/fighters/miiswordsman/src/acmd/ground.rs b/fighters/miiswordsman/src/acmd/ground.rs index 5e4c6a8ac9..b44809acda 100644 --- a/fighters/miiswordsman/src/acmd/ground.rs +++ b/fighters/miiswordsman/src/acmd/ground.rs @@ -3,14 +3,18 @@ use super::*; unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 3.0); + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 361, 25, 0, 27, 2.5, 0.0, 5.5, 7.8, Some(0.0), Some(5.5), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 361, 15, 0, 25, 2.5, 0.0, 5.5, 7.8, Some(0.0), Some(5.5), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame_revised(boma, 0, 3.0, false); - AttackModule::set_down_only(boma, 1, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 70, 20, 0, 30, 2.5, 0.0, 5.5, 7.0, Some(0.0), Some(5.5), Some(9.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 86, 20, 0, 30, 2.5, 0.0, 5.5, 7.0, Some(0.0), Some(5.5), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 361, 15, 0, 25, 2.5, 0.0, 5.5, 7.0, Some(0.0), Some(5.5), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + AttackModule::set_down_only(boma, 2, false); } - wait(lua_state, 2.0); + frame(lua_state, 8.0); if is_excute(agent) { AttackModule::clear_all(boma); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); @@ -22,10 +26,10 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.5, 78, 20, 0, 30, 3.5, 0.0, 6.2, 10.0, Some(0.0), Some(6.2), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.5, 361, 15, 0, 25, 3.5, 0.0, 4.2, 10.0, Some(0.0), Some(4.2), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame_revised(boma, 0, 4.0, false); - AttackModule::set_down_only(boma, 1, true); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 70, 20, 0, 30, 4.0, 0.0, 5.7, 8.5, Some(0.0), Some(5.7), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 80, 20, 0, 30, 4.0, 0.0, 5.7, 8.5, Some(0.0), Some(5.7), Some(15.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 361, 15, 0, 25, 4.0, 0.0, 5.7, 8.5, Some(0.0), Some(5.7), Some(15.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + AttackModule::set_down_only(boma, 2, true); } frame(lua_state, 8.0); if is_excute(agent) { @@ -43,11 +47,18 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 30, 120, 0, 40, 3.0, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 4.0, 30, 120, 0, 40, 3.0, 0.0, 3.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 6.0, 30, 120, 0, 40, 3.0, 0.0, 8.75, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 4.0, 30, 120, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 30, 120, 0, 40, 3.0, 0.0, 3.0, 8.0, Some(0.0), Some(3.0), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } - wait(lua_state, 3.0); + frame(lua_state, 6.0); + if is_excute(agent) { + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 30, 120, 0, 40, 4.0, 0.0, 7.0, 10.0, Some(0.0), Some(7.0), Some(17.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + frame(lua_state, 7.0); + if is_excute(agent) { + ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 30, 120, 0, 40, 2.5, 0.0, 13.5, 10.5, Some(0.0), Some(13.5), Some(14.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + frame(lua_state, 8.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -62,7 +73,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 8.5, 10.0, 4.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 361, 75, 0, 50, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 13.0, 361, 75, 0, 50, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 13.0, 361, 75, 0, 50, 3.0, 0.0, 2.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 15.0, 361, 75, 0, 50, 3.0, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 10.0); @@ -99,6 +110,7 @@ unsafe extern "C" fn expression_attackdash(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); + agent.acmd("game_attack12", game_attack12, Priority::Low); agent.acmd("game_attack13", game_attack13, Priority::Low); diff --git a/fighters/miiswordsman/src/acmd/other.rs b/fighters/miiswordsman/src/acmd/other.rs index 70004d336b..16db8dec9b 100644 --- a/fighters/miiswordsman/src/acmd/other.rs +++ b/fighters/miiswordsman/src/acmd/other.rs @@ -82,15 +82,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -100,10 +96,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/miiswordsman/src/acmd/smashes.rs b/fighters/miiswordsman/src/acmd/smashes.rs index d0cd91c8f4..f62e8989f3 100644 --- a/fighters/miiswordsman/src/acmd/smashes.rs +++ b/fighters/miiswordsman/src/acmd/smashes.rs @@ -21,7 +21,7 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 14.75, 16.0, 3.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 15.0, 361, 98, 0, 41, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 15.0, 361, 98, 0, 41, 3.0, 0.0, 3.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 15.0, 361, 98, 0, 41, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 17.0, 361, 98, 0, 41, 3.0, 0.0, 9.0, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 16.0); @@ -41,7 +41,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 100, 100, 80, 0, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 3.0, 105, 100, 65, 0, 3.0, 0.0, 3.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 3.0, 105, 100, 65, 0, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 3.0, 115, 100, 50, 0, 3.0, 0.0, 9.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } @@ -68,7 +68,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 22.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 11.0, 94, 102, 0, 58, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 94, 102, 0, 58, 3.0, 0.0, 3.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 94, 102, 0, 58, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 13.0, 94, 102, 0, 58, 3.0, 0.0, 9.0, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 27.0); @@ -198,7 +198,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 11.0, 27, 60, 0, 78, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 27, 60, 0, 78, 3.0, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 11.0, 27, 60, 0, 78, 3.0, 0.0, 2.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 13.0, 27, 60, 0, 78, 3.0, 0.0, 8.75, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } @@ -215,7 +215,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 14.5, 15.0, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("armr"), 13.0, 32, 57, 0, 71, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 13.0, 32, 57, 0, 71, 3.0, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 13.0, 32, 57, 0, 71, 3.0, 0.0, 2.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 15.0, 32, 57, 0, 71, 3.0, 0.0, 8.75, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } diff --git a/fighters/miiswordsman/src/acmd/specials/special_hi.rs b/fighters/miiswordsman/src/acmd/specials/special_hi.rs index 20f54ed0e7..b58b60a2dc 100644 --- a/fighters/miiswordsman/src/acmd/specials/special_hi.rs +++ b/fighters/miiswordsman/src/acmd/specials/special_hi.rs @@ -237,29 +237,14 @@ unsafe extern "C" fn game_specialhi2fall(agent: &mut L2CAgentBase) { // ======================================== HERO SPIN ========================================== // ============================================================================================= -// unsafe extern "C" fn game_specialhi3start(agent: &mut L2CAgentBase) { -// let lua_state = agent.lua_state_agent; -// let boma = agent.boma(); -// frame(lua_state, 1.0); -// FT_MOTION_RATE(agent, 0.5); -// if is_excute(agent) { -// let brake = app::sv_kinetic_energy::get_brake_x(lua_state); -// let stable_speed = app::sv_kinetic_energy::get_stable_speed_x(lua_state); -// let limit_speed = app::sv_kinetic_energy::get_limit_speed_x(lua_state); -// let speed = app::sv_kinetic_energy::get_speed_x(lua_state); -// let main_speed = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); -// println!("start brake: {}", brake); -// println!("start speed: {}", speed); -// println!("start stable speed: {}", stable_speed); -// println!("start limit speed: {}", limit_speed); -// println!("start kinetic speed: {}", main_speed); -// sv_kinetic_energy!(set_brake, agent, FIGHTER_KINETIC_ENERGY_ID_STOP, brake / 2.0, 0.0); -// sv_kinetic_energy!(set_limit_speed, agent, FIGHTER_KINETIC_ENERGY_ID_STOP, 1.5, 0.0); -// sv_kinetic_energy!(set_stable_speed, agent, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); -// sv_kinetic_energy!(set_speed, agent, FIGHTER_KINETIC_ENERGY_ID_STOP, main_speed, 0.0); -// KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_STOP); -// } -// } +unsafe extern "C" fn game_specialhi3start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 6.0); + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); +} unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; @@ -375,8 +360,8 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 95, 100, 115, 0, 6.0, 0.0, 9.0, 7.0, Some(0.0), Some(6.0), Some(14.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 95, 100, 115, 0, 6.0, 0.0, 9.0, 7.0, Some(0.0), Some(6.0), Some(14.0), 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("hip"), 3.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -386,8 +371,8 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); if is_excute(agent) { JostleModule::set_status(boma, false); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 80, 0, 6.0, 0.0, 10.0, -14.0, Some(0.0), Some(10.0), Some(-9.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 80, 0, 6.0, 0.0, 10.0, -14.0, Some(0.0), Some(10.0), Some(-9.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -396,8 +381,8 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 100, 100, 80, 0, 6.5, 0.0, 8.0, 9.0, Some(0.0), Some(7.0), Some(14.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 100, 100, 80, 0, 6.5, 0.0, 8.0, 9.0, Some(0.0), Some(7.0), Some(14.0), 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -406,8 +391,8 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 19.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 90, 0, 6.5, 0.0, 5.0, -15.0, Some(0.0), Some(6.0), Some(-11.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 90, 0, 6.5, 0.0, 5.0, -15.0, Some(0.0), Some(6.0), Some(-11.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -416,8 +401,8 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 105, 100, 65, 0, 6.0, 0.0, 8.0, 9.0, Some(0.0), Some(6.0), Some(14.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 105, 100, 65, 0, 6.0, 0.0, 8.0, 9.0, Some(0.0), Some(6.0), Some(14.0), 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -426,8 +411,8 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 26.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 70, 0, 6.5, 0.0, 8.0, -13.0, Some(0.0), Some(8.0), Some(-10.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 60, 100, 70, 0, 6.5, 0.0, 8.0, -13.0, Some(0.0), Some(8.0), Some(-10.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -436,8 +421,8 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 31.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 105, 100, 50, 0, 6.3, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(15.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 105, 100, 50, 0, 6.3, 0.0, 9.0, 9.0, Some(0.0), Some(9.0), Some(15.0), 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 85, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -446,8 +431,8 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 38.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 30, 100, 80, 0, 6.0, 0.0, 9.0, -14.0, Some(0.0), Some(9.0), Some(-10.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 60, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 30, 100, 80, 0, 6.0, 0.0, 9.0, -14.0, Some(0.0), Some(9.0), Some(-10.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("hip"), 2.0, 60, 100, 60, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -462,11 +447,11 @@ unsafe extern "C" fn game_specialairhi3(agent: &mut L2CAgentBase) { frame(lua_state, 47.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 200, 0, 30, 7.5, 0.0, 14.0, 4.0, Some(0.0), Some(18.0), Some(11.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 140, 0, 38, 7.5, 0.0, 14.0, 4.0, Some(0.0), Some(18.0), Some(11.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 48.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 200, 0, 30, 7.5, 0.0, 15.0, 3.0, Some(0.0), Some(19.0), Some(7.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 140, 0, 38, 7.5, 0.0, 15.0, 3.0, Some(0.0), Some(19.0), Some(7.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 1.0); if is_excute(agent) { @@ -488,7 +473,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialhi2landing", game_specialhi2landing, Priority::Low); agent.acmd("game_specialhi2fall", game_specialhi2fall, Priority::Low); - //agent.acmd("game_specialhi3start", game_specialhi3start, Priority::Low); + agent.acmd("game_specialhi3start", game_specialhi3start, Priority::Low); agent.acmd("game_specialhi3", game_specialhi3, Priority::Low); agent.acmd("effect_specialhi3", effect_specialhi3, Priority::Low); agent.acmd("game_specialairhi3", game_specialairhi3, Priority::Low); diff --git a/fighters/miiswordsman/src/acmd/specials/special_lw.rs b/fighters/miiswordsman/src/acmd/specials/special_lw.rs index 0b77eca377..d6f48e308c 100644 --- a/fighters/miiswordsman/src/acmd/specials/special_lw.rs +++ b/fighters/miiswordsman/src/acmd/specials/special_lw.rs @@ -1,194 +1,236 @@ use super::*; // =============================================================================================== -// ======================================== BLADE COUNTER ======================================== +// ======================================= REVERSE IMPACT ======================================== // =============================================================================================== -unsafe extern "C" fn game_speciallw1hit(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_speciallw1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 21.0, 15.0); + frame(lua_state, 7.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_OFF); + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 75, 23, 0, 54, 3.5, -3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ELBOW); + ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 75, 23, 0, 54, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ELBOW); + ATTACK(agent, 2, 0, Hash40::new("armr"), 5.0, 75, 23, 0, 54, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ELBOW); + ATTACK(agent, 3, 0, Hash40::new("armr"), 5.0, 361, 20, 0, 20, 3.5, -3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ELBOW); + ATTACK(agent, 4, 0, Hash40::new("armr"), 5.0, 361, 20, 0, 20, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ELBOW); + ATTACK(agent, 5, 0, Hash40::new("armr"), 5.0, 361, 20, 0, 20, 3.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ELBOW); } - frame(lua_state, 21.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 60, 0, 85, 8.8, 0.0, 8.0, 15.0, Some(0.0), Some(8.0), Some(3.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_force_reaction(boma, 0, true, false); + AttackModule::clear_all(boma); + VarModule::on_flag(agent.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHECK_INPUT); } - frame(lua_state, 24.0); - FT_MOTION_RATE_RANGE(agent, 24.0, 47.0, 19.0); + frame(lua_state, 25.0); if is_excute(agent) { - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_ON); + VarModule::off_flag(agent.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHECK_INPUT); + VarModule::on_flag(agent.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHANGE_KINETIC); } - frame(lua_state, 47.0); - FT_MOTION_RATE(agent, 1.0); } -unsafe extern "C" fn game_specialairlw1hit(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_speciallw1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 21.0, 15.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_OFF); - } - frame(lua_state, 21.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 73, 60, 0, 85, 10.5, 0.0, 7.0, 14.0, Some(0.0), Some(7.0), Some(4.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_force_reaction(boma, 0, true, false); + LANDING_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), 0, 0, 3.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 4, 6.5, -7, 0, 0, 0, 1, true); } - frame(lua_state, 24.0); - FT_MOTION_RATE_RANGE(agent, 24.0, 47.0, 19.0); + frame(lua_state, 7.0); if is_excute(agent) { - AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_ON); + EFFECT(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 6.5, 10.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } - frame(lua_state, 47.0); - FT_MOTION_RATE(agent, 1.0); } -unsafe extern "C" fn game_speciallw1hitlv1(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_speciallw1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 7.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_ON); + PLAY_SE(agent, Hash40::new("se_miiswordsman_dash_stop")); + PLAY_SE(agent, Hash40::new("se_miiswordsman_swing_s")); + PLAY_SE(agent, Hash40::new("se_miiswordsman_jump03")); } - frame(lua_state, 1.0); +} + +unsafe extern "C" fn expression_speciallw1(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("haver"), 2.0, 365, 0, 0, 50, 4.0, 0.0, 11.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 1, Hash40::new("haver"), 2.0, 365, 0, 0, 50, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } } - frame(lua_state, 11.0); + frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("haver"), 2.0, 365, 0, 0, 50, 4.0, 0.0, 11.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 1, Hash40::new("haver"), 2.0, 365, 0, 0, 50, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - wait(lua_state, 7.0); + frame(lua_state, 7.0); if is_excute(agent) { - AttackModule::clear_all(boma); + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); } - wait(lua_state, 1.0); +} + +unsafe extern "C" fn game_speciallw1flourish(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 361, 80, 0, 50, 6.0, 0.0, 6.0, 10.0, Some(0.0), Some(6.0), Some(-30.0), 1.1, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 6.0, 77, 75, 0, 40, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 6.0, 77, 75, 0, 40, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 82, 75, 0, 40, 3.0, 0.0, 9.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } - wait(lua_state, 5.0); + frame(lua_state, 8.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.4); + frame(lua_state, 13.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 30.0); + frame(lua_state, 15.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); + frame(lua_state, 35.0); if is_excute(agent) { - //WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_OFF); + VarModule::on_flag(agent.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHANGE_KINETIC); } } -unsafe extern "C" fn game_specialairlw1hitlv1(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_speciallw1flourish(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_ON); + let lr = PostureModule::lr(boma); + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 5.0 * lr, 12, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } - frame(lua_state, 1.0); + frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 0.0, 0, 0, 0, 0, 4.0, 0.0, 11.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 0.0, 0, 0, 0, 0, 4.0, 0.0, 2.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + let tex_sword = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD) as u64; + let sword_add = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD_ADD) as u64; + let sword_flare = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE) as u64; + AFTER_IMAGE4_ON_arg29(agent, Hash40::new_raw(tex_sword), Hash40::new_raw(sword_add), 5, Hash40::new("haver"), 0.0, 0.2, 0.0, Hash40::new("haver"), 0.0, 10.8, 0.0, true, Hash40::new_raw(sword_flare), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); } - frame(lua_state, 2.0); + frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("haver"), 2.0, 365, 0, 0, 50, 4.0, 0.0, 11.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 1, Hash40::new("haver"), 2.0, 365, 0, 0, 50, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + AFTER_IMAGE_OFF(agent, 2); } - wait(lua_state, 7.0); + frame(lua_state, 15.0); if is_excute(agent) { - AttackModule::clear_all(boma); + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke_s"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } } - wait(lua_state, 1.0); +} + +unsafe extern "C" fn sound_speciallw1flourish(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 361, 80, 0, 50, 6.0, 0.0, 6.0, 10.0, Some(0.0), Some(6.0), Some(-30.0), 1.1, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + PLAY_SE(agent, Hash40::new("se_miiswordsman_swing_m")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miiswordsman_rnd_attack02")); } - wait(lua_state, 5.0); +} + +unsafe extern "C" fn expression_speciallw1flourish(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - AttackModule::clear_all(boma); + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } } - frame(lua_state, 30.0); + frame(lua_state, 4.0); if is_excute(agent) { - //WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_OFF); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 6.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashm"), 0); } } -// Kinesis Blade - 2 Charges - -unsafe extern "C" fn game_speciallw1hitlv2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_speciallw1mordschlag(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_OFF); - } frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 2.0, 3.0); + frame(lua_state, 2.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.1, 365, 0, 0, 40, 12.0, 0.0, 12.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); + let mut damage = 16.0; + if agent.is_situation(*SITUATION_KIND_AIR) { + damage = 14.0; + let lr = PostureModule::lr(boma); + sv_kinetic_energy!(set_speed, agent, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.5 * lr, 0.0); + KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_STOP); + } + ATTACK(agent, 0, 0, Hash40::new("armr"), damage, 49, 78, 0, 80, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), damage, 49, 78, 0, 80, 3.0, 0.0, 0.0, -2.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), damage, 49, 78, 0, 80, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } - frame(lua_state, 60.0); + frame(lua_state, 21.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 365, 0, 0, 40, 12.0, 0.0, 12.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); + sv_kinetic_energy!(set_speed, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.8); + AttackModule::clear_all(boma); } - frame(lua_state, 63.0); + frame(lua_state, 45.0); if is_excute(agent) { - AttackModule::clear_all(boma); + VarModule::on_flag(agent.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHANGE_KINETIC); } - frame(lua_state, 68.0); +} + +unsafe extern "C" fn effect_speciallw1mordschlag(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 5.0, 361, 100, 0, 50, 4.0, 0.0, 11.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 5.0, 361, 100, 0, 50, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + let lr = PostureModule::lr(boma); + if agent.is_situation(*SITUATION_KIND_GROUND) { + EFFECT(agent, Hash40::new("sys_unblockable_flash"), Hash40::new("top"), 5.0 * lr, 12, 5, 0, 0, 0, 0.65, 0, 0, 0, 0, 0, 0, true); + } + else { + EFFECT_FOLLOW(agent, Hash40::new("sys_unblockable_flash"), Hash40::new("top"), 5.0 * lr, 12, 8.5, 0, 0, 0, 0.65, true); + } } - frame(lua_state, 73.0); + frame(lua_state, 17.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_OFF); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 3, 8, 1, 180, 200, 70, 0.8, true, *EF_FLIP_AXIS_YZ); + LAST_EFFECT_SET_RATE(agent, 1.8); } - frame(lua_state, 76.0); + frame(lua_state, 19.0); if is_excute(agent) { - AttackModule::clear_all(boma); + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -3, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); } } -unsafe extern "C" fn game_specialairlw1hitlv2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_speciallw1mordschlag(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 16.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_OFF); - } - frame(lua_state, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.1, 365, 0, 0, 40, 12.0, 0.0, 12.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); - } - frame(lua_state, 60.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 365, 0, 0, 40, 12.0, 0.0, 12.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); + PLAY_SE(agent, Hash40::new("se_miiswordsman_swing_l")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miiswordsman_rnd_attack03")); } - frame(lua_state, 63.0); + frame(lua_state, 17.0); if is_excute(agent) { - AttackModule::clear_all(boma); + PLAY_SE(agent, Hash40::new("se_common_swing_09")); } - frame(lua_state, 68.0); +} + +unsafe extern "C" fn expression_speciallw1mordschlag(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 5.0, 361, 100, 0, 50, 4.0, 0.0, 11.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 5.0, 361, 100, 0, 50, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } } - frame(lua_state, 73.0); + frame(lua_state, 4.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_GRAVITY_OFF); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 76.0); + frame(lua_state, 6.0); if is_excute(agent) { - AttackModule::clear_all(boma); + RUMBLE_HIT(agent, Hash40::new("rbkind_slashl"), 0); } } @@ -200,36 +242,30 @@ unsafe extern "C" fn game_speciallw2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 7.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 6.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS); } - frame(lua_state, 6.0); + frame(lua_state, 6.0); // f9 FT_MOTION_RATE_RANGE(agent, 6.0, 12.0, 16.0); + frame(lua_state, 7.0); // f12 if is_excute(agent) { - if boma.is_button_on(Buttons::Special) { - VarModule::on_flag(agent.object(), vars::miiswordsman::status::SPECIAL_LW2_SHOCK_SPELL_HOLD); - } + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + VarModule::on_flag(agent.battle_object, vars::miiswordsman::status::SPECIAL_LW2_CHANGE_ARTICLE); + ArticleModule::generate_article(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_TORNADOSHOT, false, 0); } - frame(lua_state, 12.0); + frame(lua_state, 12.0); // f25 FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_REVERSE_SLASH_FLAG_SPECIAL_FALL); - let hold = if VarModule::is_flag(agent.object(), vars::miiswordsman::status::SPECIAL_LW2_SHOCK_SPELL_HOLD) { 15.0 } else { 0.0 }; - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 60, 55, 0, 40, 5.0, 0.0, 9.0, 15.0 + hold, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 30, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 60, 55, 0, 40, 2.0, 0.0, 2.0, 15.0 + hold, Some(0.0), Some(27.0), Some(15.0 + hold), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 60, 55, 0, 40, 3.0, 0.0, 30.0, 12.0 + hold, Some(0.0), Some(30.0), Some(18.0 + hold), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_OBJECT); } frame(lua_state, 16.0); FT_MOTION_RATE_RANGE(agent, 16.0, 23.0, 10.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - AttackModule::clear_all(boma); - } frame(lua_state, 23.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_REVERSE_SLASH_FLAG_SPECIAL_FALL); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); } } @@ -248,41 +284,23 @@ unsafe extern "C" fn effect_speciallw2(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("sys_thunder"), Hash40::new("arml"), 4, 0, 0, 0, 0, 0, 0.4, true); - if VarModule::is_flag(agent.object(), vars::miiswordsman::status::SPECIAL_LW2_SHOCK_SPELL_HOLD) { + if VarModule::is_flag(agent.object(), vars::miiswordsman::status::SPECIAL_LW2_HOLD) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 15.0, 8.0, 0, 0, 0, 0.75, 0, 0, 0, 0, 0, 0, true); } } - frame(lua_state, 9.0); - if is_excute(agent) { - let hold = if VarModule::is_flag(agent.object(), vars::miiswordsman::status::SPECIAL_LW2_SHOCK_SPELL_HOLD) { 13 } else { 0 }; - EFFECT_FOLLOW(agent, Hash40::new("sys_smokescreen"), Hash40::new("top"), 0, 25, 13 + hold, 0, 0.0, 0, 0.4, true); - LAST_EFFECT_SET_SCALE_W(agent, 0.4, 0.25, 0.4); - LAST_EFFECT_SET_COLOR(agent, 0.1, 0.1, 0.1); - LAST_EFFECT_SET_RATE(agent, 1.1); - } frame(lua_state, 10.5); if is_excute(agent) { - let hold = if VarModule::is_flag(agent.object(), vars::miiswordsman::status::SPECIAL_LW2_SHOCK_SPELL_HOLD) { 13 } else { 0 }; if agent.is_situation(*SITUATION_KIND_GROUND) { LANDING_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0.5, 0, 0, 0, 0, 0, 1.4, 0, 0, 0, 0, 0, 0, false); } - EFFECT_FOLLOW(agent, Hash40::new("sys_thunder_flash"), Hash40::new("top"), 0, 15, 13 + hold, 0, 0, 180, 0.15, true); - LAST_EFFECT_SET_RATE(agent, 1.2); } frame(lua_state, 12.0); if is_excute(agent) { - let hold = if VarModule::is_flag(agent.object(), vars::miiswordsman::status::SPECIAL_LW2_SHOCK_SPELL_HOLD) { 13 } else { 0 }; EFFECT_FOLLOW(agent, Hash40::new("sys_damage_paralysis"), Hash40::new("arml"), 4, 0, 0, 0, 0, 0, 0.35, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_hit_elec"), Hash40::new("top"), 0, 8, 13 + hold, 0, 0, 0, 0.4, true); - LAST_EFFECT_SET_COLOR(agent, 1.0, 0.84, 0.17); } frame(lua_state, 16.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("sys_smokescreen"), false, false); - EFFECT_DETACH_KIND(agent, Hash40::new("sys_smokescreen"), -1); EFFECT_OFF_KIND(agent, Hash40::new("sys_damage_paralysis"), true, true); - EFFECT_OFF_KIND(agent, Hash40::new("sys_thunder_flash"), true, true); - EFFECT_DETACH_KIND(agent, Hash40::new("sys_hit_elec"), -1); } frame(lua_state, 20.0); if is_excute(agent) { @@ -307,101 +325,308 @@ unsafe extern "C" fn sound_speciallw2(agent: &mut L2CAgentBase) { if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_common_electric_hit_m")); } - frame(lua_state, 12.0); +} + +// ================================================================================================ +// ======================================== BLURRING BLADE ======================================== +// ================================================================================================ + +unsafe extern "C" fn game_speciallw3start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 11.0, 8.0); + frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn game_speciallw3end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if !VarModule::is_flag(agent.battle_object, vars::common::instance::SPECIAL_STALL_USED) { + VarModule::on_flag(agent.battle_object, vars::common::instance::SPECIAL_STALL_USED); + SET_SPEED_EX(agent, 0.5, 1.2, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + } + else { + let speed_y = KineticModule::get_sum_speed_y(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + SET_SPEED_EX(agent, 0.5, speed_y, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + } + } + frame(lua_state, 6.0); + let shield_damage = if agent.is_motion_one_of(&[Hash40::new("special_n3_max"), Hash40::new("special_air_n3_max")]) { 3.5 } else { 1.0 }; + if agent.is_situation(*SITUATION_KIND_GROUND) { + for _ in 0..4 { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("haver"), 1.0, 180, 100, 7, 0, 3.5, 0.0, 7.0, 0.0, Some(0.0), Some(9.0), Some(0.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 1.0, 0, 100, 5, 0, 3.5, 0.0, -4.0, 0.0, Some(0.0), Some(9.0), Some(0.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 2.0); + } + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("haver"), 5.0, 85, 55, 0, 30, 3.5, 0.0, 9.5, 0.0, Some(0.0), Some(10.0), Some(0.0), 1.0, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 5.0, 70, 55, 0, 30, 3.5, 0.0, -3.0, 0.0, Some(0.0), Some(10.0), Some(0.0), 1.0, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + } + else { + for _ in 0..4 { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("haver"), 1.0, 366, 100, 10, 0, 3.5, 0.0, -4.0, 0.0, Some(0.0), Some(9.0), Some(0.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 2.0); + } + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("haver"), 5.0, 85, 55, 0, 30, 3.5, 0.0, 9.5, 0.0, Some(0.0), Some(10.0), Some(0.0), 1.0, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 5.0, 70, 55, 0, 30, 3.5, 0.0, -2.2, 0.0, Some(0.0), Some(10.0), Some(0.0), 1.0, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + } + frame(lua_state, 24.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_common_electric_hit_s")); + VarModule::on_flag(agent.battle_object, vars::miiswordsman::status::SPECIAL_LW3_CHECK_INPUT); + AttackModule::clear_all(boma); + } + frame(lua_state, 38.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::miiswordsman::status::SPECIAL_LW3_CHECK_INPUT); } } -// ================================================================================================================ -// =========================================== POWER THRUST ======================================================= -// ================================================================================================================ - -unsafe extern "C" fn game_speciallw3(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_speciallw3end(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miiswordsman_rapid_slash_sword"), Hash40::new("haver"), 0, -0.5, 0, 0, 0, 0, 1, true); + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 4, 0, -5, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + if agent.is_motion_one_of(&[Hash40::new("special_n3_end_max"), Hash40::new("special_air_n3_max")]) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + } + } + frame(lua_state, 2.0); + if is_excute(agent) { + let tex_sword = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD) as u64; + let sword_add = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD_ADD) as u64; + let sword_flare = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE) as u64; + AFTER_IMAGE4_ON_arg29(agent, Hash40::new_raw(tex_sword), Hash40::new_raw(sword_add), 3, Hash40::new("haver"), 0.0, 0.2, 0.0, Hash40::new("haver"), -0.0, 0.2, 0.0, true, Hash40::new_raw(sword_flare), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 2.0, 0.2); + } + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miiswordsman_rapid_slash_wind_s"), Hash40::new("top"), -0.0, 5.5, 12, 0, 0, 0, 1, true); + EFFECT_OFF_KIND(agent, Hash40::new("miiswordsman_rapid_slash_sword"), false, true); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miiswordsman_rapid_slash_sword"), Hash40::new("haver"), 0, -0.5, 0, 0, 0, 0, 1, true); + } + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miiswordsman_rapid_slash_sword"), false, true); + } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("haver"), 15.0, 40, 72, 0, 50, 4.0, 0.0, 3.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("haver"), 15.0, 40, 72, 0, 50, 2.7, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miiswordsman_rapid_slash_sword"), Hash40::new("haver"), 0, -0.5, 0, 0, 0, 0, 1, true); } - frame(lua_state, 15.0); + frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 40, 72, 0, 50, 4.0, 0.0, 6.0, 6.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 40, 72, 0, 50, 2.7, 0.0, 6.0, 11.0, Some(0.0), Some(6.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_WALL_CHECK); + EFFECT_OFF_KIND(agent, Hash40::new("miiswordsman_rapid_slash_sword"), false, true); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 42, 72, 0, 50, 4.0, 0.0, 6.0, 6.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 42, 72, 0, 50, 2.7, 0.0, 6.0, 11.0, Some(0.0), Some(6.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miiswordsman_rapid_slash_sword"), Hash40::new("haver"), 0, -0.5, 0, 0, 0, 0, 1, true); } - frame(lua_state, 26.0); + frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 50, 72, 0, 50, 4.0, 0.0, 6.0, 6.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 50, 72, 0, 50, 2.7, 0.0, 6.0, 11.0, Some(0.0), Some(6.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + EFFECT_OFF_KIND(agent, Hash40::new("miiswordsman_rapid_slash_sword"), false, true); } - frame(lua_state, 34.0); + frame(lua_state, 22.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miiswordsman_rapid_slash_sword"), Hash40::new("haver"), 0, -0.5, 0, 0, 0, 0, 1, true); + } + frame(lua_state, 24.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miiswordsman_rapid_slash_wind_s"), false, false); + } + frame(lua_state, 25.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miiswordsman_rapid_slash_sword"), false, true); + } + frame(lua_state, 32.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 2); } } -unsafe extern "C" fn game_specialairlw3(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_speciallw3end(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_miiswordsman_special_s01")); + PLAY_SEQUENCE(agent, Hash40::new("seq_miiswordsman_rnd_special_c3_n01")); + } + frame(lua_state, 3.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miiswordsman_special_c3_n01")); + } +} + +unsafe extern "C" fn expression_speciallw3end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if agent.is_motion_one_of(&[Hash40::new("special_n3_end_max"), Hash40::new("special_air_n3_max")]) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x26769bd1de), 0, 30, 3); + } + else { + AttackModule::set_attack_reference_joint_id(boma, Hash40::new("haver"), AttackDirectionAxis(*ATTACK_DIRECTION_Y), AttackDirectionAxis(*ATTACK_DIRECTION_NONE), AttackDirectionAxis(*ATTACK_DIRECTION_NONE)); + } + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + } + frame(lua_state, 4.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 3, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 6.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashss"), 4); + } + frame(lua_state, 8.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 3, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 12.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 3, false, *BATTLE_OBJECT_ID_INVALID as u32); + } frame(lua_state, 16.0); - sv_kinetic_energy!(set_speed_mul_2nd, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.4, 1.0); - frame(lua_state, 17.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_WALL_CHECK); - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 275, 50, 0, 40, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 361, 90, 0, 40, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 275, 50, 0, 40, 3.0, 0.0, -7.0, 3.0, Some(0.0), Some(-9.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 361, 90, 0, 40, 3.0, 0.0, -7.0, 3.0, Some(0.0), Some(-9.0), Some(4.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 3, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 18.0); - sv_kinetic_energy!(set_speed_mul_2nd, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0, 1.0); frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 361, 75, 0, 40, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 361, 75, 0, 40, 3.0, 0.0, -7.0, 3.0, Some(0.0), Some(-9.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - AttackModule::clear(boma, 2, false); - AttackModule::clear(boma, 3, false); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 3, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 28.0); +} + +unsafe extern "C" fn game_speciallw3end2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 75, 0, 40, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 361, 75, 0, 40, 3.0, 0.0, -7.0, 3.0, Some(0.0), Some(-9.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + if agent.is_situation(*SITUATION_KIND_AIR) { + KineticModule::add_speed(boma, &Vector3f::new(0.0, 3.5, 0.0)); + } } - frame(lua_state, 36.0); + frame(lua_state, 7.0); + if is_excute(agent) { + let (shield_damage, sfx) = if agent.is_motion_one_of(&[Hash40::new("special_n3_end2_max"), Hash40::new("special_air_n3_end2_max")]) + { (10, *COLLISION_SOUND_ATTR_FIRE) } else { (2, *COLLISION_SOUND_ATTR_KICK) }; + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 80, 85, 0, 64, 10.0, 0.0, 10.0, 9.5, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, sfx, *ATTACK_REGION_SWORD); + } + frame(lua_state, 11.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 55.0, 26.0); + frame(lua_state, 55.0); + FT_MOTION_RATE(agent, 1.0); } -unsafe extern "C" fn game_specialairlw3end(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_speciallw3end2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.79); + frame(lua_state, 2.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_SP_BRAKE); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("miiswordsman_rapid_slash_sword"), Hash40::new("haver"), 0, -0.5, 0, 0, 0, 0, 1, true); } - frame(lua_state, 2.0); + frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 45, 120, 0, 60, 3.5, 0.0, 3.5, -10.0, Some(0.0), Some(3.5), Some(6.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + EFFECT_FOLLOW(agent, Hash40::new("miiswordsman_rapid_slash_arc"), Hash40::new("top"), 0.75, 11, 1, -20, -70, 90, 1.2, true); + LAST_EFFECT_SET_RATE(agent, 1.2); } - frame(lua_state, 5.0); + frame(lua_state, 9.0); if is_excute(agent) { - AttackModule::clear_all(boma); - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_SP_BRAKE); + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + } + EFFECT(agent, Hash40::new("sys_sp_flash"), Hash40::new("haver"), 0, 9, 4, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 17.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 2); + } + frame(lua_state, 36.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("miiswordsman_rapid_slash_sword"), false, true); + } +} + +unsafe extern "C" fn sound_speciallw3end2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_miiswordsman_special_c3_n02")); + } +} + +unsafe extern "C" fn expression_speciallw3end2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 7.0); + if is_excute(agent) { + if agent.is_motion_one_of(&[Hash40::new("special_n3_end2_max"), Hash40::new("special_air_n3_end2_max")]) { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashl"), 0); + } + else { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashm"), 0); + } + } + frame(lua_state, 25.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x26769bd1de), 0, 30, 10); } } pub fn install(agent: &mut Agent) { - agent.acmd("game_speciallw1hit", game_speciallw1hit, Priority::Low); - agent.acmd("game_specialairlw1hit", game_specialairlw1hit, Priority::Low); + agent.acmd("game_speciallw1", game_speciallw1, Priority::Low); + agent.acmd("game_specialairlw1", game_speciallw1, Priority::Low); + agent.acmd("effect_speciallw1", effect_speciallw1, Priority::Low); + agent.acmd("effect_specialairlw1", effect_speciallw1, Priority::Low); + agent.acmd("sound_speciallw1", sound_speciallw1, Priority::Low); + agent.acmd("sound_specialairlw1", sound_speciallw1, Priority::Low); + agent.acmd("expression_speciallw1", expression_speciallw1, Priority::Low); + agent.acmd("expression_specialairlw1", expression_speciallw1, Priority::Low); + + agent.acmd("game_speciallw1flourish", game_speciallw1flourish, Priority::Low); + agent.acmd("game_specialairlw1flourish", game_speciallw1flourish, Priority::Low); + agent.acmd("effect_speciallw1flourish", effect_speciallw1flourish, Priority::Low); + agent.acmd("effect_specialairlw1flourish", effect_speciallw1flourish, Priority::Low); + agent.acmd("sound_speciallw1flourish", sound_speciallw1flourish, Priority::Low); + agent.acmd("sound_specialairlw1flourish", sound_speciallw1flourish, Priority::Low); + agent.acmd("expression_speciallw1flourish", expression_speciallw1flourish, Priority::Low); + agent.acmd("expression_specialairlw1flourish", expression_speciallw1flourish, Priority::Low); + + agent.acmd("game_speciallw1mordschlag", game_speciallw1mordschlag, Priority::Low); + agent.acmd("game_specialairlw1mordschlag", game_speciallw1mordschlag, Priority::Low); + agent.acmd("effect_speciallw1mordschlag", effect_speciallw1mordschlag, Priority::Low); + agent.acmd("effect_specialairlw1mordschlag", effect_speciallw1mordschlag, Priority::Low); + agent.acmd("sound_speciallw1mordschlag", sound_speciallw1mordschlag, Priority::Low); + agent.acmd("sound_specialairlw1mordschlag", sound_speciallw1mordschlag, Priority::Low); + agent.acmd("expression_speciallw1mordschlag", expression_speciallw1mordschlag, Priority::Low); + agent.acmd("expression_specialairlw1mordschlag", expression_speciallw1mordschlag, Priority::Low); agent.acmd("game_speciallw2", game_speciallw2, Priority::Low); agent.acmd("game_specialairlw2", game_speciallw2, Priority::Low); @@ -409,8 +634,43 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_specialairlw2", effect_speciallw2, Priority::Low); agent.acmd("sound_speciallw2", sound_speciallw2, Priority::Low); agent.acmd("sound_specialairlw2", sound_speciallw2, Priority::Low); + + agent.acmd("game_specialn3start", game_speciallw3start, Priority::Low); + agent.acmd("game_specialairn3start", game_speciallw3start, Priority::Low); + + agent.acmd("game_specialn3end", game_speciallw3end, Priority::Low); + agent.acmd("game_specialairn3end", game_speciallw3end, Priority::Low); + agent.acmd("effect_specialn3end", effect_speciallw3end, Priority::Low); + agent.acmd("effect_specialairn3end", effect_speciallw3end, Priority::Low); + agent.acmd("sound_specialn3end", sound_speciallw3end, Priority::Low); + agent.acmd("sound_specialairn3end", sound_speciallw3end, Priority::Low); + agent.acmd("expression_specialn3end", expression_speciallw3end, Priority::Low); + agent.acmd("expression_specialairn3end", expression_speciallw3end, Priority::Low); - agent.acmd("game_speciallw3", game_speciallw3, Priority::Low); - agent.acmd("game_specialairlw3", game_specialairlw3, Priority::Low); - agent.acmd("game_specialairlw3end", game_specialairlw3end, Priority::Low); + agent.acmd("game_specialn3endmax", game_speciallw3end, Priority::Low); + agent.acmd("game_specialairn3endmax", game_speciallw3end, Priority::Low); + agent.acmd("effect_specialn3endmax", effect_speciallw3end, Priority::Low); + agent.acmd("effect_specialairn3endmax", effect_speciallw3end, Priority::Low); + agent.acmd("sound_specialn3endmax", sound_speciallw3end, Priority::Low); + agent.acmd("sound_specialairn3endmax", sound_speciallw3end, Priority::Low); + agent.acmd("expression_specialn3endmax", expression_speciallw3end, Priority::Low); + agent.acmd("expression_specialairn3endmax", expression_speciallw3end, Priority::Low); + + agent.acmd("game_speciallw3end2", game_speciallw3end2, Priority::Low); + agent.acmd("game_specialairlw3end2", game_speciallw3end2, Priority::Low); + agent.acmd("effect_speciallw3end2", effect_speciallw3end2, Priority::Low); + agent.acmd("effect_specialairlw3end2", effect_speciallw3end2, Priority::Low); + agent.acmd("sound_speciallw3end2", sound_speciallw3end2, Priority::Low); + agent.acmd("sound_specialairlw3end2", sound_speciallw3end2, Priority::Low); + agent.acmd("expression_speciallw3end2", expression_speciallw3end2, Priority::Low); + agent.acmd("expression_specialairlw3end2", expression_speciallw3end2, Priority::Low); + + agent.acmd("game_speciallw3end2max", game_speciallw3end2, Priority::Low); + agent.acmd("game_specialairlw3end2max", game_speciallw3end2, Priority::Low); + agent.acmd("effect_speciallw3end2max", effect_speciallw3end2, Priority::Low); + agent.acmd("effect_specialairlw3end2max", effect_speciallw3end2, Priority::Low); + agent.acmd("sound_speciallw3end2max", sound_speciallw3end2, Priority::Low); + agent.acmd("sound_specialairlw3end2max", sound_speciallw3end2, Priority::Low); + agent.acmd("expression_speciallw3end2max", expression_speciallw3end2, Priority::Low); + agent.acmd("expression_specialairlw3end2max", expression_speciallw3end2, Priority::Low); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/acmd/specials/special_n.rs b/fighters/miiswordsman/src/acmd/specials/special_n.rs index b6d9df8e1d..4654094758 100644 --- a/fighters/miiswordsman/src/acmd/specials/special_n.rs +++ b/fighters/miiswordsman/src/acmd/specials/special_n.rs @@ -9,9 +9,6 @@ unsafe extern "C" fn game_specialn1(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 17.0, 14.0); - if is_excute(agent) { - VarModule::off_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK); - } frame(lua_state, 17.0); if is_excute(agent) { ArticleModule::generate_article(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_TORNADOSHOT, false, 0); @@ -38,50 +35,30 @@ unsafe extern "C" fn game_specialn2(agent: &mut L2CAgentBase) { } else { let x_vel = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - agent.clear_lua_stack(); - lua_args!(agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, x_vel * 0.6, 0.0, 0.0, 0.0, 0.0); - app::sv_kinetic_energy::reset_energy(lua_state); + sv_kinetic_energy!(reset_energy, agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, x_vel * 0.6, 0.0, 0.0, 0.0, 0.0); let air_speed_x_stable = WorkModule::get_param_float(boma, hash40("air_speed_x_stable"), 0); - agent.clear_lua_stack(); - lua_args!(agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * 0.5, 100.0); - app::sv_kinetic_energy::set_stable_speed(lua_state); + sv_kinetic_energy!(set_stable_speed, agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * 0.5, 0.0); } } frame(lua_state, 14.0); FT_MOTION_RATE(agent, 1.0); - if boma.is_button_on(Buttons::Special) { + if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { FT_MOTION_RATE_RANGE(agent, 14.0, 17.75, 13.0); } else { FT_MOTION_RATE_RANGE(agent, 14.0, 17.75, 3.0); } - if is_excute(agent) { - if boma.is_button_on(Buttons::Special) { - VarModule::on_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK); - } - } frame(lua_state, 17.75); FT_MOTION_RATE_RANGE(agent, 17.75, 18.0, 1.0); if is_excute(agent) { - if agent.is_situation(*SITUATION_KIND_AIR) { - if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { - agent.clear_lua_stack(); - lua_args!(agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.8); - app::sv_kinetic_energy::set_speed(lua_state); + if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { + if agent.is_situation(*SITUATION_KIND_AIR) { + sv_kinetic_energy!(set_speed, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.8); } } - // light - if !VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 100, 0, 39, 3.5, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 361, 100, 0, 39, 3.5, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 361, 100, 0, 39, 3.5, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - // heavy - else { - ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 361, 100, 0, 39, 3.5, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 361, 100, 0, 39, 3.5, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 14.0, 361, 100, 0, 39, 3.5, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 100, 0, 39, 3.5, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 361, 100, 0, 39, 3.5, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 361, 100, 0, 39, 3.5, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 18.0); FT_MOTION_RATE(agent, 1.0); @@ -179,112 +156,45 @@ unsafe extern "C" fn expression_specialn2(agent: &mut L2CAgentBase) { } } -// ================================================================================================ -// ======================================== BLURRING BLADE ======================================== -// ================================================================================================ +// ============================================================================================= +// ======================================== CHAKRAM ============================================ +// ============================================================================================= -unsafe extern "C" fn game_specialn3end(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialn3_1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let turn = agent.is_motion_one_of(&[Hash40::new("special_n3_end_turn"), Hash40::new("special_n3_end_max_turn")]); - frame(lua_state, 6.0); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 18.0, 22.0); if is_excute(agent) { - if turn { - REVERSE_LR(agent); - } - } - for _ in 0..4 { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 1.0, 180, 100, 7, 0, 3.5, 0.0, 10.0, 0.0, Some(0.0), Some(12.0), Some(0.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 1.0, 0, 100, 5, 0, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(12.0), Some(0.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - wait(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); + if agent.is_situation(*SITUATION_KIND_AIR) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - wait(lua_state, 2.0); - } - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("haver"), 1.0, 91, 100, 21, 0, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(12.0), Some(0.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 2.0); - AttackModule::set_add_reaction_frame(boma, 1, 10.0, false); - } - frame(lua_state, 24.0); - FT_MOTION_RATE_RANGE(agent, 24.0, 33.0, 5.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 33.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - let sfx = if agent.is_motion_one_of(&[Hash40::new("special_n3_end_max"), Hash40::new("special_n3_end_max_turn")]) { *COLLISION_SOUND_ATTR_FIRE } else { *COLLISION_SOUND_ATTR_KICK }; - let offset = if turn { -10.0 } else { 9.5 }; - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 70, 70, 0, 80, 10.0, 0.0, 10.0, offset, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, sfx, *ATTACK_REGION_SWORD); + WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_REQUEST_GENERATE); } - frame(lua_state, 36.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 40.0); - FT_MOTION_RATE_RANGE(agent, 40.0, 80.0, 26.0); - frame(lua_state, 80.0); - FT_MOTION_RATE(agent, 1.0); -} - -unsafe extern "C" fn game_specialairn3end(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let turn = agent.is_motion_one_of(&[Hash40::new("special_air_n3_end_turn"), Hash40::new("special_air_n3_end_max_turn")]); + frame(lua_state, 10.0); if is_excute(agent) { - let flip = if turn { -1.0 } else { 1.0 }; - SET_SPEED_EX(agent, 0.5 * flip, 1.2, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_CHECK_MOTION_HI_LW); } - frame(lua_state, 6.0); + frame(lua_state, 17.0); if is_excute(agent) { - if turn { - REVERSE_LR(agent); - } - } - for _ in 0..4 { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 1.0, 366, 100, 10, 0, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(12.0), Some(0.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) { + WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); } - wait(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); + else { + WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); } - wait(lua_state, 2.0); - } - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 1.0, 120, 100, 20, 0, 4.0, 0.0, 8.2, 0.0, None, None, None, 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 1.0, 45, 100, 25, 0, 4.0, 0.0, -1.2, 0.0, Some(0.0), Some(12.0), Some(0.0), 0.5, 0.7, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATK_SET_SHIELD_SETOFF_MUL_arg3(agent, 0, 1, 2.0); - AttackModule::set_add_reaction_frame(boma, 0, 10.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 10.0, false); } - frame(lua_state, 24.0); - FT_MOTION_RATE_RANGE(agent, 24.0, 33.0, 5.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 25.0); - if is_excute(agent) { - KineticModule::add_speed(boma, &Vector3f::new(0.0, 2.0, 0.0)); + frame(lua_state, 18.0); // f23 + if WorkModule::is_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK) { + FT_MOTION_RATE_RANGE(agent, 18.0, 41.0, 29.0); } - frame(lua_state, 33.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - let sfx = if agent.is_motion_one_of(&[Hash40::new("special_air_n3_end_max"), Hash40::new("special_air_n3_end_max_turn")]) { *COLLISION_SOUND_ATTR_FIRE } else { *COLLISION_SOUND_ATTR_KICK }; - let offset = if turn { -9.5 } else { 9.5 }; - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 70, 70, 0, 80, 10.0, 0.0, 10.0, offset, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, sfx, *ATTACK_REGION_SWORD); + else { + FT_MOTION_RATE_RANGE(agent, 18.0, 41.0, 25.0); } - frame(lua_state, 36.0); if is_excute(agent) { - AttackModule::clear_all(boma); + ArticleModule::shoot_exist(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_CHAKRAM, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); } - frame(lua_state, 40.0); - FT_MOTION_RATE_RANGE(agent, 40.0, 80.0, 26.0); - frame(lua_state, 80.0); + frame(lua_state, 41.0); FT_MOTION_RATE(agent, 1.0); } @@ -301,12 +211,10 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_specialn2", expression_specialn2, Priority::Low); agent.acmd("expression_specialairn2", expression_specialn2, Priority::Low); - agent.acmd("game_specialn3end", game_specialn3end, Priority::Low); - agent.acmd("game_specialn3endturn", game_specialn3end, Priority::Low); - agent.acmd("game_specialn3endmax", game_specialn3end, Priority::Low); - agent.acmd("game_specialn3endmaxturn", game_specialn3end, Priority::Low); - agent.acmd("game_specialairn3end", game_specialairn3end, Priority::Low); - agent.acmd("game_specialairn3endturn", game_specialairn3end, Priority::Low); - agent.acmd("game_specialairn3endmax", game_specialairn3end, Priority::Low); - agent.acmd("game_specialairn3endmaxturn", game_specialairn3end, Priority::Low); + agent.acmd("game_specials3_1", game_specialn3_1, Priority::Low); + agent.acmd("game_specialairs3_1", game_specialn3_1, Priority::Low); + agent.acmd("game_specials3_1hi", game_specialn3_1, Priority::Low); + agent.acmd("game_specialairs3_1hi", game_specialn3_1, Priority::Low); + agent.acmd("game_specials3_1lw", game_specialn3_1, Priority::Low); + agent.acmd("game_specialairs3_1lw", game_specialn3_1, Priority::Low); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/acmd/specials/special_s.rs b/fighters/miiswordsman/src/acmd/specials/special_s.rs index 1ae9b04e76..14b87b627e 100644 --- a/fighters/miiswordsman/src/acmd/specials/special_s.rs +++ b/fighters/miiswordsman/src/acmd/specials/special_s.rs @@ -7,56 +7,75 @@ use super::*; unsafe extern "C" fn game_specials1start(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let end_frame = MotionModule::end_frame(boma); frame(lua_state, 1.0); - if is_excute(agent) { - FT_MOTION_RATE(agent, 0.4); - } + FT_MOTION_RATE(agent, 0.4); } -unsafe extern "C" fn game_specialairs1start(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_specials1start(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let end_frame = MotionModule::end_frame(boma); - frame(lua_state, 1.0); + frame(lua_state, 8.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 0.4); + if agent.is_situation(*SITUATION_KIND_GROUND) { + FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), -3.5, 0, -2.5, 0, 0, 0, 1, 3, 0, 2, 0, 0, 0, false); + } } -} - -unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); + frame(lua_state, 10.0); if is_excute(agent) { - + let sword_flare = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE) as u64; + EFFECT_FOLLOW(agent, Hash40::new_raw(sword_flare), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.9, 1.4, 0.72); + EFFECT(agent, Hash40::new("miiswordsman_hensoku_flash_s"), Hash40::new("top"), 0, 4, -12, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.5); + } + frame(lua_state, 16.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_r"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 0.75, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 1.3); + } + } + frame(lua_state, 18.0); + if is_excute(agent) { + let sword_flare = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE) as u64; + EFFECT_FOLLOW(agent, Hash40::new_raw(sword_flare), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 3, 3, 3); + } + frame(lua_state, 22.5); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -8, 0, -2.5, 0, 0, 0, 1.2, 3, 0, 3, 0, 0, 0, false); } } -unsafe extern "C" fn game_specialairs1(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); if is_excute(agent) { - + PostureModule::add_pos(boma, &Vector3f::new(0.0, -5.0, 0.0)); } } -/* -unsafe fn game_specials1hit(agent: &mut L2CAgentBase) { + +unsafe extern "C" fn effect_specials1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 12.5, 44, 75, 0, 56, 4.5, 0.0, 2.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 12.5, 44, 75, 0, 56, 4.5, 0.0, 6.5, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 12.5, 44, 75, 0, 56, 4.5, 0.0, 11.5, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + let tex_sword = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD) as u64; + let sword_add = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD_ADD) as u64; + let sword_flare = agent.get_int64(*FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE) as u64; + AFTER_IMAGE4_ON_arg29(agent, Hash40::new_raw(tex_sword), Hash40::new_raw(sword_add), 8, Hash40::new("haver"), 0.0, 0.2, 0.0, Hash40::new("haver"), -0.0, 11.5, 0.0, true, Hash40::new_raw(sword_flare), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); + EFFECT_FOLLOW_WORK(agent, *FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE, Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.9, 1.4, 0.72); } - frame(lua_state, 5.0); + frame(lua_state, 7.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT_FOLLOW(agent, Hash40::new("miiswordsman_hensoku_aura"), Hash40::new("head"), 1.7, 2.7, 0, 0, 0, 0, 1, true); + EffectModule::enable_sync_init_pos_last(boma); + // agent.clear_lua_stack(); + // lua_args!(agent, Hash40::new("null"), Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + // sv_animcmd::EFFECT_BRANCH_SITUATION(agent.lua_state_agent); + // agent.clear_lua_stack(); } } -*/ // ============================================================================================= // ===================================== KINETIC SLASH ========================================= @@ -66,8 +85,8 @@ unsafe extern "C" fn game_specials2start(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 14.0, 10.0); - frame(lua_state, 14.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 13.0, 9.0); + frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); } @@ -84,9 +103,25 @@ unsafe extern "C" fn effect_specials2start(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specials2dash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 10.0); + frame(lua_state, 3.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 58, 55, 0, 55, 4.0, 0.0, 7.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } +} + +unsafe extern "C" fn expression_specials2dash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - MotionModule::set_rate(boma, 0.5); + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 3.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attackm"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); } } @@ -95,8 +130,8 @@ unsafe extern "C" fn game_specials2attack(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 55, 115, 0, 40, 5.0, 0.0, 5.5, 16.0, Some(0.0), Some(5.5), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 55, 115, 0, 40, 3.5, 0.0, 5.5, 15.0, Some(0.0), Some(5.5), Some(2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 90, 44, 0, 65, 5.0, 0.0, 5.5, 16.0, Some(0.0), Some(5.5), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 90, 44, 0, 65, 3.5, 0.0, 5.5, 15.0, Some(0.0), Some(5.5), Some(2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_ATTACK_END); } frame(lua_state, 6.0); @@ -114,20 +149,12 @@ unsafe extern "C" fn effect_specials2attack(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - // Vanilla Effects - //EFFECT_FOLLOW_WORK(agent, *FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE, Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); - //LAST_EFFECT_SET_COLOR(agent, 1, 0.72, 1.1); - //EFFECT_FOLLOW(agent, Hash40::new("miiswordsman_blastwind_stab"), Hash40::new("top"), -0.0, 5, 12, 0, 0, 0, 1.1, true); - //EFFECT_DETACH_KIND(agent, Hash40::new("miiswordsman_blastwind_stab"), -1); - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("haver"), 0, 11.4, 0, 0, 0, 0, 2, true); - EFFECT_DETACH_KIND(agent, Hash40::new("sys_smash_flash_s"), -1); EFFECT(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), -0.0, 5, 7, 0, 0, 0, 1, 0, 0, 10, 0, 0, 0, true); LAST_EFFECT_SET_COLOR(agent, 0.511, 0.264, 1.3); LAST_EFFECT_SET_RATE(agent, 0.7); EFFECT(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), -0.0, 5, -3, 0, 0, 0, 0.8, 0, 0, 10, 0, 0, 0, true); LAST_EFFECT_SET_COLOR(agent, 0.511, 0.264, 1.3); LAST_EFFECT_SET_RATE(agent, 0.7); - //AFTER_IMAGE4_ON_WORK_arg29(agent, *FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD, *FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_TEX_SWORD_ADD, 5, Hash40::new("haver"), 0, 0.2, 0, Hash40::new("haver"), -0.0, 10.8, 0, true, *FIGHTER_MIISWORDSMAN_INSTANCE_WORK_ID_INT_EFT_ID_SWORD_FLARE, Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); } frame(lua_state, 2.0); if is_excute(agent) { @@ -144,214 +171,133 @@ unsafe extern "C" fn effect_specials2attack(agent: &mut L2CAgentBase) { } } -// ============================================================================================= -// ======================================== CHAKRAM ============================================ -// ============================================================================================= - -unsafe extern "C" fn game_specials3_1(agent: &mut L2CAgentBase) { +unsafe extern "C" fn expression_specials2attack(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let end_frame = MotionModule::end_frame(boma); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.27); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_REQUEST_GENERATE); + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 8); + } + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 10.0); + frame(lua_state, 3.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_CHECK_MOTION_HI_LW); + RUMBLE_HIT(agent, Hash40::new("rbkind_slashl"), 0); } - frame(lua_state, 17.0); + frame(lua_state, 32.0); if is_excute(agent) { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL_RAW) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } - else { - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } + notify_event_msc_cmd!(agent, Hash40::new_raw(0x26769bd1de), 0, 30, 20); } - frame(lua_state, 18.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK){ - FT_MOTION_RATE(agent, 1.25); - } - else{ - FT_MOTION_RATE(agent, 1.1); - } - ArticleModule::shoot_exist(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_CHAKRAM, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); - } } -unsafe extern "C" fn game_specials3_1hi(agent: &mut L2CAgentBase) { +// ================================================================================================================ +// =========================================== POWER THRUST ======================================================= +// ================================================================================================================ + +unsafe extern "C" fn game_specials3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let end_frame = MotionModule::end_frame(boma); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.27); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_REQUEST_GENERATE); - } - frame(lua_state, 10.0); + frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 14.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_CHECK_MOTION_HI_LW); + ATTACK(agent, 0, 0, Hash40::new("haver"), 15.0, 40, 72, 0, 50, 2.7, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 15.0, 40, 72, 0, 50, 4.0, 0.0, 3.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } - frame(lua_state, 17.0); + frame(lua_state, 15.0); if is_excute(agent) { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL_RAW) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } - else { - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 40, 72, 0, 50, 2.7, 0.0, 6.0, 11.0, Some(0.0), Some(6.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 40, 72, 0, 50, 4.0, 0.0, 6.0, 6.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_WALL_CHECK); } frame(lua_state, 18.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK){ - FT_MOTION_RATE(agent, 1.25); - } - else{ - FT_MOTION_RATE(agent, 1.1); - } - ArticleModule::shoot_exist(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_CHAKRAM, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); - } -} - -unsafe extern "C" fn game_specials3_1lw(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let end_frame = MotionModule::end_frame(boma); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.27); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_REQUEST_GENERATE); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 45, 72, 0, 50, 2.7, 0.0, 6.0, 11.0, Some(0.0), Some(6.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 45, 72, 0, 50, 4.0, 0.0, 6.0, 6.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } - frame(lua_state, 10.0); + frame(lua_state, 26.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_CHECK_MOTION_HI_LW); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 50, 72, 0, 50, 2.7, 0.0, 6.0, 11.0, Some(0.0), Some(6.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 50, 72, 0, 50, 4.0, 0.0, 6.0, 6.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } - frame(lua_state, 17.0); + frame(lua_state, 30.0); if is_excute(agent) { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL_RAW) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } - else { - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } + WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_CLIFF_CHECK); } - frame(lua_state, 18.0); + frame(lua_state, 34.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK){ - FT_MOTION_RATE(agent, 1.25); - } - else{ - FT_MOTION_RATE(agent, 1.1); - } - ArticleModule::shoot_exist(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_CHAKRAM, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); - } + AttackModule::clear_all(boma); + } } -unsafe extern "C" fn game_specialairs3_1(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialairs3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let end_frame = MotionModule::end_frame(boma); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.27); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_REQUEST_GENERATE); - } - frame(lua_state, 10.0); + frame(lua_state, 1.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_CHECK_MOTION_HI_LW); + SET_SPEED_EX(agent, 0, 0.8, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); } + frame(lua_state, 16.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.1); + sv_kinetic_energy!(set_speed_mul_2nd, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.4, 1.0); frame(lua_state, 17.0); + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); if is_excute(agent) { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL_RAW) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } - else { - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } + WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_WALL_CHECK); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 275, 50, 0, 40, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 275, 50, 0, 40, 3.0, 0.0, -7.0, 3.0, Some(0.0), Some(-9.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } frame(lua_state, 18.0); + sv_kinetic_energy!(set_speed_mul_2nd, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0, 1.0); + frame(lua_state, 20.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK){ - FT_MOTION_RATE(agent, 1.25); - } - else{ - FT_MOTION_RATE(agent, 1.1); - } - ArticleModule::shoot_exist(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_CHAKRAM, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); - } -} - -unsafe extern "C" fn game_specialairs3_1hi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let end_frame = MotionModule::end_frame(boma); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.27); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_REQUEST_GENERATE); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 50, 75, 0, 40, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 50, 75, 0, 40, 3.0, 0.0, -7.0, 3.0, Some(0.0), Some(-9.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + AttackModule::clear(boma, 2, false); + AttackModule::clear(boma, 3, false); } - frame(lua_state, 10.0); + frame(lua_state, 28.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_CHECK_MOTION_HI_LW); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 55, 75, 0, 40, 3.5, 0.0, -2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 55, 75, 0, 40, 3.0, 0.0, -7.0, 3.0, Some(0.0), Some(-9.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } - frame(lua_state, 17.0); + frame(lua_state, 36.0); if is_excute(agent) { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL_RAW) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } - else { - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } + AttackModule::clear_all(boma); } - frame(lua_state, 18.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK){ - FT_MOTION_RATE(agent, 1.25); - } - else{ - FT_MOTION_RATE(agent, 1.1); - } - ArticleModule::shoot_exist(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_CHAKRAM, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); - } } -unsafe extern "C" fn game_specialairs3_1lw(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialairs3end(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let end_frame = MotionModule::end_frame(boma); + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.79); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.27); - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_REQUEST_GENERATE); + WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_SP_BRAKE); } - frame(lua_state, 10.0); + frame(lua_state, 2.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_CHECK_MOTION_HI_LW); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 45, 105, 0, 60, 3.5, 0.0, 3.5, -10.0, Some(0.0), Some(3.5), Some(6.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); } - frame(lua_state, 17.0); + frame(lua_state, 5.0); if is_excute(agent) { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) || ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL_RAW) { - WorkModule::on_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } - else { - WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK); - } + AttackModule::clear_all(boma); + WorkModule::off_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_SP_BRAKE); } - frame(lua_state, 18.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_FLAG_FLICK){ - FT_MOTION_RATE(agent, 1.25); - } - else{ - FT_MOTION_RATE(agent, 1.1); - } - ArticleModule::shoot_exist(boma, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_CHAKRAM, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL), false); - } } pub fn install(agent: &mut Agent) { agent.acmd("game_specials1start", game_specials1start, Priority::Low); - agent.acmd("game_specialairs1start", game_specialairs1start, Priority::Low); + agent.acmd("effect_specials1start", effect_specials1start, Priority::Low); + agent.acmd("game_specialairs1start", game_specials1start, Priority::Low); + agent.acmd("effect_specialairs1start", effect_specials1start, Priority::Low); agent.acmd("game_specials1", game_specials1, Priority::Low); - agent.acmd("game_specialairs1", game_specialairs1, Priority::Low); + agent.acmd("game_specialairs1", game_specials1, Priority::Low); + agent.acmd("effect_specials1", effect_specials1, Priority::Low); + agent.acmd("effect_specialairs1", effect_specials1, Priority::Low); agent.acmd("game_specials2start", game_specials2start, Priority::Low); agent.acmd("effect_specials2start", effect_specials2start, Priority::Low); @@ -359,17 +305,17 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specials2dash", game_specials2dash, Priority::Low); agent.acmd("game_specialairs2dash", game_specials2dash, Priority::Low); + agent.acmd("expression_specials2dash", expression_specials2dash, Priority::Low); + agent.acmd("expression_specialairs2dash", expression_specials2dash, Priority::Low); agent.acmd("game_specials2attack", game_specials2attack, Priority::Low); agent.acmd("game_specialairs2attack", game_specials2attack, Priority::Low); agent.acmd("effect_specials2attack", effect_specials2attack, Priority::Low); agent.acmd("effect_specialairs2attack", effect_specials2attack, Priority::Low); + agent.acmd("expression_specials2attack", expression_specials2attack, Priority::Low); + agent.acmd("expression_specialairs2attack", expression_specials2attack, Priority::Low); - agent.acmd("game_specials3_1", game_specials3_1, Priority::Low); - agent.acmd("game_specials3_1hi", game_specials3_1hi, Priority::Low); - agent.acmd("game_specials3_1lw", game_specials3_1lw, Priority::Low); - - agent.acmd("game_specialairs3_1", game_specialairs3_1, Priority::Low); - agent.acmd("game_specialairs3_1hi", game_specialairs3_1hi, Priority::Low); - agent.acmd("game_specialairs3_1lw", game_specialairs3_1lw, Priority::Low); + agent.acmd("game_speciallw3", game_specials3, Priority::Low); + agent.acmd("game_specialairlw3", game_specialairs3, Priority::Low); + agent.acmd("game_specialairlw3end", game_specialairs3end, Priority::Low); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/acmd/throws.rs b/fighters/miiswordsman/src/acmd/throws.rs index cdb53ec50d..2ae8a06fdd 100644 --- a/fighters/miiswordsman/src/acmd/throws.rs +++ b/fighters/miiswordsman/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(7.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 6.0, Some(0.0), Some(6.6), Some(7.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -29,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 6.0, Some(0.0), Some(6.6), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -5.5, Some(0.0), Some(6.6), Some(-12.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/miiswordsman/src/acmd/tilts.rs b/fighters/miiswordsman/src/acmd/tilts.rs index db3abdbce8..5391834f7b 100644 --- a/fighters/miiswordsman/src/acmd/tilts.rs +++ b/fighters/miiswordsman/src/acmd/tilts.rs @@ -3,15 +3,21 @@ use super::*; unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 3.0, 1.0); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 0.0, 4.0); } + frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); FT_MOTION_RATE_RANGE(agent, 9.0, 11.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 72, 55, 0, 50, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 72, 55, 0, 50, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 87, 55, 0, 50, 3.0, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 52, 42, 0, 50, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 52, 42, 0, 50, 3.0, 0.0, 2.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 72, 48, 0, 50, 3.0, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 11.0); FT_MOTION_RATE_RANGE(agent, 11.0, 37.0, 23.0); @@ -45,9 +51,9 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 80, 93, 0, 68, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 80, 93, 0, 68, 3.0, 0.0, 3.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 82, 98, 0, 68, 3.0, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 80, 116, 0, 42, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 80, 116, 0, 42, 3.0, 0.0, 2.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 11.0, 82, 116, 0, 42, 3.0, 0.0, 8.75, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 13.0); if is_excute(agent) { @@ -59,13 +65,14 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 5.0); + FT_MOTION_RATE_RANGE(agent, 5.0, 7.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 8.0, 70, 66, 0, 52, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 80, 66, 0, 52, 3.0, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 10.0, 90, 66, 0, 52, 3.0, 0.0, 8.75, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 8.0, 30, 40, 0, 25, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 30, 40, 0, 25, 3.0, 0.0, 2.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 10.0, 30, 40, 0, 50, 3.0, 0.0, 8.75, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } - frame(lua_state, 9.0); + frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); diff --git a/fighters/miiswordsman/src/chakram/acmd.rs b/fighters/miiswordsman/src/chakram/acmd.rs index 92c1134472..a3b8fe87dd 100644 --- a/fighters/miiswordsman/src/chakram/acmd.rs +++ b/fighters/miiswordsman/src/chakram/acmd.rs @@ -1,90 +1,57 @@ use super::*; unsafe extern "C" fn game_fly(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - // Tap Input - if !WorkModule::is_flag(boma, *WEAPON_MIISWORDSMAN_CHAKRAM_INSTANCE_WORK_ID_FLAG_FLICK){ - if is_excute(agent) { - VarModule::on_flag(owner_module_accessor.object(), vars::miiswordsman::instance::SPECIAL_S3_CHAKRAM_STICK); - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 365, 40, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -0.5, 0.0, 8, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - AttackModule::set_add_reaction_frame(boma, 0, -3.0, false); - AttackModule::enable_safe_pos(boma); - } - frame(lua_state, 37.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 0, 40, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_B, false, -0.5, 0.0, 8, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - AttackModule::set_add_reaction_frame(boma, 0, -3.0, false); - AttackModule::enable_safe_pos(boma); - } - } - // Hold Input - else{ - if is_excute(agent) { - VarModule::on_flag(owner_module_accessor.object(), vars::miiswordsman::instance::SPECIAL_S3_CHAKRAM_STICK); - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 85, 50, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - AttackModule::enable_safe_pos(boma); - } - } -} - -unsafe extern "C" fn game_flynormalsub(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 365, 40, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -0.5, 0.0, 8, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - AttackModule::set_add_reaction_frame(boma, 0, -2.0, false); - AttackModule::enable_safe_pos(boma); - } - frame(lua_state, 37.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 0, 40, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_B, false, -0.5, 0.0, 8, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - AttackModule::set_add_reaction_frame(boma, 0, -2.0, false); - AttackModule::enable_safe_pos(boma); - } -} - -unsafe extern "C" fn game_flyflicksub(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 85, 50, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - AttackModule::enable_safe_pos(boma); - } -} - -unsafe extern "C" fn game_hop(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - if is_excute(agent) { - VarModule::off_flag(owner_module_accessor.object(), vars::miiswordsman::instance::SPECIAL_S3_CHAKRAM_STICK); - } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + // Tap Input + if !WorkModule::is_flag(boma, *WEAPON_MIISWORDSMAN_CHAKRAM_INSTANCE_WORK_ID_FLAG_FLICK) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 365, 40, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 9, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + AttackModule::enable_safe_pos(boma); + } + frame(lua_state, 23.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 90, 40, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 9, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + AttackModule::enable_safe_pos(boma); + } + frame(lua_state, 37.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 10, 40, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_B, false, 0, 0.0, 9, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + AttackModule::enable_safe_pos(boma); + } + } + // Hold Input + else { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 85, 75, 0, 34, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + AttackModule::enable_safe_pos(boma); + } + } } unsafe extern "C" fn game_stick(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - SEARCH(agent, 0, 0, Hash40::new("top"), 4.0, 0.0, 0.0, 0.0, None, None, None, *COLLISION_KIND_MASK_HIT, *HIT_STATUS_MASK_NORMAL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, true); - } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + SEARCH(agent, 0, 0, Hash40::new("top"), 4.0, 0.0, 0.0, 0.0, None, None, None, *COLLISION_KIND_MASK_HIT, *HIT_STATUS_MASK_NORMAL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, true); + } } unsafe extern "C" fn effect_stick(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 142.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_erace_smoke"), Hash40::new("top"), 0, 1, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); - } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 142.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_erace_smoke"), Hash40::new("top"), 0, 1, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + } } + pub fn install(agent: &mut Agent) { - agent.acmd("game_fly", game_fly, Priority::Low); - agent.acmd("game_flynormalsub", game_flynormalsub, Priority::Low); - agent.acmd("game_flyflicksub", game_flyflicksub, Priority::Low); - //agent.acmd("game_hop", game_hop, Priority::Low); - agent.acmd("game_stick", game_stick, Priority::Low); - agent.acmd("effect_stick", effect_stick, Priority::Low); -} + agent.acmd("game_fly", game_fly, Priority::Low); + agent.acmd("game_flynormalsub", acmd_stub, Priority::Low); + agent.acmd("game_flyflicksub", acmd_stub, Priority::Low); + + agent.acmd("game_stick", game_stick, Priority::Low); + agent.acmd("effect_stick", effect_stick, Priority::Low); +} \ No newline at end of file diff --git a/fighters/miiswordsman/src/chakram/mod.rs b/fighters/miiswordsman/src/chakram/mod.rs index 60f1dd4418..6869cd648b 100644 --- a/fighters/miiswordsman/src/chakram/mod.rs +++ b/fighters/miiswordsman/src/chakram/mod.rs @@ -1,11 +1,9 @@ use super::*; mod acmd; -mod status; pub fn install() { let agent = &mut Agent::new("miiswordsman_chakram"); acmd::install(agent); - status::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/chakram/status.rs b/fighters/miiswordsman/src/chakram/status.rs deleted file mode 100644 index 5cfd0c3b77..0000000000 --- a/fighters/miiswordsman/src/chakram/status.rs +++ /dev/null @@ -1,17 +0,0 @@ -use super::*; -use globals::*; -// status script import - -// WEAPON_MIISWORDSMAN_CHAKRAM_STATUS_KIND_HOP - -unsafe extern "C" fn pre_chakram_hop(weapon: &mut L2CWeaponCommon) -> L2CValue { - let lua_state = weapon.lua_state_agent; - let boma = sv_system::battle_object_module_accessor(lua_state); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - VarModule::off_flag(owner_module_accessor.object(), vars::miiswordsman::instance::SPECIAL_S3_CHAKRAM_STICK); - smashline::original_status(Pre, weapon, *WEAPON_MIISWORDSMAN_CHAKRAM_STATUS_KIND_HOP)(weapon) -} - -pub fn install(agent: &mut Agent) { - agent.status(Pre, *WEAPON_MIISWORDSMAN_CHAKRAM_STATUS_KIND_HOP, pre_chakram_hop); -} \ No newline at end of file diff --git a/fighters/miiswordsman/src/lib.rs b/fighters/miiswordsman/src/lib.rs index 14a5aa6eed..aeb04d0789 100644 --- a/fighters/miiswordsman/src/lib.rs +++ b/fighters/miiswordsman/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/miiswordsman/src/lightshuriken/acmd.rs b/fighters/miiswordsman/src/lightshuriken/acmd.rs index 1c16362969..2c5abc521c 100644 --- a/fighters/miiswordsman/src/lightshuriken/acmd.rs +++ b/fighters/miiswordsman/src/lightshuriken/acmd.rs @@ -3,22 +3,20 @@ use super::*; unsafe extern "C" fn game_fly(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 55, 60, 0, 38, 3.0, 0.0, 10.0, 3.0, Some(0.0), Some(4.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -4, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 55, 60, 0, 38, 3.0, 0.0, -2.5, 4.0, Some(0.0), Some(4.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -4, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 55, 60, 0, 38, 3.0, 0.0, 7.0, 5.0, Some(0.0), Some(3.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -4, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 55, 60, 0, 38, 3.0, 0.0, -2.5, 4.5, Some(0.0), Some(3.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -4, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_NONE); } frame(lua_state, 18.0); if is_excute(agent) { - AttackModule::set_power(boma, 0, 7.0, false); - AttackModule::set_power(boma, 1, 7.0, false); + AttackModule::set_power(boma, 0, 5.0, false); + AttackModule::set_power(boma, 1, 5.0, false); } } unsafe extern "C" fn effect_fly(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); let mut lead_wave : u32 = std::u32::MAX; let mut wave_2 : u32 = std::u32::MAX; let mut wave_3 : u32 = std::u32::MAX; diff --git a/fighters/miiswordsman/src/opff.rs b/fighters/miiswordsman/src/opff.rs index 058918c0e2..645ba9927e 100644 --- a/fighters/miiswordsman/src/opff.rs +++ b/fighters/miiswordsman/src/opff.rs @@ -3,72 +3,15 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; - -unsafe fn ssd_charge_ledgegrab(fighter: &mut L2CFighterCommon) { - let special_hi_no = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_CUSTOMIZE_SPECIAL_HI_NO); - - if special_hi_no == 1 - && fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) { - // allows ledgegrab during Skyward Slash Dash charge - fighter.sub_transition_group_check_air_cliff(); - } -} - unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { - if !fighter.is_in_hitlag() - && !StatusModule::is_changing(fighter.module_accessor) - && ( - fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - ]) - || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_1, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_1 - ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) - && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW1_HIT - ]) - ) - || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_2, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_2 - ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) - && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_END, - *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_ATTACK, - *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_HI2_RUSH_END, - *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_HI2_BOUND - ]) - ) - || ([*FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_3, - *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_3 - ].contains(&WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO)) - && ( fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_S, - *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_N3_END, - *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_N3_LOOP, - *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_N3_END_MAX, - ]) - || (fighter.is_motion(Hash40::new("special_air_hi3")) && fighter.motion_frame() > 59.0) ) - ) - ) - && fighter.is_situation(*SITUATION_KIND_AIR) { + if (fighter.is_motion(Hash40::new("special_air_hi3")) && fighter.motion_frame() > 49.0) + && !fighter.is_in_hitlag() + && !StatusModule::is_changing(fighter.module_accessor) { fighter.sub_air_check_dive(); } } pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - ssd_charge_ledgegrab(fighter); fastfall_specials(fighter); } diff --git a/fighters/miiswordsman/src/status/final_hold.rs b/fighters/miiswordsman/src/status/final_hold.rs deleted file mode 100644 index 881a7c9c5b..0000000000 --- a/fighters/miiswordsman/src/status/final_hold.rs +++ /dev/null @@ -1,12 +0,0 @@ -use super::*; - -// FIGHTER_MIISWORDSMAN_STATUS_KIND_FINAL_HOLD - -unsafe extern "C" fn final_hold_pre(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::off_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_N1_WAVE); - smashline::original_status(Pre, fighter, *FIGHTER_MIISWORDSMAN_STATUS_KIND_FINAL_HOLD)(fighter) -} - -pub fn install(agent: &mut Agent) { - agent.status(Pre, *FIGHTER_MIISWORDSMAN_STATUS_KIND_FINAL_HOLD, final_hold_pre); -} \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/mod.rs b/fighters/miiswordsman/src/status/mod.rs index 3e74a97867..ab8da027e6 100644 --- a/fighters/miiswordsman/src/status/mod.rs +++ b/fighters/miiswordsman/src/status/mod.rs @@ -2,34 +2,21 @@ use super::*; use globals::*; // status script import +mod special_n2; +mod special_n3; + mod special_s1; mod special_s2; +mod special_s3; mod special_hi; mod special_hi2; mod special_hi3; -mod special_lw; mod special_lw1; +mod special_lw2; mod special_lw3; -mod final_hold; - -pub unsafe extern "C" fn miisword_situation_helper(fighter: &mut L2CFighterCommon) -> L2CValue { - if StatusModule::is_changing(fighter.module_accessor) { - return 1.into() - } - else { - if fighter.global_table[PREV_SITUATION_KIND] == SITUATION_KIND_GROUND && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { - return 1.into() - } - if fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_GROUND && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { - return 1.into() - } - } - return 0.into() -} - unsafe fn set_move_customizer(fighter: &mut L2CFighterCommon, customizer: unsafe extern "C" fn(&mut L2CFighterCommon) -> L2CValue) { if fighter.global_table["move_customizer_set"].get_bool() { return; @@ -55,12 +42,114 @@ unsafe extern "C" fn move_customizer(fighter: &mut L2CFighterCommon) -> L2CValue if let Some(original) = get_original_customizer(fighter) { original(fighter); } - if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_3 { + if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_2 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_n2::special_n2_main as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_N_3 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), + std::mem::transmute(special_n3::special_n3_pre as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_n3::special_n3_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_N.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_n3::special_n3_end as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_2 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), + std::mem::transmute(special_s2::special_s2_pre as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_s2::special_s2_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_s2::special_s2_end as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_S_3 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), + std::mem::transmute(special_s3::special_s3_pre as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_s3::special_s3_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_S.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_s3::special_s3_end as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END.into(), + LUA_SCRIPT_STATUS_FUNC_INIT_STATUS.into(), + std::mem::transmute(special_s3::special_s3_end_init as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_1 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), + std::mem::transmute(special_lw1::special_lw1_pre as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_lw1::special_lw1_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_CHECK_ATTACK.into(), + std::mem::transmute(special_lw1::special_lw1_check_attack as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_lw1::special_lw1_end as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_2 { + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_EXEC_STATUS.into(), + std::mem::transmute(special_lw2::special_lw2_exec as *const ()) + ); + } + else if customize_to == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_LW_3 { fighter.sv_set_status_func( FIGHTER_STATUS_KIND_SPECIAL_LW.into(), LUA_SCRIPT_STATUS_FUNC_STATUS_PRE.into(), std::mem::transmute(special_lw3::special_lw3_pre as *const ()) ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN.into(), + std::mem::transmute(special_lw3::special_lw3_main as *const ()) + ); + fighter.sv_set_status_func( + FIGHTER_STATUS_KIND_SPECIAL_LW.into(), + LUA_SCRIPT_STATUS_FUNC_STATUS_END.into(), + std::mem::transmute(special_lw3::special_lw3_end as *const ()) + ); } 0.into() } @@ -73,16 +162,13 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { pub fn install(agent: &mut Agent) { special_s1::install(agent); special_s2::install(agent); + special_s3::install(agent); special_hi::install(agent); special_hi2::install(agent); special_hi3::install(agent); - special_lw::install(agent); - special_lw1::install(agent); special_lw3::install(agent); - final_hold::install(agent); - agent.on_start(on_start); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/special_hi.rs b/fighters/miiswordsman/src/status/special_hi.rs index feb41c238a..45556225ff 100644 --- a/fighters/miiswordsman/src/status/special_hi.rs +++ b/fighters/miiswordsman/src/status/special_hi.rs @@ -29,19 +29,6 @@ unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } -// I sure do like how this doesn't run -// unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue { -// println!("Anybody home?"); -// let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_HI)(fighter); -// if WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_WAZA_CUSTOMIZE_TO) == *FIGHTER_WAZA_CUSTOMIZE_TO_SPECIAL_HI_3 { -// let brake = app::sv_kinetic_energy::get_brake_x(fighter.lua_state_agent); -// sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, brake / 2.0, 0.0); -// } - -// ret -// } - pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); - //agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_main); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/special_hi3.rs b/fighters/miiswordsman/src/status/special_hi3.rs index ff1d22ebff..ab2d04fb5a 100644 --- a/fighters/miiswordsman/src/status/special_hi3.rs +++ b/fighters/miiswordsman/src/status/special_hi3.rs @@ -167,6 +167,15 @@ unsafe extern "C" fn sub_special_hi3_end_Main(fighter: &mut L2CFighterCommon) -> return 0.into() } +unsafe extern "C" fn miisword_situation_helper(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) + || StatusModule::is_situation_changed(fighter.module_accessor) { + return 1.into() + } + + return 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Exec, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_HI3_HOLD, special_hi3_hold_exec); diff --git a/fighters/miiswordsman/src/status/special_lw.rs b/fighters/miiswordsman/src/status/special_lw.rs deleted file mode 100644 index dc9113b862..0000000000 --- a/fighters/miiswordsman/src/status/special_lw.rs +++ /dev/null @@ -1,181 +0,0 @@ -use super::*; - -unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { - StatusModule::init_settings( - fighter.module_accessor, - app::SituationKind(*SITUATION_KIND_NONE), - *FIGHTER_KINETIC_TYPE_UNIQ, - *GROUND_CORRECT_KIND_KEEP as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), - true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, - 0 - ); - FighterStatusModuleImpl::set_fighter_status_data( - fighter.module_accessor, - false, - *FIGHTER_TREADED_KIND_NO_REAC, - false, - false, - false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, - *FIGHTER_STATUS_ATTR_START_TURN as u32, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, - 0 - ); - - return 0.into(); -} - -unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { - let lua_state = fighter.lua_state_agent; - WorkModule::off_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_CONTINUE_MOT); - main_setup(fighter); - let mut l2c_agent = L2CAgent::new(lua_state); - l2c_agent.clear_lua_stack(); - l2c_agent.push_lua_stack(&mut L2CValue::new_int(0x20cbc92683)); - l2c_agent.push_lua_stack(&mut L2CValue::I32(1)); - l2c_agent.push_lua_stack(&mut L2CValue::I32(*FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND)); - l2c_agent.push_lua_stack(&mut L2CValue::I32(*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_10 - 1)); - sv_battle_object::notify_event_msc_cmd(lua_state); - l2c_agent.pop_lua_stack(1); - l2c_agent.clear_lua_stack(); - l2c_agent.push_lua_stack(&mut L2CValue::new_int(0x3a40337e2c)); - l2c_agent.push_lua_stack(&mut L2CValue::I32(*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_10 - 1)); - sv_battle_object::notify_event_msc_cmd(lua_state); - l2c_agent.pop_lua_stack(1); - fighter.sub_shift_status_main(L2CValue::Ptr(special_lw_main_loop as *const () as _)) -} - -unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - let mut num = -1; - - if MotionModule::motion_kind(fighter.module_accessor) == hash40("special_lw1") || MotionModule::motion_kind(fighter.module_accessor) == hash40("special_air_lw1") { - if ControlModule::check_button_on_trriger(fighter.module_accessor, *CONTROL_PAD_BUTTON_ATTACK) { - //println!("Kinesis activation"); - //VarModule::on_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW1_ATTACK_TRIGGER); - fighter.change_status( - L2CValue::I32(*FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW1_HIT), - L2CValue::Bool(false) - ); - return 1.into() - } - } - if MotionModule::motion_kind(fighter.module_accessor) == hash40("special_lw3") || MotionModule::motion_kind(fighter.module_accessor) == hash40("special_air_lw3") { - if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { - //println!("Swordfighter gon' give it to ya"); - fighter.change_status( - L2CValue::I32(*FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END), - L2CValue::Bool(false) - ); - return 1.into() - } - } - if CancelModule::is_enable_cancel(fighter.module_accessor) { - if fighter.sub_wait_ground_check_common(false.into()).get_bool() == false { - if fighter.sub_air_check_fall_common().get_bool() == false { - if fighter.global_table[0x17].get_i32() != *SITUATION_KIND_GROUND - || fighter.global_table[0x16].get_i32() != *SITUATION_KIND_AIR { - if fighter.global_table[0x17].get_i32() != *SITUATION_KIND_GROUND { - if fighter.global_table[0x16].get_i32() != *SITUATION_KIND_GROUND { - main_setup(fighter); - } - } - } - if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_APPLY_POWERUP_MOTION_RATE) == false { - if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_APPLIED_POWERUP_MOTION_RATE) { - MotionModule::set_rate(fighter.module_accessor,1.0); - WorkModule::off_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_APPLIED_POWERUP_MOTION_RATE); - } - } - else { - if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_APPLIED_POWERUP_MOTION_RATE) == false { - let rate = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"),hash40("lw1_motion_rate")); - MotionModule::set_rate(fighter.module_accessor,rate); - WorkModule::on_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_APPLIED_POWERUP_MOTION_RATE); - } - } - if MotionModule::is_end(fighter.module_accessor) { - if fighter.global_table[0x16].get_i32() == *SITUATION_KIND_GROUND { - fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(),false.into()); - } - if fighter.global_table[0x16].get_i32() == *SITUATION_KIND_AIR { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(),false.into()); - } - } - counter_setup(fighter); - num = 0; - } - } - if num == -1 { num = 1; } - } - L2CValue::I32(num) -} - -unsafe extern "C" fn main_setup(fighter: &mut L2CFighterCommon) { - if fighter.global_table[0x16].get_i32() != *SITUATION_KIND_GROUND { - GroundModule::correct(fighter.module_accessor,GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_CONTINUE_MOT) == false { - MotionModule::change_motion(fighter.module_accessor,Hash40::new("special_air_lw1"),0.0,1.0,false,0.0,false,false); - WorkModule::on_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_CONTINUE_MOT); - } - else { - MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor,Hash40::new("special_air_lw1"),-1.0,1.0,0.0); - } - } - else { - KineticModule::change_kinetic(fighter.module_accessor,*FIGHTER_KINETIC_TYPE_MOTION_IGNORE_NORMAL); - GroundModule::correct(fighter.module_accessor,GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); - if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_CONTINUE_MOT) == false { - MotionModule::change_motion(fighter.module_accessor,Hash40::new("special_lw1"),0.0,1.0,false,0.0,false,false); - WorkModule::on_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_CONTINUE_MOT); - } - else { - MotionModule::change_motion_inherit_frame_keep_rate(fighter.module_accessor,Hash40::new("special_lw1"),-1.0,1.0,0.0); - } - } -} - -unsafe extern "C" fn counter_setup(fighter: &mut L2CFighterCommon) { - if StatusModule::status_kind(fighter.module_accessor) != *FIGHTER_STATUS_KIND_SPECIAL_LW { - let attack_power = WorkModule::get_float(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_WORK_FLOAT_ATTACK_POWER); - if StatusModule::status_kind(fighter.module_accessor) != *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW1_HIT { - return; - } - if attack_power > 0.0 { - let part = (AttackModule::part_size(fighter.module_accessor) as i32) - 1; - if -1 < part { - let mut box_num = -1; - while box_num <= part { - if AttackModule::is_attack(fighter.module_accessor,box_num + 1, false) { - AttackModule::set_power(fighter.module_accessor,box_num + 1, attack_power, false); - } - box_num += 1; - } - } - } - } - else { - if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_SHIELD_CHK) == false { - if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_SHIELD) == false { - return; - } - ShieldModule::set_status(fighter.module_accessor,0,app::ShieldStatus(*SHIELD_STATUS_NONE),*FIGHTER_MIISWORDSMAN_SHIELD_GROUP_KIND_COUNTER_GUARD); - WorkModule::off_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_SHIELD_CHK); - } - else { - if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_SHIELD) == false { - return; - } - ShieldModule::set_status(fighter.module_accessor,0,app::ShieldStatus(*SHIELD_STATUS_NORMAL),*FIGHTER_MIISWORDSMAN_SHIELD_GROUP_KIND_COUNTER_GUARD); - WorkModule::on_flag(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_FLAG_SHIELD_CHK); - } - } -} - -pub fn install(agent: &mut Agent) { - agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); - agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_main); -} \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/special_lw1.rs b/fighters/miiswordsman/src/status/special_lw1.rs index 647cd794e8..f062923a68 100644 --- a/fighters/miiswordsman/src/status/special_lw1.rs +++ b/fighters/miiswordsman/src/status/special_lw1.rs @@ -1,81 +1,160 @@ use super::*; -//FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW1_HIT +pub unsafe extern "C" fn special_lw1_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, + 0 + ); -unsafe extern "C" fn special_lw1_hit_main(fighter: &mut L2CFighterCommon) -> L2CValue { - if StatusModule::status_kind(fighter.module_accessor) != *FIGHTER_STATUS_KIND_SPECIAL_LW { - if StatusModule::situation_kind(fighter.module_accessor) == WorkModule::get_int(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_WORK_INT_SITUATION_PREV) { - return L2CValue::I32(0) + return 0.into(); +} + +pub unsafe extern "C" fn special_lw1_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw1"), 0.0, 1.0, false, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw1"), 0.0, 1.0, false, 0.0, false, false); + } + special_lw1_set_physics(fighter, 0); + + fighter.main_shift(special_lw1_main_loop) +} + +unsafe extern "C" fn special_lw1_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + special_lw1_change_motion(fighter); + } + if KineticModule::is_enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL) { + fighter.sub_air_check_dive(); + } + if VarModule::is_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHECK_INPUT) { + if fighter.is_cat_flag(Cat1::AttackLw3 | Cat1::AttackLw4) { + VarModule::off_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHECK_INPUT); + fighter.change_motion_by_situation("special_lw1_mordschlag", "special_air_lw1_mordschlag", 0.0, 1.0, false, 0.0, false, false); + special_lw1_set_physics(fighter, 2); + } + else if fighter.is_cat_flag(Cat1::SpecialLw) { + VarModule::off_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHECK_INPUT); + fighter.change_motion_by_situation("special_lw1_flourish", "special_air_lw1_flourish", 0.0, 1.0, false, 0.0, false, false); + special_lw1_set_physics(fighter, 1); } - let speed = KineticModule::get_sum_speed3f(fighter.module_accessor,*KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - if StatusModule::situation_kind(fighter.module_accessor) != *SITUATION_KIND_AIR { - WorkModule::set_int(fighter.module_accessor,*SITUATION_KIND_GROUND,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_WORK_INT_SITUATION_PREV); + } + if VarModule::is_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHANGE_KINETIC) { + VarModule::off_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW1_CHANGE_KINETIC); + if fighter.is_situation(*SITUATION_KIND_AIR) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); } - else { - if MotionModule::motion_kind(fighter.module_accessor) == hash40("special_lw1_hit") || MotionModule::motion_kind(fighter.module_accessor) == hash40("special_air_lw1_hit") { - fighter.clear_lua_stack(); - lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_STOP,ENERGY_STOP_RESET_TYPE_AIR,speed.x,0.0,0.0,0.0,0.0); - app::sv_kinetic_energy::reset_energy(fighter.lua_state_agent); - let brake_x = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"),hash40("lw1_start_air_acl_x")); - fighter.clear_lua_stack(); - lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_STOP,brake_x,0.0); - app::sv_kinetic_energy::set_brake(fighter.lua_state_agent); - fighter.clear_lua_stack(); - lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_STOP); - app::sv_kinetic_energy::enable(fighter.lua_state_agent); - fighter.clear_lua_stack(); - lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_GRAVITY,ENERGY_GRAVITY_RESET_TYPE_GRAVITY,0.0,speed.y,0.0,0.0,0.0); - app::sv_kinetic_energy::reset_energy(fighter.lua_state_agent); - let accel_y = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"),hash40("lw1_attack_acl_y")); - fighter.clear_lua_stack(); - lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_GRAVITY,accel_y); - app::sv_kinetic_energy::set_accel(fighter.lua_state_agent); - let stable_y = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"),hash40("lw1_attack_max_y")); - fighter.clear_lua_stack(); - lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_GRAVITY,stable_y); - app::sv_kinetic_energy::set_stable_speed(fighter.lua_state_agent); - lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - app::sv_kinetic_energy::enable(fighter.lua_state_agent); - KineticModule::unable_energy(fighter.module_accessor,*FIGHTER_KINETIC_ENERGY_ID_CONTROL); - KineticModule::unable_energy(fighter.module_accessor,*FIGHTER_KINETIC_ENERGY_ID_MOTION); - WorkModule::set_int(fighter.module_accessor,*SITUATION_KIND_AIR,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_WORK_INT_SITUATION_PREV); - } - else{ - //fighter.clear_lua_stack(); - //lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR,speed.x,0.0,0.0,0.0,0.0); - //app::sv_kinetic_energy::reset_energy(fighter.lua_state_agent); - //let brake_x = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"),hash40("lw1_start_air_acl_x")); - //fighter.clear_lua_stack(); - //lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP,brake_x,0.0); - //app::sv_kinetic_energy::set_brake(fighter.lua_state_agent); - //fighter.clear_lua_stack(); - //lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP); - //app::sv_kinetic_energy::enable(fighter.lua_state_agent); - //fighter.clear_lua_stack(); - //lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY,0.0,speed.y,0.0,0.0,0.0); - //app::sv_kinetic_energy::reset_energy(fighter.lua_state_agent); - //let accel_y = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"),hash40("lw1_attack_acl_y")); - //fighter.clear_lua_stack(); - //lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY,accel_y); - //app::sv_kinetic_energy::set_accel(fighter.lua_state_agent); - let stable_y = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"),hash40("lw1_attack_max_y")); - //fighter.clear_lua_stack(); - //lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_GRAVITY,stable_y); - //app::sv_kinetic_energy::set_stable_speed(fighter.lua_state_agent); - //lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - //app::sv_kinetic_energy::enable(fighter.lua_state_agent); - KineticModule::unable_energy(fighter.module_accessor,*FIGHTER_KINETIC_ENERGY_ID_CONTROL); - fighter.clear_lua_stack(); - lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_MOTION); - app::sv_kinetic_energy::enable(fighter.lua_state_agent); - KineticModule::change_kinetic(fighter.module_accessor,*FIGHTER_KINETIC_TYPE_MOTION); - WorkModule::set_int(fighter.module_accessor,*SITUATION_KIND_AIR,*FIGHTER_MIISWORDSMAN_STATUS_COUNTER_WORK_INT_SITUATION_PREV); - } + } + + return 0.into(); +} + +unsafe fn special_lw1_set_physics(fighter: &mut L2CFighterCommon, attack_type: i32) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { return; } + if attack_type == 0 { + // pommel + let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let mut speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let mut speed_x_mul = 0.8; // parameterize + if !VarModule::is_flag(fighter.battle_object, vars::common::instance::SPECIAL_STALL_USED) { + VarModule::on_flag(fighter.battle_object, vars::common::instance::SPECIAL_STALL_USED); + speed_y = 0.5; // parameterize + speed_x_mul = 0.4; // parameterize } + let air_accel_y = fighter.get_param_float("air_accel_y", ""); + let air_speed_y_stable = fighter.get_param_float("air_speed_y_stable", ""); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, speed_y, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y * 0.8); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_speed_y_stable); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_speed_y_stable); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_AIR, sum_speed_x * speed_x_mul, 0.0, 0.0, 0.0, 0.0); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + } + else if attack_type == 1 { + // flourish + //sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); + } + else { + // mordschlag + let air_accel_y = fighter.get_param_float("air_accel_y", ""); + let air_speed_y_stable = fighter.get_param_float("air_speed_y_stable", ""); + //sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.1); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y * 0.8); // parameterize + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_speed_y_stable * 0.8); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_speed_y_stable); + } +} + +unsafe fn special_lw1_change_motion(fighter: &mut L2CFighterCommon) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + let motion = if fighter.is_motion(Hash40::new("special_air_lw1_flourish")) { Hash40::new("special_lw1_flourish") } + else if fighter.is_motion(Hash40::new("special_air_lw1_mordschlag")) { Hash40::new("special_lw1_mordschlag") } + else { Hash40::new("special_lw1") }; + fighter.set_situation(SITUATION_KIND_GROUND.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); + } + else { + let motion = if fighter.is_motion(Hash40::new("special_lw1_flourish")) { Hash40::new("special_air_lw1_flourish") } + else if fighter.is_motion(Hash40::new("special_lw1_mordschlag")) { Hash40::new("special_air_lw1_mordschlag") } + else { Hash40::new("special_air_lw1") }; + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); } - return L2CValue::I32(0) } -pub fn install(agent: &mut Agent) { - agent.status(Exec, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW1_HIT, special_lw1_hit_main); +pub unsafe extern "C" fn special_lw1_end(fighter: &mut L2CFighterCommon) -> L2CValue { + return 0.into(); +} + +pub unsafe extern "C" fn special_lw1_check_attack(fighter: &mut L2CFighterCommon, param_1: &L2CValue, param_2: &L2CValue) -> L2CValue { + if fighter.is_motion(Hash40::new("special_air_lw1")) { + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let add_speed = 1.3; // parameterize + KineticModule::add_speed(fighter.module_accessor, &Vector3f::new(0.0, add_speed, 0.0)); + } + + return 0.into(); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/special_lw2.rs b/fighters/miiswordsman/src/status/special_lw2.rs new file mode 100644 index 0000000000..53198c62ea --- /dev/null +++ b/fighters/miiswordsman/src/status/special_lw2.rs @@ -0,0 +1,9 @@ +use super::*; + +pub unsafe extern "C" fn special_lw2_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.check_hold_input(0, 6, Buttons::SpecialAll) { + VarModule::on_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW2_HOLD); + } + + return 0.into(); +} \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/special_lw3.rs b/fighters/miiswordsman/src/status/special_lw3.rs index 2041201efb..92b7d52485 100644 --- a/fighters/miiswordsman/src/status/special_lw3.rs +++ b/fighters/miiswordsman/src/status/special_lw3.rs @@ -3,10 +3,10 @@ use super::*; pub unsafe extern "C" fn special_lw3_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, - SituationKind(*SITUATION_KIND_NONE), - *FIGHTER_KINETIC_TYPE_FALL, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, *GROUND_CORRECT_KIND_KEEP as u32, - GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), true, *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, @@ -20,157 +20,143 @@ pub unsafe extern "C" fn special_lw3_pre(fighter: &mut L2CFighterCommon) -> L2CV false, false, false, - ( - *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW | - *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | - *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON - ) as u64, - ( - *FIGHTER_STATUS_ATTR_DISABLE_GROUND_FRICTION | - *FIGHTER_STATUS_ATTR_START_TURN - ) as u32, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, 0 ); - 0.into() + + return 0.into(); } -unsafe extern "C" fn special_lw3_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { - if WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION) != *SITUATION_KIND_GROUND { - if WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION) == *SITUATION_KIND_GROUND { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end_air"), 0.0, 1.0, false, 0.0, false, false); - if StopModule::is_stop(fighter.module_accessor) { - special_lw3_end_substatus(fighter, false.into()); - } - fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(special_lw3_end_substatus as *const () as _)); - fighter.main_shift(special_lw3_end_main_loop_air) - } - else { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.set_situation(SITUATION_KIND_GROUND.into()); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - KineticModule::mul_speed(fighter.module_accessor, &Vector3f::new(0.8, 1.0, 1.0), *FIGHTER_KINETIC_ENERGY_ID_STOP); - let rate = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_lw"), hash40("lw3_end_air_to_ground_rate")); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end"), 0.0, rate, false, 0.0, false, false); - fighter.main_shift(special_lw3_end_main_loop_ground) - } - else { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end_air"), 0.0, 1.0, false, 0.0, false, false); - WorkModule::enable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_INHERIT_FALL); - WorkModule::unable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_LANDING_WAIT); - WorkModule::unable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_LANDING_FALL); - fighter.main_shift(special_lw3_end_main_loop) - } +pub unsafe extern "C" fn special_lw3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.off_flag(*FIGHTER_MIISWORDSMAN_STATUS_RAPID_SLASH_FLAG_CHARGE_MAX); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_03) - 1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_03) - 1); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *GROUND_CORRECT_KIND_AIR); + fighter.change_motion_by_situation("special_n3_start", "special_air_n3_start", 0.0, 1.0, false, 0.0, false, false); + + fighter.main_shift(special_lw3_main_loop) +} + +pub unsafe extern "C" fn special_lw3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); } } - else { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor,GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - let rate = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"),hash40("lw3_end_ground_to_ground_rate")); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw3_end"), 0.0, rate, false, 0.0, false, false); - fighter.main_shift(special_lw3_end_main_loop_ground) + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_motion_inherit_frame_by_situation("special_n3_start", "special_air_n3_start", -1.0, 1.0, 0.0, false, false); + } + if MotionModule::is_end(fighter.module_accessor) { + if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + let turn_stick_x = fighter.get_param_float("common", "turn_stick_x"); + if fighter.stick_x() <= turn_stick_x { + fighter.on_flag(*FIGHTER_MIISWORDSMAN_STATUS_RAPID_SLASH_FLAG_TURN); + } + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_N3_END.into(), true.into()); } else { - // ending grounded thrust in the air - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - KineticModule::add_speed(fighter.module_accessor, &Vector3f::new(0.0, 0.5, 0.0)); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end_air"), 0.0, 1.0, false, 0.0, false, false); - fighter.main_shift(special_lw3_end_main_loop_air) + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_N3_LOOP.into(), true.into()); } } + + return 0.into(); } -unsafe extern "C" fn special_lw3_end_substatus(fighter: &mut L2CFighterCommon, param_1: L2CValue) { - if !param_1.get_bool() { - if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_FALL_ONOFF) { - KineticModule::change_kinetic(fighter.module_accessor,*FIGHTER_KINETIC_TYPE_FALL); - } - else { - KineticModule::change_kinetic(fighter.module_accessor,*FIGHTER_KINETIC_TYPE_MOTION_AIR); - } - } +pub unsafe extern "C" fn special_lw3_end(fighter: &mut L2CFighterCommon) -> L2CValue { + return 0.into(); } -unsafe extern "C" fn special_lw3_end_main_loop_ground(fighter: &mut L2CFighterCommon) -> L2CValue { - if !CancelModule::is_enable_cancel(fighter.module_accessor) || (CancelModule::is_enable_cancel(fighter.module_accessor) && !fighter.sub_wait_ground_check_common(L2CValue::Bool(false)).get_bool() && !fighter.sub_air_check_fall_common().get_bool()) { - if !fighter.is_situation(*SITUATION_KIND_AIR) { - if MotionModule::is_end(fighter.module_accessor) { - fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); - return 0.into(); - } - } - else { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - return 0.into(); - } - } - - return 1.into(); +unsafe extern "C" fn special_lw3_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_MOTION_IGNORE_NORMAL, *FIGHTER_KINETIC_TYPE_AIR_STOP); + fighter.change_motion_by_situation("special_n3_end", "special_air_n3_end", 0.0, 1.0, false, 0.0, false, false); + + fighter.main_shift(special_lw3_end_main_loop) } -unsafe extern "C" fn special_lw3_end_main_loop_air(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn special_lw3_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } if CancelModule::is_enable_cancel(fighter.module_accessor) { if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { return 1.into(); } } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_MOTION_IGNORE_NORMAL, *FIGHTER_KINETIC_TYPE_AIR_STOP); + let (ground_motion, air_motion) = if fighter.is_motion_one_of(&[Hash40::new("special_n3_end"), Hash40::new("special_air_n3_end")]) + { ("special_n3_end", "special_air_n3_end") } else { ("special_lw3_end2", "special_air_lw3_end2") }; + fighter.change_motion_inherit_frame_by_situation(ground_motion, air_motion, -1.0, 1.0, 0.0, false, false); + if fighter.is_flag(*FIGHTER_MIISWORDSMAN_STATUS_RAPID_SLASH_FLAG_TURN) { + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); + } + } + if VarModule::is_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW3_CHECK_INPUT) + && ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + VarModule::off_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW3_CHECK_INPUT); + fighter.change_motion_by_situation("special_lw3_end2", "special_air_lw3_end2", 0.0, 1.0, false, 0.0, false, false); + } if MotionModule::is_end(fighter.module_accessor) { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); return 0.into(); } - if WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION) == *SITUATION_KIND_GROUND { - if fighter.status_frame() >= 20 { - CancelModule::enable_cancel(fighter.module_accessor); + if fighter.is_motion_one_of(&[Hash40::new("special_lw3_end2"), Hash40::new("special_air_lw3_end2")]) { + if let Some(func_ptr) = smashline::api::get_target_function("lua2cpp_miiswordsman.nrs", 0x3a8e0) { + let apply_charge_muls: fn(&mut L2CFighterCommon) = std::mem::transmute(func_ptr); + apply_charge_muls(fighter); } } return 0.into(); } -unsafe extern "C" fn special_lw3_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn special_lw3_end_max_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.change_motion_by_situation("special_n3_end_max", "special_air_n3_end_max", 0.0, 1.0, false, 0.0, false, false); + + fighter.main_shift(special_lw3_end_main_loop) +} + +unsafe extern "C" fn special_lw3_end_max_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } if CancelModule::is_enable_cancel(fighter.module_accessor) { if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { return 1.into(); } } - if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_INHERIT_FALL) { - if MotionModule::is_end(fighter.module_accessor) { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - return 0.into(); - } - if fighter.is_situation(*SITUATION_KIND_GROUND) { - if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_LANDING_FALL_SPECIAL) { - let landing_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_lw"), hash40("lw3_landing_frame")); - WorkModule::set_float(fighter.module_accessor,landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); - fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); - return 1.into(); - } - fighter.set_situation(SITUATION_KIND_GROUND.into()); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end"), 0.0, 1.0, false, 0.0, false, false); - WorkModule::unable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_INHERIT_FALL); - WorkModule::enable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_LANDING_WAIT); - WorkModule::enable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_LANDING_FALL); - return 0.into(); + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_MOTION_IGNORE_NORMAL, *FIGHTER_KINETIC_TYPE_AIR_STOP); + let (ground_motion, air_motion) = if fighter.is_motion_one_of(&[Hash40::new("special_n3_end_max"), Hash40::new("special_air_n3_end_max")]) + { ("special_n3_end_max", "special_air_n3_end_max") } else { ("special_lw3_end2_max", "special_air_lw3_end2_max") }; + fighter.change_motion_inherit_frame_by_situation(ground_motion, air_motion, -1.0, 1.0, 0.0, false, false); + if fighter.is_flag(*FIGHTER_MIISWORDSMAN_STATUS_RAPID_SLASH_FLAG_TURN) { + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); } } - else { - if MotionModule::is_end(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); - return 0.into(); - } - else { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - return 0.into(); - } + if VarModule::is_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW3_CHECK_INPUT) + && ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + VarModule::off_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_LW3_CHECK_INPUT); + fighter.change_motion_by_situation("special_lw3_end2_max", "special_air_lw3_end2_max", 0.0, 1.0, false, 0.0, false, false); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 0.into(); + } + if fighter.is_motion_one_of(&[Hash40::new("special_lw3_end2_max"), Hash40::new("special_air_lw3_end2_max")]) { + if let Some(func_ptr) = smashline::api::get_target_function("lua2cpp_miiswordsman.nrs", 0x3a8e0) { + let apply_charge_muls: fn(&mut L2CFighterCommon) = std::mem::transmute(func_ptr); + apply_charge_muls(fighter); } } @@ -178,5 +164,6 @@ unsafe extern "C" fn special_lw3_end_main_loop(fighter: &mut L2CFighterCommon) - } pub fn install(agent: &mut Agent) { - agent.status(Main, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END, special_lw3_end_main); + agent.status(Main, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_N3_END, special_lw3_end_main); + agent.status(Main, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_N3_END_MAX, special_lw3_end_max_main); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/special_n2.rs b/fighters/miiswordsman/src/status/special_n2.rs new file mode 100644 index 0000000000..2c37a8c7d9 --- /dev/null +++ b/fighters/miiswordsman/src/status/special_n2.rs @@ -0,0 +1,54 @@ +use super::*; + +pub unsafe extern "C" fn special_n2_main(fighter: &mut L2CFighterCommon) -> L2CValue { + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) - 1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_02) - 1); + VarModule::on_flag(fighter.battle_object, vars::common::status::CHECK_HOLD_INPUT); + + fighter.main_shift(special_n2_main_loop) +} + +pub unsafe extern "C" fn special_n2_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if StatusModule::is_changing(fighter.module_accessor) + || StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); + if fighter.is_flag(*FIGHTER_MIISWORDSMAN_STATUS_LIGHT_SYURIKEN_FLAG_FIRST) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_n2"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n2"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIISWORDSMAN_STATUS_LIGHT_SYURIKEN_FLAG_FIRST); + } + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + if fighter.is_flag(*FIGHTER_MIISWORDSMAN_STATUS_LIGHT_SYURIKEN_FLAG_FIRST) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_n2"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_n2"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIISWORDSMAN_STATUS_LIGHT_SYURIKEN_FLAG_FIRST); + } + } + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 0.into(); + } + } + if fighter.check_hold_input(0, 8, Buttons::SpecialAll) { + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + } + if fighter.motion_frame() >= 27.0 { + fighter.sub_air_check_dive(); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + + return 0.into(); +} \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/special_n3.rs b/fighters/miiswordsman/src/status/special_n3.rs new file mode 100644 index 0000000000..ff989c8996 --- /dev/null +++ b/fighters/miiswordsman/src/status/special_n3.rs @@ -0,0 +1,48 @@ +use super::*; + +pub unsafe extern "C" fn special_n3_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + 0, + 0, + 0, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON | *FIGHTER_LOG_MASK_FLAG_SHOOT) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + return 0.into(); +} + +// Chakram main +pub unsafe extern "C" fn special_n3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + PostureModule::set_stick_lr(fighter.module_accessor, 0.0); + PostureModule::update_rot_y_lr(fighter.module_accessor); + fighter.set_int64(hash40("special_s3_1") as i64, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_WORK_INT_MOTION); + fighter.set_int64(hash40("special_air_s3_1") as i64, *FIGHTER_MIISWORDSMAN_STATUS_CHAKRAM_WORK_INT_MOTION_AIR); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_06) - 1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_06) - 1); + + let main_loop = smashline::api::get_target_function("lua2cpp_miiswordsman.nrs", 0x215b0).unwrap(); + fighter.sub_shift_status_main(L2CValue::Ptr(main_loop as *const () as _)) +} + +pub unsafe extern "C" fn special_n3_end(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_GENERATE_ARTICLE_CHAKRAM, ArticleOperationTarget(0)); + return 0.into(); +} \ No newline at end of file diff --git a/fighters/miiswordsman/src/status/special_s1.rs b/fighters/miiswordsman/src/status/special_s1.rs index a9354b616a..3d85bd5808 100644 --- a/fighters/miiswordsman/src/status/special_s1.rs +++ b/fighters/miiswordsman/src/status/special_s1.rs @@ -234,84 +234,69 @@ pub unsafe extern "C" fn special_s1_end_pre(fighter: &mut L2CFighterCommon) -> L } unsafe extern "C" fn special_s1_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s1_end"), 0.0, 1.0, false, 0.0, false, false); - } - else { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s1_end"), 0.0, 1.0, false, 0.0, false, false); - } + special_s1_end_change_motion(fighter, false); fighter.sub_shift_status_main(L2CValue::Ptr(special_s1_end_main_loop as *const () as _)) } unsafe extern "C" fn special_s1_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if !fighter.sub_transition_group_check_air_cliff().get_bool() { - if !CancelModule::is_enable_cancel(fighter.module_accessor) || (CancelModule::is_enable_cancel(fighter.module_accessor) && !fighter.sub_wait_ground_check_common(L2CValue::Bool(false)).get_bool() && !fighter.sub_air_check_fall_common().get_bool()) { - if !MotionModule::is_end(fighter.module_accessor) { - if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_HENSOKU_SLASH_WORK_FLAG_END_LANDING) { - if fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_GROUND { - if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { - fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); - return 1.into(); - } - } - } - if fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_GROUND { - if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { - if fighter.global_table[PREV_SITUATION_KIND] == SITUATION_KIND_GROUND { - if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - StatusModule::set_situation_kind(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_AIR), false); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s1_end"), -1.0, 1.0, 0.0, false, false); - let s1_control_limit_mul_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("s1_control_limit_mul_x")); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - fighter.clear_lua_stack(); - lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); - smash::app::sv_kinetic_energy::reset_energy(fighter.lua_state_agent); - fighter.clear_lua_stack(); - lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, s1_control_limit_mul_x); - smash::app::sv_kinetic_energy::mul_x_speed_max(fighter.lua_state_agent); - return 1.into(); - } - } - } - else { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - StatusModule::set_situation_kind(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_GROUND), false); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_s1_end"), -1.0, 1.0, 0.0, false, false); - - } - } - else { - if fighter.global_table[PREV_SITUATION_KIND] == SITUATION_KIND_GROUND { - if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - StatusModule::set_situation_kind(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_AIR), false); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - return 1.into(); - } - } - } - return 0.into() - } - if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - } - else { - fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) + && (fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool()) { + return 1.into(); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + special_s1_end_change_motion(fighter, true); + } + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_HENSOKU_SLASH_WORK_FLAG_END_LANDING) { + if fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_GROUND { + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); + return 1.into(); } } + } + + return 0.into(); +} + +unsafe fn special_s1_end_change_motion(fighter: &mut L2CFighterCommon, inherit: bool) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + StatusModule::set_situation_kind(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_GROUND), false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + if inherit { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_s1_end"), -1.0, 1.0, 0.0, false, false); + } else { - if !fighter.sub_wait_ground_check_common(L2CValue::Bool(false)).get_bool() { - if fighter.sub_air_check_fall_common().get_bool() { - return 1.into() - } - } + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s1_end"), 0.0, 1.0, false, 0.0, false, false); } } - return 1.into() + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + StatusModule::set_situation_kind(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_AIR), false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + if inherit { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s1_end"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s1_end"), 0.0, 1.0, false, 0.0, false, false); + } + let s1_control_limit_mul_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("s1_control_limit_mul_x")); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + // fighter.clear_lua_stack(); + // lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); + // smash::app::sv_kinetic_energy::reset_energy(fighter.lua_state_agent); + sv_kinetic_energy!(mul_x_speed_max, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, s1_control_limit_mul_x * 0.2); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s1_end"), 0.0, 1.0, false, 0.0, false, false); + } } pub fn install(agent: &mut Agent) { diff --git a/fighters/miiswordsman/src/status/special_s2.rs b/fighters/miiswordsman/src/status/special_s2.rs index 3d68838d77..275d000eab 100644 --- a/fighters/miiswordsman/src/status/special_s2.rs +++ b/fighters/miiswordsman/src/status/special_s2.rs @@ -1,5 +1,95 @@ use super::*; +pub unsafe extern "C" fn special_s2_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + + 0.into() +} + +pub unsafe extern "C" fn special_s2_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.off_flag(*FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_05) + -1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_05) + -1); + sub_special_s2_main(fighter); + VarModule::on_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); + + fighter.main_shift(special_s2_main_loop) +} + +unsafe extern "C" fn special_s2_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if MotionModule::is_end(fighter.module_accessor) { + let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + VarModule::set_float(fighter.battle_object, vars::miiswordsman::status::SPECIAL_S2_SPEED_Y, sum_speed_y); + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_DASH.into(), true.into()); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + sub_special_s2_main(fighter); + } + if fighter.global_table[STATUS_KIND_INTERRUPT].get_i32() == *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_DASH { + if GroundModule::is_status_cliff(fighter.module_accessor) { + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_END.into(), true.into()); + return 1.into(); + } + } + + return 0.into(); +} + +unsafe fn sub_special_s2_main(fighter: &mut L2CFighterCommon) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + if fighter.is_flag(*FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_s2_start"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s2_start"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT); + } + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + if fighter.is_flag(*FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s2_start"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s2_start"), 0.0, 1.0, false, 0.0, false, false); + fighter.on_flag(*FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT); + } + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + } + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); +} + +pub unsafe extern "C" fn special_s2_end(fighter: &mut L2CFighterCommon) -> L2CValue { + SoundModule::stop_se(fighter.module_accessor, Hash40::new("se_miiswordsman_special_s01"), 0); + return 0.into(); +} // FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_DASH @@ -46,15 +136,26 @@ unsafe extern "C" fn special_s2_dash_main(fighter: &mut L2CFighterCommon) -> L2C } unsafe extern "C" fn special_s2_dash_change_motion(fighter: &mut L2CFighterCommon) { - let mot = if !fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_ON_DROP.into()); - Hash40::new("special_air_s2_dash") - } - else { + let mot = if fighter.is_situation(*SITUATION_KIND_GROUND) { GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_ON_DROP.into()); Hash40::new("special_s2_dash") + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + let sum_speed_y = VarModule::get_float(fighter.battle_object, vars::miiswordsman::status::SPECIAL_S2_SPEED_Y); + let stable_speed_y = fighter.get_param_float("air_speed_y_stable", ""); + let accel_y = fighter.get_param_float("air_accel_y", ""); + let min_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_s2.min_speed_y_mul"); + let max_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_s2.max_speed_y_mul"); + let speed_y = sum_speed_y.clamp(-(sum_speed_y.abs()) * min_mul, stable_speed_y * max_mul); + let mul_str = if speed_y >= 0.0 { "special_s2.accel_y_mul_up" } else { "special_s2.accel_y_mul_down" }; + let accel_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, mul_str); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, stable_speed_y); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -accel_y * accel_mul); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + Hash40::new("special_air_s2_dash") }; if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT) { MotionModule::change_motion(fighter.module_accessor, mot, 0.0, 1.0, false, 0.0, false, false); @@ -72,6 +173,32 @@ unsafe extern "C" fn special_s2_dash_substatus(fighter: &mut L2CFighterCommon, u return 0.into(); } +unsafe extern "C" fn special_s2_dash_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() + || fighter.sub_ground_check_stop_wall().get_bool() { + return 0.into(); + } + let dash_count = WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_WORK_INT_DASH_COUNT); + if dash_count <= 0 { + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_ATTACK.into(), false.into()); + return 0.into(); + } + if !StatusModule::is_changing(fighter.module_accessor) + && StatusModule::is_situation_changed(fighter.module_accessor) { + special_s2_dash_change_motion(fighter); + } + special_s2_main_loop_helper(fighter); + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + let shield_hit_end_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_s2.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, shield_hit_end_speed_x * lr, 0.0); + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_ATTACK.into(), false.into()); + return 0.into(); + } + + return 0.into(); +} + unsafe extern "C" fn special_s2_main_loop_helper(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.global_table[STATUS_KIND_INTERRUPT].get_i32() == *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_DASH { let cont = if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND @@ -89,36 +216,37 @@ unsafe extern "C" fn special_s2_main_loop_helper(fighter: &mut L2CFighterCommon) 1.into() } -unsafe extern "C" fn special_s2_dash_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.sub_transition_group_check_air_cliff().get_bool() - || fighter.sub_ground_check_stop_wall().get_bool() { - return 0.into(); - } - let dash_count = WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_WORK_INT_DASH_COUNT); - if dash_count <= 0 { - fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_END.into(), false.into()); - return 0.into(); - } - fighter.check_wall_jump_cancel(); - if VarModule::is_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_S2_GROUND_START) { - VarModule::set_float(fighter.battle_object, vars::common::instance::JUMP_SPEED_MAX_MUL, 1.346); // 1.75 max jump speed out of Quick Draw (copied from Ike) - fighter.check_jump_cancel(true, false); - } - // attack cancel - if fighter.is_cat_flag(Cat1::SpecialAny) { - StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_ATTACK, true); - } +// FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_ATTACK - if !StatusModule::is_changing(fighter.module_accessor) - && StatusModule::is_situation_changed(fighter.module_accessor) { - special_s2_dash_change_motion(fighter); - } - special_s2_main_loop_helper(fighter); +pub unsafe extern "C" fn special_s2_attack_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + *FS_SUCCEEDS_KEEP_ATTACK + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + return 0.into(); } -// FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_ATTACK - unsafe extern "C" fn special_s2_attack_main(fighter: &mut L2CFighterCommon) -> L2CValue { WorkModule::off_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT); let s2_dash_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40("s2_dash_frame")); @@ -139,7 +267,12 @@ unsafe extern "C" fn special_s2_attack_mot_change(fighter: &mut L2CFighterCommon } } else { - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + if VarModule::is_flag(fighter.battle_object, vars::miiswordsman::status::SPECIAL_S2_GROUND_START) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + } + else { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + } if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT) { MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s2_attack"), 0.0, 1.0, false, 0.0, false, false); WorkModule::on_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_SHIPPU_SLASH_FLAG_CONTINUE_MOT); @@ -154,60 +287,29 @@ unsafe extern "C" fn special_s2_attack_main_loop(fighter: &mut L2CFighterCommon) if fighter.sub_transition_group_check_air_cliff().get_bool() { return 0.into(); } - if !CancelModule::is_enable_cancel(fighter.module_accessor) || (CancelModule::is_enable_cancel(fighter.module_accessor) && !fighter.sub_wait_ground_check_common(L2CValue::Bool(false)).get_bool() && !fighter.sub_air_check_fall_common().get_bool()) { - special_s2_attack_main_helper(fighter); + if CancelModule::is_enable_cancel(fighter.module_accessor) + && (fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool()) { + return 0.into(); } - else { - if fighter.sub_wait_ground_check_common(false.into()).get_bool() == false { - if fighter.sub_air_check_fall_common().get_bool() { - return 0.into(); - } - } - } - return 0.into() -} - -unsafe extern "C" fn special_s2_attack_main_helper(fighter: &mut L2CFighterCommon) { - if !MotionModule::is_end(fighter.module_accessor) { - if !StatusModule::is_changing(fighter.module_accessor) { - if fighter.global_table[PREV_SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { - if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { - special_s2_attack_mot_change(fighter); - } + if !StatusModule::is_changing(fighter.module_accessor) { + if StatusModule::is_situation_changed(fighter.module_accessor) { + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("miiswordsman_counter_arc"), true, true); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + let landing_lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "special_s2.landing_lag"); + fighter.check_land_cancel(Some(landing_lag)); } else { - if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { - special_s2_attack_mot_change(fighter); - } + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); } } - special_s2_main_loop_helper(fighter); } - else { - if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { - if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_AIR { - if StatusModule::is_changing(fighter.module_accessor) { - if fighter.global_table[PREV_SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { - if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { - special_s2_attack_mot_change(fighter); - } - } - else { - if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { - special_s2_attack_mot_change(fighter); - } - } - } - special_s2_main_loop_helper(fighter); - } - else { - fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), true.into()); - } - } - else { - fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), true.into()); - } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); } + + return 0.into(); } // FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_END @@ -281,7 +383,7 @@ unsafe extern "C" fn special_s2_end_main_loop(fighter: &mut L2CFighterCommon) -> else { if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { fighter.change_status( - L2CValue::I32(*FIGHTER_STATUS_KIND_FALL_SPECIAL), + L2CValue::I32(*FIGHTER_STATUS_KIND_FALL), L2CValue::Bool(true) ); } @@ -354,6 +456,7 @@ pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_DASH, special_s2_dash_pre); agent.status(Main, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_DASH, special_s2_dash_main); + agent.status(Pre, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_ATTACK, special_s2_attack_pre); agent.status(Main, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_ATTACK, special_s2_attack_main); agent.status(Pre, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_S2_END, special_s2_end_pre); diff --git a/fighters/miiswordsman/src/status/special_s3.rs b/fighters/miiswordsman/src/status/special_s3.rs new file mode 100644 index 0000000000..f43be9a235 --- /dev/null +++ b/fighters/miiswordsman/src/status/special_s3.rs @@ -0,0 +1,355 @@ +use super::*; + +// FIGHTER_STATUS_KIND_SPECIAL_S + +pub unsafe extern "C" fn special_s3_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_FALL, + *GROUND_CORRECT_KIND_KEEP as u32, + GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + ( + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW | + *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | + *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON + ) as u64, + ( + *FIGHTER_STATUS_ATTR_DISABLE_GROUND_FRICTION | + *FIGHTER_STATUS_ATTR_START_TURN + ) as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, + 0 + ); + + return 0.into(); +} + +pub unsafe extern "C" fn special_s3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.off_flag(*FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_SP_BRAKE); + fighter.off_flag(*FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_CLIFF_CHECK); + fighter.off_flag(*FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_WALL_CHECK); + fighter.off_flag(*FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_FALL_ONOFF); + fighter.off_flag(*FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_LANDING_FALL_SPECIAL); + let hit_reduct_count = fighter.get_param_int("param_special_lw", "lw3_hit_reduct_count"); + fighter.set_int(hit_reduct_count, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_REDUCTION_LEFT); + fighter.set_float(1.0, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLOAT_JET_STUB_SPEED_COEFFICIENT); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.set_int(*SITUATION_KIND_GROUND, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw3"), 0.0, 1.0, false, 0.0, false, false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); + fighter.set_situation(SITUATION_KIND_GROUND.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + } + else { + fighter.set_int(*SITUATION_KIND_AIR, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3"), 0.0, 1.0, false, 0.0, false, false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_12) - 1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x3a40337e2c), FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_12) - 1); + // Restore double jump + if fighter.is_situation(*SITUATION_KIND_AIR) + && fighter.get_num_used_jumps() == fighter.get_jump_count_max() { + fighter.dec_int(*FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + } + + fighter.main_shift(special_s3_main_loop) +} + +pub unsafe extern "C" fn special_s3_end(fighter: &mut L2CFighterCommon) -> L2CValue { + return 0.into(); +} + +unsafe extern "C" fn special_s3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END.into(), false.into()); + return 0.into(); + } + + // Skip to end on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) + && !fighter.is_in_hitlag() { + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END.into(), false.into()); + return 0.into(); + } + + let start_situation = fighter.get_int(*FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION); + if start_situation == *SITUATION_KIND_GROUND { + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.set_int(*SITUATION_KIND_GROUND, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION); + fighter.set_situation(SITUATION_KIND_GROUND.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + } + else { + // grounded edge cancel + if fighter.is_flag(*FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_CLIFF_CHECK) { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + } + } + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END.into(), false.into()); + return 1.into(); + } + + return 0.into(); + } + if fighter.is_situation(*SITUATION_KIND_GROUND) + && GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) { + fighter.change_status(FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END.into(), false.into()); + return 0.into(); + } + + return 0.into(); +} + +// FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END + +pub unsafe extern "C" fn special_s3_end_init(fighter: &mut L2CFighterCommon) -> L2CValue { + let start_situation = WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION); + + if start_situation == *SITUATION_KIND_AIR + && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + + KineticModule::unable_energy_all(fighter.module_accessor); + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + ENERGY_GRAVITY_RESET_TYPE_GRAVITY, + 0.0, + speed_y, + 0.0, + 0.0, + 0.0 + ); + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + ENERGY_STOP_RESET_TYPE_AIR_BRAKE, + speed_x, + 0.0, + 0.0, + 0.0, + 0.0 + ); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + } else if start_situation == *SITUATION_KIND_GROUND + && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + ENERGY_STOP_RESET_TYPE_GROUND, + speed_x, + 0.0, + 0.0, + 0.0, + 0.0 + ); + + // Reduce speed on shield + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 || prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0 { + let shield_hit_end_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s3.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + shield_hit_end_speed_x * lr, + 0.0 + ); + } + + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + } + + 0.into() +} + +unsafe extern "C" fn special_s3_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION) != *SITUATION_KIND_GROUND { + if WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION) == *SITUATION_KIND_GROUND { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end_air"), 0.0, 1.0, false, 0.0, false, false); + if StopModule::is_stop(fighter.module_accessor) { + special_s3_end_substatus(fighter, false.into()); + } + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(special_s3_end_substatus as *const () as _)); + fighter.main_shift(special_s3_end_main_loop_air) + } + else { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + // ending air thrust on the ground + fighter.set_situation(SITUATION_KIND_GROUND.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + KineticModule::mul_speed(fighter.module_accessor, &Vector3f::new(0.8, 1.0, 1.0), *FIGHTER_KINETIC_ENERGY_ID_STOP); + let rate = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_lw"), hash40("lw3_end_air_to_ground_rate")); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end"), 0.0, rate, false, 0.0, false, false); + fighter.main_shift(special_s3_end_main_loop_ground) + } + else { + // ending air thrust in air + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + let dive_speed_y = fighter.get_param_float("dive_speed_y", ""); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, dive_speed_y); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end_air"), 0.0, 1.0, false, 0.0, false, false); + WorkModule::enable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_INHERIT_FALL); + WorkModule::unable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_LANDING_WAIT); + WorkModule::unable_transition_term(fighter.module_accessor,*FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_LANDING_FALL); + fighter.main_shift(special_s3_end_main_loop) + } + } + } + else { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + // ending grounded thrust on the ground + GroundModule::correct(fighter.module_accessor,GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + let rate = WorkModule::get_param_float(fighter.module_accessor,hash40("param_special_lw"), hash40("lw3_end_ground_to_ground_rate")); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw3_end"), 0.0, rate, false, 0.0, false, false); + + // Reduce speed on shield + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 || prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0 { + let shield_hit_end_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s3.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, shield_hit_end_speed_x * lr, 0.0); + } + + fighter.main_shift(special_s3_end_main_loop_ground) + } + else { + // ending grounded thrust in the air + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + KineticModule::add_speed(fighter.module_accessor, &Vector3f::new(0.0, 0.5, 0.0)); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw3_end_air"), 0.0, 1.0, false, 0.0, false, false); + fighter.main_shift(special_s3_end_main_loop_air) + } + } +} + +unsafe extern "C" fn special_s3_end_substatus(fighter: &mut L2CFighterCommon, param_1: L2CValue) { + if !param_1.get_bool() { + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_FLAG_JET_STUB_FALL_ONOFF) { + KineticModule::change_kinetic(fighter.module_accessor,*FIGHTER_KINETIC_TYPE_FALL); + } + else { + KineticModule::change_kinetic(fighter.module_accessor,*FIGHTER_KINETIC_TYPE_MOTION_AIR); + } + } +} + +unsafe extern "C" fn special_s3_end_main_loop_ground(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if fighter.is_situation(*SITUATION_KIND_GROUND) { + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + return 0.into(); + } + } + else { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); + } + + return 0.into(); +} + +unsafe extern "C" fn special_s3_end_main_loop_air(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); + } + if WorkModule::get_int(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_STATUS_WORK_ID_INT_JET_STUB_START_SITUATION) == *SITUATION_KIND_GROUND { + if fighter.status_frame() == 20 { + CancelModule::enable_cancel(fighter.module_accessor); + } + } + + return 0.into(); +} + +unsafe extern "C" fn special_s3_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_MIISWORDSMAN_JET_STUB_AA_TRANSITION_TERM_ID_INHERIT_FALL) { + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); + } + if fighter.is_situation(*SITUATION_KIND_GROUND) { + let landing_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_lw"), hash40("lw3_landing_frame")); + WorkModule::set_float(fighter.module_accessor,landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); + return 1.into(); + } + } + else { + if MotionModule::is_end(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + return 0.into(); + } + else { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); + } + } + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_MIISWORDSMAN_STATUS_KIND_SPECIAL_LW3_END, special_s3_end_main); +} \ No newline at end of file diff --git a/fighters/miiswordsman/src/tornadoshot/acmd.rs b/fighters/miiswordsman/src/tornadoshot/acmd.rs index 30d6e31b61..06759a39b8 100644 --- a/fighters/miiswordsman/src/tornadoshot/acmd.rs +++ b/fighters/miiswordsman/src/tornadoshot/acmd.rs @@ -3,18 +3,73 @@ use super::*; unsafe extern "C" fn game_fly(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if is_excute(agent) { AREA_WIND_2ND_RAD_arg9(agent, 0, 2, 0.05, 200, 1, 3, 3, 25, 30); - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 65, 23, 0, 53, 3.3, 0.0, 5.7, 2.6, Some(0.0), Some(2.8), Some(2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -6.5, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 65, 16, 0, 54, 3.3, 0.0, 5.7, 2.6, Some(0.0), Some(2.8), Some(2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -6.5, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_ENERGY); } frame(lua_state, 18.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 80, 35, 0, 51, 3.3, 0.0, 5.7, 2.6, Some(0.0), Some(2.8), Some(2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -6.5, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_ENERGY); + } +} + +unsafe extern "C" fn game_shockspell(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 15.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 73, 55, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.6, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 22, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 17.0, 84, 72, 0, 40, 3.0, 0.0, 1.0, 0.0, Some(0.0), Some(27.0), Some(0.0), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 8, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 17.0, 84, 72, 0, 40, 3.5, 0.0, 30.0, -4.0, Some(0.0), Some(30.0), Some(4.0), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 8, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_OBJECT); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_kick_hit_l")); + AttackModule::set_optional_hit_sound(boma, 2, Hash40::new("se_common_kick_hit_l")); + } + frame(lua_state, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 80, 61, 0, 48, 3.3, 0.0, 5.7, 2.6, Some(0.0), Some(2.8), Some(2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -6.5, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_ENERGY); + } +} + +unsafe extern "C" fn effect_shockspell(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("sys_smokescreen"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("sys_smokescreen"), Hash40::new("top"), 0, 30, 0, 0, 0, 0, 0.4, false); + LAST_EFFECT_SET_SCALE_W(agent, 0.4, 0.25, 0.4); + LAST_EFFECT_SET_COLOR(agent, 0.1, 0.1, 0.1); + LAST_EFFECT_SET_RATE(agent, 1.1); + } + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miiswordsman_thunder_spark"), Hash40::new("top"), 0, 0, 0, 0, 0, 180, 0.2, false); + } + frame(lua_state, 14.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("miiswordsman_thunder_flash"), Hash40::new("top"), 0, 0, 0, 0, 0, 180, 0.2, false); + LAST_EFFECT_SET_SCALE_W(agent, 0.6, 0.6, 0.2); + LAST_EFFECT_SET_RATE(agent, 1.2); + } + frame(lua_state, 23.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("sys_smokescreen"), false, false); + } +} + +unsafe extern "C" fn sound_shockspell(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 16.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_electric_hit_s")); } } pub fn install(agent: &mut Agent) { agent.acmd("game_fly", game_fly, Priority::Low); + + agent.acmd("game_shockspell", game_shockspell, Priority::Low); + agent.acmd("effect_shockspell", effect_shockspell, Priority::Low); + agent.acmd("sound_shockspell", sound_shockspell, Priority::Low); } diff --git a/fighters/miiswordsman/src/tornadoshot/mod.rs b/fighters/miiswordsman/src/tornadoshot/mod.rs index 7c8a24408d..5e793a80c8 100644 --- a/fighters/miiswordsman/src/tornadoshot/mod.rs +++ b/fighters/miiswordsman/src/tornadoshot/mod.rs @@ -2,10 +2,12 @@ use super::*; mod acmd; mod opff; +mod status; pub fn install() { let agent = &mut Agent::new("miiswordsman_tornadoshot"); acmd::install(agent); opff::install(agent); + status::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/miiswordsman/src/tornadoshot/opff.rs b/fighters/miiswordsman/src/tornadoshot/opff.rs index 7c68411d70..c78b1eeb9d 100644 --- a/fighters/miiswordsman/src/tornadoshot/opff.rs +++ b/fighters/miiswordsman/src/tornadoshot/opff.rs @@ -3,8 +3,8 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -pub extern "C" fn tornadoshot_frame(weapon: &mut L2CFighterBase) { - unsafe { +pub unsafe extern "C" fn tornadoshot_frame(weapon: &mut L2CFighterBase) { + if weapon.is_status(*WEAPON_MIISWORDSMAN_TORNADOSHOT_STATUS_KIND_FLY) { ModelModule::set_joint_scale(weapon.module_accessor, Hash40::new("top"), &Vector3f::new(0.6, 0.6, 0.6)); } } diff --git a/fighters/miiswordsman/src/tornadoshot/status.rs b/fighters/miiswordsman/src/tornadoshot/status.rs new file mode 100644 index 0000000000..2bd48487c3 --- /dev/null +++ b/fighters/miiswordsman/src/tornadoshot/status.rs @@ -0,0 +1,75 @@ +use super::*; +use globals::*; +// status script import + +unsafe extern "C" fn fly_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { + let owner_boma = weapon.get_owner_boma(); + if VarModule::is_flag(owner_boma.object(), vars::miiswordsman::status::SPECIAL_LW2_CHANGE_ARTICLE) { + StatusModule::set_status_kind_interrupt(weapon.module_accessor, statuses::miiswordsman_tornadoshot::SHOCK_SPELL); + return 1.into(); + } + + return smashline::original_status(Pre, weapon, *WEAPON_MIISWORDSMAN_TORNADOSHOT_STATUS_KIND_FLY)(weapon); +} + +unsafe extern "C" fn shock_spell_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { + StatusModule::init_settings( + weapon.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *WEAPON_KINETIC_TYPE_RESET, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(0), + false, + 0, + 0, + 0, + 0 + ); + + return 0.into(); +} + +unsafe extern "C" fn shock_spell_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + weapon.set_int(50, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); + weapon.set_int(50, *WEAPON_INSTANCE_WORK_ID_INT_INIT_LIFE); + MotionModule::change_motion(weapon.module_accessor, Hash40::new("shock_spell"), 0.0, 1.0, false, 0.0, false, false); + let owner_boma = weapon.get_owner_boma(); + let offset_x; + if VarModule::is_flag(owner_boma.object(), vars::miiswordsman::status::SPECIAL_LW2_HOLD) { + VarModule::on_flag(weapon.battle_object, vars::miiswordsman_shockspell::status::SHOCK_SPELL_HOLD); + offset_x = 60.0; + } + else { + offset_x = 20.0; + } + let pos_x = PostureModule::pos_x(weapon.module_accessor); + let pos_y = PostureModule::pos_y(weapon.module_accessor); + PostureModule::set_pos(weapon.module_accessor, &Vector3f::new(pos_x + (offset_x * PostureModule::lr(weapon.module_accessor)), pos_y, 0.0)); + + weapon.fastshift(L2CValue::Ptr(shock_spell_main_loop as *const () as _)) +} + +unsafe extern "C" fn shock_spell_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { + // This is the most cursed thing ever, but it somehow ignores everything else so bear with it + SET_SPEED_EX(weapon, 0, 0, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + if !StatusModule::is_changing(weapon.module_accessor) { + weapon.dec_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE); + } + if weapon.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE) <= 0 { + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + } + + return 0.into(); +} + +unsafe extern "C" fn shock_spell_end(weapon: &mut L2CWeaponCommon) -> L2CValue { + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *WEAPON_MIISWORDSMAN_TORNADOSHOT_STATUS_KIND_FLY, fly_pre); + + agent.status(Pre, statuses::miiswordsman_tornadoshot::SHOCK_SPELL, shock_spell_pre); + agent.status(Main, statuses::miiswordsman_tornadoshot::SHOCK_SPELL, shock_spell_main); + agent.status(End, statuses::miiswordsman_tornadoshot::SHOCK_SPELL, shock_spell_end); +} \ No newline at end of file diff --git a/fighters/murabito/Cargo.toml b/fighters/murabito/Cargo.toml index 5533c52f1c..c6a7304e67 100644 --- a/fighters/murabito/Cargo.toml +++ b/fighters/murabito/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/murabito/src/acmd/other.rs b/fighters/murabito/src/acmd/other.rs index 56032b3a2b..817db94945 100644 --- a/fighters/murabito/src/acmd/other.rs +++ b/fighters/murabito/src/acmd/other.rs @@ -35,15 +35,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -53,10 +49,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_itemlightthrowdash(agent: &mut L2CAgentBase) { diff --git a/fighters/murabito/src/acmd/specials.rs b/fighters/murabito/src/acmd/specials.rs index acf9f6d701..06b32baf69 100644 --- a/fighters/murabito/src/acmd/specials.rs +++ b/fighters/murabito/src/acmd/specials.rs @@ -102,13 +102,13 @@ unsafe extern "C" fn expression_specialairlw1failure(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_speciallw3(agent: &mut L2CAgentBase) { frame(agent.lua_state_agent, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 14.0, 361, 100, 0, 36, 5.0, 0.0, 6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 23, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("haver"), 14.0, 361, 100, 0, 36, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 23, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("haver"), 14.0, 361, 100, 0, 36, 5.0, 0.0, 6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("haver"), 14.0, 361, 100, 0, 36, 3.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } frame(agent.lua_state_agent, 8.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 361, 100, 0, 36, 5.0, 0.0, 5.5, 11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 23, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 14.0, 361, 100, 0, 36, 3.0, 0.0, 6.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 23, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 361, 100, 0, 36, 5.0, 0.0, 5.5, 11.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 14.0, 361, 100, 0, 36, 3.0, 0.0, 6.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } frame(agent.lua_state_agent, 9.0); if is_excute(agent) { diff --git a/fighters/murabito/src/acmd/throws.rs b/fighters/murabito/src/acmd/throws.rs index d1517c274e..d384f1951b 100644 --- a/fighters/murabito/src/acmd/throws.rs +++ b/fighters/murabito/src/acmd/throws.rs @@ -118,6 +118,10 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 135, 102, 0, 46, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 12.0); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, -2, 0); @@ -132,6 +136,23 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 12.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + } +} + unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -160,6 +181,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_throwf", game_throwf, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("effect_throwb", effect_throwb, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); } diff --git a/fighters/murabito/src/lib.rs b/fighters/murabito/src/lib.rs index 8616e9150b..c773630fe0 100644 --- a/fighters/murabito/src/lib.rs +++ b/fighters/murabito/src/lib.rs @@ -41,6 +41,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/murabito/src/opff.rs b/fighters/murabito/src/opff.rs index 3943328f81..4d9a22effb 100644 --- a/fighters/murabito/src/opff.rs +++ b/fighters/murabito/src/opff.rs @@ -38,6 +38,7 @@ unsafe fn uspecial_cancels(boma: &mut BattleObjectModuleAccessor, situation_kind } else if boma.is_status_one_of(&[*FIGHTER_MURABITO_STATUS_KIND_SPECIAL_HI_DETACH, *FIGHTER_MURABITO_STATUS_KIND_SPECIAL_HI_END]) && frame > 7.0 { VarModule::on_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL); + VarModule::on_flag(boma.object(), vars::common::instance::UP_SPECIAL_LAG); ControlModule::reset_trigger(boma); StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_FALL, true); } diff --git a/fighters/murabito/src/status/landing.rs b/fighters/murabito/src/status/landing.rs new file mode 100644 index 0000000000..ce7bc80962 --- /dev/null +++ b/fighters/murabito/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + VarModule::set_float(fighter.battle_object, vars::common::instance::LAND_CANCEL_LAG, lag); + WorkModule::set_float(fighter.module_accessor, 0.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + VarModule::set_float(fighter.battle_object, vars::common::instance::LAND_CANCEL_LAG, lag); + WorkModule::set_float(fighter.module_accessor, 0.0, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/murabito/src/status/mod.rs b/fighters/murabito/src/status/mod.rs index f92055e409..f1df7e27f9 100644 --- a/fighters/murabito/src/status/mod.rs +++ b/fighters/murabito/src/status/mod.rs @@ -7,6 +7,7 @@ mod jump; mod special_hi; mod special_lw; mod special_s; +mod landing; // Prevents sideB from being used again if it has already been used once in the current airtime unsafe extern "C" fn should_use_special_s_callback(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -40,4 +41,5 @@ pub fn install(agent: &mut Agent) { special_hi::install(agent); special_lw::install(agent); special_s::install(agent); + landing::install(agent); } \ No newline at end of file diff --git a/fighters/murabito/src/status/special_lw.rs b/fighters/murabito/src/status/special_lw.rs index abde1a188d..f9a3fff9d6 100644 --- a/fighters/murabito/src/status/special_lw.rs +++ b/fighters/murabito/src/status/special_lw.rs @@ -49,7 +49,7 @@ unsafe extern "C" fn special_lw_plant_fail_pre(fighter: &mut L2CFighterCommon) - false, false, false, - 0, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, *FIGHTER_STATUS_ATTR_START_TURN as u32, *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, 0 diff --git a/fighters/ness/Cargo.toml b/fighters/ness/Cargo.toml index dc976e72a2..4e140a3caf 100644 --- a/fighters/ness/Cargo.toml +++ b/fighters/ness/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/ness/src/acmd/ground.rs b/fighters/ness/src/acmd/ground.rs index 84b5b4843f..a584691575 100644 --- a/fighters/ness/src/acmd/ground.rs +++ b/fighters/ness/src/acmd/ground.rs @@ -11,6 +11,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 20, 2.5, 0.0, 3.0, 4.0, Some(0.0), Some(3.0), Some(9.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_MIDDLE), false); + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 5.0); if is_excute(agent) { @@ -80,9 +81,8 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 0, 100, 57, 0, 5.5, 0.0, 5.5, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 80, 117, 0, 51, 5.5, 0.0, 5.5, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); - ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 361, 100, 80, 0, 4.2, 0.0, 4.3, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 10, 50, 0, 30, 4.2, 0.0, 4.3, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 10, 50, 0, 20, 5.5, 0.0, 5.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 10.0); if is_excute(agent) { @@ -90,7 +90,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 20, 100, 70, 0, 5.5, 0.0, 4.8, 16.3, Some(0.0), Some(4.8), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 10, 50, 0, 20, 5.5, 0.0, 5.0, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 17.0); if is_excute(agent) { @@ -98,7 +98,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 95, 90, 0, 80, 6.5, 0.0, 4.8, 21.2, Some(0.0), Some(4.8), Some(19.2), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 95, 90, 0, 80, 6.5, 0.0, 5.5, 15.0, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PSI); } frame(lua_state, 25.0); if is_excute(agent) { @@ -106,6 +106,41 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + EFFECT_FLW_POS(agent, Hash40::new("ness_psi_hold"), Hash40::new("handr"), 1, 1, 0, 0, 0, 0, 1, true); + } + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("ness_psi_hold"), true, true); + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("ness_psi_rush"), Hash40::new("top"), 0, 4.5, 9, 0, 0, 0, 1.35, 2, 2, 2, 0, 0, 0, true); + } + frame(lua_state, 13.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("ness_psi_rush"), Hash40::new("top"), 0, 4.5, 11, 0, 0, 0, 1.35, 2, 2, 2, 0, 0, 0, true); + } + frame(lua_state, 16.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 21.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 22.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("ness_psi_rush"), Hash40::new("top"), 0, 5, 15, 0, 0, 0, 1.5, 2, 2, 2, 0, 0, 0, true); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); agent.acmd("game_attack12", game_attack12, Priority::Low); @@ -114,4 +149,5 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_attack13", effect_attack13, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); + agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); } \ No newline at end of file diff --git a/fighters/ness/src/acmd/other.rs b/fighters/ness/src/acmd/other.rs index 8d6b53b95e..0f7a45680d 100644 --- a/fighters/ness/src/acmd/other.rs +++ b/fighters/ness/src/acmd/other.rs @@ -72,15 +72,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -90,10 +86,16 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + +} + +unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let start_motion_rate = ParamModule::get_float(agent.object(), ParamType::Agent, "param_jump_aerial.start_motion_rate"); + FT_MOTION_RATE(agent, 1.0 / start_motion_rate); + frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_jumpaerialfront(agent: &mut L2CAgentBase) { @@ -102,19 +104,28 @@ unsafe extern "C" fn effect_jumpaerialfront(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); for _ in 0..4 { if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("waist"), 0, 0, 0, 0, 0, 0, 0.6, 10, 10, 10, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("waist"), 0, 0, 0, 0, 0, 0, 0.75, 10, 10, 10, 0, 0, 0, false); } wait(lua_state, 6.0); } } +unsafe extern "C" fn game_jumpaerialback(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let start_motion_rate = ParamModule::get_float(agent.object(), ParamType::Agent, "param_jump_aerial.start_motion_rate"); + FT_MOTION_RATE(agent, 1.0 / start_motion_rate); + frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); +} + unsafe extern "C" fn effect_jumpaerialback(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); for _ in 0..4 { if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("waist"), 0, 0, 0, 0, 0, 0, 0.6, 10, 10, 10, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("waist"), 0, 0, 0, 0, 0, 0, 0.75, 10, 10, 10, 0, 0, 0, false); } wait(lua_state, 6.0); } @@ -143,6 +154,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_escapeair", game_escapeair, Priority::Low); agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); + agent.acmd("game_jumpaerialfront", game_jumpaerialfront, Priority::Low); + agent.acmd("game_jumpaerialback", game_jumpaerialback, Priority::Low); agent.acmd("effect_jumpaerialfront", effect_jumpaerialfront, Priority::Low); agent.acmd("effect_jumpaerialback", effect_jumpaerialback, Priority::Low); diff --git a/fighters/ness/src/acmd/throws.rs b/fighters/ness/src/acmd/throws.rs index 6e3d8ea055..f4303e05b4 100644 --- a/fighters/ness/src/acmd/throws.rs +++ b/fighters/ness/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 5.2, 0.0, Some(0.0), Some(5.2), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 5.2, 7.7, Some(0.0), Some(5.2), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 5.2, 0.0, Some(0.0), Some(5.2), Some(12.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 5.2, 8.2, Some(0.0), Some(5.2), Some(11.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 5.2, 0.0, Some(0.0), Some(5.2), Some(-16.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 5.2, -4.2, Some(0.0), Some(5.2), Some(-12.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -67,13 +66,12 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 45, 10, 0, 120, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 45, 44, 0, 80, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 26.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 14, 6); - //lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 1.2); } frame(lua_state, 27.0); if is_excute(agent) { @@ -94,8 +92,6 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { frame(lua_state, 26.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, -5, 18); - //lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 2.0); - //lua_bind::FighterCutInManager::set_throw_finish_offset(singletons::FighterCutInManager(), Vector3f{x: 0.0, y: 5.0, z: 0.0}); } frame(lua_state, 27.0); if is_excute(agent) { @@ -110,14 +106,12 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 90, 75, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 90, 44, 0, 105, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 35.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 3, 11); - //lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 1.5); - //lua_bind::FighterCutInManager::set_throw_finish_offset(singletons::FighterCutInManager(), Vector3f{x: 0.0, y: 3.0, z: 0.0}); } frame(lua_state, 36.0); if is_excute(agent) { @@ -153,8 +147,6 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 361, 100, 0, 0, 6.0, 2.0, 2.2, 0.0, Some(-2.0), Some(2.2), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PSI); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 2, 0); - //lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 1.5); - //lua_bind::FighterCutInManager::set_throw_finish_offset(singletons::FighterCutInManager(), Vector3f{x: 0.0, y: 0.0, z: 0.0}); } wait(lua_state, 1.0); if is_excute(agent) { diff --git a/fighters/ness/src/lib.rs b/fighters/ness/src/lib.rs index 1f425ec95b..0182295ec4 100644 --- a/fighters/ness/src/lib.rs +++ b/fighters/ness/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/ness/src/opff.rs b/fighters/ness/src/opff.rs index 204dac4821..6c2aeef549 100644 --- a/fighters/ness/src/opff.rs +++ b/fighters/ness/src/opff.rs @@ -5,29 +5,44 @@ use globals::*; // Magnet Jump Cancel unsafe fn psi_magnet_jump_cancel(fighter: &mut L2CFighterCommon) { - if fighter.is_status_one_of(&[ - *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_HIT, + // disables jump cancels when parried between statuses + if fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_HOLD, - *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_END]) { - if fighter.status_frame() > 0 { // Allows for jump cancel on frame 6 in game (this is dictated by how long game_speciallw_start takes) - if !fighter.is_in_hitlag() { - fighter.check_jump_cancel(false, false); - } + *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_END, + *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_HIT, + ]) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY) { + VarModule::on_flag(fighter.battle_object, vars::ness::instance::SPECIAL_LW_DISABLE_JC); + if !fighter.is_status(*FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_END) + && !fighter.is_in_hitlag() { + fighter.change_status(FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); } } -} -// Ness PK Fire drift -unsafe fn pk_fire_drift(boma: &mut BattleObjectModuleAccessor, stick_y: f32) { - if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_S) { - if boma.is_situation(*SITUATION_KIND_AIR) { - if KineticModule::get_kinetic_type(boma) != *FIGHTER_KINETIC_TYPE_FALL { - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); - } - } + if fighter.is_status_one_of(&[ + *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_HOLD, + *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_END, + *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_HIT, + ]) + && fighter.status_frame() > 0 // Allows for jump cancel on frame 6 in game (this is dictated by how long game_speciallw_start takes) + && !fighter.is_in_hitlag() + && !VarModule::is_flag(fighter.battle_object, vars::ness::instance::SPECIAL_LW_DISABLE_JC){ + fighter.check_jump_cancel(false, false, false); } } +// // Ness PK Fire drift +// unsafe fn pk_fire_drift(boma: &mut BattleObjectModuleAccessor, stick_y: f32) { +// if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_S) { +// if boma.is_situation(*SITUATION_KIND_AIR) { +// if KineticModule::get_kinetic_type(boma) != *FIGHTER_KINETIC_TYPE_FALL { +// KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); +// } +// } +// } +// } + unsafe fn magnet_stall_prevention(boma: &mut BattleObjectModuleAccessor, id: usize, status_kind: i32, situation_kind: i32) { if StatusModule::prev_status_kind(boma, 0) == *FIGHTER_NESS_STATUS_KIND_SPECIAL_LW_END && situation_kind == *SITUATION_KIND_AIR { @@ -84,13 +99,13 @@ unsafe fn pk_thunder_cancel(fighter: &mut L2CFighterCommon) { && StatusModule::is_situation_changed(fighter.module_accessor) { fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), true.into()); } - if MotionModule::is_end(fighter.module_accessor) { - if (fighter.is_prev_status(*FIGHTER_NESS_STATUS_KIND_SPECIAL_HI_HOLD) && VarModule::is_flag(fighter.object(), vars::ness::instance::DISABLE_SPECIAL_HI)) - || !fighter.is_prev_status_one_of(&[*FIGHTER_NESS_STATUS_KIND_SPECIAL_HI_ATTACK, *FIGHTER_NESS_STATUS_KIND_SPECIAL_HI_AGAIN, *FIGHTER_NESS_STATUS_KIND_SPECIAL_HI_HOLD]) { - let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { *FIGHTER_STATUS_KIND_WAIT } else { *FIGHTER_STATUS_KIND_FALL }; - fighter.change_status(status.into(), false.into()); - } - } + // if MotionModule::is_end(fighter.module_accessor) { + // if (fighter.is_prev_status(*FIGHTER_NESS_STATUS_KIND_SPECIAL_HI_HOLD) && VarModule::is_flag(fighter.object(), vars::ness::instance::DISABLE_SPECIAL_HI)) + // || !fighter.is_prev_status_one_of(&[*FIGHTER_NESS_STATUS_KIND_SPECIAL_HI_ATTACK, *FIGHTER_NESS_STATUS_KIND_SPECIAL_HI_AGAIN, *FIGHTER_NESS_STATUS_KIND_SPECIAL_HI_HOLD]) { + // let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { *FIGHTER_STATUS_KIND_WAIT } else { *FIGHTER_STATUS_KIND_FALL }; + // fighter.change_status(status.into(), false.into()); + // } + // } } } @@ -164,7 +179,7 @@ pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectMod pk_thunder_wall_ride(boma, id, status_kind, situation_kind); //pk_fire_ff(boma, stick_y); upspecialend_cliff(fighter); - pk_fire_drift(boma, stick_y); + // pk_fire_drift(boma, stick_y); uair_scaling(boma); fastfall_specials(fighter); pkt2_edgeslipoff(fighter); diff --git a/fighters/ness/src/status/special_lw.rs b/fighters/ness/src/status/special_lw.rs index afc4c16353..4397bd23be 100644 --- a/fighters/ness/src/status/special_lw.rs +++ b/fighters/ness/src/status/special_lw.rs @@ -27,6 +27,7 @@ pub unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CV speed_y.min(0.0) * 0.33 ); } + VarModule::off_flag(fighter.battle_object, vars::ness::instance::SPECIAL_LW_DISABLE_JC); smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_LW)(fighter) } diff --git a/fighters/ness/src/yoyohead/acmd.rs b/fighters/ness/src/yoyohead/acmd.rs index 36e44a62de..b7b1a5b372 100644 --- a/fighters/ness/src/yoyohead/acmd.rs +++ b/fighters/ness/src/yoyohead/acmd.rs @@ -16,7 +16,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); FT_MOTION_RATE(agent, 1); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("attach"), 1.0, 90, 100, 30, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 10, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("attach"), 1.0, 90, 100, 30, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } frame(lua_state, 16.0); if is_excute(agent) { diff --git a/fighters/packun/Cargo.toml b/fighters/packun/Cargo.toml index 511f5268b0..d670874f7c 100644 --- a/fighters/packun/Cargo.toml +++ b/fighters/packun/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/packun/src/acmd/aerials.rs b/fighters/packun/src/acmd/aerials.rs index 45623a7c4a..bc4a2c1c7f 100644 --- a/fighters/packun/src/acmd/aerials.rs +++ b/fighters/packun/src/acmd/aerials.rs @@ -3,38 +3,36 @@ use super::*; unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 1.0); - if stance.label != 2 { - FT_MOTION_RATE(agent, 0.5); + if stance.label == STANCE_PRICKLY { + FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 7.0); } frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { - let bkb = if stance.label == 2 {15} else {20}; - let kbg = if stance.label == 2 {90} else {45}; - ATTACK(agent, 0, 0, Hash40::new("arml"), 2.0 * stance.damage_other, 365, kbg, 0, bkb, 5.5, 1.8, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0 * stance.damage_other, 365, kbg, 0, bkb, 5.5, 1.8, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + let (bkb, kbg) = if stance.label == STANCE_PRICKLY { (15, 90) } else { (20, 45) }; + ATTACK(agent, 0, 0, Hash40::new("arml"), 2.0 * stance.damage_other, 365, kbg, 0, bkb, 4.5, 1.8, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 2.0 * stance.damage_other, 365, kbg, 0, bkb, 4.5, 1.8, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } - wait(lua_state, 10.0); + frame(lua_state, 18.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 19.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 3.0 * stance.damage_other, 55, 125, 0, 40, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 3.0 * stance.damage_other, 55, 125, 0, 40, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("arml"), 3.0 * stance.damage_other, 51, 141, 0, 40, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 3.0 * stance.damage_other, 51, 141, 0, 40, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } - wait(lua_state, 3.0); + frame(lua_state, 22.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 36.0); + frame(lua_state, 34.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -43,9 +41,9 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 3.0); - if stance.label != 2 { + if stance.label != STANCE_PRICKLY { FT_DESIRED_RATE(agent, 6.0, 4.0); } else { @@ -58,9 +56,10 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("potc"), 9.0 * stance.damage_other, 40, 94, 0, 30, 4.5, 3.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("potc"), 11.0 * stance.damage_other, 40, 94, 0, 30, 7.0, -3.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - if stance.label == 2 { + let bkb = if stance.label == STANCE_PUTRID { 10 } else { 0 }; + ATTACK(agent, 0, 0, Hash40::new("potc"), 9.0 * stance.damage_other, 361, 72, 0, 40 + bkb, 4.5, 3.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("potc"), 11.0 * stance.damage_other, 361, 72, 0, 40 + bkb, 7.0, -3.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + if stance.label == STANCE_PRICKLY { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("hip"), *HIT_STATUS_XLU); } @@ -93,8 +92,9 @@ unsafe extern "C" fn expression_attackairf(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if stance.label != 1 { + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if stance.label == STANCE_PIRANHA { + // Piranha frame(lua_state, 5.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); @@ -102,13 +102,12 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0 * stance.damage_other, 50, 108, 0, 25, 9.0, 0.0, 4.0, -10.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - VarModule::on_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0 * stance.damage_other, 50, 108, 0, 25, 9.0, 0.0, 4.0, -10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0 * stance.damage_other, 55, 100, 0, 25, 4.5, 0.0, 8.35, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } wait(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); - VarModule::off_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); } frame(lua_state, 36.0); if is_excute(agent) { @@ -116,6 +115,7 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } } else { + // Putrid frame(lua_state, 5.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); @@ -123,12 +123,17 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); if is_excute(agent) { FT_MOTION_RATE(agent, 1.0); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0 * stance.damage_other, 366, 90, 0, 25, 7.0, 0.0, 4.0, -8.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 366, 90, 0, 25, 7.0, 0.0, 4.0, -8.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 366, 90, 0, 25, 4.5, 0.0, 8.35, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } frame(lua_state, 26.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0 * stance.damage_other, 50, 108, 0, 25, 9.0, 0.0, 4.0, -8.5, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - AttackModule::set_poison_param(boma, 0, 121, 30, 1.0, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 50, 108, 0, 25, 9.0, 0.0, 4.0, -8.5, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 50, 108, 0, 25, 4.5, 0.0, 8.35, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 1, Hash40::new("top"), 0.0, 0, 0, 0, 0, 9.0, 0.0, 4.0, -8.5, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BOMB); + ATTACK(agent, 3, 1, Hash40::new("top"), 0.0, 0, 0, 0, 0, 4.5, 0.0, 8.35, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BOMB); + AttackModule::set_poison_param(boma, 0, 241, 60, 0.5, false); + AttackModule::set_poison_param(boma, 1, 241, 60, 0.5, false); } wait(lua_state, 4.0); if is_excute(agent) { @@ -144,8 +149,9 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - if stance != 1 { + let stance = VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE); + if stance == STANCE_PIRANHA { + // Piranha frame(lua_state, 6.0); for _ in 0..3 { if is_excute(agent) { @@ -163,7 +169,8 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { LAST_EFFECT_SET_RATE(agent, 1.25); } } - else if stance == 1 { + else { + // Putrid frame(lua_state, 6.0); for h in 0..3 { if is_excute(agent) { @@ -204,27 +211,26 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { unsafe extern "C" fn sound_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - frame(lua_state, 8.0); - if is_excute(agent) { - if stance != 1 { + let stance = VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE); + if stance == STANCE_PIRANHA { + frame(lua_state, 8.0); + if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_packun_attackair_b01")); } } - frame(lua_state, 13.0); - if is_excute(agent) { - if stance == 1 { + else { // STANCE_PUTRID + frame(lua_state, 13.0); + if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_packun_special_s03")); } - } - frame(lua_state, 20.0); - if is_excute(agent) { - if stance == 1 { + frame(lua_state, 20.0); + if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_packun_attackair_b01")); } } } +// Prickly unsafe extern "C" fn game_attackairbs(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -234,9 +240,9 @@ unsafe extern "C" fn game_attackairbs(agent: &mut L2CAgentBase) { } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("virtualhit2"), 18.0, 45, 90, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 18.0, 45, 90, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("mouth"), 19.5, 45, 95, 0, 25, 7.0, 2.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("virtualhit2"), 16.0, 45, 90, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 16.0, 45, 90, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("mouth"), 19.0, 45, 95, 0, 25, 7.0, 2.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); @@ -270,10 +276,10 @@ unsafe extern "C" fn effect_attackairbs(agent: &mut L2CAgentBase) { frame(lua_state, 15.0); if is_excute(agent) { if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { - EFFECT_FOLLOW(agent, Hash40::new("packun_smash_s_arc_l"), Hash40::new("top"), 6, 7.5, -8, 155, -50, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("packun_smash_s_arc_l"), Hash40::new("top"), 6, 7.5, -9.5, 155, -50, 0, 1.0, true); } else { - EFFECT_FOLLOW(agent, Hash40::new("packun_smash_s_arc_r"), Hash40::new("top"), -6, 7.5, -8, 155, 50, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("packun_smash_s_arc_r"), Hash40::new("top"), -6, 7.5, -9.5, 155, 50, 0, 1.0, true); } } } @@ -300,8 +306,8 @@ unsafe extern "C" fn expression_attackairbs(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if stance.label != 2 { + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if stance.label != STANCE_PRICKLY { FT_DESIRED_RATE(agent, 6.0, 7.0); } else { @@ -314,27 +320,53 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - let angle = if stance.label == 1 { 105 } else { 75 }; - let bkb = if stance.label == 1 { 15 } else if stance.label == 0 { 10 } else { 0 }; - let sound = if stance.label != 2 { *COLLISION_SOUND_ATTR_PUNCH } else { *COLLISION_SOUND_ATTR_HEAVY }; - let size = if stance.label == 2 { 6.5 } else { 6.0 }; - ATTACK(agent, 0, 0, Hash40::new("mouth"), 9.0 * stance.damage_head, angle, 87, 0, 53 + bkb, size, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, sound, *ATTACK_REGION_HEAD); - if stance.label == 2 { - HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("neck6"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("neck8"), *HIT_STATUS_XLU); + match stance.label { + STANCE_PIRANHA => { + // Piranha + ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0 * stance.damage_head, 64, 72, 0, 38, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 10.0 * stance.damage_head, 64, 72, 0, 38, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + }, + STANCE_PUTRID => { + // Putrid + ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0 * stance.damage_head, 64, 80, 0, 48, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 10.0 * stance.damage_head, 64, 80, 0, 48, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + }, + _ => { + // Prickly + ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0 * stance.damage_head, 75, 90, 0, 60, 6.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 10.0 * stance.damage_head, 75, 90, 0, 60, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); + } } } - wait(lua_state, 6.0); + frame(lua_state, 8.0); + if is_excute(agent) { + match stance.label { + STANCE_PIRANHA => { + // Piranha + ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0 * stance.damage_head, 64, 72, 0, 38, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 10.0 * stance.damage_head, 64, 72, 0, 38, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + }, + STANCE_PUTRID => { + // Putrid + ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0 * stance.damage_head, 64, 80, 0, 48, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 10.0 * stance.damage_head, 64, 80, 0, 48, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + }, + _ => { + // Prickly + ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0 * stance.damage_head, 75, 90, 0, 60, 6.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 10.0 * stance.damage_head, 75, 90, 0, 60, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + } + } + } + frame(lua_state, 12.0); if is_excute(agent) { AttackModule::clear_all(boma); HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("neck6"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("neck8"), *HIT_STATUS_NORMAL); } frame(lua_state, 25.0); if is_excute(agent) { @@ -363,8 +395,8 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if stance.label == 2 { + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if stance.label == STANCE_PRICKLY { FT_MOTION_RATE(agent, (11.0/5.0)); } else { @@ -379,21 +411,21 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 5.0); - if stance.label == 2 { + if stance.label == STANCE_PRICKLY { FT_MOTION_RATE(agent, 1.0); } frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("potc"), 13.0 * stance.damage_other, 270, 67, 0, 20, 4.5, -0.3, 0.0, 0.0, Some(-0.3), Some( 0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("potc"), 13.0 * stance.damage_other, 270, 67, 0, 20, 4.5, -7.0, -0.5, 0.5, Some(-7.0), Some(-0.5), Some(0.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("potc"), 13.0 * stance.damage_other, 270, 62, 0, 20, 4.5, -0.3, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("potc"), 13.0 * stance.damage_other, 270, 62, 0, 20, 4.5, -7.0, -0.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } - wait(lua_state, 4.0); + frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("potc"), 9.0 * stance.damage_other, 361, 92, 0, 15, 4.5, -0.3, 0.0, 0.0, Some(-0.3), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("potc"), 9.0 * stance.damage_other, 361, 92, 0, 15, 4.5, -7.0, -0.5, 0.5, Some(-7.0), Some(-0.5), Some(0.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("potc"), 9.0 * stance.damage_other, 361, 92, 0, 15, 4.5, -0.3, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("potc"), 9.0 * stance.damage_other, 361, 92, 0, 15, 4.5, -4.0, -0.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } - wait(lua_state, 7.0); + frame(lua_state, 20.0); if is_excute(agent) { AttackModule::clear_all(boma); } diff --git a/fighters/packun/src/acmd/ground.rs b/fighters/packun/src/acmd/ground.rs index 2418c68aab..8141d64578 100644 --- a/fighters/packun/src/acmd/ground.rs +++ b/fighters/packun/src/acmd/ground.rs @@ -3,23 +3,26 @@ use super::*; unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 4.0); } frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.4 * stance.damage_other, 361, 25, 0, 20, 2.5, 0.0, 6.3, 5.3, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.4 * stance.damage_other, 361, 25, 0, 18, 2.5, 0.0, 6.3, 8.7, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.4 * stance.damage_other, 180, 20, 0, 18, 3.0, 0.0, 6.3, 12.5, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.4 * stance.damage_other, 361, 20, 0, 18, 3.0, 0.0, 6.3, 12.5, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0 * stance.damage_other, 80, 100, 20, 0, 2.5, 0.0, 6.3, 5.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0 * stance.damage_other, 80, 100, 20, 0, 2.5, 0.0, 6.3, 8.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0 * stance.damage_other, 80, 100, 20, 0, 3.0, 0.0, 6.3, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 2.0 * stance.damage_other, 80, 100, 20, 0, 3.0, 0.0, 6.3, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 4, 0, Hash40::new("top"), 2.0 * stance.damage_other, 361, 15, 0, 30, 3.0, 0.0, 3.5, 5.3, Some(0.0), Some(3.5), Some(12.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_MIDDLE), false); + AttackModule::set_down_only(boma, 4, true); } frame(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 7.0); + frame(lua_state, 9.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } @@ -28,38 +31,34 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 4.0); - if stance.label == 2 { + if stance.label == STANCE_PRICKLY { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } - if stance.label == 1 { + if stance.label == STANCE_PUTRID { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.2 * stance.damage_other, 361, 25, 0, 15, 3.2, 0.0, 6.5, 6.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.2 * stance.damage_other, 361, 25, 0, 15, 3.4, 0.0, 6.5, 10.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.2 * stance.damage_other, 180, 25, 0, 15, 4.0, 0.0, 6.5, 15.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.2 * stance.damage_other, 361, 15, 0, 15, 4.0, 0.0, 6.5, 15.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame(boma, 0, 6.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 6.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 6.0, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0 * stance.damage_other, 70, 15, 0, 30, 3.2, 0.0, 6.5, 6.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0 * stance.damage_other, 75, 15, 0, 30, 3.4, 0.0, 6.5, 10.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0 * stance.damage_other, 80, 15, 0, 30, 4.0, 0.0, 6.5, 15.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 7.0); + frame(lua_state, 9.0); if is_excute(agent) { - if stance.label != 2 { + if stance.label != STANCE_PRICKLY { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } - frame(lua_state, 10.0); + frame(lua_state, 12.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } @@ -68,12 +67,8 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - let bkb = if stance.label == 2 {15} else {0}; - let angle = if stance.label == 2 {10} else {0}; - let sound_level = if stance.label != 2 { *ATTACK_SOUND_LEVEL_M } else { *ATTACK_SOUND_LEVEL_S }; - let sound = if stance.label != 2 { *COLLISION_SOUND_ATTR_PUNCH } else { *COLLISION_SOUND_ATTR_HEAVY }; - if stance.label == 2 { + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if stance.label == STANCE_PRICKLY { FT_DESIRED_RATE(agent, 7.0, 9.0); } if is_excute(agent) { @@ -82,9 +77,11 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.4 * stance.damage_head, 40 - angle, 70, 0, 60 + bkb, 5.5, 0.0, 8.0, 12.8, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level, sound, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.4 * stance.damage_head, 40 - angle, 70, 0, 60 + bkb, 2.5, 0.0, 8.0, 7.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level, sound, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 4.4 * stance.damage_head, 40 - angle, 70, 0, 60 + bkb, 2.5, 0.0, 8.0, 4.7, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level, sound, *ATTACK_REGION_HEAD); + let (kbg, sound_level, sound_attr) = if stance.label == STANCE_PRICKLY + { (52, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_HEAVY) } else { (0, *COLLISION_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH) }; + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0 * stance.damage_head, 38, 70 + kbg, 0, 50, 6.5, 0.0, 7.0, 15.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level, sound_attr, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 5.0 * stance.damage_head, 38, 70 + kbg, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level, sound_attr, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("virtualhit3"), 5.0 * stance.damage_head, 38, 70 + kbg, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level, sound_attr, *ATTACK_REGION_HEAD); } frame(lua_state, 9.0); if is_excute(agent) { @@ -95,31 +92,30 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attack13(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), -3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } frame(lua_state, 6.0); if is_excute(agent) { - EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 11, -3, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true, 0.5); + FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), -3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 13, 5, 8, 0, 0, 1.2, true); } frame(lua_state, 7.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 13, 9, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 15, 7, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); } } unsafe extern "C" fn game_attack100end(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 6.0); if is_excute(agent) { - if stance.label == 1 { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.4 * stance.damage_bite, 50, 150, 0, 40, 6.0, 0.0, 7.5, 9.0, None, Some(7.5), Some(15.0), 3.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_poison_param(boma, 0, 121, 30, 1.8, false); + if stance.label == STANCE_PUTRID { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0 * stance.damage_bite, 50, 150, 0, 40, 6.0, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(15.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 1, Hash40::new("top"), 0.0, 0, 0, 0, 0, 6.0, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(15.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BITE); + AttackModule::set_poison_param(boma, 0, 241, 60, 2.0, false); } else { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.4 * stance.damage_bite, 50, 150, 0, 40, 6.0, 0.0, 7.5, 9.0, None, Some(7.5), Some(15.0), 3.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0 * stance.damage_bite, 50, 150, 0, 40, 6.0, 0.0, 7.5, 9.0, Some(0.0), Some(7.5), Some(15.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); } } wait(lua_state, 2.0); @@ -133,8 +129,8 @@ unsafe extern "C" fn effect_attack100end(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if stance.label == 1 { + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if stance.label == STANCE_PUTRID { EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 9, 12.5, 0, 0, 0, 0.95, true); LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 9, 12.5, 0, 0, 0, 0.85, true); @@ -161,10 +157,10 @@ unsafe extern "C" fn effect_attack100end(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); // base 0.93 sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.8); - if stance.label == 2 { + if stance.label == STANCE_PRICKLY { FT_MOTION_RATE(agent, (10.0/7.0)); } frame(lua_state, 6.0); @@ -176,8 +172,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("potc"), 12.0 * stance.damage_other, 45, 100, 0, 45, 5.3, -5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); ATTACK(agent, 1, 0, Hash40::new("top"), 12.0 * stance.damage_other, 45, 100, 0, 45, 4.0, 0.0, 11.0, 0.0, Some(0.0), Some(5.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATK_SET_SHIELD_SETOFF_MUL_arg3(agent, 0, 1, 1.3); - if stance.label == 2 { + if stance.label == STANCE_PRICKLY { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("hip"), *HIT_STATUS_XLU); } @@ -192,9 +187,8 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("potc"), 8.0 * stance.damage_other, 50, 100, 0, 40, 5.3, -5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("potc"), 8.0 * stance.damage_other, 50, 100, 0, 40, 4.3, -4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); ATTACK(agent, 1, 0, Hash40::new("top"), 8.0 * stance.damage_other, 50, 100, 0, 40, 4.0, 0.0, 11.0, -2.0, Some(0.0), Some(5.0), Some(-2.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATK_SET_SHIELD_SETOFF_MUL_arg3(agent, 0, 1, 1.3); } wait(lua_state, 10.0); if is_excute(agent) { diff --git a/fighters/packun/src/acmd/mod.rs b/fighters/packun/src/acmd/mod.rs index 55d396290e..1eef2fdb86 100644 --- a/fighters/packun/src/acmd/mod.rs +++ b/fighters/packun/src/acmd/mod.rs @@ -8,45 +8,44 @@ mod specials; mod throws; mod other; +pub const STANCE_PIRANHA: i32 = 0; +pub const STANCE_PUTRID: i32 = 1; +pub const STANCE_PRICKLY: i32 = 2; + #[repr(C)] pub struct StanceInfo { label: i32, damage_bite: f32, damage_head: f32, - damage_other: f32, - da_speed: f32 + damage_other: f32 } impl From for StanceInfo { fn from(other: i32) -> Self { match other { - 0 => StanceInfo { // Regular + 0 => StanceInfo { // Piranha label: 0, - damage_bite: 0.9, - damage_head: 0.9, - damage_other: 0.9, - da_speed: 0.8 + damage_bite: 1.0, + damage_head: 1.0, + damage_other: 1.0 }, 1 => StanceInfo { // Putrid label: 1, - damage_bite: 0.85, - damage_head: 0.65, - damage_other: 0.75, - da_speed: (0.8 * 0.86) + damage_bite: 0.75, + damage_head: 0.75, + damage_other: 0.75 }, 2 => StanceInfo { // Prickly label: 2, - damage_bite: 1.05, + damage_bite: 1.0, damage_head: 1.3, - damage_other: 1.15, - da_speed: (0.8 * 0.84) + damage_other: 0.9 }, - _ => StanceInfo { // same as regular + _ => StanceInfo { // same as Piranha label: 3, - damage_bite: 0.9, - damage_head: 0.9, - damage_other: 0.9, - da_speed: 0.8 + damage_bite: 1.0, + damage_head: 1.0, + damage_other: 1.0 }, } } diff --git a/fighters/packun/src/acmd/other.rs b/fighters/packun/src/acmd/other.rs index 76ccc88b0f..c021d20350 100644 --- a/fighters/packun/src/acmd/other.rs +++ b/fighters/packun/src/acmd/other.rs @@ -43,15 +43,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -61,60 +57,18 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } -} -unsafe extern "C" fn game_appealhi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let cur_stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - frame(lua_state, 1.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER, 10.0); - VarModule::on_flag(boma.object(), vars::packun::instance::APPEAL_STANCE_REVERSE); - } - frame(lua_state, 8.0); - if is_excute(agent) { - let advance = if VarModule::is_flag(boma.object(), vars::packun::instance::APPEAL_STANCE_REVERSE) {2} else {1}; - VarModule::set_int(boma.object(), vars::packun::instance::CURRENT_STANCE, (cur_stance + advance) % 3); - } - wait(lua_state, 1.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); - } } -unsafe extern "C" fn effect_appealhi(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_appealhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if !VarModule::is_flag(agent.object(), vars::packun::status::APPEAL_CLOUD_COVER) { - frame(lua_state, 1.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - if VarModule::get_int(agent.object(), vars::packun::instance::CURRENT_STANCE) == 0 { - EFFECT_FOLLOW(agent, Hash40::new("sys_grass_landing"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.5, false); - } - else if VarModule::get_int(agent.object(), vars::packun::instance::CURRENT_STANCE) == 1 { - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), 0, 15.5, 0, 0, 0, 0, 1.2, false); - } - else if VarModule::get_int(agent.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - EFFECT_FOLLOW(agent, Hash40::new("sys_crown"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, false); - } - } - } } unsafe extern "C" fn sound_appealhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if !VarModule::is_flag(agent.object(), vars::packun::status::APPEAL_CLOUD_COVER) { - frame(lua_state, 8.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_packun_special_s02")); - } frame(lua_state, 19.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_packun_appear01")); @@ -122,20 +76,15 @@ unsafe extern "C" fn sound_appealhi(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_appealhi2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_appeals2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let cur_stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - if !(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE) == 0) { - VarModule::set_int(boma.object(), vars::packun::instance::CURRENT_STANCE, 0); - VarModule::on_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT); - } if is_excute(agent) { ModelModule::set_mesh_visibility(agent.boma(), Hash40::new("foot"), true); } frame(lua_state, 2.0); if is_excute(agent) { - VarModule::off_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT); + VarModule::off_flag(agent.object(), vars::packun::status::STANCE_INIT); } frame(lua_state, 107.0); if is_excute(agent) { @@ -143,29 +92,20 @@ unsafe extern "C" fn game_appealhi2(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn effect_appealhi2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_appeals2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if !VarModule::is_flag(agent.object(), vars::packun::status::APPEAL_CLOUD_COVER) { - frame(lua_state, 1.0); if is_excute(agent) { - if VarModule::is_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT) { - EFFECT(agent, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_grass_landing"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.5, false); - } EFFECT_FOLLOW(agent, Hash40::new("packun_appeal_left"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.1, false); } } } -unsafe extern "C" fn sound_appealhi2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_appeals2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if !VarModule::is_flag(agent.object(), vars::packun::status::APPEAL_CLOUD_COVER) { - frame(lua_state, 1.0); - if VarModule::is_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT) { - PLAY_SE(agent, Hash40::new("se_packun_special_s02")); - } frame(lua_state, 29.0); if is_excute(agent) { PLAY_STEP_FLIPPABLE(agent, Hash40::new("se_packun_step_right_m"), Hash40::new("se_packun_step_left_m")); @@ -181,7 +121,7 @@ unsafe extern "C" fn sound_appealhi2(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn expression_appealhi2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn expression_appeals2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { @@ -205,35 +145,14 @@ unsafe extern "C" fn expression_appealhi2(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_appeals(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let cur_stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); if boma.is_button_on(Buttons::AppealSL) { if is_excute(agent) { - MotionModule::change_motion(boma, Hash40::new("appeal_hi_2"), 0.0, 1.0, false, 0.0, false, false); - } - } - else { - if !(cur_stance == 2) { - VarModule::set_int(boma.object(), vars::packun::instance::CURRENT_STANCE, 2); - VarModule::on_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT); + MotionModule::change_motion(boma, Hash40::new("appeal_s_2"), 0.0, 1.0, false, 0.0, false, false); } } frame(lua_state, 2.0); if is_excute(agent) { - VarModule::off_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT); - } -} - -unsafe extern "C" fn effect_appeals(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if !VarModule::is_flag(agent.object(), vars::packun::status::APPEAL_CLOUD_COVER) { - frame(lua_state, 1.0); - if is_excute(agent) { - if VarModule::is_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT) { - EFFECT(agent, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_crown"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, false); - } - } + VarModule::off_flag(agent.object(), vars::packun::status::STANCE_INIT); } } @@ -243,9 +162,6 @@ unsafe extern "C" fn sound_appeals(agent: &mut L2CAgentBase) { if !VarModule::is_flag(agent.object(), vars::packun::status::APPEAL_CLOUD_COVER) { frame(lua_state, 1.0); if is_excute(agent) { - if VarModule::is_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT) { - PLAY_SE(agent, Hash40::new("se_packun_special_s02")); - } PLAY_SE(agent, Hash40::new("se_packun_appeal_s01")); } frame(lua_state, 14.0); @@ -266,14 +182,9 @@ unsafe extern "C" fn sound_appeals(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_appeallw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let cur_stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - if !(cur_stance == 1) { - VarModule::set_int(boma.object(), vars::packun::instance::CURRENT_STANCE, 1); - VarModule::on_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT); - } frame(lua_state, 2.0); if is_excute(agent) { - VarModule::off_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT); + VarModule::off_flag(agent.object(), vars::packun::status::STANCE_INIT); } } @@ -281,13 +192,6 @@ unsafe extern "C" fn effect_appeallw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if !VarModule::is_flag(agent.object(), vars::packun::status::APPEAL_CLOUD_COVER) { - frame(lua_state, 1.0); - if is_excute(agent) { - if VarModule::is_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT) { - EFFECT(agent, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), 0, 15.5, 0, 0, 0, 0, 1.2, false); - } - } frame(lua_state, 5.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); @@ -301,9 +205,6 @@ unsafe extern "C" fn sound_appeallw(agent: &mut L2CAgentBase) { if !VarModule::is_flag(agent.object(), vars::packun::status::APPEAL_CLOUD_COVER) { frame(lua_state, 1.0); if is_excute(agent) { - if VarModule::is_flag(agent.object(), vars::packun::instance::APPEAL_STANCE_INIT) { - PLAY_SE(agent, Hash40::new("se_packun_special_s02")); - } PLAY_SE(agent, Hash40::new("se_packun_appeal_l01")); } frame(lua_state, 21.0); @@ -324,6 +225,14 @@ unsafe extern "C" fn game_passivestand(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); } +unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + PostureModule::add_pos(boma, &Vector3f::new(0.0, -2.275, 0.0)); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_cliffescape", acmd_stub, Priority::Low); @@ -336,20 +245,20 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_appealhil", game_appealhi, Priority::Low); agent.acmd("game_appealhir", game_appealhi, Priority::Low); - agent.acmd("effect_appealhil", effect_appealhi, Priority::Low); - agent.acmd("effect_appealhir", effect_appealhi, Priority::Low); + agent.acmd("effect_appealhil", acmd_stub, Priority::Low); + agent.acmd("effect_appealhir", acmd_stub, Priority::Low); agent.acmd("sound_appealhil", sound_appealhi, Priority::Low); agent.acmd("sound_appealhir", sound_appealhi, Priority::Low); - agent.acmd("game_appealhi2", game_appealhi2, Priority::Low); - agent.acmd("effect_appealhi2", effect_appealhi2, Priority::Low); - agent.acmd("sound_appealhi2", sound_appealhi2, Priority::Low); - agent.acmd("expression_appealhi2", expression_appealhi2, Priority::Low); + agent.acmd("game_appeals2", game_appeals2, Priority::Low); + agent.acmd("effect_appeals2", effect_appeals2, Priority::Low); + agent.acmd("sound_appeals2", sound_appeals2, Priority::Low); + agent.acmd("expression_appeals2", expression_appeals2, Priority::Low); agent.acmd("game_appealsl", game_appeals, Priority::Low); agent.acmd("game_appealsr", game_appeals, Priority::Low); - agent.acmd("effect_appealsl", effect_appeals, Priority::Low); - agent.acmd("effect_appealsr", effect_appeals, Priority::Low); + agent.acmd("effect_appealsl", acmd_stub, Priority::Low); + agent.acmd("effect_appealsr", acmd_stub, Priority::Low); agent.acmd("sound_appealsl", sound_appeals, Priority::Low); agent.acmd("sound_appealsr", sound_appeals, Priority::Low); @@ -362,4 +271,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_passivestandf", game_passivestand, Priority::Low); agent.acmd("game_passivestandb", game_passivestand, Priority::Low); -} + + agent.acmd("game_cliffjump2", game_cliffjump2, Priority::Low); +} \ No newline at end of file diff --git a/fighters/packun/src/acmd/smashes.rs b/fighters/packun/src/acmd/smashes.rs index 372aa4f082..07c89ffc63 100644 --- a/fighters/packun/src/acmd/smashes.rs +++ b/fighters/packun/src/acmd/smashes.rs @@ -3,31 +3,42 @@ use super::*; unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } + frame(lua_state, 7.0); + if stance.label == STANCE_PRICKLY { + FT_MOTION_RATE_RANGE(agent, 7.0, 15.0, 11.0); + } + frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 16.0); if is_excute(agent) { - let kbg = if stance.label == 0 { 110 } else if stance.label == 1 { 140 } else { 100 }; - let hitlag = if stance.label != 2 { 1.2 } else { 1.5 }; - let sound = if stance.label != 2 { *COLLISION_SOUND_ATTR_PUNCH } else { *COLLISION_SOUND_ATTR_HEAVY }; - ATTACK(agent, 0, 0, Hash40::new("virtualhit2"), 14.0 * stance.damage_head, 45, 100, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 14.0 * stance.damage_head, 45, 100, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("mouth"), 15.0 * stance.damage_head, 45, kbg, 0, 25, 7.0, 2.5, 0.0, 0.0, None, None, None, hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, sound, *ATTACK_REGION_HEAD); + let (kbg, sound_lvl, sound_attr) = match stance.label { + STANCE_PIRANHA => { (110, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH) }, + STANCE_PUTRID => { (140, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH) }, + _ => { (100, *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY) } + }; + ATTACK(agent, 0, 0, Hash40::new("virtualhit2"), 14.0 * stance.damage_head, 45, 100, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_lvl, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 14.0 * stance.damage_head, 45, 100, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_lvl, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("mouth"), 15.0 * stance.damage_head, 45, kbg, 0, 25, 7.0, 2.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, sound_attr, *ATTACK_REGION_HEAD); HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); } - wait(lua_state, 4.0); + frame(lua_state, 20.0); + FT_MOTION_RATE_RANGE(agent, 20.0, 58.0, 34.0); if is_excute(agent) { AttackModule::clear_all(boma); HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_NORMAL); } + frame(lua_state, 58.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { @@ -35,11 +46,8 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if stance.label != 2 { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 12, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 1.4); - } + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 12, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.4); } frame(lua_state, 13.0); if is_excute(agent) { @@ -56,162 +64,11 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_attacks42(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 22.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); - } - frame(lua_state, 26.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("virtualhit2"), 20.0, 45, 100, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 20.0, 45, 100, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("mouth"), 25.0, 45, 100, 0, 25, 7.0, 2.5, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); - HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("neck6"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("neck8"), *HIT_STATUS_XLU); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear(boma, 0, false); - AttackModule::clear(boma, 1, false); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 60, 75, 0, 40, 6.0, 0.0, 5.0, 5.0, Some(0.0), Some(5.0), Some(20.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 11, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); - } - wait(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("neck6"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("neck8"), *HIT_STATUS_NORMAL); - } -} - -unsafe extern "C" fn effect_attacks42(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 16.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 18, -6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 1.4); - } - frame(lua_state, 25.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { - EFFECT_FOLLOW(agent, Hash40::new("packun_smash_s_arc_l"), Hash40::new("top"), 0, 14.5, 8, 50, 50, 90, 1.3, true); - LAST_EFFECT_SET_COLOR(agent, 1.3, 0.33, 0.11); - } - else { - EFFECT_FOLLOW(agent, Hash40::new("packun_smash_s_arc_r"), Hash40::new("top"), 0, 14.5, 8, 40, -50, -90, 1.3, true); - LAST_EFFECT_SET_COLOR(agent, 1.3, 0.33, 0.11); - } - } - frame(lua_state, 29.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 16, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); - LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } -} - -unsafe extern "C" fn sound_attacks42(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 24.0); - if is_excute(agent) { - STOP_SE(agent, Hash40::new("se_common_smash_start")); - } - wait(lua_state, 2.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_packun_smash_s01")); - } - frame(lua_state, 31.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_common_down_soil_l")); - } -} - -unsafe extern "C" fn expression_attacks42(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_L); - } - frame(lua_state, 23.0); - smash::app::sv_animcmd::execute(lua_state, 23.0); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_L); - } - frame(lua_state, 26.0); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 4, true); - RUMBLE_HIT(agent, Hash40::new("rbkind_attackll"), 0); - } - frame(lua_state, 29.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_impact"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - frame(lua_state, 30.0); - if is_excute(agent) { - RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); - } - frame(lua_state, 33.0); - if is_excute(agent) { - QUAKE(agent, *CAMERA_QUAKE_KIND_M); - } - frame(lua_state, 79.0); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 14); - } -} - -unsafe extern "C" fn effect_attacks4charge2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 5.0); - if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 10, 0, 4, 0, 0, 0, false); - } - for _ in 0..999 { - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("head"), -5, 3, 0, 0, 0, 0, 1, 3, 3, 3, 0, 0, 0, true); - } - wait(lua_state, 5.0); - } -} - -unsafe extern "C" fn sound_attacks4charge2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 2.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_common_smash_start")); - } -} - -unsafe extern "C" fn expression_attacks4charge2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - physics!(agent, *MA_MSC_CMD_PHYSICS_START_CHARGE, -1, -1, -1, -1, 0.1, -1, Hash40::new("invalid")); - ControlModule::set_rumble(boma, Hash40::new("rbkind_smashhold1"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - } - frame(lua_state, 61.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_smashhold2"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); - } -} - unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if stance.label == 2 { + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if stance.label == STANCE_PRICKLY { FT_DESIRED_RATE(agent, 8.0, 11.0); } frame(lua_state, 8.0); @@ -219,17 +76,10 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } - wait(lua_state, 1.0); - if is_excute(agent) { - if stance.label == 2 { - VarModule::on_flag(boma.object(), vars::packun::status::POISON_BREATH_ENABLE_PRICKLY_BITE); - } - } frame(lua_state, 12.0); if is_excute(agent) { - VarModule::off_flag(boma.object(), vars::packun::status::POISON_BREATH_ENABLE_PRICKLY_BITE); - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0 * stance.damage_bite, 75, 0, 0, 75, 5.5, 0.0, 12.0, -4.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0 * stance.damage_bite, 105, 0, 0, 75, 5.5, 0.0, 12.0, 4.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0 * stance.damage_bite, 114, 100, 80, 0, 5.5, 0.0, 12.0, -4.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0 * stance.damage_bite, 114, 100, 80, 0, 5.5, 0.0, 12.0, 4.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); @@ -237,23 +87,18 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 17.0); if is_excute(agent) { AttackModule::clear_all(boma); - if stance.label == 1 { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 12.5 * stance.damage_bite, 90, 86, 0, 90, 9.0, 2.0, 0.0, 0.0, Some(3.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_poison_param(boma, 0, 121, 30, 3.5, false); + if stance.label == STANCE_PUTRID { + ATTACK(agent, 0, 0, Hash40::new("mouth"), 13.0 * stance.damage_bite, 90, 149, 0, 46, 9.0, 2.0, 0.0, 0.0, Some(2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 1, Hash40::new("mouth"), 0.0, 0, 0, 0, 0, 9.0, 2.0, 0.0, 0.0, Some(2.5), Some(0.0), Some(0.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BITE); + AttackModule::set_poison_param(boma, 0, 241, 60, 2.5, false); } else { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 12.5 * stance.damage_bite, 90, 86, 0, 90, 9.0, 2.0, 0.0, 0.0, Some(3.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 14.0 * stance.damage_bite, 90, 86, 0, 90, 9.0, 2.0, 0.0, 0.0, Some(3.5), Some(0.0), Some(0.0), 0.35, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("mouth"), 8.5, 90, 86, 0, 90, 9.0, 4.0, 0.0, 0.0, Some(3.5), Some(0.0), Some(0.0), 0.45, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BITE); - } + ATTACK(agent, 0, 0, Hash40::new("mouth"), 13.0 * stance.damage_bite, 90, 109, 0, 46, 9.0, 2.0, 0.0, 0.0, Some(2.5), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); } - } - wait(lua_state, 2.0); + frame(lua_state, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); - VarModule::off_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST); HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_NORMAL); @@ -270,8 +115,8 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if stance.label == 1 { + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if stance.label == STANCE_PUTRID { EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 25.5, 0, 0, 0, 0, 0.95, true); LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 25.5, 0, 0, 0, 0, 0.85, true); @@ -289,11 +134,6 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("packun_bite_line2"), Hash40::new("top"), 0, 27, 0, 90, 0, 90, 1, true); EFFECT_FOLLOW(agent, Hash40::new("packun_smash_hi_bite"), Hash40::new("mouth"), 1.5, 0, 0, 0, 0, -90, 1, true); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - EFFECT(agent, Hash40::new("sys_flame"), Hash40::new("mouth"), 0, 0, 0, 0, 0, 0, 1.75, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 0.15, 0.01, 0.6); - LAST_EFFECT_SET_RATE(agent, 0.7); - } } frame(lua_state, 18.0); if is_excute(agent) { @@ -315,9 +155,6 @@ unsafe extern "C" fn sound_attackhi4(agent: &mut L2CAgentBase) { wait(lua_state, 9.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_packun_smash_h02")); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - PLAY_SE(agent, Hash40::new("se_common_bomb_s")); - } } wait(lua_state, 10.0); if is_excute(agent) { @@ -328,71 +165,75 @@ unsafe extern "C" fn sound_attackhi4(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - let angle1 = if stance.label == 0 { 175 } else { 32 }; - let angle2 = if stance.label == 0 { 94 } else { 30 }; - let dmg1 = if stance.label == 0 { 7.0 } else { 14.0 }; - let dmg2 = if stance.label == 0 { 6.0 } else { 12.0 }; - let fkb1 = if stance.label == 0 { 80 } else { 0 }; - let bkb1 = if stance.label == 0 { 0 } else { 25 }; - let kbg2 = if stance.label == 0 { 70 } else { 99 }; - let bkb2 = if stance.label == 0 { 75 } else { 25 }; - let element = if stance.label == 0 { Hash40::new("collision_attr_fire") } else { Hash40::new("collision_attr_normal") }; - let lvl1 = if stance.label == 0 { *ATTACK_SOUND_LEVEL_M } else { *ATTACK_SOUND_LEVEL_L }; - if stance.label == 2 { - FT_DESIRED_RATE(agent, 6.0, 9.0); - } + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 3.0); frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 7.0); - if stance.label == 0 { - FT_DESIRED_RATE(agent, 7.0, 3.0); + if stance.label != STANCE_PRICKLY { + FT_MOTION_RATE_RANGE(agent, 7.0, 14.0, 3.0); + } + else { + FT_MOTION_RATE_RANGE(agent, 7.0, 14.0, 6.0); } frame(lua_state, 14.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), dmg1 * stance.damage_other, angle1, 99, fkb1, bkb1, 5.0, 0.0, 4.0, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, element, lvl1, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), dmg1 * stance.damage_other, angle1, 99, fkb1, bkb1, 4.0, 0.0, 3.5, 7.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, element, lvl1, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - if stance.label == 0 { - VarModule::on_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); + if stance.label == STANCE_PIRANHA { + // Piranha + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0 * stance.damage_other, 94, 64, 0, 48, 5.0, 0.0, 4.0, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0 * stance.damage_other, 94, 64, 0, 48, 4.0, 0.0, 3.5, 7.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 13.0 * stance.damage_other, 94, 64, 0, 48, 4.0, 0.0, 3.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } else { - AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); + // Putrid/Prickly + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0 * stance.damage_other, 35, 99, 0, 25, 5.0, 0.0, 4.0, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0 * stance.damage_other, 35, 99, 0, 25, 4.0, 0.0, 3.5, 7.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 13.0 * stance.damage_other, 35, 99, 0, 25, 4.0, 0.0, 3.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } + AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } - wait(lua_state, 3.0); + frame(lua_state, 17.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), dmg2 * stance.damage_other, angle2, kbg2, 0, bkb2, 5.0, 0.0, 4.0, -13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, element, *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), dmg2 * stance.damage_other, angle2, kbg2, 0, bkb2, 4.0, 0.0, 3.6, -8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, element, *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - if stance.label != 0 { - AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); + if stance.label == STANCE_PIRANHA { + // Piranha + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0 * stance.damage_other, 94, 64, 0, 48, 5.0, 0.0, 4.0, -13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0 * stance.damage_other, 94, 64, 0, 48, 4.0, 0.0, 3.6, -8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 13.0 * stance.damage_other, 94, 64, 0, 48, 4.0, 0.0, 3.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + } + else { + // Putrid/Prickly + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0 * stance.damage_other, 35, 99, 0, 25, 5.0, 0.0, 4.0, -13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0 * stance.damage_other, 35, 99, 0, 25, 4.0, 0.0, 3.6, -8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 13.0 * stance.damage_other, 35, 99, 0, 25, 4.0, 0.0, 3.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } + AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } - wait(lua_state, 3.0); + frame(lua_state, 21.0); if is_excute(agent) { AttackModule::clear_all(boma); - VarModule::off_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); } } unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 3.0); if is_excute(agent) { EFFECT_FLIP(agent, Hash40::new("sys_smash_flash"), Hash40::new("sys_smash_flash"), Hash40::new("top"), 5, 4, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); } frame(lua_state, 9.5); if is_excute(agent) { - if stance.label == 0 { + if stance.label == STANCE_PIRANHA { EFFECT_FOLLOW(agent, Hash40::new("sys_flame"), Hash40::new("mouth"), 6.0, 1.0, 0, 0, 0, 0, 0.6, true); } } @@ -402,14 +243,14 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - if stance.label == 0 { + if stance.label == STANCE_PIRANHA { EFFECT_FOLLOW(agent, Hash40::new("packun_atk_air_b_fire"), Hash40::new("potc"), -8, 0, 0, 0, 0, 0, 1.2, true); } EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_smash_lw_arc"), Hash40::new("packun_smash_lw_arc"), Hash40::new("top"), 0, 5, 3, -180, 150, 7, 1.4, true, *EF_FLIP_YZ); } frame(lua_state, 16.0); if is_excute(agent) { - if stance.label == 0 { + if stance.label == STANCE_PIRANHA { EFFECT_FOLLOW(agent, Hash40::new("packun_atk_air_b_fire"), Hash40::new("potc"), -8, 0, 0, 0, 0, 0, 1.2, true); } } @@ -424,15 +265,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); agent.acmd("effect_attacks4", effect_attacks4, Priority::Low); - agent.acmd("game_attacks42", game_attacks42, Priority::Low); - agent.acmd("effect_attacks42", effect_attacks42, Priority::Low); - agent.acmd("sound_attacks42", sound_attacks42, Priority::Low); - agent.acmd("expression_attacks42", expression_attacks42, Priority::Low); - - agent.acmd("effect_attacks4charge2", effect_attacks4charge2, Priority::Low); - agent.acmd("sound_attacks4charge2", sound_attacks4charge2, Priority::Low); - agent.acmd("expression_attacks4charge2", expression_attacks4charge2, Priority::Low); - agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); agent.acmd("effect_attackhi4", effect_attackhi4, Priority::Low); agent.acmd("sound_attackhi4", sound_attackhi4, Priority::Low); diff --git a/fighters/packun/src/acmd/specials.rs b/fighters/packun/src/acmd/specials.rs deleted file mode 100644 index fc6f536a2b..0000000000 --- a/fighters/packun/src/acmd/specials.rs +++ /dev/null @@ -1,697 +0,0 @@ -use super::*; - -unsafe extern "C" fn game_specialnstart(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - frame(lua_state, 1.0); - if stance != 2 { - FT_MOTION_RATE(agent, 0.7); - } - else { - FT_MOTION_RATE(agent, 9.0/(9.0 - 1.0)); - } - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 10.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_N_FLAG_GENERATE_ARTICLE_SPIKEBALL); - } - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 0.7); -} - -unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 5.0); - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); -} - -unsafe extern "C" fn game_specialsshoot(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - let charged = WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60; - let hit = false; - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 10.0, 3.0); - } - if stance == 0 { - frame(lua_state, 1.0); - if is_excute(agent) { - if !charged { - ArticleModule::generate_article(boma, articles::packun::FIREBREATH, false, -1); - VarModule::on_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); - } - } - FT_DESIRED_RATE(agent, 5.0, 6.0); - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - if charged { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 14.0, 30, 66, 0, 60, 9.0, 2.0, 0.0, 0.0, Some(8.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BITE); - VarModule::on_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); - } - else { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 3.0, 30, 150, 0, 11, 5.0, 0.0, 0.0, 0.0, Some(6.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BITE); - } - } - wait(lua_state, 5.0); - FT_DESIRED_RATE(agent, 40.0, 30.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - VarModule::off_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); - } - } - else if stance == 1 { - frame(lua_state, 2.0); - if !WorkModule::is_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_FAILURE) { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 18, 100, 30, 0, 5.0, 0.0, 7.0, 7.0, Some(0.0), Some(7.0), Some(10.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - } - } - frame(lua_state, 10.0); - if !WorkModule::is_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_FAILURE) { - if is_excute(agent) { - ArticleModule::generate_article(boma, *FIGHTER_PACKUN_GENERATE_ARTICLE_POISONBREATH, false, -1); - } - } - frame(lua_state, 21.0); - FT_MOTION_RATE(agent, 0.9); - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 5.0); - AttackModule::clear_all(boma); - } - frame(lua_state, 31.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_CHANGE_KINETIC); - CancelModule::enable_cancel(boma); - } - frame(lua_state, 20.0); - FT_MOTION_RATE(agent, 0.55); - } -} - -unsafe extern "C" fn game_specialsshoots(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let charged = WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60; - let hit = false; - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 10.0, 3.0); - } - frame(lua_state, 1.0); - if is_excute(agent) { - VarModule::on_flag(boma.object(), vars::packun::status::POISON_BREATH_ENABLE_PRICKLY_BITE); - } - FT_DESIRED_RATE(agent, 11.0, 4.0); - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 20.0); - if is_excute(agent) { - VarModule::off_flag(boma.object(), vars::packun::status::POISON_BREATH_ENABLE_PRICKLY_BITE); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST){ - if charged { - ATTACK(agent, 2, 0, Hash40::new("mouth"), 17.0, 90, 100, 80, 0, 9.0, 4.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BITE); - AttackModule::set_add_reaction_frame(boma, 0, 8.0, false); - } - else { - ATTACK(agent, 2, 0, Hash40::new("mouth"), 12.0, 90, 100, 80, 0, 9.0, 4.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 8.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BITE); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.0); - } - } - else { - if charged { - if agent.is_situation(*SITUATION_KIND_GROUND) { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 15.0, 180, 100, 30, 0, 9.0, 2.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("mouth"), 15.0, 180, 100, 30, 0, 9.0, 2.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_add_reaction_frame_revised(boma, 0, 14.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 3.0, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 15.0, 90, 100, 80, 0, 9.0, 2.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("mouth"), 15.0, 90, 100, 80, 0, 9.0, 2.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - } - } - else { - if agent.is_situation(*SITUATION_KIND_GROUND) { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0, 180, 100, 30, 0, 9.0, 2.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 19.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("mouth"), 10.0, 180, 100, 30, 0, 9.0, 2.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 19.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.0); - AttackModule::set_add_reaction_frame_revised(boma, 0, 8.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 1.0, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0, 90, 100, 80, 0, 9.0, 2.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 19.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("mouth"), 10.0, 90, 100, 80, 0, 9.0, 2.0, 0.0, 0.0, Some(7.0), Some(0.0), Some(0.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 19.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.0); - } - } - } - } - wait(lua_state, 3.0); - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) - && !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_PARRY) { - FT_DESIRED_RATE(agent, 30.0, 16.0); - } - else { - FT_DESIRED_RATE(agent, 30.0, 26.0); - } - if is_excute(agent) { - AttackModule::clear_all(boma); - VarModule::off_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST); - } - wait(lua_state, 30.0); - FT_MOTION_RATE(agent, 1.0); -} - -unsafe extern "C" fn effect_specialsend(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); - if stance == 0 { - EFFECT_FOLLOW(agent, Hash40::new("sys_flash"), Hash40::new("mouth"), 2, -2, 0, 0, 0, 0, 0.75, false); - EFFECT_FOLLOW(agent, Hash40::new("sys_hit_fire"), Hash40::new("mouth"), 3, -1, 0, 0, 0, 0, 0.6, true); - } - if stance == 1 { - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 3, -1, 0, 0, 0, 0, 1, true); - } - if stance == 2 { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite_line2"), Hash40::new("packun_bite_line2"), Hash40::new("mouth"), 5, -3, 0, 10, 50, -20, 0.9, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 0.5); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite"), Hash40::new("packun_bite"), Hash40::new("mouth"), 3, 0, 0, 0, -150, 20, 0.9, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 0.5); - } - } - frame(lua_state, 8.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("packun_poison_max"), -1); - } -} - -unsafe extern "C" fn effect_specialsshoot(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 4.0); - if is_excute(agent) { - if stance == 0 { - EFFECT(agent, Hash40::new("packun_spikeball_shoot"), Hash40::new("mouth"), 2, -0.6, 0, 0, 90, -100, 1, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 1.0, 0.35, 0.02); - let effect = if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { Hash40::new("sys_flame") } else { Hash40::new("packun_atk_air_b_fire") }; - let size = if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { 0.8 } else { 1.5 }; - EFFECT_FOLLOW(agent, effect, Hash40::new("mouth"), 7.5, 0, 0, 0, 0, 0, size, true); - } - } - frame(lua_state, 6.0); - if stance == 1 { - if WorkModule::is_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_FAILURE) { - if is_excute(agent) { - agent.clear_lua_stack(); - lua_args!(agent, Hash40::new("packun_poison_breath2"), Hash40::new("mouth"), 5, -0.6, 0, 0, 90, -100, 1.2, true); - smash::app::sv_animcmd::EFFECT_FOLLOW_NO_SCALE(lua_state); - agent.pop_lua_stack(1); - } - } - else { - if is_excute(agent) { - agent.clear_lua_stack(); - lua_args!(agent, Hash40::new("packun_poison_breath"), Hash40::new("mouth"), 5, -0.6, 0, 0, 90, -100, 1.1, true); - smash::app::sv_animcmd::EFFECT_FOLLOW_NO_SCALE(lua_state); - agent.pop_lua_stack(1); - LAST_EFFECT_SET_RATE(agent, 1.6); - } - } - } - frame(lua_state, 25.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("packun_poison_breath"), -1); - } -} - -unsafe extern "C" fn effect_specialsshoots(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 19.0); - if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("packun_bite_line"), Hash40::new("packun_bite_line"), Hash40::new("top"), -5, 11, 19, 0, -130, 35, 1, true, *EF_FLIP_YZ); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite_line2"), Hash40::new("packun_bite_line2"), Hash40::new("top"), -12, 9, 20, 10, 50, 10, 0.8, true, *EF_FLIP_YZ); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite"), Hash40::new("packun_bite"), Hash40::new("top"), -9, 11, 18, 0, -120, 20, 1, true, *EF_FLIP_YZ); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - EFFECT(agent, Hash40::new("sys_flame"), Hash40::new("mouth"), 0, 0, 0, 0, 0, 0, 1.75, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 0.15, 0.01, 0.6); - LAST_EFFECT_SET_RATE(agent, 0.7); - } - } -} - -unsafe extern "C" fn effect_specialairsend(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - if is_excute(agent) { - if stance == 0 { - EFFECT_FOLLOW(agent, Hash40::new("sys_flash"), Hash40::new("mouth"), 2, -2, 0, 0, 0, 0, 0.75, false); - EFFECT_FOLLOW(agent, Hash40::new("sys_hit_fire"), Hash40::new("mouth"), 3, -1, 0, 0, 0, 0, 0.6, true); - } - if stance == 1 { - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 3, -1, 0, 0, 0, 0, 1, true); - } - if stance == 2 { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite_line2"), Hash40::new("packun_bite_line2"), Hash40::new("mouth"), 5, -3, 0, 10, 50, -20, 0.9, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 0.5); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite"), Hash40::new("packun_bite"), Hash40::new("mouth"), 3, 0, 0, 0, -150, 20, 0.9, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 0.5); - } - } - frame(lua_state, 8.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("packun_poison_max"), -1); - } -} - -unsafe extern "C" fn effect_specialairsshoot(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - frame(lua_state, 4.0); - if is_excute(agent) { - if stance == 0 { - EFFECT(agent, Hash40::new("packun_spikeball_shoot"), Hash40::new("mouth"), 2, -0.6, 0, 0, 90, -100, 1, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 1.0, 0.35, 0.02); - let effect = if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { Hash40::new("sys_flame") } else { Hash40::new("packun_atk_air_b_fire") }; - let size = if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { 0.8 } else { 1.5 }; - EFFECT_FOLLOW(agent, effect, Hash40::new("mouth"), 7.5, 0, 0, 0, 0, 0, size, true); - } - } - frame(lua_state, 6.0); - if stance == 1 { - if WorkModule::is_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_FAILURE) { - if is_excute(agent) { - agent.clear_lua_stack(); - lua_args!(agent, Hash40::new("packun_poison_breath2"), Hash40::new("mouth"), 5, -0.6, 0, 0, 90, -100, 1.2, true); - smash::app::sv_animcmd::EFFECT_FOLLOW_NO_SCALE(lua_state); - agent.pop_lua_stack(1); - } - } - else { - if is_excute(agent) { - agent.clear_lua_stack(); - lua_args!(agent, Hash40::new("packun_poison_breath"), Hash40::new("mouth"), 5, -0.6, 0, 0, 90, -100, 1.1, true); - smash::app::sv_animcmd::EFFECT_FOLLOW_NO_SCALE(lua_state); - agent.pop_lua_stack(1); - LAST_EFFECT_SET_RATE(agent, 1.6); - } - } - } - frame(lua_state, 25.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("packun_poison_breath"), -1); - } -} - -unsafe extern "C" fn expression_specialsshoot(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - if is_excute(agent) { - if agent.is_situation(*SITUATION_KIND_GROUND) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - } - } - if stance == 0 { - frame(lua_state, 5.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_nohit_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { - RUMBLE_HIT(agent, Hash40::new("rbkind_explosionm"), 0); - } - else { - RUMBLE_HIT(agent, Hash40::new("rbkind_explosion"), 0); - } - } - } - else { - frame(lua_state, 2.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - frame(lua_state, 5.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - frame(lua_state, 8.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - } -} - -unsafe extern "C" fn effect_specialairsshoots(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 19.0); - if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("packun_bite_line"), Hash40::new("packun_bite_line"), Hash40::new("top"), -5, 11, 19, 0, -130, 35, 1, true, *EF_FLIP_YZ); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite_line2"), Hash40::new("packun_bite_line2"), Hash40::new("top"), -12, 9, 20, 10, 50, 10, 0.8, true, *EF_FLIP_YZ); - EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite"), Hash40::new("packun_bite"), Hash40::new("top"), -9, 11, 18, 0, -120, 20, 1, true, *EF_FLIP_YZ); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - EFFECT(agent, Hash40::new("sys_flame"), Hash40::new("mouth"), 0, 0, 0, 0, 0, 0, 1.75, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 0.15, 0.01, 0.6); - LAST_EFFECT_SET_RATE(agent, 0.7); - } - } -} - -unsafe extern "C" fn sound_specialsshoot(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); - frame(lua_state, 1.0); - if is_excute(agent) { - //sound!(agent, *MA_MSC_CMD_SOUND_STOP_SE_STATUS); - if stance == 0 { - PLAY_SE(agent, Hash40::new("se_packun_special_n03")); - if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { - PLAY_SE(agent, Hash40::new("se_common_fire_m")); - } - } - } - frame(lua_state, 3.0); - if is_excute(agent) { - if stance == 1 { - PLAY_SE(agent, Hash40::new("se_packun_special_s03")); - } - else if stance == 2 { - PLAY_SE(agent, Hash40::new("se_packun_attackhard_s03")); - } - } - wait(lua_state, 3.0); - if is_excute(agent) { - if stance == 2 { - PLAY_SE(agent, Hash40::new("se_packun_attackhard_s04")); - } - } -} - -unsafe extern "C" fn sound_specialsshoots(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 17.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_packun_attackhard_s03")); - } - wait(lua_state, 3.0); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_packun_attackhard_s04")); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - PLAY_SE(agent, Hash40::new("se_common_bomb_s")); - } - } -} - -unsafe extern "C" fn expression_specialsshoots(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - if agent.is_situation(*SITUATION_KIND_GROUND) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - } - } - frame(lua_state, 3.0); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - frame(lua_state, 5.0); - if is_excute(agent) { - if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { - RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); - } - else { - RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); - } - } -} - -unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - FT_MOTION_RATE(agent, (10.0/15.0)); - frame(lua_state, 15.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 10.0 * stance.damage_other, 30, 70, 0, 70, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0 * stance.damage_other, 30, 70, 0, 70, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 10.0 * stance.damage_other, 30, 70, 0, 70, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("armr"), 10.0 * stance.damage_other, 30, 70, 0, 70, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 38.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 7.0 * stance.damage_other, 40, 70, 0, 70, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0 * stance.damage_other, 40, 70, 0, 70, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 7.0 * stance.damage_other, 40, 70, 0, 70, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("armr"), 7.0 * stance.damage_other, 40, 70, 0, 70, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - } - frame(lua_state, 70.0); - FT_MOTION_RATE(agent, 0.5); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 86.0); - FT_MOTION_RATE(agent, 3.03); - frame(lua_state, 90.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_HI_DIVE); - } -} - -unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - FT_MOTION_RATE(agent, (10.0/15.0)); - frame(lua_state, 15.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - if !boma.is_status(*FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_END) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 10.0 * stance.damage_other, 40, 70, 0, 50, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0 * stance.damage_other, 40, 70, 0, 50, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 10.0 * stance.damage_other, 40, 70, 0, 50, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("armr"), 10.0 * stance.damage_other, 40, 70, 0, 50, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - } - } - frame(lua_state, 38.0); - if is_excute(agent) { - if !boma.is_status(*FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_END) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 7.0 * stance.damage_other, 50, 70, 0, 50, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0 * stance.damage_other, 50, 70, 0, 50, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 7.0 * stance.damage_other, 50, 70, 0, 50, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("armr"), 7.0 * stance.damage_other, 50, 70, 0, 50, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - } - } - frame(lua_state, 70.0); - FT_MOTION_RATE(agent, 0.5); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 86.0); - FT_MOTION_RATE(agent, 3.03); - frame(lua_state, 90.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_HI_DIVE); - } -} - -unsafe extern "C" fn game_speciallwbiteattack(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if WorkModule::get_float(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_WORK_FLOAT_CHARGE_RATE) > 1.0 { - if is_excute(agent) { - if stance.label == 1 { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 20.0, 55, 55, 0, 75, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_poison_param(boma, 0, 121, 30, 3.0, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 26.0 * stance.damage_head, 55, 55, 0, 75, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - } - } - } - else { - if is_excute(agent) { - if stance.label == 1 { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 0.0, 55, 55, 0, 75, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.0, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 0.0 * stance.damage_head, 55, 55, 0, 75, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - } - WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_ATTACK_LERP); - } - } - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_BITE_ATTACK); - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); - } -} - -unsafe extern "C" fn game_speciallwbite_attack(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if WorkModule::get_float(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_WORK_FLOAT_CHARGE_RATE) > 1.0 { - if is_excute(agent) { - if stance.label == 1 { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 20.0, 55, 55, 0, 75, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_poison_param(boma, 0, 121, 30, 3.0, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 26.0 * stance.damage_head, 55, 55, 0, 75, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - } - } - } - else { - if is_excute(agent) { - if stance.label == 1 { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 0.0, 55, 55, 0, 75, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.0, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("mouth"), 0.0 * stance.damage_head, 55, 55, 0, 75, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - } - WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_ATTACK_LERP); - } - } - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_BITE_ATTACK); - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); - } -} - -unsafe extern "C" fn effect_speciallwbite(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - frame(lua_state, 1.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - } - frame(lua_state, 5.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_start"), Hash40::new("mouth"), 0, 0, 0, 180, 0, 0, 0.85, true); - } - frame(lua_state, 12.0); - if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("packun_longrange_bite_line"), Hash40::new("mouth"), 6, 0, 0, 0, 90, 0, 0.8, true); - } - frame(lua_state, 11.0); - if is_excute(agent) { - if stance.label == 1 { - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 1.0, true); - LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 0.9, true); - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_mouth"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 1.0, true); - LAST_EFFECT_SET_RATE(agent, 2.0); - } - } - frame(lua_state, 14.0); - if is_excute(agent) { - let size = if stance.label != 2 { 0.85 } else { 1.0 }; - EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_bite"), Hash40::new("mouth"), 0, 0, 0, 180, 0, 0, size, true); - } - frame(lua_state, 15.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("packun_longrange_bite"), -1); - } - frame(lua_state, 17.0); - if is_excute(agent) { - let size = if stance.label != 2 { 0.9 } else { 1.0 }; - EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_bite_line2"), Hash40::new("mouth"), 5, 0, 0, 0, 90, 0, size, true); - } -} - -unsafe extern "C" fn effect_specialairlwbite(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - frame(lua_state, 5.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_start"), Hash40::new("mouth"), 0, 0, 0, 180, 0, 0, 0.85, true); - } - frame(lua_state, 11.0); - if is_excute(agent) { - if stance.label == 1 { - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 1.0, true); - LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 0.9, true); - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_mouth"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 1.0, true); - LAST_EFFECT_SET_RATE(agent, 2.0); - } - } - frame(lua_state, 14.0); - if is_excute(agent) { - let size = if stance.label != 2 { 0.85 } else { 1.0 }; - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("packun_longrange_bite_line"), Hash40::new("mouth"), 6, 0, 0, 0, 90, 0, 0.9, true); - EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_bite"), Hash40::new("mouth"), 0, 0, 0, 180, 0, 0, size, true); - } - frame(lua_state, 15.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("packun_longrange_bite"), -1); - } - frame(lua_state, 17.0); - if is_excute(agent) { - let size = if stance.label != 2 { 0.9 } else { 1.0 }; - EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_bite_line2"), Hash40::new("mouth"), 5, 0, 0, 0, 90, 0, size, true); - } -} - -pub fn install(agent: &mut Agent) { - agent.acmd("game_specialnstart", game_specialnstart, Priority::Low); - agent.acmd("game_specialairnstart", game_specialnstart, Priority::Low); - agent.acmd("game_specials", game_specials, Priority::Low); - agent.acmd("game_specialairs", game_specials, Priority::Low); - agent.acmd("game_specialsshoot", game_specialsshoot, Priority::Low); - agent.acmd("game_specialairsshoot", game_specialsshoot, Priority::Low); - agent.acmd("game_specialsshoots", game_specialsshoots, Priority::Low); - agent.acmd("game_specialairsshoots", game_specialsshoots, Priority::Low); - agent.acmd("effect_specialsend", effect_specialsend, Priority::Low); - agent.acmd("effect_specialsshoot", effect_specialsshoot, Priority::Low); - agent.acmd("effect_specialsshoots", effect_specialsshoots, Priority::Low); - agent.acmd("effect_specialairsend", effect_specialairsend, Priority::Low); - agent.acmd("effect_specialairsshoot", effect_specialairsshoot, Priority::Low); - agent.acmd("expression_specialsshoot", expression_specialsshoot, Priority::Low); - agent.acmd("expression_specialairsshoot", expression_specialsshoot, Priority::Low); - agent.acmd("effect_specialairsshoots", effect_specialairsshoots, Priority::Low); - agent.acmd("sound_specialsshoot", sound_specialsshoot, Priority::Low); - agent.acmd("sound_specialairsshoot", sound_specialsshoot, Priority::Low); - agent.acmd("sound_specialsshoots", sound_specialsshoots, Priority::Low); - agent.acmd("sound_specialairsshoots", sound_specialsshoots, Priority::Low); - agent.acmd("expression_specialsshoots", expression_specialsshoots, Priority::Low); - agent.acmd("expression_specialairsshoots", expression_specialsshoots, Priority::Low); - - agent.acmd("game_specialhi", game_specialhi, Priority::Low); - agent.acmd("game_specialairhi", game_specialairhi, Priority::Low); - - agent.acmd("game_speciallwbiteattack", game_speciallwbiteattack, Priority::Low); - agent.acmd("game_speciallwbite_attack", game_speciallwbite_attack, Priority::Low); - agent.acmd("effect_speciallwbite", effect_speciallwbite, Priority::Low); - agent.acmd("effect_specialairlwbite", effect_specialairlwbite, Priority::Low); -} \ No newline at end of file diff --git a/fighters/packun/src/acmd/specials/mod.rs b/fighters/packun/src/acmd/specials/mod.rs new file mode 100644 index 0000000000..39588766a7 --- /dev/null +++ b/fighters/packun/src/acmd/specials/mod.rs @@ -0,0 +1,13 @@ +use super::*; + +mod special_n; +mod special_s; +mod special_hi; +mod special_lw; + +pub fn install(agent: &mut Agent) { + special_n::install(agent); + special_s::install(agent); + special_hi::install(agent); + special_lw::install(agent); +} \ No newline at end of file diff --git a/fighters/packun/src/acmd/specials/special_hi.rs b/fighters/packun/src/acmd/specials/special_hi.rs new file mode 100644 index 0000000000..0d03b1455d --- /dev/null +++ b/fighters/packun/src/acmd/specials/special_hi.rs @@ -0,0 +1,39 @@ +use super::*; + +unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + FT_MOTION_RATE(agent, (10.0/15.0)); + frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("arml"), 12.0 * stance.damage_other, 48, 80, 0, 50, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 12.0 * stance.damage_other, 48, 80, 0, 50, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 12.0 * stance.damage_other, 48, 80, 0, 50, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("armr"), 12.0 * stance.damage_other, 48, 80, 0, 50, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 24.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("arml"), 7.0 * stance.damage_other, 50, 100, 0, 20, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 7.0 * stance.damage_other, 50, 100, 0, 20, 3.5, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 7.0 * stance.damage_other, 50, 100, 0, 20, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("armr"), 7.0 * stance.damage_other, 50, 100, 0, 20, 5.0, 1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 70.0); + FT_MOTION_RATE(agent, 0.5); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 86.0); + FT_MOTION_RATE(agent, 3.03); + frame(lua_state, 90.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_HI_DIVE); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialhi", game_specialhi, Priority::Low); + agent.acmd("game_specialairhi", game_specialhi, Priority::Low); +} \ No newline at end of file diff --git a/fighters/packun/src/acmd/specials/special_lw.rs b/fighters/packun/src/acmd/specials/special_lw.rs new file mode 100644 index 0000000000..efe87f3942 --- /dev/null +++ b/fighters/packun/src/acmd/specials/special_lw.rs @@ -0,0 +1,179 @@ +use super::*; + +unsafe extern "C" fn game_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 17.0, 11.0); + frame(lua_state, 17.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn game_speciallwbiteattack(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if WorkModule::get_float(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_WORK_FLOAT_CHARGE_RATE) > 1.0 { + // Max charge + if is_excute(agent) { + if stance.label == STANCE_PUTRID { + ATTACK(agent, 0, 0, Hash40::new("mouth"), 20.0 * stance.damage_bite, 60, 70, 0, 60, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 1, Hash40::new("mouth"), 0.0, 0, 0, 0, 0, 7.9, 2.4, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BITE); + AttackModule::set_poison_param(boma, 0, 241, 60, 1.5, false); + } + else { + ATTACK(agent, 0, 0, Hash40::new("mouth"), 20.0 * stance.damage_head, 60, 70, 0, 60, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + } + } + } + else { + // Below max charge + if is_excute(agent) { + let charge = agent.get_int(*FIGHTER_PACKUN_STATUS_SPECIAL_LW_WORK_INT_CHARGE_COUNT); + let angle = (81.0 - charge as f32 * 0.5) as u64; + let kbg = (55.0 + charge as f32 * 0.2) as i32; + if stance.label == STANCE_PUTRID { + ATTACK(agent, 0, 0, Hash40::new("mouth"), 0.0, angle, kbg, 0, 60, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 1, Hash40::new("mouth"), 0.0, 0, 0, 0, 0, 7.9, 2.4, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BITE); + AttackModule::set_poison_param(boma, 0, 241, 60, 1.5, false); + } + else { + ATTACK(agent, 0, 0, Hash40::new("mouth"), 0.0 * stance.damage_head, angle, kbg, 0, 60, 7.9, 2.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + } + WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_ATTACK_LERP); + } + } + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_BITE_ATTACK); + search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); + } +} + +unsafe extern "C" fn effect_speciallwbite(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + frame(lua_state, 1.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_b"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_start"), Hash40::new("mouth"), 0, 0, 0, 180, 0, 0, 0.85, true); + } + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("packun_longrange_bite_line"), Hash40::new("mouth"), 6, 0, 0, 0, 90, 0, 0.8, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + if stance.label == STANCE_PUTRID { + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 0.9, true); + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_mouth"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_RATE(agent, 2.0); + } + } + frame(lua_state, 14.0); + if is_excute(agent) { + let size = if stance.label != STANCE_PRICKLY { 0.85 } else { 1.0 }; + EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_bite"), Hash40::new("mouth"), 0, 0, 0, 180, 0, 0, size, true); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("packun_longrange_bite"), -1); + } + frame(lua_state, 17.0); + if is_excute(agent) { + let size = if stance.label != STANCE_PRICKLY { 0.9 } else { 1.0 }; + EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_bite_line2"), Hash40::new("mouth"), 5, 0, 0, 0, 90, 0, size, true); + } +} + +unsafe extern "C" fn effect_specialairlwbite(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_start"), Hash40::new("mouth"), 0, 0, 0, 180, 0, 0, 0.85, true); + } + frame(lua_state, 11.0); + if is_excute(agent) { + if stance.label == STANCE_PUTRID { + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 0.9, true); + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_mouth"), Hash40::new("mouth"), 6, -0.6, 0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_RATE(agent, 2.0); + } + } + frame(lua_state, 14.0); + if is_excute(agent) { + let size = if stance.label != STANCE_PRICKLY { 0.85 } else { 1.0 }; + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("packun_longrange_bite_line"), Hash40::new("mouth"), 6, 0, 0, 0, 90, 0, 0.9, true); + EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_bite"), Hash40::new("mouth"), 0, 0, 0, 180, 0, 0, size, true); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("packun_longrange_bite"), -1); + } + frame(lua_state, 17.0); + if is_excute(agent) { + let size = if stance.label != STANCE_PRICKLY { 0.9 } else { 1.0 }; + EFFECT_FOLLOW(agent, Hash40::new("packun_longrange_bite_line2"), Hash40::new("mouth"), 5, 0, 0, 0, 90, 0, size, true); + } +} + +unsafe extern "C" fn game_speciallwend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { + VarModule::off_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + FT_MOTION_RATE_RANGE(agent, 1.0, 19.0, 9.0); + } + wait(lua_state, 15.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_END_CHANGE_KINETIC); + } + frame(lua_state, 19.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn game_speciallwfallend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_AIR) { + KineticModule::add_speed(boma, &Vector3f{x: 0.0, y: 0.7, z: 0.0}); + } + } + frame(lua_state, 1.0); + if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { + VarModule::off_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + FT_MOTION_RATE_RANGE(agent, 1.0, 19.0, 9.0); + } + wait(lua_state, 15.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_END_CHANGE_KINETIC); + } + frame(lua_state, 19.0); + FT_MOTION_RATE(agent, 1.0); +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_speciallwstart", game_speciallwstart, Priority::Low); + agent.acmd("game_specialairlwstart", game_speciallwstart, Priority::Low); + + agent.acmd("game_speciallwbiteattack", game_speciallwbiteattack, Priority::Low); + agent.acmd("game_speciallwbite_attack", game_speciallwbiteattack, Priority::Low); + agent.acmd("effect_speciallwbite", effect_speciallwbite, Priority::Low); + agent.acmd("effect_specialairlwbite", effect_specialairlwbite, Priority::Low); + + agent.acmd("game_speciallwend", game_speciallwend, Priority::Low); + agent.acmd("game_specialairlwend", game_speciallwend, Priority::Low); + agent.acmd("game_speciallwfallend", game_speciallwfallend, Priority::Low); + agent.acmd("game_specialairlwfallend", game_speciallwfallend, Priority::Low); +} \ No newline at end of file diff --git a/fighters/packun/src/acmd/specials/special_n.rs b/fighters/packun/src/acmd/specials/special_n.rs new file mode 100644 index 0000000000..e1a09e7130 --- /dev/null +++ b/fighters/packun/src/acmd/specials/special_n.rs @@ -0,0 +1,29 @@ +use super::*; + +unsafe extern "C" fn game_specialnstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE); + frame(lua_state, 1.0); + if stance == STANCE_PRICKLY { + VarModule::set_float(agent.battle_object, vars::packun::instance::SPECIAL_N_PTOOIE_SCALE, 1.3); + FT_MOTION_RATE(agent, 11.0/(9.0 - 1.0)); + } + else { + VarModule::set_float(agent.battle_object, vars::packun::instance::SPECIAL_N_PTOOIE_SCALE, 1.0); + FT_MOTION_RATE(agent, 0.7); + } + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 10.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_N_FLAG_GENERATE_ARTICLE_SPIKEBALL); + } + frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 0.7); +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specialnstart", game_specialnstart, Priority::Low); + agent.acmd("game_specialairnstart", game_specialnstart, Priority::Low); +} \ No newline at end of file diff --git a/fighters/packun/src/acmd/specials/special_s.rs b/fighters/packun/src/acmd/specials/special_s.rs new file mode 100644 index 0000000000..385534412e --- /dev/null +++ b/fighters/packun/src/acmd/specials/special_s.rs @@ -0,0 +1,338 @@ +use super::*; + +unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 5.0); + frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 1.0); +} + +// Piranha/Putrid +unsafe extern "C" fn game_specialsshoot(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE); + let charged = WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60; + let hit = false; + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 10.0, 3.0); + } + if stance == STANCE_PIRANHA { + // Fiery Breath + frame(lua_state, 1.0); + FT_DESIRED_RATE(agent, 5.0, 6.0); + frame(lua_state, 5.0); // f16 + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + if charged { + ATTACK(agent, 0, 0, Hash40::new("mouth"), 15.0, 30, 65, 0, 60, 6.0, 9.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 0, Hash40::new("mouth"), 15.0, 30, 65, 0, 60, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BITE); + } + else { + ArticleModule::generate_article(boma, articles::packun::FIREBREATH, false, -1); + ATTACK(agent, 0, 0, Hash40::new("mouth"), 3.0, 30, 150, 0, 11, 5.0, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 0, Hash40::new("mouth"), 3.0, 30, 150, 0, 11, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BITE); + } + } + frame(lua_state, 10.0); + FT_MOTION_RATE_RANGE(agent, 10.0, 50.0, 24.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 50.0); // f45 + FT_MOTION_RATE(agent, 1.0); + } + else if stance == STANCE_PUTRID { + // Poison Breath + frame(lua_state, 2.0); + if !WorkModule::is_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_FAILURE) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 18, 100, 30, 0, 5.0, 0.0, 7.0, 7.0, Some(0.0), Some(7.0), Some(10.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + } + } + frame(lua_state, 10.0); + if !WorkModule::is_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_FAILURE) { + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_PACKUN_GENERATE_ARTICLE_POISONBREATH, false, -1); + } + } + frame(lua_state, 21.0); + FT_MOTION_RATE(agent, 0.9); + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 5.0); + AttackModule::clear_all(boma); + } + frame(lua_state, 31.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_CHANGE_KINETIC); + CancelModule::enable_cancel(boma); + } + frame(lua_state, 20.0); + FT_MOTION_RATE(agent, 0.55); + } +} + +unsafe extern "C" fn effect_specialsshoot(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + } + if stance == STANCE_PIRANHA { + // Piranha + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("packun_spikeball_shoot"), Hash40::new("mouth"), 2, -0.6, 0, 0, 90, -100, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.35, 0.02); + let (effect, size) = if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 + { (Hash40::new("sys_flame"), 0.8) } else { (Hash40::new("packun_atk_air_b_fire"), 1.5) }; + EFFECT_FOLLOW(agent, effect, Hash40::new("mouth"), 7.5, 0, 0, 0, 0, 0, size, true); + } + } + else { + // Putrid + frame(lua_state, 6.0); + if WorkModule::is_flag(boma, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_FAILURE) { + if is_excute(agent) { + agent.clear_lua_stack(); + lua_args!(agent, Hash40::new("packun_poison_breath2"), Hash40::new("mouth"), 5, -0.6, 0, 0, 90, -100, 1.2, true); + smash::app::sv_animcmd::EFFECT_FOLLOW_NO_SCALE(lua_state); + agent.pop_lua_stack(1); + } + } + else { + if is_excute(agent) { + agent.clear_lua_stack(); + lua_args!(agent, Hash40::new("packun_poison_breath"), Hash40::new("mouth"), 5, -0.6, 0, 0, 90, -100, 1.1, true); + smash::app::sv_animcmd::EFFECT_FOLLOW_NO_SCALE(lua_state); + agent.pop_lua_stack(1); + LAST_EFFECT_SET_RATE(agent, 1.6); + } + } + } + frame(lua_state, 25.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("packun_poison_breath"), -1); + } +} + +unsafe extern "C" fn sound_specialsshoot(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE); + if stance == STANCE_PIRANHA { + frame(lua_state, 1.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_packun_special_n03")); + SoundModule::set_se_pitch_ratio(boma, Hash40::new("se_packun_special_n03"), 3.0); + if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { + PLAY_SE(agent, Hash40::new("se_common_fire_m")); + } + } + frame(lua_state, 2.0); + if is_excute(agent) { + SoundModule::set_se_pitch_ratio(boma, Hash40::new("se_packun_special_n03"), 1.0); + } + } + else { // STANCE_PUTRID + frame(lua_state, 3.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_packun_special_s03")); + } + } +} + +unsafe extern "C" fn expression_specialsshoot(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + } + if stance == 0 { + frame(lua_state, 5.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohit_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { + RUMBLE_HIT(agent, Hash40::new("rbkind_explosionm"), 0); + } + else { + RUMBLE_HIT(agent, Hash40::new("rbkind_explosion"), 0); + } + } + } + else { + frame(lua_state, 2.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 5.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 2, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 8.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + } +} + +// Prickly +unsafe extern "C" fn game_specialsshoots(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let charged = WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60; + let hit = false; + if is_excute(agent) { + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 10.0, 3.0); + } + FT_DESIRED_RATE(agent, 11.0, 4.0); + frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 17.0); + if is_excute(agent) { + if charged { + ATTACK(agent, 0, 0, Hash40::new("mouth"), 15.0, 80, 20, 0, 50, 7.5, -0.5, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 0.35, 0.3, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 0, Hash40::new("mouth"), 15.0, 80, 20, 0, 50, 7.5, -0.5, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 0.35, 0.3, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, f32::NAN, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + } + else { + ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0, 80, 27, 0, 50, 7.5, -0.5, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 0.35, 0.3, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 19.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 0, Hash40::new("mouth"), 10.0, 80, 27, 0, 50, 7.5, -0.5, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 0.35, 0.3, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 19.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.0); + } + } + frame(lua_state, 20.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 23.0); + FT_MOTION_RATE_RANGE(agent, 23.0, 31.0, 12.0); + frame(lua_state, 31.0); + FT_MOTION_RATE_RANGE(agent, 31.0, 47.0, 13.0); + frame(lua_state, 47.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialsshoots(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_unblockable_flash"), Hash40::new("sys_unblockable_flash"), Hash40::new("top"), 7, 18, -5, 0, 0, 0, 0.8, true, *EF_FLIP_YZ); + } + } + frame(lua_state, 19.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("packun_bite_line"), Hash40::new("packun_bite_line"), Hash40::new("top"), -5, 11, 19, 0, -130, 35, 1, true, *EF_FLIP_YZ); + } + wait(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite_line2"), Hash40::new("packun_bite_line2"), Hash40::new("top"), -12, 9, 20, 10, 50, 10, 0.8, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite"), Hash40::new("packun_bite"), Hash40::new("top"), -9, 11, 18, 0, -120, 20, 1, true, *EF_FLIP_YZ); + } +} + +unsafe extern "C" fn sound_specialsshoots(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 17.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_packun_attackhard_s03")); + } + wait(lua_state, 3.0); + if is_excute(agent) { + if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { + PLAY_SE(agent, Hash40::new("se_packun_smash_h02")); + } + PLAY_SE(agent, Hash40::new("se_packun_attackhard_s04")); + } +} + +unsafe extern "C" fn expression_specialsshoots(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + } + frame(lua_state, 3.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 5.0); + if is_excute(agent) { + if WorkModule::get_int(boma, *FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) == 60 { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); + } + else { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } + } +} + +unsafe extern "C" fn effect_specialsend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE); + if is_excute(agent) { + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } + match stance { + STANCE_PIRANHA => { + EFFECT(agent, Hash40::new("sys_flash"), Hash40::new("mouth"), 2, -2, 0, 0, 0, 0, 0.75, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW(agent, Hash40::new("sys_hit_fire"), Hash40::new("mouth"), 3, -1, 0, 0, 0, 0, 0.6, true); + }, + STANCE_PUTRID => { + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("mouth"), 3, -1, 0, 0, 0, 0, 1, true); + } + _ => { // STANCE_PRICKLY + EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite_line2"), Hash40::new("packun_bite_line2"), Hash40::new("mouth"), 5, -3, 0, 10, 50, -20, 0.9, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 0.5); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite"), Hash40::new("packun_bite"), Hash40::new("mouth"), 3, 0, 0, 0, -150, 20, 0.9, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 0.5); + } + } + } + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("packun_poison_max"), -1); + } +} + +pub fn install(agent: &mut Agent) { + agent.acmd("game_specials", game_specials, Priority::Low); + agent.acmd("game_specialairs", game_specials, Priority::Low); + + agent.acmd("game_specialsshoot", game_specialsshoot, Priority::Low); + agent.acmd("game_specialairsshoot", game_specialsshoot, Priority::Low); + agent.acmd("effect_specialsshoot", effect_specialsshoot, Priority::Low); + agent.acmd("effect_specialairsshoot", effect_specialsshoot, Priority::Low); + agent.acmd("sound_specialsshoot", sound_specialsshoot, Priority::Low); + agent.acmd("sound_specialairsshoot", sound_specialsshoot, Priority::Low); + agent.acmd("expression_specialsshoot", expression_specialsshoot, Priority::Low); + agent.acmd("expression_specialairsshoot", expression_specialsshoot, Priority::Low); + + agent.acmd("game_specialsshoots", game_specialsshoots, Priority::Low); + agent.acmd("game_specialairsshoots", game_specialsshoots, Priority::Low); + agent.acmd("effect_specialsshoots", effect_specialsshoots, Priority::Low); + agent.acmd("effect_specialairsshoots", effect_specialsshoots, Priority::Low); + agent.acmd("sound_specialsshoots", sound_specialsshoots, Priority::Low); + agent.acmd("sound_specialairsshoots", sound_specialsshoots, Priority::Low); + agent.acmd("expression_specialsshoots", expression_specialsshoots, Priority::Low); + agent.acmd("expression_specialairsshoots", expression_specialsshoots, Priority::Low); + + agent.acmd("effect_specialsend", effect_specialsend, Priority::Low); + agent.acmd("effect_specialairsend", effect_specialsend, Priority::Low); +} \ No newline at end of file diff --git a/fighters/packun/src/acmd/throws.rs b/fighters/packun/src/acmd/throws.rs index 86abb403c3..5775362857 100644 --- a/fighters/packun/src/acmd/throws.rs +++ b/fighters/packun/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(11.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(11.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -66,14 +65,13 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_catchattack(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE); if is_excute(agent) { - VarModule::on_flag(boma.object(), vars::common::status::PUMMEL_OVERRIDE_GLOBAL_STATS); + VarModule::on_flag(agent.battle_object, vars::common::status::PUMMEL_OVERRIDE_GLOBAL_STATS); } frame(lua_state, 1.0); if is_excute(agent) { - let damage = if stance != 1 { 0.0 } else { 0.3 }; - let effect = if stance != 1 { Hash40::new("collision_attr_normal") } else { Hash40::new("collision_attr_purple") }; + let (damage, effect) = if VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE) != STANCE_PUTRID + { (0.0, Hash40::new("collision_attr_normal")) } else { (0.3, Hash40::new("collision_attr_purple")) }; ATTACK(agent, 0, 0, Hash40::new("top"), 1.4 + damage, 361, 100, 30, 0, 5.0, 0.0, 10.0, 10.0, None, None, None, 3.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, effect, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD); AttackModule::set_catch_only_all(boma, true, false); } @@ -86,25 +84,18 @@ unsafe extern "C" fn game_catchattack(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - if stance.label == 2 { - FT_MOTION_RATE(agent, (17.0/13.0)); - } if is_excute(agent) { - let angle = if stance.label == 2 { 10 } else { 0 }; - let kbg = if stance.label == 2 { 12 } else { 0 }; - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0 * stance.damage_head, 45 - angle, 65 + kbg, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 30, 60, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 13.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 26.0); if is_excute(agent) { - let sfx_lvl = if stance.label == 2 { *ATTACK_SOUND_LEVEL_L } else { *ATTACK_SOUND_LEVEL_M }; - ATTACK(agent, 0, 0, Hash40::new("mouth"), 3.0 * stance.damage_head, 361, 100, 0, 50, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sfx_lvl, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); - AttackModule::set_catch_only_all(boma, true, false); + ATTACK(agent, 0, 0, Hash40::new("mouth"), 10.0, 361, 100, 0, 50, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("mouth"), 14.0, 361, 60, 0, 50, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + AttackModule::set_catch_only(boma, 0, true, false); CHECK_FINISH_CAMERA(agent, 30, 8); } - frame(lua_state, 14.0); + frame(lua_state, 29.0); if is_excute(agent) { let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); @@ -112,14 +103,80 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); AttackModule::clear_all(boma); } + frame(lua_state, 38.0); + FT_MOTION_RATE_RANGE(agent, 38.0, 55.0, 9.0); + frame(lua_state, 55.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 25.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { + EFFECT_FOLLOW(agent, Hash40::new("packun_smash_s_arc_l"), Hash40::new("top"), 0, 14.5, 8, 50, 50, 90, 1.3, true); + LAST_EFFECT_SET_COLOR(agent, 1.3, 0.33, 0.11); + } + else { + EFFECT_FOLLOW(agent, Hash40::new("packun_smash_s_arc_r"), Hash40::new("top"), 0, 14.5, 8, 40, -50, -90, 1.3, true); + LAST_EFFECT_SET_COLOR(agent, 1.3, 0.33, 0.11); + } + } + frame(lua_state, 29.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 16, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 24.0); + if is_excute(agent) { + STOP_SE(agent, Hash40::new("se_common_smash_start")); + } + frame(lua_state, 26.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_03")); + PLAY_SE(agent, Hash40::new("se_packun_smash_s01")); + PLAY_SE(agent, Hash40::new("se_common_swing_10")); + } + frame(lua_state, 31.0); + if is_excute(agent) { + let handle = SoundModule::play_se(boma, Hash40::new("se_common_down_soil_l"), true, false, false, false, app::enSEType(0)); + SoundModule::set_se_vol(boma, handle as i32, 1.5, 0); + } +} + +unsafe extern "C" fn expression_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 28.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_M); + RUMBLE_HIT(agent, Hash40::new("rbkind_attackl"), 0); + } + frame(lua_state, 30.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_impact"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } } unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - let kbg = if VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE) == 0 { 87 } else { 77 }; - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 45, kbg, 0, 54, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 65, 40, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 18.0); @@ -137,19 +194,48 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 17.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 5, 0, 0, 0, 180, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW_FLIP_ALPHA(agent, Hash40::new("packun_atk_arc"), Hash40::new("packun_atk_arc"), Hash40::new("top"), 0, 15, -4, -165, 42, 36, 1.6, true, *EF_FLIP_YZ, 0.5); + LAST_EFFECT_SET_RATE(agent, 0.7); + } + frame(lua_state, 19.0); + if is_excute(agent) { + //EFFECT_ATTR(agent, Hash40::new("packun_bite_splash"), Hash40::new("mouth"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true, *EFFECT_SUB_ATTRIBUTE_NO_JOINT_SCALE); + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); + } +} + +unsafe extern "C" fn sound_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 15.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } +} + unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); if is_excute(agent) { - let damage = if stance.label != 1 { 0.0 } else { 3.0 }; - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 13.0 * stance.damage_bite + damage, 90, 67, 0, 64, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 90, 91, 0, 57, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 19.0); if is_excute(agent) { ATTACK_IGNORE_THROW(agent, 0, 0, Hash40::new("mouth"), 5.0, 90, 100, 0, 82, 7.0, 2.0, 0.0, 0.0, Some(3.5), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_THROW); - //AttackModule::set_catch_only_all(boma, true, false); FT_CATCH_STOP(agent, 8, 1); } frame(lua_state, 20.0); @@ -158,10 +244,6 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); - if stance.label == 1 { - ATTACK(agent, 1, 1, Hash40::new("mouth"), 0.0, 90, 0, 0, 0, 7.0, 2.0, 0.0, 0.0, Some(3.5), Some(0.0), Some(0.0), 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_THROW); - //AttackModule::set_poison_param(boma, 1, 136, 45, 2.0, false); - } } frame(lua_state, 21.0); if is_excute(agent) { @@ -172,17 +254,15 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 1.0); if is_excute(agent) { FT_LEAVE_NEAR_OTTOTTO(agent, -2.5, 2.5); - let angle = if stance.label == 0 { 66 } else if stance.label == 1 { 68 } else { 70 }; - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0 * stance.damage_bite, angle, 75, 0, 80, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 84, 163, 0, 41, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5 * stance.damage_bite, 0, 100, 0, 0, 6.0, 0.0, 7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 0, 100, 0, 0, 6.0, 0.0, 7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); AttackModule::set_catch_only_all(boma, true, false); } wait(lua_state, 1.0); @@ -191,17 +271,14 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { } frame(lua_state, 30.0); if is_excute(agent) { - if stance.label == 1 { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5 * stance.damage_bite, 0, 100, 0, 0, 6.0, 0.0, 7.0, 0.0, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_poison_param(boma, 0, 121, 30, 1.5, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5 * stance.damage_bite, 0, 100, 0, 0, 6.0, 0.0, 7.0, 0.0, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - } + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 0, 100, 0, 0, 6.0, 0.0, 7.0, 0.0, None, None, None, 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 1, Hash40::new("top"), 0.0, 0, 0, 0, 0, 6.0, 0.0, 7.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BITE); + AttackModule::set_poison_param(boma, 0, 241, 60, 1.0, false); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 8, 0); } frame(lua_state, 31.0); + FT_MOTION_RATE_RANGE(agent, 31.0, 55.0, 26.0); if is_excute(agent) { AttackModule::clear_all(boma); let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); @@ -209,6 +286,78 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } + frame(lua_state, 55.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("packun_bite_line"), Hash40::new("top"), 0, 8, -2, 116, -6, -137, 0.9, true); + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 21.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("packun_bite_line2"), Hash40::new("top"), 0, 10, -2, 116, -6, -137, 0.9, true); + } + frame(lua_state, 29.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 5, 0, 0, 0, 0, 0.95, true); + LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 5, 0, 0, 0, 0, 0.85, true); + } + frame(lua_state, 30.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("packun_bite_line"), Hash40::new("top"), 0, 8.5, -2, 104, -2, -151, 0.9, true); + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 32.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("packun_bite_line2"), Hash40::new("top"), 0, 5, -2, 104, -2, -151, 0.9, true); + } + frame(lua_state, 49.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_landing_smoke_s"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 18.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 19.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_packun_attackhard_s01")); + } + frame(lua_state, 21.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_packun_attackhard_s02")); + } + frame(lua_state, 29.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_packun_attackhard_s03")); + } + frame(lua_state, 31.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_packun_attackhard_s04")); + } + frame(lua_state, 49.0); + if is_excute(agent) { + PLAY_LANDING_SE(agent, Hash40::new("se_packun_landing02")); + } } pub fn install(agent: &mut Agent) { @@ -219,10 +368,17 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchattack", game_catchattack, Priority::Low); agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("effect_throwf", effect_throwf, Priority::Low); + agent.acmd("sound_throwf", sound_throwf, Priority::Low); + agent.acmd("expression_throwf", expression_throwf, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("effect_throwb", effect_throwb, Priority::Low); + agent.acmd("sound_throwb", sound_throwb, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); -} + agent.acmd("effect_throwlw", effect_throwlw, Priority::Low); + agent.acmd("sound_throwlw", sound_throwlw, Priority::Low); +} \ No newline at end of file diff --git a/fighters/packun/src/acmd/tilts.rs b/fighters/packun/src/acmd/tilts.rs index 19171f72db..178f07be7a 100644 --- a/fighters/packun/src/acmd/tilts.rs +++ b/fighters/packun/src/acmd/tilts.rs @@ -3,17 +3,13 @@ use super::*; unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - let shield_damage = if stance.label != 2 { 0 } else { 2 }; - if stance.label == 2 { - FT_MOTION_RATE(agent, (9.0/7.0)); - } + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.5 * stance.damage_bite, 366, 20, 0, 20, 6.3, 0.0, 7.5, 12.0, Some(0.0), Some(10.5), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 5.5 * stance.damage_bite, 361, 20, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 2, 0, Hash40::new("virtualhit2"), 5.5 * stance.damage_bite, 361, 20, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.5 * stance.damage_bite, 366, 20, 0, 20, 6.3, 0.0, 7.5, 12.0, Some(0.0), Some(10.5), Some(13.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 5.5 * stance.damage_bite, 361, 20, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 2, 0, Hash40::new("virtualhit2"), 5.5 * stance.damage_bite, 361, 20, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); AttackModule::set_add_reaction_frame(boma, 0, 11.0, false); AttackModule::set_add_reaction_frame(boma, 1, 11.0, false); AttackModule::set_add_reaction_frame(boma, 2, 11.0, false); @@ -32,22 +28,25 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { } } +// Piranha unsafe extern "C" fn game_attacks3a(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - VarModule::on_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); - ATTACK(agent, 0, 0, Hash40::new("virtualhit2"), 5.5, 361, 120, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 5.5, 361, 120, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("mouth"), 9.0, 361, 120, 0, 40, 6.3, 4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("virtualhit2"), 6.0, 361, 102, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("mouth"), 11.0, 361, 102, 0, 40, 6.3, 4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); } - wait(lua_state, 7.0); + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("virtualhit2"), 6.0, 50, 120, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("mouth"), 6.0, 50, 120, 0, 40, 6.3, 4.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); + } + frame(lua_state, 15.0); if is_excute(agent) { AttackModule::clear_all(boma); - VarModule::off_flag(boma.object(), vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_NORMAL); } @@ -96,9 +95,6 @@ unsafe extern "C" fn sound_attacks3a(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_packun_attackhard_h01")); - } - wait(lua_state, 1.0); - if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_common_fire_m")); } } @@ -116,86 +112,50 @@ unsafe extern "C" fn expression_attacks3a(agent: &mut L2CAgentBase) { } } +// Putrid unsafe extern "C" fn game_attacks32(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - let shield_damage = if stance.label != 2 { 0 } else { 2 }; - let damage = if stance.label == 2 { 10.0 } else { 6.0 }; - let atk_frame = if stance.label == 2 { 6.0 } else { 5.0 }; - frame(lua_state, 1.0); - if is_excute(agent) { - if stance.label == 2 { - VarModule::on_flag(boma.object(), vars::packun::status::POISON_BREATH_ENABLE_PRICKLY_BITE); - } - } - frame(lua_state, 3.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, atk_frame); - if is_excute(agent) { - VarModule::off_flag(boma.object(), vars::packun::status::POISON_BREATH_ENABLE_PRICKLY_BITE); - if stance.label == 1 { - ATTACK(agent, 0, 0, Hash40::new("top"), damage * stance.damage_bite, 361, 125, 0, 40, 6.5, 0.0, 7.5, 15.0, Some(0.0), Some(10.5), Some(15.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), damage * stance.damage_bite, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 2, 0, Hash40::new("virtualhit2"), damage * stance.damage_bite, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - AttackModule::set_poison_param(boma, 0, 121, 30, 1.8, false); - AttackModule::set_poison_param(boma, 1, 121, 30, 1.8, false); - AttackModule::set_poison_param(boma, 2, 121, 30, 1.8, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("top"), damage * stance.damage_bite, 361, 125, 0, 40, 6.5, 0.0, 7.5, 15.0, Some(0.0), Some(10.5), Some(15.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), damage * stance.damage_bite, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 2, 0, Hash40::new("virtualhit3"), damage * stance.damage_bite, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - if stance.label == 2 { - HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("neck6"), *HIT_STATUS_XLU); - HIT_NODE(agent, Hash40::new("neck8"), *HIT_STATUS_XLU); - } - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - ATTACK(agent, 0, 0, Hash40::new("top"), damage * stance.damage_bite * 1.25, 361, 125, 0, 40, 6.5, 0.0, 7.5, 15.0, Some(0.0), Some(10.5), Some(15.0), 0.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 2, 0, Hash40::new("virtualhit2"), damage * stance.damage_bite * 1.25, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - ATTACK(agent, 3, 0, Hash40::new("virtualhit3"), damage * stance.damage_bite * 1.25, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); - } - } - } - wait(lua_state, 2.0); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + frame(lua_state, 6.0); if is_excute(agent) { - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 361, 125, 0, 40, 6.5, 0.0, 10.0, 15.0, Some(0.0), Some(10.5), Some(15.0), 0.35, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, shield_damage, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BITE); - } + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0 * stance.damage_bite, 361, 125, 0, 40, 6.5, 0.0, 7.5, 15.0, Some(0.0), Some(10.5), Some(15.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 1, 0, Hash40::new("virtualhit3"), 6.0 * stance.damage_bite, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 2, 0, Hash40::new("virtualhit2"), 6.0 * stance.damage_bite, 361, 125, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BITE); + ATTACK(agent, 3, 1, Hash40::new("top"), 0.0, 0, 0, 0, 0, 6.5, 0.0, 7.5, 15.0, Some(0.0), Some(10.5), Some(15.0), 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BITE); + ATTACK(agent, 4, 1, Hash40::new("virtualhit3"), 0.0, 0, 0, 0, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BITE); + ATTACK(agent, 5, 1, Hash40::new("virtualhit2"), 0.0, 0, 0, 0, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BITE); + AttackModule::set_poison_param(boma, 0, 241, 60, 1.8, false); + AttackModule::set_poison_param(boma, 1, 241, 60, 1.8, false); + AttackModule::set_poison_param(boma, 2, 241, 60, 1.8, false); } - wait(lua_state, 2.0); + frame(lua_state, 10.0); + FT_MOTION_RATE_RANGE(agent, 10.0, 12.0, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); - VarModule::off_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST); HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_NORMAL); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("neck6"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("neck8"), *HIT_STATUS_NORMAL); } + frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attacks32(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - let atk_frame = if stance.label == 2 { 1.0 } else { 0.0 }; + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 1.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 3.0); if is_excute(agent) { - if stance.label == 1 { - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 11, 18, 0, 0, 0, 0.95, true); - LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 11, 18, 0, 0, 0, 0.85, true); - } + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 11, 18, 0, 0, 0, 0.95, true); + LAST_EFFECT_SET_COLOR(agent, 0.5, 0.5, 0.5); + EFFECT_FOLLOW(agent, Hash40::new("packun_poison_max"), Hash40::new("top"), -1.2, 11, 18, 0, 0, 0, 0.85, true); } - frame(lua_state, 4.0 + atk_frame); + frame(lua_state, 4.0); if is_excute(agent) { EFFECT_FOLLOW_NO_STOP_FLIP(agent, Hash40::new("packun_bite_line"), Hash40::new("packun_bite_line"), Hash40::new("top"), -5, 11, 19, 0, -130, 35, 1, true, *EF_FLIP_YZ); } @@ -203,11 +163,6 @@ unsafe extern "C" fn effect_attacks32(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite_line2"), Hash40::new("packun_bite_line2"), Hash40::new("top"), -12, 9, 20, 10, 50, 10, 0.8, true, *EF_FLIP_YZ); EFFECT_FOLLOW_FLIP(agent, Hash40::new("packun_bite"), Hash40::new("packun_bite"), Hash40::new("top"), -9, 11, 18, 0, -120, 20, 1, true, *EF_FLIP_YZ); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - EFFECT(agent, Hash40::new("sys_flame"), Hash40::new("mouth"), 0, 0, 0, 0, 0, 0, 1.75, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 0.15, 0.01, 0.6); - LAST_EFFECT_SET_RATE(agent, 0.7); - } } } @@ -221,16 +176,13 @@ unsafe extern "C" fn sound_attacks32(agent: &mut L2CAgentBase) { wait(lua_state, 5.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_packun_attackhard_s04")); - if VarModule::is_flag(boma.object(), vars::packun::status::POISON_BREATH_BURST) { - PLAY_SE(agent, Hash40::new("se_common_bomb_s")); - } } } unsafe extern "C" fn expression_attacks32(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); let atk_frame = if stance.label == 2 { 6.0 } else { 5.0 }; if is_excute(agent) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); @@ -245,24 +197,93 @@ unsafe extern "C" fn expression_attacks32(agent: &mut L2CAgentBase) { } } +// Prickly +unsafe extern "C" fn game_attacks3ss(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + frame(lua_state, 10.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0 * stance.damage_head, 361, 105, 0, 40, 6.5, 0.0, 8.25, 15.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("neck5"), 10.0 * stance.damage_head, 361, 105, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("neck3"), 10.0 * stance.damage_head, 361, 105, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_HEAD); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_NORMAL); + } + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 26.0, 15.0); + frame(lua_state, 26.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_attacks3ss(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 11, -3, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true, 0.5); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 15.0, 8.0, 0, 0, 0, 0, 1.6, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.8); + } +} + +unsafe extern "C" fn sound_attacks3ss(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_packun_swing_l01")); + PLAY_SE(agent, Hash40::new("se_packun_attackair_h01")); + } +} + +unsafe extern "C" fn expression_attacks3ss(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + let atk_frame = if stance.label == STANCE_PRICKLY { 6.0 } else { 5.0 }; + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 3.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, atk_frame); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } +} + unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - let sound_level_neck = if stance.label != 2 { *ATTACK_SOUND_LEVEL_S } else { *ATTACK_SOUND_LEVEL_S }; - let sound_neck = if stance.label != 2 { *COLLISION_SOUND_ATTR_PUNCH } else { *COLLISION_SOUND_ATTR_HEAVY }; - let sound_level_head = if stance.label != 2 { *ATTACK_SOUND_LEVEL_M } else { *ATTACK_SOUND_LEVEL_M }; - let sound_head = if stance.label != 2 { *COLLISION_SOUND_ATTR_PUNCH } else { *COLLISION_SOUND_ATTR_HEAVY }; - if stance.label == 2 { + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); + if stance.label == STANCE_PRICKLY { FT_MOTION_RATE(agent, (9.0/6.0)); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("virtualhit1"), 7.0 * stance.damage_head, 80, 100, 0, 55, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level_neck, sound_neck, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 7.0 * stance.damage_head, 80, 100, 0, 55, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level_neck, sound_neck, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("virtualhit3"), 7.0 * stance.damage_head, 80, 100, 0, 55, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level_neck, sound_neck, *ATTACK_REGION_BODY); - ATTACK(agent, 3, 0, Hash40::new("mouth"), 9.0 * stance.damage_head, 85, 100, 0, 55, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sound_level_head, sound_head, *ATTACK_REGION_HEAD); + let collision_sfx = if stance.label != STANCE_PRICKLY { *COLLISION_SOUND_ATTR_PUNCH } else { *COLLISION_SOUND_ATTR_HEAVY }; + ATTACK(agent, 0, 0, Hash40::new("virtualhit1"), 7.0 * stance.damage_head, 80, 100, 0, 55, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, collision_sfx, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("virtualhit2"), 7.0 * stance.damage_head, 80, 100, 0, 55, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, collision_sfx, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("mouth"), 9.0 * stance.damage_head, 85, 100, 0, 55, 6.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, collision_sfx, *ATTACK_REGION_HEAD); HIT_NODE(agent, Hash40::new("mouth"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipu3"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("lipd3"), *HIT_STATUS_XLU); @@ -296,10 +317,9 @@ unsafe extern "C" fn expression_attackhi3(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let stance = StanceInfo::from(VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE)); - let bkb = if stance.label == 1 {10} else {0}; + let stance = StanceInfo::from(VarModule::get_int(agent.battle_object, vars::packun::instance::CURRENT_STANCE)); frame(lua_state, 1.0); - if stance.label != 2 { + if stance.label != STANCE_PRICKLY { FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 4.0); } frame(lua_state, 6.0); @@ -307,9 +327,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 8.75); FT_MOTION_RATE_RANGE(agent, 8.75, 12.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0 * stance.damage_other, 73, 75, 0, 60 + bkb, 4.5, 0.0, 4.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0 * stance.damage_other, 73, 75, 0, 60 + bkb, 4.5, 0.0, 3.4, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0 * stance.damage_other, 86, 75, 0, 60 + bkb, 4.5, 0.0, 2.8, 16.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0 * stance.damage_other, 60, 67, 0, 45, 4.5, 0.0, 4.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0 * stance.damage_other, 60, 67, 0, 45, 4.5, 0.0, 3.4, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0 * stance.damage_other, 80, 54, 0, 60, 4.5, 0.0, 2.8, 16.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 12.0); @@ -377,10 +397,15 @@ pub fn install(agent: &mut Agent) { agent.acmd("sound_attacks32", sound_attacks32, Priority::Low); agent.acmd("expression_attacks32", expression_attacks32, Priority::Low); + agent.acmd("game_attacks3ss", game_attacks3ss, Priority::Low); + agent.acmd("effect_attacks3ss", effect_attacks3ss, Priority::Low); + agent.acmd("sound_attacks3ss", sound_attacks3ss, Priority::Low); + agent.acmd("expression_attacks3ss", expression_attacks3ss, Priority::Low); + agent.acmd("game_attackhi3", game_attackhi3, Priority::Low); agent.acmd("expression_attackhi3", expression_attackhi3, Priority::Low); agent.acmd("game_attacklw3", game_attacklw3, Priority::Low); agent.acmd("effect_attacklw3", effect_attacklw3, Priority::Low); agent.acmd("expression_attacklw3", expression_attacklw3, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/packun/src/firebreath/acmd.rs b/fighters/packun/src/firebreath/acmd.rs index a3dd0c2f8f..167275c9c4 100644 --- a/fighters/packun/src/firebreath/acmd.rs +++ b/fighters/packun/src/firebreath/acmd.rs @@ -3,17 +3,18 @@ use super::*; unsafe extern "C" fn game_regular(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 361, 20, 0, 35, 2.4, 0.0, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2.5, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 361, 20, 0, 35, 2.4, 0.0, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); AttackModule::enable_safe_pos(agent.module_accessor); } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 361, 15, 0, 28, 2.2, 0.0, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2.5, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 361, 15, 0, 28, 2.2, 0.0, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } frame(lua_state, 30.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 10, 0, 22, 2.0, 0.0, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 10, 0, 22, 2.0, 0.0, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } } diff --git a/fighters/packun/src/firebreath/status.rs b/fighters/packun/src/firebreath/status.rs index 4371209727..62637ca274 100644 --- a/fighters/packun/src/firebreath/status.rs +++ b/fighters/packun/src/firebreath/status.rs @@ -14,19 +14,16 @@ pub unsafe extern "C" fn regular_pre(weapon: &mut L2CFighterCommon) -> L2CValue 0, 0, ); - 0.into() + + return 0.into(); } pub unsafe extern "C" fn regular_main(weapon: &mut L2CFighterCommon) -> L2CValue { let life = WorkModule::get_param_int(weapon.module_accessor, hash40("param_firebreath"), hash40("life")); WorkModule::set_int(weapon.module_accessor, life, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); WorkModule::set_int(weapon.module_accessor, life, *WEAPON_INSTANCE_WORK_ID_INT_INIT_LIFE); - let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; - let packun = utils::util::get_battle_object_from_id(owner_id); - if (&mut *(*packun).module_accessor).kind() == *FIGHTER_KIND_PACKUN { - VarModule::set_float(packun, vars::packun::instance::FIRE_POS_X, PostureModule::pos_x(weapon.module_accessor)); - VarModule::set_float(packun, vars::packun::instance::FIRE_POS_Y, PostureModule::pos_y(weapon.module_accessor)); - } + let facing = PostureModule::lr(weapon.module_accessor); + PostureModule::add_pos(weapon.module_accessor, &Vector3f::new(10.0 * facing, 0.0, 0.0)); MotionModule::change_motion(weapon.module_accessor, Hash40::new("regular"), 0.0, 1.0, false, 0.0, false, false); VarModule::on_flag(weapon.object(), vars::common::status::NO_POCKET); weapon.fastshift(L2CValue::Ptr(regular_main_loop as *const () as _)) @@ -34,12 +31,6 @@ pub unsafe extern "C" fn regular_main(weapon: &mut L2CFighterCommon) -> L2CValue pub unsafe extern "C" fn regular_main_loop(weapon: &mut L2CFighterCommon) -> L2CValue { if WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LIFE) > 0 { - let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; - let packun = utils::util::get_battle_object_from_id(owner_id); - if (&mut *(*packun).module_accessor).kind() == *FIGHTER_KIND_PACKUN { - VarModule::set_float(packun, vars::packun::instance::FIRE_POS_X, PostureModule::pos_x(weapon.module_accessor)); - VarModule::set_float(packun, vars::packun::instance::FIRE_POS_Y, PostureModule::pos_y(weapon.module_accessor)); - } if GroundModule::is_touch(weapon.module_accessor, *GROUND_TOUCH_FLAG_ALL as u32) { notify_event_msc_cmd!(weapon, Hash40::new_raw(0x18b78d41a0)); app::lua_bind::MotionAnimcmdModule::call_script_single(weapon.module_accessor, *WEAPON_ANIMCMD_EFFECT, Hash40::new("effect_bound"), -1); @@ -57,27 +48,15 @@ pub unsafe extern "C" fn regular_main_loop(weapon: &mut L2CFighterCommon) -> L2C pub unsafe extern "C" fn regular_exec(weapon: &mut L2CFighterCommon) -> L2CValue { WorkModule::dec_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); - 0.into() + return 0.into(); } pub unsafe extern "C" fn regular_end(weapon: &mut L2CFighterCommon) -> L2CValue { - let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; - let packun = utils::util::get_battle_object_from_id(owner_id); - if (&mut *(*packun).module_accessor).kind() == *FIGHTER_KIND_PACKUN { - VarModule::set_float(packun, vars::packun::instance::FIRE_POS_X, 0.0); - VarModule::set_float(packun, vars::packun::instance::FIRE_POS_Y, 0.0); - } - 0.into() + return 0.into(); } pub unsafe extern "C" fn regular_exit(weapon: &mut L2CFighterCommon) -> L2CValue { - let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; - let packun = utils::util::get_battle_object_from_id(owner_id); - if (&mut *(*packun).module_accessor).kind() == *FIGHTER_KIND_PACKUN { - VarModule::set_float(packun, vars::packun::instance::FIRE_POS_X, 0.0); - VarModule::set_float(packun, vars::packun::instance::FIRE_POS_Y, 0.0); - } - 0.into() + return 0.into(); } pub fn install(agent: &mut Agent) { diff --git a/fighters/packun/src/lib.rs b/fighters/packun/src/lib.rs index f70f0bc24c..1b9e38a7ae 100644 --- a/fighters/packun/src/lib.rs +++ b/fighters/packun/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -45,6 +46,47 @@ use utils::{ use smashline::*; #[macro_use] extern crate smash_script; +pub unsafe fn SET_STANCE(fighter: &mut L2CFighterCommon, stance: i32, follow: bool) { + if !(VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == stance) { + VarModule::set_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE, stance); + //VarModule::on_flag(fighter.battle_object, vars::packun::status::STANCE_INIT); + + if follow { + EFFECT_FOLLOW(fighter, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, true); + } + else { + EFFECT(fighter, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); + } + PLAY_SE(fighter, Hash40::new("se_packun_special_s02")); + + // Enable meshes for stances + // HeadA is the normal head + // HeadB is the poison head + // HeadS is the spike head + match stance { + 0 => { // STANCE_PIRANHA + EFFECT_FOLLOW(fighter, Hash40::new("sys_grass_landing"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.5, false); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("heada"), true); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("headb"), false); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("heads"), false); + }, + 1 => { // STANCE_PUTRID + EFFECT_FOLLOW(fighter, Hash40::new("packun_poison_max"), Hash40::new("top"), 0, 15.5, 0, 0, 0, 0, 1.2, false); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("headb"), true); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("heada"), false); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("heads"), false); + }, + 2 => { // STANCE_PRICKLY + EFFECT_FOLLOW(fighter, Hash40::new("sys_crown"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, false); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("heads"), true); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("headb"), false); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("heada"), false); + }, + _ => {} + } + } +} + pub fn install() { let agent = &mut Agent::new("packun"); acmd::install(agent); diff --git a/fighters/packun/src/opff.rs b/fighters/packun/src/opff.rs index ed42b7c98a..d1bee68aac 100644 --- a/fighters/packun/src/opff.rs +++ b/fighters/packun/src/opff.rs @@ -2,56 +2,17 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; - -unsafe fn piranhacopter_cancel(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status(*FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_END) && boma.is_motion(Hash40::new("special_hi")) { - if boma.is_prev_situation(*SITUATION_KIND_AIR) && boma.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(boma, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - } - if boma.is_prev_situation(*SITUATION_KIND_GROUND) && boma.is_situation(*SITUATION_KIND_AIR) { - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); - GroundModule::correct(boma,GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - } - let stop_add_speed_y_frame = WorkModule::get_param_int(boma, hash40("param_special_hi"), hash40("stop_add_speed_y_frame")); - if boma.is_situation(*SITUATION_KIND_GROUND) - && boma.status_frame() >= stop_add_speed_y_frame { - StatusModule::change_status_request_from_script(boma, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_LANDING, false); - } - } -} extern "Rust" { fn gimmick_flash(boma: &mut BattleObjectModuleAccessor); } -unsafe fn stance_head(fighter: &mut smash::lua2cpp::L2CFighterCommon) { - // Enable meshes for stances - // HeadA is the normal head - // HeadB is the poison head - // HeadS is the spike head - if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 0 { - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), true); - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), false); - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), false); - } - else if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 1 { - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), true); - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), false); - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), false); - } - else if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), true); - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), false); - ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), false); - } -} - /// handle speed application unsafe fn check_apply_speeds(fighter: &mut smash::lua2cpp::L2CFighterCommon) { - + // handle speed application once - if VarModule::is_flag(fighter.object(), vars::packun::instance::STANCE_ENABLE_CHANGE_SPEED) { - if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 0 { + if VarModule::is_flag(fighter.battle_object, vars::packun::instance::STANCE_ENABLE_CHANGE_SPEED) { + if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 0 { apply_status_speed_mul(fighter, 1.0); } else if fighter.is_status_one_of(&[ *FIGHTER_STATUS_KIND_ESCAPE_F, @@ -61,58 +22,29 @@ unsafe fn check_apply_speeds(fighter: &mut smash::lua2cpp::L2CFighterCommon) { *FIGHTER_STATUS_KIND_DOWN_STAND_FB, *FIGHTER_STATUS_KIND_PASSIVE_FB]) { apply_status_speed_mul(fighter, 1.0); - } else if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 1 { + } else if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 1 { apply_status_speed_mul(fighter, 0.86); - } else if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 2 { + } else if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 { apply_status_speed_mul(fighter, 0.84); } - VarModule::off_flag(fighter.object(), vars::packun::instance::STANCE_ENABLE_CHANGE_SPEED); + VarModule::off_flag(fighter.battle_object, vars::packun::instance::STANCE_ENABLE_CHANGE_SPEED); } - if fighter.status() != VarModule::get_int(fighter.object(), vars::packun::instance::STANCE_STATUS) { + if fighter.status() != VarModule::get_int(fighter.battle_object, vars::packun::instance::STANCE_STATUS) { //println!("Status is changing!"); - VarModule::on_flag(fighter.object(), vars::packun::instance::STANCE_ENABLE_CHANGE_SPEED); - VarModule::set_int(fighter.object(), vars::packun::instance::STANCE_STATUS, fighter.status()); - //println!("new stance status: {}", VarModule::get_int(fighter.object(), vars::packun::instance::STANCE_STATUS)); + VarModule::on_flag(fighter.battle_object, vars::packun::instance::STANCE_ENABLE_CHANGE_SPEED); + VarModule::set_int(fighter.battle_object, vars::packun::instance::STANCE_STATUS, fighter.status()); + //println!("new stance status: {}", VarModule::get_int(fighter.battle_object, vars::packun::instance::STANCE_STATUS)); } // dash & momentum transfer speeds - if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 1 { - VarModule::set_float(fighter.object(), vars::common::instance::JUMP_SPEED_MAX_MUL, 1.0); - - // if you are initial dash, slow them down slightly - if fighter.is_status(*FIGHTER_STATUS_KIND_DASH) { - let motion_vec = Vector3f { - x: -0.15 * PostureModule::lr(fighter.boma()) * (1.0 - (MotionModule::frame(fighter.boma()) / MotionModule::end_frame(fighter.boma()))), - y: 0.0, - z: 0.0 - }; - //KineticModule::add_speed_outside(fighter.boma(), *KINETIC_OUTSIDE_ENERGY_TYPE_WIND_NO_ADDITION, &motion_vec); - } + if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 1 { + // Putrid + VarModule::set_float(fighter.battle_object, vars::common::instance::JUMP_SPEED_MAX_MUL, 1.0); } - - else if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - VarModule::set_float(fighter.object(), vars::common::instance::JUMP_SPEED_MAX_MUL, 0.88); - - // if you are initial dash, slow them down slightly - if fighter.is_status(*FIGHTER_STATUS_KIND_DASH) { - let motion_vec = Vector3f { - x: -0.15 * PostureModule::lr(fighter.boma()) * (1.0 - (MotionModule::frame(fighter.boma()) / MotionModule::end_frame(fighter.boma()))), - y: 0.0, - z: 0.0 - }; - //KineticModule::add_speed_outside(fighter.boma(), *KINETIC_OUTSIDE_ENERGY_TYPE_WIND_NO_ADDITION, &motion_vec); - } - } -} - -/// checks if stance should be reset due to match end -unsafe fn check_reset(fighter: &mut smash::lua2cpp::L2CFighterCommon) { - if fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_WIN, - *FIGHTER_STATUS_KIND_LOSE, - *FIGHTER_STATUS_KIND_ENTRY]) { - VarModule::set_int(fighter.object(), vars::packun::instance::CURRENT_STANCE, 0); + else if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 { + // Prickly + VarModule::set_float(fighter.battle_object, vars::common::instance::JUMP_SPEED_MAX_MUL, 0.88); } } @@ -127,117 +59,69 @@ unsafe fn apply_status_speed_mul(fighter: &mut smash::lua2cpp::L2CFighterCommon, lua_bind::FighterKineticEnergyMotion::set_speed_mul(fighter.get_motion_energy(), og_speed_mul * mul); // set the X motion accel multiplier for control energy (used in the air, during walk, fall, etc) - lua_bind::FighterKineticEnergyController::mul_x_accel_mul( fighter.get_controller_energy(), mul); + lua_bind::FighterKineticEnergyController::mul_x_accel_mul(fighter.get_controller_energy(), mul); // set the X motion accel multiplier for control energy (used in the air, during walk, fall, etc) - lua_bind::FighterKineticEnergyController::mul_x_accel_add( fighter.get_controller_energy(), mul); + lua_bind::FighterKineticEnergyController::mul_x_accel_add(fighter.get_controller_energy(), mul); // set the X speed max multiplier for control energy (used in the air, during walk, fall, etc) lua_bind::FighterKineticEnergyController::mul_x_speed_max(fighter.get_controller_energy(), mul); } -unsafe fn ptooie_scale(boma: &mut BattleObjectModuleAccessor) { - if VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - VarModule::set_float(boma.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE, 1.3); - } - else { - VarModule::set_float(boma.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE, 1.0); - } -} - -// Allows hold input to transition to rapid jab if in Putrid stance, and handles changed animations per stance -unsafe fn motion_handler(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if boma.is_motion(Hash40::new("attack_13")) && VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE) == 1 { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_100, false); - } - if boma.is_motion(Hash40::new("attack_s3_s")) { - if VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - MotionModule::change_motion(boma, Hash40::new("attack_s3_s2"), 0.0, 1.0, false, 0.0, false, false); - } - else if VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE) == 0 { - MotionModule::change_motion(boma, Hash40::new("attack_s3_s_a"), 0.0, 1.0, false, 0.0, false, false); - } - } - if boma.is_motion(Hash40::new("attack_air_b")) && VarModule::get_int(boma.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - MotionModule::change_motion(boma, Hash40::new("attack_air_b_s"), 0.0, 1.0, false, 0.0, false, false); - } - if boma.is_motion(Hash40::new("appeal_hi_2")) - && fighter.status_frame() == 93 - && boma.is_button_on(Buttons::AppealSL) { - MotionModule::change_motion(boma, Hash40::new("appeal_hi_2"), 45.0, 1.0, false, 0.0, false, false); - } -} - -unsafe fn reverse_switch(boma: &mut BattleObjectModuleAccessor) { - if VarModule::is_flag(boma.object(), vars::packun::instance::APPEAL_STANCE_REVERSE) { - if !boma.is_motion_one_of(& - [Hash40::new("appeal_hi_l"), Hash40::new("appeal_hi_r")]) || - !boma.is_button_on(Buttons::AppealHi) { - VarModule::off_flag(boma.object(), vars::packun::instance::APPEAL_STANCE_REVERSE); - } - } -} - unsafe fn game_start_switch(fighter: &mut L2CFighterCommon) { if fighter.is_prev_status(*FIGHTER_STATUS_KIND_ENTRY) { if StatusModule::is_changing(fighter.module_accessor) { - VarModule::on_flag(fighter.object(), vars::packun::instance::APPEAL_STANCE_INIT); + VarModule::on_flag(fighter.battle_object, vars::packun::status::STANCE_INIT); } - if VarModule::is_flag(fighter.object(), vars::packun::instance::APPEAL_STANCE_INIT) { + if VarModule::is_flag(fighter.battle_object, vars::packun::status::STANCE_INIT) { if fighter.is_button_on(Buttons::AppealSL) { - EFFECT(fighter, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - PLAY_SE(fighter, Hash40::new("se_packun_special_s02")); - EFFECT_FOLLOW(fighter, Hash40::new("sys_grass_landing"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.5, false); - VarModule::set_int(fighter.object(), vars::packun::instance::CURRENT_STANCE, 0); - VarModule::off_flag(fighter.object(), vars::packun::instance::APPEAL_STANCE_INIT); + SET_STANCE(fighter, 0, false); + VarModule::off_flag(fighter.battle_object, vars::packun::status::STANCE_INIT); } else if fighter.is_button_on(Buttons::AppealSR) { - EFFECT(fighter, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - PLAY_SE(fighter, Hash40::new("se_packun_special_s02")); - EFFECT_FOLLOW(fighter, Hash40::new("sys_crown"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, false); - VarModule::set_int(fighter.object(), vars::packun::instance::CURRENT_STANCE, 2); - VarModule::off_flag(fighter.object(), vars::packun::instance::APPEAL_STANCE_INIT); + SET_STANCE(fighter, 1, false); + VarModule::off_flag(fighter.battle_object, vars::packun::status::STANCE_INIT); } else if fighter.is_button_on(Buttons::AppealLw) { - EFFECT(fighter, Hash40::new("sys_level_up"), Hash40::new("top"), -2, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); - PLAY_SE(fighter, Hash40::new("se_packun_special_s02")); - EFFECT_FOLLOW(fighter, Hash40::new("packun_poison_max"), Hash40::new("top"), 0, 15.5, 0, 0, 0, 0, 1.2, false); - VarModule::set_int(fighter.object(), vars::packun::instance::CURRENT_STANCE, 1); - VarModule::off_flag(fighter.object(), vars::packun::instance::APPEAL_STANCE_INIT); + SET_STANCE(fighter, 2, false); + VarModule::off_flag(fighter.battle_object, vars::packun::status::STANCE_INIT); } } if fighter.status_frame() > 94 { - VarModule::off_flag(fighter.object(), vars::packun::instance::APPEAL_STANCE_INIT); + VarModule::off_flag(fighter.battle_object, vars::packun::status::STANCE_INIT); } } } -unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { - if !fighter.is_in_hitlag() - && !StatusModule::is_changing(fighter.module_accessor) - && fighter.is_status_one_of(&[ - *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_N_END, - *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_N_FAILURE, - *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_N_HIT_END, - *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_END, - *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_LW_END, - *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_LW_FALL_END - ]) - && fighter.is_situation(*SITUATION_KIND_AIR) { - fighter.sub_air_check_dive(); +unsafe fn maw_end_head(fighter: &mut L2CFighterCommon) { + // fixes side special forcing normal head somewhere + if fighter.is_prev_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_S, + *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_CHARGE, + *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_CANCEL, + *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_JUMP_CANCEL, + *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_END, + *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_SHOOT + ]) + && VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 1 { + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), true); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), false); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), false); + } +} + +unsafe fn lss_lc(fighter: &mut L2CFighterCommon) { + if fighter.is_status_one_of(&[*FIGHTER_PACKUN_STATUS_KIND_SPECIAL_LW_END, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_LW_FALL_END]) + || (fighter.is_status(*FIGHTER_PACKUN_STATUS_KIND_SPECIAL_LW_BITE) && fighter.is_flag(*FIGHTER_PACKUN_STATUS_SPECIAL_LW_FLAG_STALK_SHORTEN)) { + fighter.check_land_cancel(Some(6.0)); } } pub unsafe fn moveset(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - piranhacopter_cancel(boma); - ptooie_scale(boma); - stance_head(fighter); - check_reset(fighter); check_apply_speeds(fighter); - motion_handler(fighter, boma); - fastfall_specials(fighter); - reverse_switch(boma); game_start_switch(fighter); + maw_end_head(fighter); + lss_lc(fighter); } unsafe extern "C" fn plant_meter(fighter: &mut smash::lua2cpp::L2CFighterCommon) { @@ -249,7 +133,7 @@ unsafe extern "C" fn plant_meter(fighter: &mut smash::lua2cpp::L2CFighterCommon) utils::ui::UiManager::set_plant_meter_enable(fighter.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as u32, true); utils::ui::UiManager::set_plant_meter_info( fighter.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as u32, - VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) + VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) ); } } diff --git a/fighters/packun/src/poisonbreath/acmd.rs b/fighters/packun/src/poisonbreath/acmd.rs index c8c1e697ca..2297fc64b4 100644 --- a/fighters/packun/src/poisonbreath/acmd.rs +++ b/fighters/packun/src/poisonbreath/acmd.rs @@ -5,10 +5,10 @@ unsafe extern "C" fn game_start(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.4, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.1, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.3, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.8, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.4, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.1, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.3, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.8, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); attack!(agent, *MA_MSC_CMD_ATTACK_SET_LERP, 0, 1); attack!(agent, *MA_MSC_CMD_ATTACK_SET_LERP, 2, 3); AttackModule::set_no_hop_opponent_all(boma, true, false); @@ -20,8 +20,8 @@ unsafe extern "C" fn game_startmax(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.1, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.1, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); AttackModule::set_no_hop_opponent_all(boma, true, false); } } @@ -30,10 +30,10 @@ unsafe extern "C" fn game_shoot(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.4, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.1, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.3, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.8, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.4, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.1, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.3, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 3, 0, Hash40::new("top"), 1.8, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); attack!(agent, *MA_MSC_CMD_ATTACK_SET_LERP, 0, 1); attack!(agent, *MA_MSC_CMD_ATTACK_SET_LERP, 2, 3); AttackModule::set_no_hop_opponent_all(boma, true, false); @@ -44,69 +44,16 @@ unsafe extern "C" fn game_shootmax(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.1, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, false, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.1, 361, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 361, 0, 0, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 14, true, true, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); AttackModule::set_no_hop_opponent_all(boma, true, false); } } -unsafe extern "C" fn game_explode(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE); - frame(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 55, 90, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 0, false, false, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 55, 95, 0, 50, 10.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.1, 0.0, 0, false, false, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - } - wait(lua_state, 3.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 15.0); - if is_excute(agent) { - WorkModule::set_int(boma, 1, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); - } -} - -unsafe extern "C" fn effect_explode(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE); - if is_excute(agent) { - EffectModule::kill_kind(boma, Hash40::new("packun_poison_breath"), false, false); - EffectModule::kill_kind(boma, Hash40::new("packun_poison_breath2"), false, false); - EffectModule::kill_kind(boma, Hash40::new("packun_poison_gas"), false, false); - EffectModule::kill_kind(boma, Hash40::new("packun_poison_max"), false, false); - EffectModule::kill_kind(boma, Hash40::new("packun_poison_max_smoke"), false, false); - EffectModule::kill_kind(boma, Hash40::new("packun_poison_mouth"), false, false); - EffectModule::kill_kind(boma, Hash40::new("packun_poison_mouth2"), false, false); - EFFECT(agent, Hash40::new("sys_flame"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.75, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 0.7); - } -} - -unsafe extern "C" fn sound_explode(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE); - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_common_bomb_l")); - } -} - pub fn install(agent: &mut Agent) { agent.acmd("game_start", game_start, Priority::Low); agent.acmd("game_startmax", game_startmax, Priority::Low); agent.acmd("game_shoot", game_shoot, Priority::Low); agent.acmd("game_shootmax", game_shootmax, Priority::Low); - - agent.acmd("game_explode", game_explode, Priority::Low); - agent.acmd("effect_explode", effect_explode, Priority::Low); - agent.acmd("sound_explode", sound_explode, Priority::Low); } \ No newline at end of file diff --git a/fighters/packun/src/poisonbreath/opff.rs b/fighters/packun/src/poisonbreath/opff.rs index 7f3f230c04..2b19a90ee7 100644 --- a/fighters/packun/src/poisonbreath/opff.rs +++ b/fighters/packun/src/poisonbreath/opff.rs @@ -3,47 +3,20 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -pub extern "C" fn poisonbreath_frame(weapon: &mut L2CFighterBase) { - unsafe { - let boma = weapon.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let owner_object = owner_module_accessor.object(); - let status_kind = StatusModule::status_kind(boma); - let motion_kind = MotionModule::motion_kind(boma); - if owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN { - let pos_x = PostureModule::pos_x(boma); - let pos_y = PostureModule::pos_y(boma); - let packun_pos_x = PostureModule::pos_x(owner_module_accessor); - let packun_pos_y = PostureModule::pos_y(owner_module_accessor); - let fire_pos_x = VarModule::get_float(owner_object, vars::packun::instance::FIRE_POS_X); - let fire_pos_y = VarModule::get_float(owner_object, vars::packun::instance::FIRE_POS_Y); - let scale = PostureModule::scale(boma); - if ((pos_x - packun_pos_x).abs() < 12.0*scale) && - ((pos_y - packun_pos_y).abs() < 12.0*scale) && - pos_y != 0.0 { - if owner_module_accessor.is_status(*FIGHTER_STATUS_KIND_APPEAL){ - VarModule::on_flag(owner_object, vars::packun::status::APPEAL_CLOUD_COVER); - } - if VarModule::is_flag(owner_object, vars::packun::status::POSION_BREATH_ENABLE_STANDARD_FLAME) && - motion_kind != hash40("explode") { - //println!("Woo!"); - MotionModule::change_motion(weapon.module_accessor, Hash40::new("explode"), 0.0, 1.0, false, 0.0, false, false); - } - if VarModule::is_flag(owner_object, vars::packun::status::POISON_BREATH_ENABLE_PRICKLY_BITE) && - motion_kind != hash40("explode") { - //println!("Woo!"); - VarModule::on_flag(owner_object, vars::packun::status::POISON_BREATH_BURST); - WorkModule::set_int(boma, 1, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); - } - } - if ((pos_x - fire_pos_x).abs() < 12.0*scale) && - ((pos_y - fire_pos_y).abs() < 12.0*scale) && - pos_y != 0.0 && fire_pos_y != 0.0 { - if motion_kind != hash40("explode") { - MotionModule::change_motion(weapon.module_accessor, Hash40::new("explode"), 0.0, 1.0, false, 0.0, false, false); - } - } - } +pub unsafe extern "C" fn poisonbreath_frame(weapon: &mut L2CFighterBase) { + let boma = weapon.boma(); + let owner_module_accessor = weapon.get_owner_boma(); + if owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN { + let pos_x = PostureModule::pos_x(boma); + let pos_y = PostureModule::pos_y(boma); + let packun_pos_x = PostureModule::pos_x(owner_module_accessor); + let packun_pos_y = PostureModule::pos_y(owner_module_accessor); + let scale = PostureModule::scale(boma); + if owner_module_accessor.is_status(*FIGHTER_STATUS_KIND_APPEAL) + && ((pos_x - packun_pos_x).abs() < 12.0 * scale) && ((pos_y - packun_pos_y).abs() < 12.0 * scale) + && pos_y != 0.0 { + VarModule::on_flag(owner_module_accessor.object(), vars::packun::status::APPEAL_CLOUD_COVER); + } } } diff --git a/fighters/packun/src/spikeball/acmd.rs b/fighters/packun/src/spikeball/acmd.rs index ddce7c6956..bda5c01f7c 100644 --- a/fighters/packun/src/spikeball/acmd.rs +++ b/fighters/packun/src/spikeball/acmd.rs @@ -4,58 +4,79 @@ unsafe extern "C" fn game_start(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - let scale = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_float(owner_module_accessor.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE)} else {1.0}; + let (stance, scale) = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) { + (VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE), + VarModule::get_float(owner_module_accessor.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE)) + } else { (0, 1.0) }; + VarModule::off_flag(agent.battle_object, vars::packun_spikeball::instance::ENABLE_EXPLODE); + ModelModule::set_scale(boma, 1.0); frame(lua_state, 1.0); + if stance == 2 { + FT_MOTION_RATE(agent, 11.0/(9.0 - 1.0)); + } if is_excute(agent) { - ModelModule::set_scale(boma, scale); MotionModule::set_rate(boma, 1.4); - if stance == 1 { - ATTACK(agent, 0, 0, Hash40::new("trans"), 12.0, 55, 80, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.5, false); + match stance { + 1 => { + // Putrid + VarModule::on_flag(agent.battle_object, vars::packun_spikeball::instance::ENABLE_EXPLODE); + ATTACK(agent, 0, 0, Hash40::new("trans"), 10.0, 55, 60, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 1, Hash40::new("trans"), 0.0, 0, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_OBJECT); + AttackModule::set_poison_param(boma, 0, 241, 60, 2.5, false); + } + 2 => { + // Prickly + ATTACK(agent, 0, 0, Hash40::new("trans"), 18.0, 55, 60, 0, 60, 6.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + } + _ => { + // Piranha + ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0, 55, 70, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + } } - else { - let kbg = if stance == 0 { 0 } else { 5 }; - ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0 * scale, 55, 70 - kbg, 0, 50, 5.0 * scale, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + } + if stance == 2 { + // Smoothly increase the size so it doesn't offset the Ptooie as much at the start + for h in 1..=15 { + if is_excute(agent) { + ModelModule::set_scale(boma, 1.0 + ((scale - 1.0) * h as f32)/15.0); + } + wait(lua_state, 1.0); } } } -unsafe extern "C" fn game_startair(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_loopwait(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - let scale = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_float(owner_module_accessor.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE)} else {1.0}; + let (stance, scale) = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) { + (VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE), + VarModule::get_float(owner_module_accessor.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE)) + } else { (0, 1.0) }; + VarModule::off_flag(agent.battle_object, vars::packun_spikeball::instance::ENABLE_EXPLODE); frame(lua_state, 1.0); + if stance == 2 { + FT_MOTION_RATE(agent, 11.0/(9.0 - 1.0)); + } if is_excute(agent) { ModelModule::set_scale(boma, scale); MotionModule::set_rate(boma, 1.4); - if stance == 1 { - ATTACK(agent, 0, 0, Hash40::new("trans"), 12.0, 55, 80, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.5, false); - } - else { - let kbg = if stance == 0 { 0 } else { 5 }; - ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0 * scale, 55, 70 - kbg, 0, 50, 5.0 * scale, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - } - } -} - -unsafe extern "C" fn game_loop(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - let scale = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_float(owner_module_accessor.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE)} else {1.0}; - if is_excute(agent) { - if stance == 1 { - ATTACK(agent, 0, 0, Hash40::new("trans"), 12.0, 55, 80, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.5, false); - } - else { - let kbg = if stance == 0 { 0 } else { 5 }; - ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0 * scale, 55, 70 - kbg, 0, 50, 5.0 * scale, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + match stance { + 1 => { + // Putrid + VarModule::on_flag(agent.battle_object, vars::packun_spikeball::instance::ENABLE_EXPLODE); + ATTACK(agent, 0, 0, Hash40::new("trans"), 10.0, 55, 60, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 1, Hash40::new("trans"), 0.0, 0, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_OBJECT); + AttackModule::set_poison_param(boma, 0, 241, 60, 2.5, false); + } + 2 => { + // Prickly + ATTACK(agent, 0, 0, Hash40::new("trans"), 18.0, 55, 60, 0, 60, 6.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + } + _ => { + // Piranha + ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0, 55, 70, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + } } } } @@ -64,7 +85,8 @@ unsafe extern "C" fn effect_loop(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; + let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) + { VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE) } else { 0 }; if stance == 1 { if is_excute(agent) { //EFFECT_BRANCH_SITUATION(agent, Hash40::new("null"), Hash40::new("sys_bound_smoke"), Hash40::new("top"), 0, -4, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); @@ -77,156 +99,50 @@ unsafe extern "C" fn game_shoot(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - let scale = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_float(owner_module_accessor.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE)} else {1.0}; - if WorkModule::is_flag(boma, *WEAPON_PACKUN_SPIKEBALL_INSTANCE_WORK_ID_FLAG_REACTIVE) { - if is_excute(agent) { - if stance == 1 { - ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0, 55, 80, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.5, false); - } - else { - let kbg = if stance == 0 { 0 } else { 5 }; - ATTACK(agent, 0, 0, Hash40::new("trans"), 18.0 * scale, 55, 70 - kbg, 0, 50, 5.0 * scale, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) + { VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE) } else { 0 }; + if is_excute(agent) { + match stance { + 1 => { + // Putrid + ATTACK(agent, 0, 0, Hash40::new("trans"), 12.0, 55, 60, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 1, Hash40::new("trans"), 0.0, 0, 0, 0, 0, 5.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_OBJECT); + AttackModule::set_poison_param(boma, 0, 241, 60, 2.5, false); } - } - } - else { - if is_excute(agent) { - if stance == 1 { - ATTACK(agent, 0, 0, Hash40::new("trans"), 12.0, 55, 80, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 121, 30, 3.0, false); + 2 => { + // Prickly + ATTACK(agent, 0, 0, Hash40::new("trans"), 20.0, 55, 60, 0, 60, 6.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } - else { - let kbg = if stance == 0 { 0 } else { 5 }; - ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0 * scale, 55, 70 - kbg, 0, 50, 5.0 * scale, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + _ => { + // Normal + ATTACK(agent, 0, 0, Hash40::new("trans"), 16.0, 55, 70, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } } } - frame(lua_state, 4.0); - if is_excute(agent) { - if stance == 1 { - ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0, 55, 80, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.5, false); - } - else { - let kbg = if stance == 0 { 0 } else { 5 }; - ATTACK(agent, 0, 0, Hash40::new("trans"), 18.0 * scale, 55, 70 - kbg, 0, 50, 5.0 * scale, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - } - } -} - -unsafe extern "C" fn effect_shoot(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - if stance == 1 { - for _ in 0..999 { - if is_excute(agent) { - if boma.is_status(*WEAPON_PACKUN_SPIKEBALL_STATUS_KIND_HOP){ - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_mouth"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 3.0, false); - } - } - wait(lua_state, 3.0); - } - } -} - -unsafe extern "C" fn game_fall(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - let scale = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_float(owner_module_accessor.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE)} else {1.0}; - if is_excute(agent) { - if stance == 1 { - ATTACK(agent, 0, 0, Hash40::new("trans"), 12.0, 55, 80, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.5, false); - } - else { - let kbg = if stance == 0 { 0 } else { 5 }; - ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0 * scale, 55, 70 - kbg, 0, 50, 5.0 * scale, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - } - } -} - -unsafe extern "C" fn effect_fall(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - if stance == 1 { - if is_excute(agent) { - //EFFECT_BRANCH_SITUATION(agent, Hash40::new("null"), Hash40::new("sys_bound_smoke"), Hash40::new("top"), 0, -4, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_mouth"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 2.0, false); - } - } -} - -unsafe extern "C" fn game_wait(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - let scale = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_float(owner_module_accessor.object(), vars::packun::instance::SPECIAL_N_PTOOIE_SCALE)} else {1.0}; - if is_excute(agent) { - if stance == 1 { - ATTACK(agent, 0, 0, Hash40::new("trans"), 12.0, 55, 80, 0, 50, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 121, 30, 2.5, false); - } - else { - let kbg = if stance == 0 { 0 } else { 5 }; - ATTACK(agent, 0, 0, Hash40::new("trans"), 14.0 * scale, 55, 70 - kbg, 0, 50, 5.0 * scale, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - } - } - /*frame(lua_state, 55.0); - if is_excute(agent) { - if stance == 1 { - WorkModule::off_flag(boma, *WEAPON_PACKUN_SPIKEBALL_STATUS_HOP_WORK_FLAG_CLEARED_ATTACK); - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 55, 80, 0, 50, 999.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 361, 45, 3.0, false); - } - }*/ -} - -unsafe extern "C" fn effect_wait(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = if (owner_module_accessor.kind() == *FIGHTER_KIND_PACKUN) || (owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY) {VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE)} else {0}; - if stance == 1 { - if is_excute(agent) { - //EFFECT_BRANCH_SITUATION(agent, Hash40::new("null"), Hash40::new("sys_bound_smoke"), Hash40::new("top"), 0, -4, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW(agent, Hash40::new("packun_poison_mouth"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 2.0, false); - } - } } unsafe extern "C" fn game_explode(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE); if is_excute(agent) { AttackModule::clear_all(boma); - ModelModule::set_scale(boma, 0.1); - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 120, 0, 45, 14.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::set_poison_param(boma, 0, 151, 30, 3.5, false); + ModelModule::set_scale(boma, 0.001); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 120, 0, 45, 14.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal_poison"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 1, Hash40::new("top"), 0.0, 0, 0, 0, 0, 14.0, 0.0, 0.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, true, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_OBJECT); + AttackModule::set_poison_param(boma, 0, 241, 60, 3.5, false); } - wait(lua_state, 5.0); + frame(lua_state, 6.0); if is_excute(agent) { - WorkModule::set_int(boma, 1, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); + AttackModule::clear_all(boma); + WorkModule::set_int(boma, 4, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); } } unsafe extern "C" fn effect_explode(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_flame"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 16.0, false); + EFFECT_FOLLOW(agent, Hash40::new("sys_flame"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1600, false); LAST_EFFECT_SET_COLOR(agent, 0.1, 0.01, 0.7); LAST_EFFECT_SET_RATE(agent, 1.25); } @@ -235,8 +151,6 @@ unsafe extern "C" fn effect_explode(agent: &mut L2CAgentBase) { unsafe extern "C" fn sound_explode(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - let stance = VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_common_bomb_l")); } @@ -244,19 +158,18 @@ unsafe extern "C" fn sound_explode(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_start", game_start, Priority::Low); - agent.acmd("game_startair", game_startair, Priority::Low); + agent.acmd("game_startair", game_start, Priority::Low); - agent.acmd("game_loop", game_loop, Priority::Low); + agent.acmd("game_loop", game_loopwait, Priority::Low); agent.acmd("effect_loop", effect_loop, Priority::Low); agent.acmd("game_shoot", game_shoot, Priority::Low); - agent.acmd("effect_shoot", effect_shoot, Priority::Low); + agent.acmd("effect_shoot", acmd_stub, Priority::Low); - agent.acmd("game_fall", game_fall, Priority::Low); - agent.acmd("effect_fall", effect_fall, Priority::Low); + agent.acmd("game_fall", game_shoot, Priority::Low); + agent.acmd("effect_fall", acmd_stub, Priority::Low); - agent.acmd("game_wait", game_wait, Priority::Low); - agent.acmd("effect_wait", effect_wait, Priority::Low); + agent.acmd("game_wait", game_loopwait, Priority::Low); agent.acmd("game_explode", game_explode, Priority::Low); agent.acmd("effect_explode", effect_explode, Priority::Low); diff --git a/fighters/packun/src/spikeball/opff.rs b/fighters/packun/src/spikeball/opff.rs index 391d176de7..33a9126a28 100644 --- a/fighters/packun/src/spikeball/opff.rs +++ b/fighters/packun/src/spikeball/opff.rs @@ -3,29 +3,19 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -pub extern "C" fn spikeball_frame(weapon: &mut L2CFighterBase) { - unsafe { - let boma = weapon.boma(); - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - if weapon.is_status(*WEAPON_PACKUN_SPIKEBALL_STATUS_KIND_START) && VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE) == 1 { - VarModule::on_flag(weapon.object(), vars::packun_spikeball::instance::ENABLE_EXPLODE); - // println!("bomb"); +pub unsafe extern "C" fn spikeball_frame(weapon: &mut L2CFighterBase) { + let owner_module_accessor = weapon.get_owner_boma(); + if [*FIGHTER_KIND_PACKUN, *FIGHTER_KIND_KIRBY].contains(&owner_module_accessor.kind()) { + if weapon.is_status(*WEAPON_PACKUN_SPIKEBALL_STATUS_KIND_HOP) + && VarModule::is_flag(weapon.battle_object, vars::packun_spikeball::instance::ENABLE_EXPLODE) + && weapon.is_prev_situation(*SITUATION_KIND_AIR) + && weapon.is_situation(*SITUATION_KIND_GROUND) { + EFFECT_FOLLOW(weapon, Hash40::new("packun_poison_mouth"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 2.0, false); } - else if weapon.is_status(*WEAPON_PACKUN_SPIKEBALL_STATUS_KIND_START) && VarModule::get_int(owner_module_accessor.object(), vars::packun::instance::CURRENT_STANCE) != 1 { - VarModule::off_flag(weapon.object(), vars::packun_spikeball::instance::ENABLE_EXPLODE); - // println!("not bomb"); - } - let status_kind = StatusModule::status_kind(weapon.module_accessor); - let motion_kind = MotionModule::motion_kind(weapon.module_accessor); - if [*FIGHTER_KIND_PACKUN, *FIGHTER_KIND_KIRBY].contains(&owner_module_accessor.kind()) { - if weapon.is_status(*WEAPON_PACKUN_SPIKEBALL_STATUS_KIND_WAIT) || weapon.is_status(*WEAPON_PACKUN_SPIKEBALL_STATUS_KIND_HOP) { - /* if VarModule::is_flag(owner_module_accessor.object(), vars::packun::instance::PTOOIE_SHOULD_EXPLODE) && weapon.status_frame() == 2 { - println!("will bomb"); - } */ - if VarModule::is_flag(weapon.object(), vars::packun_spikeball::instance::ENABLE_EXPLODE) && weapon.status_frame() >= 60 && motion_kind != hash40("explode") { - WorkModule::off_flag(boma, *WEAPON_PACKUN_SPIKEBALL_STATUS_HOP_WORK_FLAG_CLEARED_ATTACK); + if weapon.is_status(*WEAPON_PACKUN_SPIKEBALL_STATUS_KIND_WAIT) || weapon.is_status(*WEAPON_PACKUN_SPIKEBALL_STATUS_KIND_HOP) { + if weapon.status_frame() >= 60 && VarModule::is_flag(weapon.battle_object, vars::packun_spikeball::instance::ENABLE_EXPLODE) { + if MotionModule::motion_kind(weapon.module_accessor) != hash40("explode") { MotionModule::change_motion(weapon.module_accessor, Hash40::new("explode"), 0.0, 1.0, false, 0.0, false, false); - // println!("is bomb"); } } } diff --git a/fighters/packun/src/status/appeal.rs b/fighters/packun/src/status/appeal.rs new file mode 100644 index 0000000000..71c5be6dcb --- /dev/null +++ b/fighters/packun/src/status/appeal.rs @@ -0,0 +1,40 @@ +use super::*; + +unsafe extern "C" fn appeal_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_APPEAL)(fighter); + + // left taunt + if fighter.is_button_trigger(Buttons::AppealSL) { + // this is also done in acmd to account for the button_trigger check failing on the last frame of tap buffer for... reasons + MotionModule::change_motion(fighter.module_accessor, Hash40::new("appeal_s_2"), 0.0, 1.0, false, 0.0, false, false); + } + + if app::smashball::is_training_mode() { + if fighter.is_motion(Hash40::new("appeal_s_2")) { SET_STANCE(fighter, 0, false); } + if fighter.is_motion_one_of(&[Hash40::new("appeal_lw_l"), Hash40::new("appeal_lw_r")]) { SET_STANCE(fighter, 1, false); } + else if fighter.is_motion_one_of(&[Hash40::new("appeal_s_l"), Hash40::new("appeal_s_r")]) { SET_STANCE(fighter, 2, false); } + } + + return ret; +} + +unsafe extern "C" fn appeal_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_motion(Hash40::new("appeal_s_2")) + && fighter.motion_frame() == 92.0 + && fighter.is_button_on(Buttons::AppealSL) { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("appeal_s_2"), 45.0, 1.0, false, 0.0, false, false); + } + + return 0.into(); +} + +unsafe extern "C" fn appeal_end(fighter: &mut L2CFighterCommon) -> L2CValue { + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("packun_appeal_left"), true, false); + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_APPEAL, appeal_main); + agent.status(Exec, *FIGHTER_STATUS_KIND_APPEAL, appeal_exec); + agent.status(End, *FIGHTER_STATUS_KIND_APPEAL, appeal_end); +} \ No newline at end of file diff --git a/fighters/packun/src/status/attack.rs b/fighters/packun/src/status/attack.rs new file mode 100644 index 0000000000..75a8da40c9 --- /dev/null +++ b/fighters/packun/src/status/attack.rs @@ -0,0 +1,28 @@ +use super::*; + +unsafe extern "C" fn attack_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_status_AttackCommon(); + if !StopModule::is_stop(fighter.module_accessor) { + fighter.check_attack_mtrans(); + } + fighter.global_table[SUB_STATUS3].assign(&L2CValue::Ptr(smash::lua2cpp::L2CFighterCommon_check_attack_mtrans as *const () as _)); + fighter.sub_status_AttackComboCommon(); + WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_STATUS_ATTACK_WORK_INT_100_HIT_NEAR_COUNT_CLIFF_STOP); + fighter.sub_shift_status_main(L2CValue::Ptr(attack_main_loop as *const () as _)) +} + +unsafe extern "C" fn attack_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = fighter.status_Attack_Main(); + + if fighter.is_motion(Hash40::new("attack_13")) + && VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 1 { + StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_ATTACK_100, false); + return 0.into(); + } + + return ret; +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK, attack_main); +} \ No newline at end of file diff --git a/fighters/packun/src/status/attack_air.rs b/fighters/packun/src/status/attack_air.rs new file mode 100644 index 0000000000..8bbc01980b --- /dev/null +++ b/fighters/packun/src/status/attack_air.rs @@ -0,0 +1,16 @@ +use super::*; + +unsafe extern "C" fn attack_air_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_ATTACK_AIR)(fighter); + + if fighter.is_motion(Hash40::new("attack_air_b")) + && VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_air_b_s"), 0.0, 1.0, false, 0.0, false, false); + } + + return ret; +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_AIR, attack_air_main); +} \ No newline at end of file diff --git a/fighters/packun/src/status/attack_s3.rs b/fighters/packun/src/status/attack_s3.rs new file mode 100644 index 0000000000..447e77d572 --- /dev/null +++ b/fighters/packun/src/status/attack_s3.rs @@ -0,0 +1,21 @@ +use super::*; + +unsafe extern "C" fn attack_s3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_ATTACK_S3)(fighter); + + if fighter.is_motion(Hash40::new("attack_s3_s")) { + let stance = VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE); + if stance == 0 { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_s3_s_a"), 0.0, 1.0, false, 0.0, false, false); + } + else if stance == 2 { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_s3_s_s"), 0.0, 1.0, false, 0.0, false, false); + } + } + + return ret; +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_S3, attack_s3_main); +} \ No newline at end of file diff --git a/fighters/packun/src/status/attack_s4.rs b/fighters/packun/src/status/attack_s4.rs index f84cf9bb5f..4b23183165 100644 --- a/fighters/packun/src/status/attack_s4.rs +++ b/fighters/packun/src/status/attack_s4.rs @@ -4,12 +4,14 @@ use super::*; unsafe extern "C" fn attack_s4_start_main(fighter: &mut L2CFighterCommon) -> L2CValue { fighter.status_AttackS4Start(); - if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_s4_s_2"), 0.0, 1.0, false, 0.0, false, false); - } - else { + //if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 { + // MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_s4_s_2"), 0.0, 1.0, false, 0.0, false, false); + //} + //else { MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_s4_s"), 0.0, 1.0, false, 0.0, false, false); - } + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), true); + //} + stance_head(fighter); fighter.sub_shift_status_main(L2CValue::Ptr(L2CFighterCommon_bind_address_call_status_AttackS4Start_Main as *const () as _)) } @@ -17,12 +19,13 @@ unsafe extern "C" fn attack_s4_start_main(fighter: &mut L2CFighterCommon) -> L2C unsafe extern "C" fn attack_s4_main(fighter: &mut L2CFighterCommon) -> L2CValue { sub_attack_s4(fighter, true.into()); + stance_head(fighter); fighter.sub_shift_status_main(L2CValue::Ptr(L2CFighterCommon_bind_address_call_status_AttackS4_Main as *const () as _)) } unsafe extern "C" fn sub_attack_s4(fighter: &mut L2CFighterCommon, param_1: L2CValue) { - let hash = if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 2 { hash40("attack_s4_s_2") } else { hash40("attack_s4_s") }; - WorkModule::set_int64(fighter.module_accessor, hash as i64, *FIGHTER_STATUS_ATTACK_WORK_INT_MOTION_KIND); + //let hash = if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 { hash40("attack_s4_s_2") } else { hash40("attack_s4_s") }; + WorkModule::set_int64(fighter.module_accessor, hash40("attack_s4_s") as i64, *FIGHTER_STATUS_ATTACK_WORK_INT_MOTION_KIND); WorkModule::on_flag(fighter.module_accessor, *FIGHTER_STATUS_ATTACK_FLAG_SMASH_SMASH_HOLD_TO_ATTACK); } @@ -41,15 +44,36 @@ unsafe extern "C" fn attack_s4_hold_main(fighter: &mut L2CFighterCommon) -> L2CV WorkModule::set_int(fighter.module_accessor, ratio as i32, *FIGHTER_STATUS_ATTACK_WORK_INT_SMASH_LOOP_TOTAL_FRAME); let keep_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("attack_s4_hold_keep_frame"), 0); WorkModule::set_int(fighter.module_accessor, keep_frame, *FIGHTER_STATUS_ATTACK_WORK_INT_SMASH_HOLD_KEEP_FRAME); - if VarModule::get_int(fighter.object(), vars::packun::instance::CURRENT_STANCE) == 2 { - MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_s4_hold_2"), 0.0, s4_hold_frame as f32 / ratio, false, 0.0, false, false); - } - else { + //if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 { + // MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_s4_hold_2"), 0.0, s4_hold_frame as f32 / ratio, false, 0.0, false, false); + //} + //else { MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_s4_hold"), 0.0, s4_hold_frame as f32 / ratio, false, 0.0, false, false); - } + //} fighter.sub_shift_status_main(L2CValue::Ptr(L2CFighterCommon_bind_address_call_status_AttackS4Hold_main as *const () as _)) } +unsafe fn stance_head(fighter: &mut L2CFighterCommon) { + match VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) { + 0 => { + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), true); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), false); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), false); + }, + 1 => { + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), true); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), false); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), false); + }, + 2 => { + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), true); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), false); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), false); + }, + _ => {} + } +} + pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_S4_START, attack_s4_start_main); agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_S4, attack_s4_main); diff --git a/fighters/packun/src/status/mod.rs b/fighters/packun/src/status/mod.rs index 89ba59574b..eec6461af9 100644 --- a/fighters/packun/src/status/mod.rs +++ b/fighters/packun/src/status/mod.rs @@ -2,18 +2,58 @@ use super::*; use globals::*; // status script import +mod appeal; +mod attack; +mod attack_air; +mod attack_s3; +mod attack_s4; mod special_hi; +mod special_lw; mod special_s; -mod attack_s4; +mod throw; unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { VarModule::set_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE, 0); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("heada"), true); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("headb"), false); + ModelModule::set_mesh_visibility(fighter.module_accessor, Hash40::new("heads"), false); +} + +unsafe extern "C" fn entry_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_ENTRY)(fighter); + VarModule::set_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE, 0); + + return ret; +} + +unsafe extern "C" fn win_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_WIN)(fighter); + VarModule::set_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE, 0); + + return ret; +} + +unsafe extern "C" fn lose_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_LOSE)(fighter); + VarModule::set_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE, 0); + + return ret; } pub fn install(agent: &mut Agent) { agent.on_start(on_start); + appeal::install(agent); + attack::install(agent); + attack_air::install(agent); + attack_s3::install(agent); + attack_s4::install(agent); special_s::install(agent); special_hi::install(agent); - attack_s4::install(agent); + special_lw::install(agent); + throw::install(agent); + + agent.status(Main, *FIGHTER_STATUS_KIND_ENTRY, entry_main); + agent.status(Main, *FIGHTER_STATUS_KIND_WIN, win_main); + agent.status(Main, *FIGHTER_STATUS_KIND_LOSE, lose_main); } \ No newline at end of file diff --git a/fighters/packun/src/status/special_hi.rs b/fighters/packun/src/status/special_hi.rs index df9e122e22..82be501f63 100644 --- a/fighters/packun/src/status/special_hi.rs +++ b/fighters/packun/src/status/special_hi.rs @@ -3,6 +3,7 @@ use super::*; // FIGHTER_STATUS_KIND_SPECIAL_HI pub unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi"), 0.0, 1.0, false, 0.0, false, false); } @@ -19,6 +20,7 @@ pub unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> if fighter.is_motion(Hash40::new("special_hi")) { fighter.set_situation(L2CValue::I32(*SITUATION_KIND_GROUND)); GroundModule::correct(fighter.module_accessor,GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); fighter.change_status(FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_END.into(), false.into()); return 0.into(); } @@ -72,7 +74,86 @@ pub unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> } } +pub unsafe extern "C" fn special_hi_end_init(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Init, fighter, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_END)(fighter); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.75, 0.0); + } + + ret +} + // FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_LANDING +unsafe extern "C" fn special_hi_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + GroundModule::select_cliff_hangdata(fighter.module_accessor, *FIGHTER_PACKUN_CLIFF_HANG_DATA_SPECIAL_HI as u32); + ItemModule::set_have_item_visibility(fighter.module_accessor, false, 0); + + fighter.main_shift(special_hi_end_main_loop) +} + +unsafe extern "C" fn special_hi_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + fighter.sub_air_check_dive(); + let status_frame = fighter.get_int(*FIGHTER_PACKUN_STATUS_SPECIAL_HI_WORK_INT_STATUS_FRAME); + let mut start_no_landing_frame = fighter.get_param_int("param_special_hi", "start_no_landing_frame"); + if fighter.is_motion(Hash40::new("special_hi")) && !fighter.is_prev_situation(*SITUATION_KIND_AIR) { start_no_landing_frame = 999; } + if fighter.is_situation(*SITUATION_KIND_GROUND) && start_no_landing_frame <= status_frame { + fighter.change_status(FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_LANDING.into(), false.into()); + } + let stop_add_speed_y_frame = fighter.get_param_int("param_special_hi", "stop_add_speed_y_frame"); + let end_frame_from_stop_add_speed = fighter.get_param_int("param_special_hi", "end_frame_from_stop_add_speed"); + if MotionModule::is_end(fighter.module_accessor) + || end_frame_from_stop_add_speed <= status_frame - stop_add_speed_y_frame { + fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); + return 1.into(); + } + if fighter.is_flag(*FIGHTER_PACKUN_STATUS_SPECIAL_HI_DIVE) { + if !fighter.is_flag(*FIGHTER_PACKUN_STATUS_SPECIAL_HI_DIVE_DONE) { + let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let dive_cont_value = fighter.get_param_float("common", "dive_cont_value"); + if fighter.stick_y() <= dive_cont_value { + let dive_flick_frame_value = fighter.get_param_int("common", "dive_flick_frame_value"); + if fighter.global_table[FLICK_Y].get_i32() < dive_flick_frame_value { + let dive_speed_y = fighter.get_param_float("dive_speed_y", ""); + if sum_speed_y <= -dive_speed_y { + // There's some stuff here about BattleObjectWorld gravity coefficients but we no longer have those kind of stages so I don't care + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, dive_speed_y); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, dive_speed_y); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); + fighter.on_flag(*FIGHTER_PACKUN_STATUS_SPECIAL_HI_DIVE_DONE); + fighter.check_mach_stamp(); + EffectModule::req_on_joint(fighter.module_accessor, Hash40::new("sys_smash_flash_s"), Hash40::new("hip"), &Vector3f::new(0.0, 4.0, 8.0), &Vector3f::zero(), 1.1, &Vector3f::new(18.0, 12.0, 0.0), &Vector3f::zero(), false, 0, 0, 0); + let inertia_status = fighter.get_int(*FIGHTER_PACKUN_STATUS_SPECIAL_HI_WORK_INT_INERTIA_STATUS); + if inertia_status != *FIGHTER_PACKUN_SPECIAL_HI_TILT_INERTIA_STATUS_NONE { + fighter.set_int(*FIGHTER_PACKUN_SPECIAL_HI_TILT_INERTIA_STATUS_TO_CENTER_DIVE, *FIGHTER_PACKUN_STATUS_SPECIAL_HI_WORK_INT_INERTIA_STATUS); + fighter.set_int(0, *FIGHTER_PACKUN_STATUS_SPECIAL_HI_WORK_INT_PENDULUM_FRAME); + } + } + } + } + } + } + if fighter.is_motion(Hash40::new("special_hi")) { + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + } + let stop_add_speed_y_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_hi"), hash40("stop_add_speed_y_frame")); + if fighter.is_situation(*SITUATION_KIND_GROUND) + && fighter.status_frame() >= stop_add_speed_y_frame { + StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_LANDING, false); + } + } + + return 0.into(); +} unsafe extern "C" fn special_hi_landing_main(fighter: &mut L2CFighterCommon) -> L2CValue { let landing_lag = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_hi"), hash40("landing_frame")); @@ -98,13 +179,16 @@ unsafe extern "C" fn special_hi_landing_main_loop(fighter: &mut L2CFighterCommon fighter.change_status_req(*FIGHTER_STATUS_KIND_WAIT, false); } else { - fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL, false); + fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL_SPECIAL, false); } return 1.into(); } // if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { - fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL, false); + // edge cancel if started in the air + let status = if VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK) + { *FIGHTER_STATUS_KIND_FALL_SPECIAL } else { *FIGHTER_STATUS_KIND_FALL }; + fighter.change_status_req(status, false); return 1.into(); } // @@ -113,5 +197,9 @@ unsafe extern "C" fn special_hi_landing_main_loop(fighter: &mut L2CFighterCommon pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_main); + + agent.status(Init, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_END, special_hi_end_init); + + agent.status(Main, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_END, special_hi_end_main); agent.status(Main, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_HI_LANDING, special_hi_landing_main); } \ No newline at end of file diff --git a/fighters/packun/src/status/special_lw.rs b/fighters/packun/src/status/special_lw.rs new file mode 100644 index 0000000000..c73ae1a9c4 --- /dev/null +++ b/fighters/packun/src/status/special_lw.rs @@ -0,0 +1,16 @@ +use super::*; + +unsafe extern "C" fn special_lw_bite_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) + && !VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { + let stance = VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE); + SET_STANCE(fighter, (stance + 1) % 3, true); + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + } + + return smashline::original_status(Exec, fighter, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_LW_BITE)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Exec, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_LW_BITE, special_lw_bite_exec); +} \ No newline at end of file diff --git a/fighters/packun/src/status/special_s.rs b/fighters/packun/src/status/special_s.rs index a1cb7cca94..3e77d3e249 100644 --- a/fighters/packun/src/status/special_s.rs +++ b/fighters/packun/src/status/special_s.rs @@ -8,7 +8,7 @@ unsafe extern "C" fn special_s_charge_main(fighter: &mut L2CFighterCommon) -> L2 } else { CORRECT(fighter, *GROUND_CORRECT_KIND_AIR); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s_charge"), 0.0, 1.0, false, 0.0, false, false); } WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_GUARD_ON); @@ -52,7 +52,12 @@ unsafe extern "C" fn special_s_charge_main_loop(fighter: &mut L2CFighterCommon) } else { GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 0 { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s_charge"), -1.0, 1.0, 0.0, false, false); } } @@ -87,6 +92,7 @@ unsafe extern "C" fn special_s_charge_main_loop(fighter: &mut L2CFighterCommon) special_s_charge_set_kinetic(fighter); } } + stance_head(fighter); return 0.into(); } @@ -99,6 +105,53 @@ unsafe extern "C" fn special_s_charge_set_kinetic(fighter: &mut L2CFighterCommon KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); } +unsafe extern "C" fn special_s_shoot_init(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + } + else { + if !(VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 0 + && fighter.get_int(*FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_COUNT) < 60) { // do not apply physics to uncharged Fiery Breath + let sum_speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + let start_air_speed_x_mul = fighter.get_param_float("param_special_s", "start_air_speed_x_mul"); + let start_air_speed_y = fighter.get_param_float("param_special_s", "start_air_speed_y"); + let accel_y = fighter.get_param_float("param_special_s", "accel_y"); + + fighter.clear_lua_stack(); + lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP); + let speed_x = sv_kinetic_energy::get_speed_x(fighter.lua_state_agent); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, speed_x * start_air_speed_x_mul, 0.0); + if !fighter.is_flag(*FIGHTER_PACKUN_INSTANCE_WORK_ID_FLAG_SPECIAL_S_LANDING) { + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, start_air_speed_y); + } + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -accel_y); + + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); + let stable_speed_x = fighter.get_param_float("air_speed_x_stable", ""); + let facing = PostureModule::lr(fighter.module_accessor); + let speed_x = sum_speed_x.abs().min(stable_speed_x) * facing; + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, speed_x * 0.5, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, stable_speed_x * 0.5, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, stable_speed_x * 0.5, 0.0); + sv_kinetic_energy!(controller_set_accel_x_mul, fighter, 0.03); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + } + } + + EffectModule::remove_common(fighter.module_accessor, Hash40::new("charge_max")); + let handle = fighter.get_int(*FIGHTER_PACKUN_INSTANCE_WORK_ID_INT_SPECIAL_S_CHARGE_MAX_EFFECT_HANDLE); + fighter.clear_lua_stack(); + lua_args!(fighter, MA_MSC_EFFECT_REMOVE, handle); + sv_module_access::effect(fighter.lua_state_agent); + fighter.pop_lua_stack(1); + + return 0.into(); +} + unsafe extern "C" fn special_s_shoot_main(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.is_situation(*SITUATION_KIND_GROUND) { CORRECT(fighter, *GROUND_CORRECT_KIND_GROUND_CLIFF_STOP); @@ -140,7 +193,16 @@ unsafe extern "C" fn special_s_shoot_main_loop(fighter: &mut L2CFighterCommon) - } else { GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 0 { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + WorkModule::off_flag(fighter.module_accessor,*FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_CHANGE_KINETIC); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + } + let motion = if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 + { Hash40::new("special_air_s_shoot_s") } else { Hash40::new("special_air_s_shoot") }; + MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); if WorkModule::is_flag(fighter.module_accessor,*FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_CHANGE_KINETIC) { // let accel_y = -1.0 * WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("accel_y")); // sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, accel_y); @@ -162,38 +224,12 @@ unsafe extern "C" fn special_s_shoot_main_loop(fighter: &mut L2CFighterCommon) - WorkModule::on_flag(fighter.module_accessor, *FIGHTER_PACKUN_STATUS_SPECIAL_S_FLAG_CHANGE_KINETIC_DONE); } } - let motion = if VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 - { Hash40::new("special_air_s_shoot_s") } else { Hash40::new("special_air_s_shoot") }; - MotionModule::change_motion_inherit_frame(fighter.module_accessor, motion, -1.0, 1.0, 0.0, false, false); - } - // monch - if //fighter.is_motion_one_of(&[Hash40::new("special_s_shoot_s"), Hash40::new("special_air_s_shoot_s")]) && - VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) == 2 { - if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) && !fighter.is_in_hitlag() - && fighter.is_situation(*SITUATION_KIND_GROUND) { - if fighter.is_cat_flag(Cat2::AppealHi) { - let hash = if PostureModule::lr(fighter.module_accessor) < 0.0 { Hash40::new("appeal_hi_l") } else { Hash40::new("appeal_hi_r") }; - StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_APPEAL, false); - MotionModule::change_motion(fighter.module_accessor, hash, 0.0, -1.0, false, 0.0, false, false); - return 1.into(); - } - else if fighter.is_cat_flag(Cat2::AppealSL | Cat2::AppealSR) { - StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_APPEAL, false); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("appeal_hi_2"), 0.0, -1.0, false, 0.0, false, false); - return 1.into(); - } - else if fighter.is_cat_flag(Cat2::AppealLw) { - let hash = if PostureModule::lr(fighter.module_accessor) < 0.0 { Hash40::new("appeal_lw_l") } else { Hash40::new("appeal_lw_r") }; - StatusModule::change_status_request_from_script(fighter.module_accessor, *FIGHTER_STATUS_KIND_APPEAL, false); - MotionModule::change_motion(fighter.module_accessor, Hash40::new("appeal_lw_l"), 0.0, -1.0, false, 0.0, false, false); - return 1.into(); - } - } } } if !fighter.global_table[IS_STOPPING].get_bool() { special_s_shoot_helper(fighter); } + stance_head(fighter); return 0.into(); } @@ -216,7 +252,39 @@ unsafe fn special_s_shoot_helper(fighter: &mut L2CFighterCommon) { } } +unsafe extern "C" fn special_s_end_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + stance_head(fighter); + return 0.into(); +} + +unsafe fn stance_head(fighter: &mut L2CFighterCommon) { + match VarModule::get_int(fighter.battle_object, vars::packun::instance::CURRENT_STANCE) { + 0 => { + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), true); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), false); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), false); + }, + 1 => { + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), true); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), false); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), false); + }, + 2 => { + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heads"), true); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("headb"), false); + ModelModule::set_mesh_visibility(fighter.boma(), Hash40::new("heada"), false); + }, + _ => {} + } +} + pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_CHARGE, special_s_charge_main); + + agent.status(Init, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_SHOOT, special_s_shoot_init); agent.status(Main, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_SHOOT, special_s_shoot_main); + + agent.status(Exec, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_CANCEL, special_s_end_exec); + agent.status(Exec, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_JUMP_CANCEL, special_s_end_exec); + agent.status(Exec, *FIGHTER_PACKUN_STATUS_KIND_SPECIAL_S_END, special_s_end_exec); } \ No newline at end of file diff --git a/fighters/packun/src/status/throw.rs b/fighters/packun/src/status/throw.rs new file mode 100644 index 0000000000..79ef234ada --- /dev/null +++ b/fighters/packun/src/status/throw.rs @@ -0,0 +1,15 @@ +use super::*; + +unsafe extern "C" fn throw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_THROW)(fighter); + + if fighter.is_motion(Hash40::new("throw_b")) { SET_STANCE(fighter, 0, false); } + else if fighter.is_motion(Hash40::new("throw_lw")) { SET_STANCE(fighter, 1, false); } + else if fighter.is_motion(Hash40::new("throw_f")) { SET_STANCE(fighter, 2, false); } + + return ret; +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_THROW, throw_main); +} \ No newline at end of file diff --git a/fighters/pacman/Cargo.toml b/fighters/pacman/Cargo.toml index 895b1b5b91..59f4af9e9b 100644 --- a/fighters/pacman/Cargo.toml +++ b/fighters/pacman/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pacman/src/acmd/aerials.rs b/fighters/pacman/src/acmd/aerials.rs index e08868d5f2..9a337adfdb 100644 --- a/fighters/pacman/src/acmd/aerials.rs +++ b/fighters/pacman/src/acmd/aerials.rs @@ -115,8 +115,8 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 7.0, 46, 60, 0, 50, 5.5, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legl"), 7.0, 46, 60, 0, 50, 5.0, 1.6, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 7.0, 48, 70, 0, 42, 5.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 46, 58, 0, 42, 5.5, 4.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 10.0); if is_excute(agent) { @@ -232,7 +232,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 65, 70, 0, 45, 4.75, 0.0, 3.0, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 40.0); + frame(lua_state, 30.0); if is_excute(agent) { KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } @@ -264,7 +264,7 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 5, 12.5, 4, 0, 0, 0, 0.7, true); + // EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 5, 12.5, 4, 0, 0, 0, 0.8, true); } frame(lua_state, 15.0); if is_excute(agent) { diff --git a/fighters/pacman/src/acmd/ground.rs b/fighters/pacman/src/acmd/ground.rs index 64cdcd11e0..ca802ba463 100644 --- a/fighters/pacman/src/acmd/ground.rs +++ b/fighters/pacman/src/acmd/ground.rs @@ -5,13 +5,20 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 25, 0, 25, 2.5, 0.0, 7.5, 2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 25, 0, 20, 3.0, 0.0, 7.5, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 15, 0, 20, 3.5, 0.0, 7.5, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 100, 16, 0, 1.5, 0.0, 7.5, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 70, 100, 19, 0, 1.7, 0.0, 7.5, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 80, 100, 22, 0, 2.0, 0.0, 7.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 80, 100, 22, 0, 2.0, 0.0, 7.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 2.0, 0.0, 3.0, 5.0, Some(0.0), Some(3.0), Some(11.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); } frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 9.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } @@ -21,13 +28,19 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 35, 0, 35, 2.5, 0.0, 7.5, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 35, 0, 30, 3.0, 0.0, 7.5, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 30, 0, 30, 3.5, 0.0, 7.5, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 100, 15, 0, 2.5, 0.0, 7.5, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 70, 100, 21, 0, 2.8, 0.0, 7.5, 4.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 80, 100, 26, 0, 3.0, 0.0, 7.5, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 3.0, 0.0, 3.5, 1.0, Some(0.0), Some(3.5), Some(8.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 9.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } diff --git a/fighters/pacman/src/acmd/other.rs b/fighters/pacman/src/acmd/other.rs index c6d35f2406..32a5cdbe25 100644 --- a/fighters/pacman/src/acmd/other.rs +++ b/fighters/pacman/src/acmd/other.rs @@ -26,15 +26,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -44,10 +40,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/pacman/src/acmd/smashes.rs b/fighters/pacman/src/acmd/smashes.rs index efcb40193f..4c971f4f45 100644 --- a/fighters/pacman/src/acmd/smashes.rs +++ b/fighters/pacman/src/acmd/smashes.rs @@ -48,11 +48,11 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("ghost1"), 14.0, 83, 102, 0, 32, 7.0, 0.0, 5.8, 0.0, Some(0.0), Some(5.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("ghost1"), 14.0, 90, 105, 0, 32, 7.0, 0.0, 5.8, 0.0, Some(0.0), Some(5.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); } wait(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("ghost1"), 8.0, 83, 97, 0, 32, 7.0, 0.0, 5.8, 0.0, Some(0.0), Some(5.3), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("ghost1"), 8.0, 90, 97, 0, 32, 7.0, 0.0, 5.8, 0.0, Some(0.0), Some(5.3), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); } wait(lua_state, 11.0); if is_excute(agent) { diff --git a/fighters/pacman/src/acmd/specials.rs b/fighters/pacman/src/acmd/specials.rs index 8c47429926..88b6e7ed27 100644 --- a/fighters/pacman/src/acmd/specials.rs +++ b/fighters/pacman/src/acmd/specials.rs @@ -3,10 +3,15 @@ use super::*; unsafe extern "C" fn game_specialnshoot(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 12.0); if WorkModule::get_int(boma, *FIGHTER_PACMAN_INSTANCE_WORK_ID_INT_SPECIAL_N_CHARGE_RANK) < *PACMAN_SPECIAL_N_RANK_MAX { + frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 8.0, 2.0); + frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 12.0); FT_MOTION_RATE_RANGE(agent, 12.0, 42.0, 22.0); } + frame(lua_state, 12.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_PACMAN_STATUS_SPECIAL_N_WORK_FLAG_THROW); } diff --git a/fighters/pacman/src/acmd/throws.rs b/fighters/pacman/src/acmd/throws.rs index 0c9425c5a1..7205d9d679 100644 --- a/fighters/pacman/src/acmd/throws.rs +++ b/fighters/pacman/src/acmd/throws.rs @@ -22,7 +22,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 45, 82, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 47, 90, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 24.0); @@ -67,7 +67,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { FT_LEAVE_NEAR_OTTOTTO(agent, -2.5, 2.5); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 48, 55, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 32, 30, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 10.0); @@ -87,12 +87,8 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 361, 100, 40, 0, 5.0, 0.0, 5.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); AttackModule::set_catch_only_all(boma, true, false); } - wait(lua_state, 1.0); - if is_excute(agent) { - // CHECK_FINISH_CAMERA(agent, 0, 0); - // lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 1.4); - } - wait(lua_state, 1.0); + frame(lua_state, 34.0); + FT_MOTION_RATE_RANGE(agent, 34.0, 65.0, 27.0); if is_excute(agent) { AttackModule::clear_all(boma); let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); @@ -100,6 +96,8 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } + frame(lua_state, 65.0); + FT_MOTION_RATE(agent, 1.0); } pub fn install(agent: &mut Agent) { diff --git a/fighters/pacman/src/lib.rs b/fighters/pacman/src/lib.rs index 91ba686b8d..31ca07ade4 100644 --- a/fighters/pacman/src/lib.rs +++ b/fighters/pacman/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/pacman/src/opff.rs b/fighters/pacman/src/opff.rs index ba1e91ba5d..c87e104efc 100644 --- a/fighters/pacman/src/opff.rs +++ b/fighters/pacman/src/opff.rs @@ -4,64 +4,46 @@ use super::*; use globals::*; unsafe fn side_special_freefall(fighter: &mut L2CFighterCommon) { - if fighter.is_prev_status(*FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_DASH) - && fighter.is_status(*FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_RETURN) - && fighter.is_situation(*SITUATION_KIND_AIR) - && CancelModule::is_enable_cancel(fighter.module_accessor) - && WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PACMAN_STATUS_SPECIAL_S_WORK_FLAG_EAT_POWER_ESA) - && !VarModule::is_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_S_GROUND_START) { - fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL_SPECIAL, true); - let cancel_module = *(fighter.module_accessor as *mut BattleObjectModuleAccessor as *mut u64).add(0x128 / 8) as *const u64; - *(((cancel_module as u64) + 0x1c) as *mut bool) = false; // CancelModule::is_enable_cancel = false - } - - if fighter.is_status(*FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_RETURN) - && !StatusModule::is_changing(fighter.module_accessor) - && fighter.is_prev_situation(*SITUATION_KIND_AIR) - && fighter.is_situation(*SITUATION_KIND_GROUND) { - if fighter.status_frame() < 30 && VarModule::is_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_S_GROUND_START) { return; } - fighter.change_status_req(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, true); - } -} - -// Allows you to land out of upB before reaching end of animation (weird vanilla behavior) -unsafe fn up_special_proper_landing(fighter: &mut L2CFighterCommon) { - if fighter.is_status(*FIGHTER_PACMAN_STATUS_KIND_SPECIAL_HI_END) - && fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.change_status_req(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, false); + if fighter.is_status_one_of(&[*FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_DASH, *FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_DASH]) { + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { + VarModule::on_flag(fighter.battle_object, vars::pacman::status::SPECIAL_S_HIT); + } } -} - -unsafe fn empty_hydrant_physics(fighter: &mut L2CFighterCommon) { - if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_LW) - && WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PACMAN_STATUS_SPECIAL_LW_FLAG_FAILURE) { - if StatusModule::is_changing(fighter.module_accessor) - && fighter.is_situation(*SITUATION_KIND_AIR) { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + if fighter.is_status(*FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_RETURN) { + if fighter.is_prev_status(*FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_DASH) + && fighter.is_situation(*SITUATION_KIND_AIR) + && CancelModule::is_enable_cancel(fighter.module_accessor) + && WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PACMAN_STATUS_SPECIAL_S_WORK_FLAG_EAT_POWER_ESA) + && !VarModule::is_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_S_GROUND_START) { + fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL_SPECIAL, true); + let cancel_module = *(fighter.module_accessor as *mut BattleObjectModuleAccessor as *mut u64).add(0x128 / 8) as *const u64; + *(((cancel_module as u64) + 0x1c) as *mut bool) = false; // CancelModule::is_enable_cancel = false } - if StatusModule::is_situation_changed(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - MotionModule::set_frame_sync_anim_cmd(fighter.module_accessor, 26.0, true, false, false); + + if !StatusModule::is_changing(fighter.module_accessor) + && fighter.is_prev_situation(*SITUATION_KIND_AIR) + && fighter.is_situation(*SITUATION_KIND_GROUND) { + if VarModule::is_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_S_GROUND_START) { + // prevent special landing from grounded version before transitioning into normal fall + if fighter.status_frame() < 30 { return; } } else { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + // land cancel air version + if VarModule::is_flag(fighter.battle_object, vars::pacman::status::SPECIAL_S_HIT) { + fighter.check_land_cancel(Some(10.0)); + return; + } } - } + + fighter.change_status_req(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, true); + } } } unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) - && fighter.is_status_one_of(&[ - *FIGHTER_STATUS_KIND_SPECIAL_N, - *FIGHTER_STATUS_KIND_SPECIAL_LW, - *FIGHTER_PACMAN_STATUS_KIND_SPECIAL_N_HOLD, - *FIGHTER_PACMAN_STATUS_KIND_SPECIAL_N_CANCEL, - *FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_REFLECT_FALL, - *FIGHTER_PACMAN_STATUS_KIND_SPECIAL_HI_END, - ]) + && fighter.is_status(*FIGHTER_PACMAN_STATUS_KIND_SPECIAL_S_REFLECT_FALL) && fighter.is_situation(*SITUATION_KIND_AIR) { fighter.sub_air_check_dive(); } @@ -69,8 +51,6 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { side_special_freefall(fighter); - up_special_proper_landing(fighter); - empty_hydrant_physics(fighter); fastfall_specials(fighter); } diff --git a/fighters/pacman/src/status/attack_air.rs b/fighters/pacman/src/status/attack_air.rs index aceabdac32..e3301bbbea 100644 --- a/fighters/pacman/src/status/attack_air.rs +++ b/fighters/pacman/src/status/attack_air.rs @@ -1,19 +1,5 @@ use super::*; -pub unsafe extern "C" fn attack_air_end(fighter: &mut L2CFighterCommon) -> L2CValue { - if VarModule::is_flag(fighter.object(), vars::pacman::instance::SPECIAL_HI_AERIAL_USED) { - if [ - *FIGHTER_STATUS_KIND_LANDING, - *FIGHTER_STATUS_KIND_LANDING_ATTACK_AIR, - ].contains(&fighter.global_table[STATUS_KIND].get_i32()) { - fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); - } - VarModule::off_flag(fighter.object(), vars::pacman::instance::SPECIAL_HI_AERIAL_USED); - } - - smashline::original_status(End, fighter, *FIGHTER_STATUS_KIND_ATTACK_AIR)(fighter) -} - pub unsafe extern "C" fn attack_air_main(fighter: &mut L2CFighterCommon) -> L2CValue { fighter.sub_attack_air(); fighter.sub_shift_status_main(L2CValue::Ptr(attack_air_main_loop as *const () as _)) @@ -66,7 +52,21 @@ unsafe extern "C" fn status_AttackAir_Main(fighter: &mut L2CFighterCommon) -> L2 return 0.into(); } +pub unsafe extern "C" fn attack_air_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.object(), vars::pacman::instance::SPECIAL_HI_AERIAL_USED) { + if [ + *FIGHTER_STATUS_KIND_LANDING, + *FIGHTER_STATUS_KIND_LANDING_ATTACK_AIR, + ].contains(&fighter.global_table[STATUS_KIND].get_i32()) { + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()); + } + VarModule::off_flag(fighter.object(), vars::pacman::instance::SPECIAL_HI_AERIAL_USED); + } + + smashline::original_status(End, fighter, *FIGHTER_STATUS_KIND_ATTACK_AIR)(fighter) +} + pub fn install(agent: &mut Agent) { - agent.status(End, *FIGHTER_STATUS_KIND_ATTACK_AIR, attack_air_end); agent.status(Main, *FIGHTER_STATUS_KIND_ATTACK_AIR, attack_air_main); + agent.status(End, *FIGHTER_STATUS_KIND_ATTACK_AIR, attack_air_end); } \ No newline at end of file diff --git a/fighters/pacman/src/status/mod.rs b/fighters/pacman/src/status/mod.rs index f66374f81e..aabc04ad6a 100644 --- a/fighters/pacman/src/status/mod.rs +++ b/fighters/pacman/src/status/mod.rs @@ -34,6 +34,7 @@ unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { VarModule::off_flag(fighter.battle_object, vars::pacman::instance::DISABLE_SPECIAL_HI); VarModule::off_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_HI_GROUND_START); + VarModule::off_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_HI_DISABLE_AERIAL); VarModule::off_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_S_GROUND_START); } diff --git a/fighters/pacman/src/status/special_hi.rs b/fighters/pacman/src/status/special_hi.rs index ea3cedd26b..38fd9a1b2b 100644 --- a/fighters/pacman/src/status/special_hi.rs +++ b/fighters/pacman/src/status/special_hi.rs @@ -144,6 +144,7 @@ pub unsafe extern "C" fn special_hi_loop_main(fighter: &mut L2CFighterCommon) -> } AttackModule::set_power_mul(fighter.module_accessor, attack_mul); AttackModule::set_attack_scale(fighter.module_accessor, attack_size_mul, true); + WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_AIR); if !StopModule::is_stop(fighter.module_accessor) { special_hi_loop_substatus(fighter, false.into()); } fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(special_hi_loop_substatus as *const () as _)); @@ -241,11 +242,17 @@ pub unsafe extern "C" fn special_hi_end_main_loop(fighter: &mut L2CFighterCommon KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.0, 0.0); KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + + // Allows you to land out of upB before reaching end of animation (weird vanilla behavior) + fighter.change_status_req(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, false); + return 1.into(); + } + else { + fighter.sub_air_check_dive(); } special_hi_check_aerial(fighter); if MotionModule::is_end(fighter.module_accessor) { - let new_status = if fighter.is_situation(*SITUATION_KIND_GROUND) { FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL } else { FIGHTER_STATUS_KIND_FALL_SPECIAL }; - fighter.change_status(new_status.into(), false.into()); + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL, *FIGHTER_STATUS_KIND_FALL_SPECIAL, false); return 1.into(); } @@ -253,9 +260,8 @@ pub unsafe extern "C" fn special_hi_end_main_loop(fighter: &mut L2CFighterCommon } pub unsafe extern "C" fn special_hi_check_aerial(fighter: &mut L2CFighterCommon) { - // Only allow aerial canceling on first bounce - let jump_num = WorkModule::get_int(fighter.module_accessor, *FIGHTER_PACMAN_INSTANCE_WORK_ID_INT_SPECIAL_HI_JUMP_NUM); - if jump_num > 0 { + // Only allow aerial canceling once per airtime + if VarModule::is_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_HI_DISABLE_AERIAL) { return; } @@ -266,6 +272,7 @@ pub unsafe extern "C" fn special_hi_check_aerial(fighter: &mut L2CFighterCommon) if fighter.sub_transition_group_check_air_attack().get_bool() { WorkModule::off_flag(fighter.module_accessor, *FIGHTER_PACMAN_INSTANCE_WORK_ID_FLAG_SPECIAL_HI_FALL); VarModule::on_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_HI_AERIAL_USED); + VarModule::on_flag(fighter.battle_object, vars::pacman::instance::SPECIAL_HI_DISABLE_AERIAL); } } else { diff --git a/fighters/pacman/src/status/special_lw.rs b/fighters/pacman/src/status/special_lw.rs index fbc4429ed7..cc1e5ffcd8 100644 --- a/fighters/pacman/src/status/special_lw.rs +++ b/fighters/pacman/src/status/special_lw.rs @@ -118,27 +118,40 @@ pub unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> if StatusModule::is_changing(fighter.module_accessor) { return 0.into(); } + fighter.sub_air_check_dive(); if StatusModule::is_situation_changed(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PACMAN_STATUS_SPECIAL_LW_FLAG_FAILURE) { - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_lw_failure"), -1.0, 1.0, 0.0, false, false); + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PACMAN_STATUS_SPECIAL_LW_FLAG_FAILURE) { + // empty hydrant physics + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + MotionModule::set_frame_sync_anim_cmd(fighter.module_accessor, 26.0, true, false, false); } else { - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_lw"), -1.0, 1.0, 0.0, false, false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); } } else { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PACMAN_STATUS_SPECIAL_LW_FLAG_FAILURE) { - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_lw_failure"), -1.0, 1.0, 0.0, false, false); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PACMAN_STATUS_SPECIAL_LW_FLAG_FAILURE) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_lw_failure"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_lw"), -1.0, 1.0, 0.0, false, false); + } } else { - MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_lw"), -1.0, 1.0, 0.0, false, false); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PACMAN_STATUS_SPECIAL_LW_FLAG_FAILURE) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_lw_failure"), -1.0, 1.0, 0.0, false, false); + } + else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_lw"), -1.0, 1.0, 0.0, false, false); + } } } } diff --git a/fighters/pacman/src/status/special_n.rs b/fighters/pacman/src/status/special_n.rs index 414d9970f2..0dd0f93c82 100644 --- a/fighters/pacman/src/status/special_n.rs +++ b/fighters/pacman/src/status/special_n.rs @@ -32,6 +32,14 @@ unsafe extern "C" fn special_n_pre(fighter: &mut L2CFighterCommon) -> L2CValue { return 0.into(); } +pub unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_N)(fighter); + let precede = ParamModule::get_int(fighter.battle_object, ParamType::Common, "precede") as u32; + InputModule::set_command_life_count_max(fighter.battle_object, precede); + + return ret; +} + pub unsafe extern "C" fn special_n_hold_main(fighter: &mut L2CFighterCommon) -> L2CValue { WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_PACMAN_STATUS_SPECIAL_N_WORK_INT_MAX_HOLD_COUNT); if fighter.is_situation(*SITUATION_KIND_GROUND) { @@ -203,5 +211,6 @@ pub unsafe extern "C" fn special_n_hold_substatus(fighter: &mut L2CFighterCommon pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_main); agent.status(Main, *FIGHTER_PACMAN_STATUS_KIND_SPECIAL_N_HOLD, special_n_hold_main); } \ No newline at end of file diff --git a/fighters/palutena/Cargo.toml b/fighters/palutena/Cargo.toml index e1488e298f..0b1f78b4cd 100644 --- a/fighters/palutena/Cargo.toml +++ b/fighters/palutena/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/palutena/src/acmd/aerials.rs b/fighters/palutena/src/acmd/aerials.rs index 2cd80b8a6a..9c19ba43d4 100644 --- a/fighters/palutena/src/acmd/aerials.rs +++ b/fighters/palutena/src/acmd/aerials.rs @@ -62,15 +62,15 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 10.0, 50, 82, 0, 37, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 50, 82, 0, 37, 4.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 12.0, 361, 81, 0, 38, 4.5, 5.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 50, 93, 0, 35, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 50, 93, 0, 35, 4.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 11.0, 50, 93, 0, 35, 4.5, 5.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); } frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 53, 82, 0, 37, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 53, 82, 0, 37, 3.5, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 9.0, 53, 82, 0, 37, 4.0, 5.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 53, 90, 0, 35, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 53, 90, 0, 35, 3.5, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 8.0, 53, 90, 0, 35, 4.0, 5.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); } frame(lua_state, 15.0); if is_excute(agent) { @@ -85,24 +85,25 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 3.0); + frame(lua_state, 2.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.2, true); + LAST_EFFECT_SET_RATE(agent, 6.0/11.0); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); } - frame(lua_state, 9.0); + frame(lua_state, 8.0); if is_excute(agent) { let facing = PostureModule::lr(boma); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_flash"), Hash40::new("top"), 4.0 * facing, 8.5, 16, 0, 0, 0, 0.6, true); - LAST_EFFECT_SET_RATE(agent, 1.3); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("palutena_guard_yellow"), Hash40::new("kneel"), 5.5, 0.0, 0, 0, 0, 0, 0.55, true); + LAST_EFFECT_SET_RATE(agent, 8.0/9.0); EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 8, 4, 0, 0, 0, 0.9, true); } frame(lua_state, 20.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } @@ -122,7 +123,7 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 9.0, 361, 100, 0, 30, 3.5, -1.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 361, 98, 0, 31, 6.7, 0.0, 10.7, -13.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 361, 98, 0, 31, 6.2, 0.0, 10.4, -13.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } frame(lua_state, 11.0); FT_MOTION_RATE_RANGE(agent, 11.0, 49.0, 29.0); @@ -138,26 +139,27 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 3.0); + frame(lua_state, 2.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.2, true); + LAST_EFFECT_SET_RATE(agent, 6.0/11.0); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); } frame(lua_state, 7.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_shield_flash"), Hash40::new("shield"), 0, 0, 0, 0, 0, 0, 1, true); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("palutena_guard"), Hash40::new("top"), -4, 11, -14, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_shield_flash"), Hash40::new("shield"), 0, 0, 0, 0, 0, 0, 1.0, true); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("palutena_guard_yellow"), Hash40::new("top"), -4, 11, -14, 0, 0, 0, 0.85, true); } frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("sys_flash"), -1); + EFFECT_DETACH_KIND(agent, Hash40::new("palutena_guard_yellow"), -1); } frame(lua_state, 33.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } @@ -174,11 +176,11 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); FT_DESIRED_RATE(agent, 13.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 105, 100, 45, 0, 4.0, 0.0, 20.0, 5.0, Some(0.0), Some(20.0), Some(-5.0), 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 365, 100, 40, 0, 4.0, 0.0, 22.8, 0.0, None, None, None, 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 365, 100, 40, 0, 3.0, 0.0, 18.0, 4.0, Some(0.0), Some(22.0), Some(7.5), 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 365, 100, 40, 0, 3.0, 0.0, 18.0, -4.0, Some(0.0), Some(22.0), Some(-7.5), 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 365, 100, 40, 0, 4.0, 0.0, 16.0, 0.0, None, None, None, 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 110, 100, 45, 0, 3.0, 0.0, 18.0, 4.0, Some(0.0), Some(18.0), Some(-4.0), 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 365, 100, 40, 0, 4.0, 0.0, 16.0, 0.0, None, None, None, 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 365, 100, 40, 0, 4.0, 0.0, 22.8, 0.0, None, None, None, 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 365, 100, 40, 0, 3.0, 0.0, 18.0, 4.0, Some(0.0), Some(22.0), Some(7.5), 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 365, 100, 40, 0, 3.0, 0.0, 18.0, -4.0, Some(0.0), Some(22.0), Some(-7.5), 1.0, 0.7, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); } frame(lua_state, 23.0); FT_MOTION_RATE(agent, 1.0); @@ -187,10 +189,10 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 24.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 88, 105, 0, 59, 6.0, 0.0, 22.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 88, 105, 0, 59, 4.0, 0.0, 18.0, 4.0, Some(0.0), Some(22.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 88, 105, 0, 59, 4.0, 0.0, 18.0, -4.0, Some(0.0), Some(22.0), Some(-8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.0, 88, 105, 0, 59, 6.0, 0.0, 17.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 88, 105, 0, 59, 4.0, 0.0, 22.8, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 88, 105, 0, 59, 4.0, 0.0, 18.0, 4.0, Some(0.0), Some(22.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 88, 105, 0, 59, 4.0, 0.0, 18.0, -4.0, Some(0.0), Some(22.0), Some(-7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 3, 0, Hash40::new("top"), 8.0, 88, 105, 0, 59, 4.0, 0.0, 15.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); } frame(lua_state, 27.0); if is_excute(agent) { @@ -205,22 +207,26 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 3.0); + frame(lua_state, 1.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.05, 0.05, 0.90); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.05, 0.05, 0.90); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); } frame(lua_state, 7.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight2"), Hash40::new("top"), 0, 23, 0, 0, -90, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.35, 0.35, 0.90); + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight2_grey"), Hash40::new("top"), 0, 23, 0, 0, -90, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.2, true); + LAST_EFFECT_SET_RATE(agent, 6.0/11.0); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); } frame(lua_state, 40.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } @@ -274,21 +280,25 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_smash_flash"), Hash40::new("footl"), 4.5, -1.5, -1.5, 0, 0, 0, 1, true); } - frame(lua_state, 4.0); + frame(lua_state, 3.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0125, 0.025); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.2, true); + LAST_EFFECT_SET_RATE(agent, 6.0/11.0); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0125, 0.025); + } + frame(lua_state, 6.0); if is_excute(agent) { EFFECT_DETACH_KIND(agent, Hash40::new("sys_smash_flash"), -1); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.01); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.01); } frame(lua_state, 8.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_atk_lw_arc"), Hash40::new("top"), -2, 6, 0, -60, 40, -120, 0.95, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_atk_lw_arc_red"), Hash40::new("top"), -2, 6, 0, -60, 40, -120, 0.95, true); } frame(lua_state, 9.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_twinkle"), Hash40::new("footl"), 1, -1, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_twinkle_red"), Hash40::new("footl"), 1, -1, 0, 0, 0, 0, 1, true); } frame(lua_state, 10.0); if is_excute(agent) { @@ -296,8 +306,8 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 30.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } diff --git a/fighters/palutena/src/acmd/ground.rs b/fighters/palutena/src/acmd/ground.rs index 199f0fcedc..026aa48d73 100644 --- a/fighters/palutena/src/acmd/ground.rs +++ b/fighters/palutena/src/acmd/ground.rs @@ -90,20 +90,17 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_shield_flash"), Hash40::new("shield"), 0, 0, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_RATE(agent, 0.5); - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_flash"), Hash40::new("top"), 0, 11, 16, 0, 0, 0, 1, true); - } frame(lua_state, 4.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_b"), Hash40::new("top"), 0, 0, 3, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); LAST_EFFECT_SET_RATE(agent, 1.3); } - frame(lua_state, 4.0); + frame(lua_state, 5.0); if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("sys_flash"), -1); + EFFECT_FOLLOW(agent, Hash40::new("palutena_shield_flash"), Hash40::new("shield"), 0, 0, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.5); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("palutena_guard"), Hash40::new("arml"), 2, 0, 0.0, 0, 0, 0, 0.5, true); + LAST_EFFECT_SET_RATE(agent, 0.75); } } diff --git a/fighters/palutena/src/acmd/other.rs b/fighters/palutena/src/acmd/other.rs index b824918dae..58a42da4ce 100644 --- a/fighters/palutena/src/acmd/other.rs +++ b/fighters/palutena/src/acmd/other.rs @@ -77,16 +77,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -97,10 +93,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealhil(agent: &mut L2CAgentBase) { diff --git a/fighters/palutena/src/acmd/smashes.rs b/fighters/palutena/src/acmd/smashes.rs index b530ace0dc..254d3eee53 100644 --- a/fighters/palutena/src/acmd/smashes.rs +++ b/fighters/palutena/src/acmd/smashes.rs @@ -46,18 +46,18 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), 1, 21, 2.5, 0, -50, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), 1, 21, 2.5, 0, -50, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); } frame(lua_state, 17.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("palutena_feather"), Hash40::new("top"), 0, 6, -3, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); + EFFECT(agent, Hash40::new("palutena_feather_grey"), Hash40::new("top"), 0, 6, -3, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); } frame(lua_state, 19.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("palutena_feather"), Hash40::new("top"), 0, 6, -6, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); + EFFECT(agent, Hash40::new("palutena_feather_grey"), Hash40::new("top"), 0, 6, -6, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); } } @@ -97,21 +97,28 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, -3, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.05, 0.05, 0.90); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.4, true); + LAST_EFFECT_SET_RATE(agent, 6.0/11.0); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); } frame(lua_state, 16.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("palutena_pressure"), Hash40::new("top"), 0, 0, 10, 0, 0, 0, 1, true); //LAST_EFFECT_SET_COLOR(agent, 0.35, 0.35, 0.90); LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 10, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, true); - EFFECT_FOLLOW_ALPHA(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), 4, 21.5, 2, 0, -60, 0, 1, true, 0.7); + EFFECT_FOLLOW_ALPHA(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), 4, 21.5, 2, 0, -60, 0, 1, true, 0.7); LAST_EFFECT_SET_RATE(agent, 1.1); - LAST_EFFECT_SET_COLOR(agent, 0.35, 0.35, 0.90); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); } - frame(lua_state, 50.0); + frame(lua_state, 24.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.4, true); + LAST_EFFECT_SET_RATE(agent, 6.0/11.0); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); + } + frame(lua_state, 40.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } @@ -163,18 +170,18 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), 3, 13.5, 0, 0, -90, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.01); + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), 3, 13.5, 0, 0, -90, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0125, 0.025); } frame(lua_state, 19.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("palutena_feather"), Hash40::new("top"), 0, 3, 8, 0, 180, 0, 0.6, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.01); + EFFECT(agent, Hash40::new("palutena_feather_grey"), Hash40::new("top"), 0, 3, 8, 0, 180, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0125, 0.025); } frame(lua_state, 20.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("palutena_feather"), Hash40::new("top"), 0, 3, -8, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.01); + EFFECT(agent, Hash40::new("palutena_feather_grey"), Hash40::new("top"), 0, 3, -8, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0125, 0.025); LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, false); } } diff --git a/fighters/palutena/src/acmd/specials/mod.rs b/fighters/palutena/src/acmd/specials/mod.rs index d19af81b76..2e62825617 100644 --- a/fighters/palutena/src/acmd/specials/mod.rs +++ b/fighters/palutena/src/acmd/specials/mod.rs @@ -11,49 +11,55 @@ unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if agent.kind() == *FIGHTER_KIND_PALUTENA { - frame(lua_state, 7.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 72, 40, 0, 70, 8.0, 0.0, 12.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); } - wait(lua_state, 2.0); + frame(lua_state, 12.0); + FT_MOTION_RATE_RANGE(agent, 12.0, 38.0, 3.0); if is_excute(agent) { - AttackModule::clear(boma, 0, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 72, 40, 0, 70, 8.0, 0.0, 12.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); } - frame(lua_state, 22.0); + frame(lua_state, 38.0); + FT_MOTION_RATE(agent, 1.0); + //FT_MOTION_RATE_RANGE(agent, 38.0, 51.0, 11.0); if is_excute(agent) { - search!(agent, *MA_MSC_CMD_SEARCH_SEARCH_SCH_CLR_ALL); + AttackModule::clear(boma, 0, false); } + //frame(lua_state, 51.0); // 27 faf + //FT_MOTION_RATE(agent, 1.0); } else { - FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); - if is_excute(agent) { - if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) { - VarModule::on_flag(agent.battle_object, vars::kirby::status::PALUTENA_SPECIAL_N_HOLD); - } - ArticleModule::generate_article(boma, *FIGHTER_PALUTENA_GENERATE_ARTICLE_EXPLOSIVEFLAME, false, -1); - } + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 63.0, 70.0); + frame(lua_state, 63.0); + FT_MOTION_RATE(agent, 1.0); } } unsafe extern "C" fn effect_specialn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 7.0); + frame(lua_state, 5.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), -0.2, 22, -1, 10, 90, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.1, 0.1, 0.15); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.1, 0.1, 0.15); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.1, 0.1, 0.15); - EFFECT(agent, Hash40::new("palutena_wand_finish"), Hash40::new("top"), 0.0, 12.0, 10.0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_COLOR(agent, 0.1, 0.1, 0.15); + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), -0.2, 22, -1, 10, 90, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.9, 0.9, 0.9); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.9, 0.9, 0.9); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.2, true); + LAST_EFFECT_SET_RATE(agent, 6.0/11.0); + LAST_EFFECT_SET_COLOR(agent, 0.9, 0.9, 0.9); } - frame(lua_state, 30.0); + frame(lua_state, 11.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_finish_grey"), Hash40::new("top"), 0.0, 12.5, 10.5, 0, 0, 0, 0.7, true); + LAST_EFFECT_SET_COLOR(agent, 0.9, 0.9, 0.9); + LAST_EFFECT_SET_RATE(agent, 1.1); + } + frame(lua_state, 51.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } @@ -64,7 +70,7 @@ unsafe extern "C" fn sound_specialn(agent: &mut L2CAgentBase) { if is_excute(agent) { PLAY_STATUS(agent, Hash40::new("se_palutena_special_n01")); } - wait(lua_state, 22.0); + frame(lua_state, 48.0); if is_excute(agent) { sound!(agent, *MA_MSC_CMD_SOUND_STOP_SE_STATUS); } @@ -87,20 +93,82 @@ unsafe extern "C" fn expression_specialn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 11.0, 9.0); + frame(lua_state, 11.0); + FT_MOTION_RATE_RANGE(agent, 11.0, 21.0, 22.0); + frame(lua_state, 21.0); + FT_MOTION_RATE_RANGE(agent, 21.0, 64.0, 40.0); + frame(lua_state, 64.0); + FT_MOTION_RATE(agent, 1.0); +} + unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 5.0); if is_excute(agent) { if agent.is_situation(*SITUATION_KIND_AIR) { - WorkModule::on_flag(boma, *FIGHTER_PALUTENA_STATUS_SPECIAL_HI_DIVE); + agent.on_flag(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_DIVE); } } - frame(lua_state, 8.0); + frame(lua_state, 10.0); if is_excute(agent) { if agent.is_situation(*SITUATION_KIND_AIR) { - WorkModule::on_flag(boma, *FIGHTER_PALUTENA_STATUS_SPECIAL_HI_CONTROL_ON); + agent.on_flag(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_CONTROL_ON); + } + } +} + +unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_teleport_end"), Hash40::new("rot"), 0, 4, 0, 0, 0, 0, 0.9, false); + LAST_EFFECT_SET_RATE(agent, 1.1); + FLASH(agent, 1, 1, 1, 1); + } + wait(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), 0, 21.5, 0, 0, 90, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 4); + } + wait(lua_state, 1.0); + if is_excute(agent) { + FLASH(agent, 1, 1, 1, 0.3); + } + wait(lua_state, 1.0); + if is_excute(agent) { + FLASH(agent, 0.25, 1, 1, 0.2); + } + wait(lua_state, 6.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("palutena_backlight"), false, true); + } + wait(lua_state, 1.0); + if is_excute(agent) { + FLASH(agent, 1, 1, 1, 0.15); + if agent.is_motion(Hash40::new("special_air_hi_cancel")) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_teleport_feather"), Hash40::new("rot"), 0, 4, 0, 0, 0, 0, 1, true); } } + wait(lua_state, 2.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + wait(lua_state, 5.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_teleport_feather"), Hash40::new("rot"), 0, 4, 0, 0, 0, 0, 1, true); + } } unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { @@ -227,8 +295,13 @@ pub fn install(agent: &mut Agent) { special_n_b::install(agent); special_n_p::install(agent); + agent.acmd("game_specials", game_specials, Priority::Low); + agent.acmd("game_specialairs", game_specials, Priority::Low); + agent.acmd("game_specialhi", game_specialhi, Priority::Low); agent.acmd("game_specialairhi", game_specialhi, Priority::Low); + agent.acmd("effect_specialhi", effect_specialhi, Priority::Low); + agent.acmd("effect_specialairhi", effect_specialhi, Priority::Low); agent.acmd("game_speciallw", game_speciallw, Priority::Low); agent.acmd("game_specialairlw", game_speciallw, Priority::Low); diff --git a/fighters/palutena/src/acmd/specials/special_n_b.rs b/fighters/palutena/src/acmd/specials/special_n_b.rs index 100baa4d14..d1f3d21ed4 100644 --- a/fighters/palutena/src/acmd/specials/special_n_b.rs +++ b/fighters/palutena/src/acmd/specials/special_n_b.rs @@ -7,8 +7,8 @@ unsafe extern "C" fn game_specialnb(agent: &mut L2CAgentBase) { let powered = VarModule::is_flag(agent.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) || VarModule::get_int(agent.object(), vars::palutena::instance::POWER_BOARD_SLOT_2) == 2; //println!("POWERED (game): {}", powered); - let power1 = if powered {14.0} else {9.0}; - let power2 = if powered {12.0} else {7.0}; + let power1 = if powered {10.0} else {7.0}; + let power2 = if powered {12.0} else {10.0}; let tall = powered; frame(lua_state, 4.0); FT_DESIRED_RATE(agent, 14.0, 10.0); @@ -16,22 +16,16 @@ unsafe extern "C" fn game_specialnb(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { VarModule::on_flag(boma.object(), vars::palutena::instance::SPECIAL_N_FLUSH_BOARD); - ATTACK(agent, 0, 0, Hash40::new("top"), power1, 88, 91, 0, 53, 4.5, 0.0, 15.0, 9.7, Some(0.0), Some(4.0), Some(9.7), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FREEZE, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("top"), power2, 88, 91, 0, 58, 2.8, 0.0, 30.0, 9.7, Some(0.0), Some(4.0), Some(9.7), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FREEZE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), power1, 90, 83, 0, 62, 4.5, 0.0, 15.0, 9.7, Some(0.0), Some(4.0), Some(9.7), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), power2, 90, 83, 0, 55, 2.8, 0.0, 30.0, 9.7, Some(0.0), Some(4.0), Some(9.7), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); if tall { - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 88, 91, 0, 62, 2.8, 0.0, 45.0, 9.7, Some(0.0), Some(4.0), Some(9.7), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FREEZE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 90, 83, 0, 48, 2.8, 0.0, 40.0, 9.7, Some(0.0), Some(4.0), Some(9.7), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); } } frame(lua_state, 28.0); if is_excute(agent) { AttackModule::clear_all(boma); - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) - && !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_PARRY) { - FT_DESIRED_RATE(agent, 17.0, 10.0); - } } - frame(lua_state, 43.0); - FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_specialnb(agent: &mut L2CAgentBase) { @@ -39,26 +33,47 @@ unsafe extern "C" fn effect_specialnb(agent: &mut L2CAgentBase) { let boma = agent.boma(); let powered = VarModule::is_flag(agent.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED); //println!("POWERED (effects): {}", powered); - let length = if powered { 2.7 } else { 1.8 }; - let length2 = if powered { 0.69 } else { 0.5 }; - let y_pos = if powered {25} else {16}; + let length = if powered { 2.25 } else { 1.8 }; + let length2 = if powered { 0.6 } else { 0.5 }; + let facing = agent.lr(); + let x_pos = 8.0 * facing; + let y_pos = if powered { 21.0 } else { 16.0 }; + let x_rot = 0.0; //-25.0 * facing; + let mut handle = 0; + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); + EFFECT_FOLLOW(agent, Hash40::new("sys_freezer"), Hash40::new("top"), x_pos, 3, 10, 0, 0, 0, 0.75, true); + } frame(lua_state, 14.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.05, 0.05, 0.90); - EFFECT_FOLLOW(agent, Hash40::new("sys_freezer"), Hash40::new("top"), 0, 3, 10, 0, 0, 0, 0.75, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); + EFFECT_FOLLOW(agent, Hash40::new("sys_freezer"), Hash40::new("top"), x_pos, 24, 10, 0, 0, 0, 0.5, true); EFFECT_FOLLOW(agent, Hash40::new("palutena_pressure"), Hash40::new("top"), 0, 0, 10, 0, 0, 0, length2, true); LAST_EFFECT_SET_ALPHA(agent, 0.3); LAST_EFFECT_SET_RATE(agent, (16.0/10.0)); + handle = EffectModule::req_follow(boma, Hash40::new("sys_ice"), Hash40::new("top"), &Vector3f::new(x_pos, y_pos - 10.0, 10.0 /*5.0*/), &Vector3f::new(x_rot, 270.0, 0.0), 1.0, true, 0, 0, 0, 0, 0, false, false); + LAST_EFFECT_SET_COLOR(agent, 0.35, 0.35, 0.90); + EffectModule::set_scale(boma, handle as u32, &Vector3f::new(0.5, length * 0.5, 0.5)); + //EffectModule::set_rot(boma, handle as u32, &Vector3f::new(x_rot, 270.0, 0.0)); } frame(lua_state, 16.0); if is_excute(agent) { - EFFECT_FOLLOW_ALPHA(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), 4, 21.5, 2, 0, -60, 0, 1, true, 0.7); + EffectModule::set_scale(boma, handle as u32, &Vector3f::new(0.5, length * 0.75, 0.5)); + EffectModule::set_pos(boma, handle as u32, &Vector3f::new(x_pos, y_pos - 5.0, 10.0 /*6.0*/)); + //EffectModule::set_rot(boma, handle as u32, &Vector3f::new(x_rot, 270.0, 0.0)); + } + frame(lua_state, 18.0); + if is_excute(agent) { + EffectModule::set_scale(boma, handle as u32, &Vector3f::new(0.5, length, 0.5)); + EffectModule::set_pos(boma, handle as u32, &Vector3f::new(x_pos, y_pos, 10.0 /*7.0*/)); + //EffectModule::set_rot(boma, handle as u32, &Vector3f::new(x_rot, 270.0, 0.0)); + EFFECT_FOLLOW_ALPHA(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), 4, 21.5, 2, 0, -60, 0, 1, true, 0.7); LAST_EFFECT_SET_RATE(agent, 1.1); - LAST_EFFECT_SET_COLOR(agent, 0.35, 0.35, 0.90); - EFFECT_FOLLOW(agent, Hash40::new("sys_ice"), Hash40::new("top"), 0, y_pos, 10, 0, 250, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.35, 0.35, 0.90); - EffectModule::set_scale_last(boma, &Vector3f::new(0.5, length, 0.5)); + LAST_EFFECT_SET_COLOR(agent, 0.025, 0.15, 0.95); + //EFFECT_FOLLOW(agent, Hash40::new("sys_ice"), Hash40::new("top"), 0, y_pos, 7, 0, 250, 30, 1, true); } wait(lua_state, 10.0); if is_excute(agent) { @@ -67,15 +82,15 @@ unsafe extern "C" fn effect_specialnb(agent: &mut L2CAgentBase) { } if is_excute(agent) { let size = if powered { 0.6 } else { 0.5 }; - EFFECT_FOLLOW(agent, Hash40::new("sys_hit_ice"), Hash40::new("top"), 0, 3, 10, 0, 0, 0, 0.6, true); - EFFECT_FOLLOW(agent, Hash40::new("sys_freezer"), Hash40::new("top"), 0, 24, 10, 0, 0, 0, size, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_hit_ice"), Hash40::new("top"), x_pos, 3, 7, 0, 0, 0, 0.6, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_freezer"), Hash40::new("top"), x_pos, 24, 10, 0, 0, 0, size, true); if powered { - EFFECT_FOLLOW(agent, Hash40::new("sys_freezer"), Hash40::new("top"), 0, 40, 10, 0, 0, 0, 0.3, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_freezer"), Hash40::new("top"), x_pos, 40, 13, 0, 0, 0, 0.3, true); } } frame(lua_state, 50.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2_grey"), false, false); } } @@ -100,12 +115,9 @@ unsafe extern "C" fn expression_specialnb(agent: &mut L2CAgentBase) { let powered = VarModule::is_flag(agent.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED); if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - } - frame(lua_state, 13.0); - app::sv_animcmd::execute(lua_state, 13.0); - if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + if agent.is_situation(*SITUATION_KIND_GROUND) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } } frame(lua_state, 16.0); if is_excute(agent) { @@ -119,7 +131,6 @@ unsafe extern "C" fn expression_specialnb(agent: &mut L2CAgentBase) { } else { ControlModule::set_rumble(boma, Hash40::new("rbkind_beams"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - } frame(lua_state, 48.0); if is_excute(agent) { diff --git a/fighters/palutena/src/acmd/specials/special_n_g.rs b/fighters/palutena/src/acmd/specials/special_n_g.rs index aae6b6de86..19ee64ed5b 100644 --- a/fighters/palutena/src/acmd/specials/special_n_g.rs +++ b/fighters/palutena/src/acmd/specials/special_n_g.rs @@ -1,9 +1,14 @@ use super::*; -unsafe extern "C" fn game_specialng(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialngstart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 10.0, 8.0); + frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 13.0); // 12 + FT_MOTION_RATE_RANGE(agent, 14.0, 24.0, 6.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); @@ -12,75 +17,36 @@ unsafe extern "C" fn game_specialng(agent: &mut L2CAgentBase) { HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); } - FT_DESIRED_RATE(agent, 20.0, 10.0); - frame(lua_state, 20.0); - FT_DESIRED_RATE(agent, 25.0, 15.0); - if is_excute(agent) { - VarModule::on_flag(boma.object(), vars::palutena::instance::SPECIAL_N_FLUSH_BOARD); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 366, 40, 70, 0, 6.0, 0.0, 6.0, 0.0, None, None, None, 0.8, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 5, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 366, 40, 70, 0, 6.0, 0.0, 12.0, -2.0, Some(0.0), Some(12.0), Some(2.0), 0.8, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 5, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 366, 40, 70, 0, 6.0, 0.0, 18.0, -3.0, Some(0.0), Some(18.0), Some(3.0), 0.8, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 5, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); - } - wait(lua_state, 25.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - let angle_mod = ((sv_math::rand(hash40("fighter"), 51) as i32) - 25) as u64; - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 90 + angle_mod, 116, 0, 75, 6.0, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 90 + angle_mod, 116, 0, 75, 6.0, 0.0, 13.5, -3.0, Some(0.0), Some(13.5), Some(3.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); - ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 90 + angle_mod, 116, 0, 75, 6.0, 0.0, 21.0, -5.0, Some(0.0), Some(21.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); - } - wait(lua_state, 3.0); - if is_excute(agent) { - HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_NORMAL); - HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_NORMAL); - AttackModule::clear_all(boma); - } } -unsafe extern "C" fn effect_specialng(agent: &mut L2CAgentBase) { +unsafe extern "C" fn effect_specialngstart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 8.0); + frame(lua_state, 5.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), -0.2, 22, -1, 10, 90, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), -0.2, 22, -1, 10, 90, 0, 1, true); LAST_EFFECT_SET_COLOR(agent, 0.05, 0.50, 0.01); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); LAST_EFFECT_SET_COLOR(agent, 0.05, 0.50, 0.01); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); LAST_EFFECT_SET_COLOR(agent, 0.05, 0.50, 0.01); } - frame(lua_state, 19.0); + frame(lua_state, 18.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_club_tornado"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_club_tornado"), Hash40::new("top"), -0.5*boma.lr(), -0.5, 0.5, 0, 0, 0, 0.95, true); LAST_EFFECT_SET_COLOR(agent, 0.05, 1.0, 0.05); - EFFECT_FOLLOW(agent, Hash40::new("sys_club_tornado"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.95, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_club_tornado"), Hash40::new("top"), -0.5*boma.lr(), -0.5, 0.5, 0, 0, 0, 0.9, true); LAST_EFFECT_SET_COLOR(agent, 0.05, 0.50, 0.05); } - wait(lua_state, 1.0); + frame(lua_state, 20.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_club_tornado"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_club_tornado"), Hash40::new("top"), -0.5*boma.lr(), -0.5, 0.5, 0, 0, 0, 1.15, true); LAST_EFFECT_SET_COLOR(agent, 0.25, 0.70, 0.25); LAST_EFFECT_SET_ALPHA(agent, 0.3); } - wait(lua_state, 26.0); - if is_excute(agent) { - EFFECT_DETACH_KIND(agent, Hash40::new("sys_club_tornado"), -1); - EFFECT_DETACH_KIND(agent, Hash40::new("sys_club_tornado"), -1); - } - wait(lua_state, 3.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("sys_club_tornado"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("sys_club_tornado"), false, false); - } } -unsafe extern "C" fn sound_specialng(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_specialngstart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 8.0); @@ -94,38 +60,159 @@ unsafe extern "C" fn sound_specialng(agent: &mut L2CAgentBase) { PLAY_SE(agent, Hash40::new("se_palutena_throw")); PLAY_SE(agent, Hash40::new("se_common_throw_02")); PLAY_SEQUENCE(agent, Hash40::new("seq_palutena_rnd_attack")); - PLAY_SE(agent, Hash40::new("se_item_club_wind")); + PLAY_STATUS(agent, Hash40::new("se_item_club_wind")); + } +} + +unsafe extern "C" fn expression_specialngstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 18.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_27_spinslash"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); } - wait(lua_state, 25.0); +} + +unsafe extern "C" fn game_specialngloop(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let loop_count = VarModule::get_int(agent.battle_object, vars::palutena::status::SPECIAL_N_GREEN_LOOP) as f32; + let damage = 1.75 - loop_count/4.0; // 1.5-1.0 + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 30.0, 19.0); if is_excute(agent) { - STOP_SE(agent, Hash40::new("se_item_club_wind")); + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); + // multihit segment + ATTACK(agent, 0, 0, Hash40::new("top"), damage, 111, 100, 42, 0, 5.75, 0.0, 6.75, 0.75, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 6, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), damage, 145, 100, 40, 0, 5.75, 0.0, 11.75, -1.25, Some(0.0), Some(11.75), Some(2.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 6, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("top"), damage, 177, 100, 38, 0, 5.75, 0.0, 17.75, -2.25, Some(0.0), Some(17.75), Some(3.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 6, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); } } -unsafe extern "C" fn expression_specialng(agent: &mut L2CAgentBase) { +unsafe extern "C" fn expression_specialngloop(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 18.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashss"), 10); + } + frame(lua_state, 14.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_27_spinslash"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 29.0); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_27_spinslash"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); } +} + +unsafe extern "C" fn game_specialngend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let loop_count = VarModule::get_int(agent.battle_object, vars::palutena::status::SPECIAL_N_GREEN_LOOP) as f32; + let damage = 1.75 - loop_count/4.0; // 1.5-0.75 + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 13.0, 10.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), damage, 111, 100, 42, 0, 5.75, 0.0, 6.75, 0.75, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 6, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), damage, 145, 100, 40, 0, 5.75, 0.0, 11.75, -1.25, Some(0.0), Some(11.75), Some(2.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 6, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("top"), damage, 177, 100, 38, 0, 5.75, 0.0, 17.75, -2.25, Some(0.0), Some(17.75), Some(3.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 6, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + } + frame(lua_state, 8.0); + if is_excute(agent) { + let angle_mod = ((sv_math::rand(hash40("fighter"), 51) as i32) - 25) as u64; + ATTACK(agent, 0, 1, Hash40::new("top"), 5.0, 90 + angle_mod, 123, 0, 66, 6.5, 0.0, 6.5, 0.75, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 1, Hash40::new("top"), 5.0, 90 + angle_mod, 123, 0, 66, 6.5, 0.0, 13.25, -2.5, Some(0.0), Some(13.25), Some(3.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 1, Hash40::new("top"), 5.0, 90 + angle_mod, 123, 0, 66, 6.5, 0.0, 20.0, -4.5, Some(0.0), Some(20.0), Some(5.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + } + frame(lua_state, 13.0); // 11 + FT_MOTION_RATE(agent, 1.0); // 42 faf + //FT_MOTION_RATE_RANGE(agent, 29.0, 46.0, 15.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("bust"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("shoulderr"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("shoulderl"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_NORMAL); + HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_NORMAL); + AttackModule::clear_all(boma); + VarModule::set_int(agent.battle_object, vars::palutena::status::SPECIAL_N_GREEN_BUTTON_TIMER, 1); + } +} + +unsafe extern "C" fn effect_specialngend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), -0.2, 22, -1, 10, 90, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.05, 0.50, 0.01); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_club_tornado"), Hash40::new("top"), -0.5*boma.lr(), -0.5, 0.5, 0, 0, 0, 1.15, true); + LAST_EFFECT_SET_COLOR(agent, 0.05, 1.0, 0.05); + LAST_EFFECT_SET_RATE(agent, 2.0); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_club_tornado"), Hash40::new("top"), -0.5*boma.lr(), -0.5, 0.5, 0, 0, 0, 1.25, true); + LAST_EFFECT_SET_COLOR(agent, 0.25, 1.0, 0.25); + LAST_EFFECT_SET_RATE(agent, 2.0); + LAST_EFFECT_SET_ALPHA(agent, 0.4); + } + frame(lua_state, 7.0); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("sys_club_tornado"), false, true); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2_grey"), false, false); + } + frame(lua_state, 21.0); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("sys_club_tornado"), true, true); + } +} + +unsafe extern "C" fn sound_specialngend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + PLAY_STATUS(agent, Hash40::new("se_palutena_special_n01")); + } frame(lua_state, 20.0); if is_excute(agent) { - RUMBLE_HIT(agent, Hash40::new("rbkind_slashss"), 10); + STOP_SE(agent, Hash40::new("se_item_club_wind")); + sound!(agent, *MA_MSC_CMD_SOUND_STOP_SE_STATUS); } - frame(lua_state, 25.0); +} + +unsafe extern "C" fn expression_specialngend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_slashm"), 10); } } pub fn install(agent: &mut Agent) { - agent.acmd("game_specialng", game_specialng, Priority::Low); - agent.acmd("game_specialairng", game_specialng, Priority::Low); - agent.acmd("effect_specialng", effect_specialng, Priority::Low); - agent.acmd("effect_specialairng", effect_specialng, Priority::Low); - agent.acmd("sound_specialng", sound_specialng, Priority::Low); - agent.acmd("sound_specialairng", sound_specialng, Priority::Low); - agent.acmd("expression_specialng", expression_specialng, Priority::Low); - agent.acmd("expression_specialairng", expression_specialng, Priority::Low); + agent.acmd("game_specialngstart", game_specialngstart, Priority::Low); + agent.acmd("effect_specialngstart", effect_specialngstart, Priority::Low); + agent.acmd("sound_specialngstart", sound_specialngstart, Priority::Low); + agent.acmd("expression_specialngstart", expression_specialngstart, Priority::Low); + + agent.acmd("game_specialngloop", game_specialngloop, Priority::Low); + agent.acmd("effect_specialngloop", acmd_stub, Priority::Low); + agent.acmd("sound_specialngloop", acmd_stub, Priority::Low); + agent.acmd("expression_specialngloop", expression_specialngloop, Priority::Low); + + agent.acmd("game_specialngend", game_specialngend, Priority::Low); + agent.acmd("game_specialairngend", game_specialngend, Priority::Low); + agent.acmd("effect_specialngend", effect_specialngend, Priority::Low); + agent.acmd("effect_specialairngend", effect_specialngend, Priority::Low); + agent.acmd("sound_specialngend", sound_specialngend, Priority::Low); + agent.acmd("sound_specialairngend", sound_specialngend, Priority::Low); + agent.acmd("expression_specialngend", expression_specialngend, Priority::Low); + agent.acmd("expression_specialairngend", expression_specialngend, Priority::Low); } \ No newline at end of file diff --git a/fighters/palutena/src/acmd/specials/special_n_o.rs b/fighters/palutena/src/acmd/specials/special_n_o.rs index 4690ef255e..b917f25626 100644 --- a/fighters/palutena/src/acmd/specials/special_n_o.rs +++ b/fighters/palutena/src/acmd/specials/special_n_o.rs @@ -22,10 +22,10 @@ unsafe extern "C" fn effect_specialno(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); EffectModule::enable_sync_init_pos_last(boma); LAST_EFFECT_SET_COLOR(agent, 0.8, 0.2, 0.01); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); LAST_EFFECT_SET_COLOR(agent, 0.8, 0.2, 0.01); EFFECT_FOLLOW(agent, Hash40::new("palutena_throw_twinkle"), Hash40::new("top"), 0.0, 12.0, 6.0, 0, 0, 0, 0.7, true); } @@ -35,7 +35,7 @@ unsafe extern "C" fn effect_specialno(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW_ALPHA(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), -1, 21, 1, 0, 90, 0, 1, true, 0.7); + EFFECT_FOLLOW_ALPHA(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), -1, 21, 1, 0, 90, 0, 1, true, 0.7); LAST_EFFECT_SET_COLOR(agent, 0.8, 0.2, 0.01); } frame(lua_state, 13.0); @@ -45,8 +45,8 @@ unsafe extern "C" fn effect_specialno(agent: &mut L2CAgentBase) { } frame(lua_state, 35.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2_grey"), false, false); } } diff --git a/fighters/palutena/src/acmd/specials/special_n_p.rs b/fighters/palutena/src/acmd/specials/special_n_p.rs index 118f7c4e1f..d6944e3866 100644 --- a/fighters/palutena/src/acmd/specials/special_n_p.rs +++ b/fighters/palutena/src/acmd/specials/special_n_p.rs @@ -17,15 +17,15 @@ unsafe extern "C" fn effect_specialnp(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 12.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.01, 0.35); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.01, 0.35); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.25, 0.025, 0.9); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.25, 0.025, 0.9); } frame(lua_state, 14.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), -1, 21, -1, 0, -90, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.01, 0.35); + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), -1, 21, -1, 0, -90, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.25, 0.025, 0.9); EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_atk1"), Hash40::new("top"), 0, 40, 6, 0, 0, 0, 1.25, true); LAST_EFFECT_SET_COLOR(agent, 1.875, 0.025, 0.875); LAST_EFFECT_SET_RATE(agent, 0.8); @@ -36,8 +36,8 @@ unsafe extern "C" fn effect_specialnp(agent: &mut L2CAgentBase) { } frame(lua_state, 30.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2_grey"), false, false); } } diff --git a/fighters/palutena/src/acmd/specials/special_n_r.rs b/fighters/palutena/src/acmd/specials/special_n_r.rs index 2b43c507e6..a52830c6d7 100644 --- a/fighters/palutena/src/acmd/specials/special_n_r.rs +++ b/fighters/palutena/src/acmd/specials/special_n_r.rs @@ -35,15 +35,15 @@ unsafe extern "C" fn effect_specialnr(agent: &mut L2CAgentBase) { //println!("POWERED (effects): {}", power); frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.01); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.01); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0125, 0.025); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0125, 0.025); } frame(lua_state, 16.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), 1, 21, 2.5, 0, -50, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.01); + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), 1, 21, 2.5, 0, -50, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0125, 0.025); } frame(lua_state, 18.0); if power { @@ -58,8 +58,8 @@ unsafe extern "C" fn effect_specialnr(agent: &mut L2CAgentBase) { } frame(lua_state, 30.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2_grey"), false, false); } } diff --git a/fighters/palutena/src/acmd/specials/special_n_y.rs b/fighters/palutena/src/acmd/specials/special_n_y.rs index ca19d2fb01..9c68ab7b35 100644 --- a/fighters/palutena/src/acmd/specials/special_n_y.rs +++ b/fighters/palutena/src/acmd/specials/special_n_y.rs @@ -6,17 +6,15 @@ unsafe extern "C" fn game_specialny(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 20.0, 16.0); frame(lua_state, 20.0); + FT_MOTION_RATE_RANGE(agent, 20.0, 54.0, 24.0); // 37 FAF -> 41 if is_excute(agent) { VarModule::on_flag(boma.object(), vars::palutena::instance::SPECIAL_N_FLUSH_BOARD); - if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { - WorkModule::set_float(boma, PostureModule::pos_x(boma) - 100.0, *FIGHTER_PALUTENA_STATUS_SPECIAL_N_WORK_FLOAT_TARGET_POS_X); - } - else { - WorkModule::set_float(boma, PostureModule::pos_x(boma) + 100.0, *FIGHTER_PALUTENA_STATUS_SPECIAL_N_WORK_FLOAT_TARGET_POS_X); - } - WorkModule::set_float(boma, PostureModule::pos_y(boma) + 5.0, *FIGHTER_PALUTENA_STATUS_SPECIAL_N_WORK_FLOAT_TARGET_POS_Y); + agent.set_float(PostureModule::pos_x(boma) + (100.0 * boma.lr()), *FIGHTER_PALUTENA_STATUS_SPECIAL_N_WORK_FLOAT_TARGET_POS_X); + agent.set_float(PostureModule::pos_y(boma) + 5.0, *FIGHTER_PALUTENA_STATUS_SPECIAL_N_WORK_FLOAT_TARGET_POS_Y); ArticleModule::generate_article(boma, *FIGHTER_PALUTENA_GENERATE_ARTICLE_AUTOAIMBULLET, false, -1); } + frame(lua_state, 54.0); // cancel frame + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_specialny(agent: &mut L2CAgentBase) { @@ -24,17 +22,17 @@ unsafe extern "C" fn effect_specialny(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight"), Hash40::new("top"), -0.2, 22, -1, 10, 90, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); + EFFECT_FOLLOW(agent, Hash40::new("palutena_backlight_grey"), Hash40::new("top"), -0.2, 22, -1, 10, 90, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light2_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); } - frame(lua_state, 35.0); + frame(lua_state, 41.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2_grey"), false, false); } } diff --git a/fighters/palutena/src/acmd/throws.rs b/fighters/palutena/src/acmd/throws.rs index 8275a5a411..8a7986938d 100644 --- a/fighters/palutena/src/acmd/throws.rs +++ b/fighters/palutena/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, 4.2, Some(0.0), Some(8.0), Some(7.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -29,7 +29,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(12.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, 5.2, Some(0.0), Some(8.0), Some(10.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -49,7 +49,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-18.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, -5.2, Some(0.0), Some(8.0), Some(-15.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -72,13 +72,16 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { CHECK_FINISH_CAMERA(agent, 10, 9); } frame(lua_state, 20.0); + FT_MOTION_RATE_RANGE(agent, 20.0, 47.0, 18.0); if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let target = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); AttackModule::clear_all(boma); } + frame(lua_state, 47.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { @@ -97,13 +100,38 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); REVERSE_LR(agent); - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let target = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } } +unsafe extern "C" fn effect_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("palutena_catch_wind"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.7); + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("top"), 0, 16.5, -9.5, 0, 0, 0, 1.25, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 4.0/8.0); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("palutena_throw_twinkle"), Hash40::new("handr"), 0, 0, -1, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 20.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("palutena_catch_wind"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + FOOT_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 22.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); + } +} + unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -117,14 +145,50 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let target = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); AttackModule::clear_all(boma); } } +unsafe extern "C" fn effect_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("palutena_catch_wind"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 0.7); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("palutena_wand_light2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 11.0/13.5); + } + frame(lua_state, 15.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("palutena_catch_wind"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke_s"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 16.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("palutena_throw_twinkle2"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 0.85, true); + } + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("throw"), 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("palutena_throw_twinkle2"), -1); + } + frame(lua_state, 27.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light2"), false, false); + } + frame(lua_state, 46.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); + } +} + unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -141,9 +205,9 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { } frame(lua_state, 25.0); if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let target = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); AttackModule::clear_all(boma); } @@ -157,8 +221,10 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_throwf", game_throwf, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("effect_throwb", effect_throwb, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); + agent.acmd("effect_throwhi", effect_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); } \ No newline at end of file diff --git a/fighters/palutena/src/acmd/tilts.rs b/fighters/palutena/src/acmd/tilts.rs index 07f6a29738..7132c7af67 100644 --- a/fighters/palutena/src/acmd/tilts.rs +++ b/fighters/palutena/src/acmd/tilts.rs @@ -3,40 +3,38 @@ use super::*; unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE(agent, 11.0/(16.0-0.0)); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 11.0); + frame(lua_state, 9.0); + FT_MOTION_RATE_RANGE(agent, 9.0, 16.0, 2.0); + frame(lua_state, 16.0); // 14 + FT_MOTION_RATE_RANGE(agent, 16.0, 44.0, 20.0); if is_excute(agent) { VarModule::on_flag(boma.object(), vars::palutena::status::ENABLE_COLOR_INCREMENT); - } - frame(lua_state, 16.0); - FT_MOTION_RATE(agent, 0.667); - frame(lua_state, 17.0); - if is_excute(agent) { HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_XLU); - ATTACK(agent, 1, 0, Hash40::new("stick"), 6.0, 90, 100, 25, 0, 4.3, 0.0, 5.5, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 0, 0, Hash40::new("stick"), 6.0, 45, 100, 45, 0, 3.3, 0.0, -5.5, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - } - frame(lua_state, 20.0); - if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("stick"), 6.0, 285, 100, 25, 0, 4.3, 0.0, 5.5, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 0, 0, Hash40::new("stick"), 6.0, 100, 100, 40, 0, 3.3, 0.0, -5.5, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("stick"), 11.0, 55, 111, 0, 44, 4.3, 0.0, 4.9, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 13, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("stick"), 11.0, 55, 111, 0, 44, 3.5, 0.0, -6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 13, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } - frame(lua_state, 25.0); + frame(lua_state, 23.0); // 20 if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("stick"), 6.0, 20, 100, 35, 0, 4.3, 0.0, 5.5, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 0, 0, Hash40::new("stick"), 6.0, 85, 100, 30, 0, 3.3, 0.0, -5.5, 0.0, None, None, None, 0.8, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("stick"), 9.0, 50, 111, 0, 44, 4.3, 0.0, 4.9, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("stick"), 9.0, 50, 111, 0, 44, 3.5, 0.0, -6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } - frame(lua_state, 29.0); + frame(lua_state, 32.0); // 27 if is_excute(agent) { - ATTACK(agent, 1, 1, Hash40::new("stick"), 7.0, 40, 110, 0, 54, 5.3, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 0, 1, Hash40::new("stick"), 7.0, 40, 110, 0, 54, 4.3, 0.0, -5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("stick"), 7.0, 45, 111, 0, 44, 4.3, 0.0, 4.9, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("stick"), 7.0, 45, 111, 0, 44, 3.5, 0.0, -6.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } - frame(lua_state, 41.0); + frame(lua_state, 44.0); // 34 FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 44.0); if is_excute(agent) { AttackModule::clear_all(boma); HIT_NODE(agent, Hash40::new("armr"), *HIT_STATUS_NORMAL); } + frame(lua_state, 50.0); + FT_MOTION_RATE_RANGE(agent, 50.0, 64.0, 10.0); + frame(lua_state, 64.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { @@ -46,10 +44,13 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 13.0); + frame(lua_state, 12.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); + //EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + //LAST_EFFECT_SET_COLOR(agent, 1.0, 0.82, 0.0125); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); + LAST_EFFECT_SET_RATE(agent, 6.0/9.0); } frame(lua_state, 14.0); if is_excute(agent) { @@ -66,6 +67,12 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { }; EFFECT_FOLLOW(agent, hash, Hash40::new("stick"), 0, 0, 0, 0, 0, 0, 1, true); } + frame(lua_state, 29.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.87, 0.0125); + LAST_EFFECT_SET_RATE(agent, 6.0/9.0); + } frame(lua_state, 40.0); if is_excute(agent) { match WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR) { @@ -80,9 +87,10 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { _ => EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_trace_08"), false, false), }; } - frame(lua_state, 42.0); + frame(lua_state, 43.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } @@ -93,10 +101,11 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { VarModule::on_flag(boma.object(), vars::palutena::status::ENABLE_COLOR_INCREMENT); } frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.778); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 7.0); frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 10.0); + FT_MOTION_RATE_RANGE(agent, 10.0, 30.0, 11.0); FT_MOTION_RATE(agent, 0.571); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 1.4, 367, 100, 20, 0, 3.0, 0.0, 18.0, 4.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); @@ -111,8 +120,8 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 31.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.5, 85, 136, 0, 75, 3.0, 0.0, 23.0, 10.5, Some(0.0), Some(23.0), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.5, 85, 136, 0, 75, 3.0, 0.0, 17.0, 10.5, Some(0.0), Some(17.0), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.5, 85, 136, 0, 75, 3.0, 0.0, 21.0, 10.5, Some(0.0), Some(21.0), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.5, 85, 136, 0, 75, 3.0, 0.0, 15.0, 10.5, Some(0.0), Some(15.0), Some(-5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); } frame(lua_state, 34.0); if is_excute(agent) { @@ -126,6 +135,13 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); } + frame(lua_state, 9.0); + if is_excute(agent) { + //EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + //LAST_EFFECT_SET_COLOR(agent, 0.05, 0.2, 0.95); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.05, 0.2, 0.95); + } frame(lua_state, 10.0); if is_excute(agent) { let hash = match WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR) { @@ -141,10 +157,11 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { }; EFFECT_FOLLOW(agent, hash, Hash40::new("stick"), 0, 0, 0, 0, 0, 0, 1, true); } - frame(lua_state, 10.0); + frame(lua_state, 18.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.05, 0.05, 0.90); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 0.05, 0.2, 0.95); + LAST_EFFECT_SET_RATE(agent, 6.0/8.0); } frame(lua_state, 32.0); if is_excute(agent) { @@ -160,9 +177,10 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { _ => EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_trace_08"), false, false), }; } - frame(lua_state, 35.0); + frame(lua_state, 36.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } @@ -177,11 +195,10 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); FT_MOTION_RATE_RANGE(agent, 14.0, 25.0, 10.0); if is_excute(agent) { - // Ground only hitboxes - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 67, 90, 0, 45, 3.5, 0.0, 3.5, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 67, 90, 0, 45, 3.5, 0.0, 3.5, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + // Ground-only ATTACK(agent, 1, 0, Hash40::new("top"), 8.5, 83, 90, 0, 45, 3.0, 0.0, 3.5, 6.0, Some(0.0), Some(3.0), Some(21.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_OBJECT); - // Air only hitboxes - ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 67, 90, 0, 45, 3.5, 0.0, 3.5, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + // Air-only ATTACK(agent, 3, 0, Hash40::new("top"), 8.5, 76, 90, 0, 45, 3.0, 0.0, 3.5, 6.0, Some(0.0), Some(3.0), Some(21.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_OBJECT); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } @@ -201,6 +218,14 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } + frame(lua_state, 11.0); + if is_excute(agent) { + //EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light_trace_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 0, 0, 1, true); + //LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0, 0.05); + EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4_grey"), Hash40::new("stick"), 0, 8.65, 0, 0, 180, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 1.0, 0.0, 0.05); + LAST_EFFECT_SET_RATE(agent, 6.0/9.0); + } frame(lua_state, 13.0); if is_excute(agent) { let hash = match WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR) { @@ -215,8 +240,6 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { _ => Hash40::new("palutena_wand_trace_08"), }; EFFECT_FOLLOW(agent, hash, Hash40::new("stick"), 0, 0, 0, 0, 0, 0, 1, true); - EFFECT_FOLLOW(agent, Hash40::new("palutena_wand_light4"), Hash40::new("stick"), 0, 8.65, 0, 0, 180, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 2.0, 0.03, 0.0); } frame(lua_state, 29.0); if is_excute(agent) { @@ -234,7 +257,8 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { } frame(lua_state, 32.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light_trace_grey"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_wand_light4_grey"), false, false); } } diff --git a/fighters/palutena/src/autoaimbullet/acmd.rs b/fighters/palutena/src/autoaimbullet/acmd.rs index 4d33ed07c4..76765a2add 100644 --- a/fighters/palutena/src/autoaimbullet/acmd.rs +++ b/fighters/palutena/src/autoaimbullet/acmd.rs @@ -4,11 +4,12 @@ unsafe extern "C" fn game_shot(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { + AttackModule::set_power_mul_5th(boma, 1.0); let owner_module_accessor = boma.get_owner_boma(); if owner_module_accessor.kind() == *FIGHTER_KIND_PALUTENA { - let damage = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {7.0} else {4.0}; - let paralyze = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {0.4} else {0.2}; - ATTACK(agent, 0, 0, Hash40::new("top"), damage, 65, 40, 0, 75, 2.3, 0.0, 0.0, 0.0, None, None, None, paralyze, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); + let (damage, bkb, kbg, hitlag, size) = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) + { (7.0, 63, 40, 0.5, 2.4) } else { (4.0, 60, 60, 0.25, 2.1) }; // para cap of 90, stun is kb * hitlag mul + 1 + ATTACK(agent, 0, 0, Hash40::new("top"), damage, 65, kbg, 0, bkb, size, 0.0, 0.0, 0.0, None, None, None, hitlag, 0.6, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); } else { ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 36, 53, 0, 61, 2.3, 0.0, 0.0, 0.0, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_ITEM, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_paralyze"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_ENERGY); @@ -23,81 +24,35 @@ unsafe extern "C" fn effect_shot(agent: &mut L2CAgentBase) { let owner_module_accessor = boma.get_owner_boma(); let palutena = owner_module_accessor.kind() == *FIGHTER_KIND_PALUTENA; if is_excute(agent) { - EFFECT(agent, Hash40::new("palutena_bullet_shot"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); if palutena { - LAST_EFFECT_SET_COLOR(agent, 0.85, 0.40, 0.001); + let eff_name = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {"palutena_bullet_grey_super"} else {"palutena_bullet_grey"}; + let scale_x = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {1.15} else {0.9}; + let scale_y = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {0.95} else {0.65}; + let red = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {1.25} else {1.05}; + let green = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {0.55} else {0.7}; + EFFECT_FOLLOW(agent, Hash40::new(eff_name), Hash40::new("top"), 0, 0, 0.0, 0, 0, 0, 1.0, false); + LAST_EFFECT_SET_COLOR(agent, red, green, 0.0125); + LAST_EFFECT_SET_SCALE_W(agent, scale_x, 0.85, scale_x); + EFFECT(agent, Hash40::new("palutena_bullet_shot_grey"), Hash40::new("top"), 0, 0, 0.25, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_COLOR(agent, 1.25, 1.00, 0.025); + LAST_EFFECT_SET_RATE(agent, 1.5); + LAST_EFFECT_SET_ALPHA(agent, 0.75); + } else { + EFFECT(agent, Hash40::new("palutena_bullet_shot"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } } if palutena { - let power = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {Hash40::new("sys_hit_elec")} else {Hash40::new("sys_hit_elec_s")}; - let size = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {2.0} else {1.0}; - for _ in 0..99 { - if is_excute(agent) { - EFFECT_FOLLOW(agent, power, Hash40::new("top"), 0.0, 2.2, 1.2, 0, 0, 0, 0.23 * size, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - LAST_EFFECT_SET_RATE(agent, 3.0); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_elec"), Hash40::new("top"), 0.0, 0.0, 0.0, 0, 0, 0, 1.3, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, power, false, true); - EFFECT_OFF_KIND(agent, Hash40::new("sys_damage_elec"), false, true); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, power, Hash40::new("top"), 0.0, 0.2, -1.4, 0, 0, 0, 0.17 * size, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - LAST_EFFECT_SET_RATE(agent, 3.0); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_elec"), Hash40::new("top"), 0.0, 0.0, 0.0, 0, 0, 0, 1.3, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, power, false, true); - EFFECT_OFF_KIND(agent, Hash40::new("sys_damage_elec"), false, true); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, power, Hash40::new("top"), 0.0, 1.7, 0.1, 0, 0, 0, 0.32 * size, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - LAST_EFFECT_SET_RATE(agent, 3.0); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_elec"), Hash40::new("top"), 0.0, 0.0, 0.0, 0, 0, 0, 1.3, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, power, false, true); - EFFECT_OFF_KIND(agent, Hash40::new("sys_damage_elec"), false, true); - LAST_EFFECT_SET_RATE(agent, 1); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, power, Hash40::new("top"), 0.0, 1.4, 1.0, 0, 0, 0, 0.2 * size, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - LAST_EFFECT_SET_RATE(agent, 3.0); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_elec"), Hash40::new("top"), 0.0, 0.0, 0.0, 0, 0, 0, 1.3, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, power, false, true); - EFFECT_OFF_KIND(agent, Hash40::new("sys_damage_elec"), false, true); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, power, Hash40::new("top"), 0.0, 2.3, -1.4, 0, 0, 0, 0.15 * size, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - LAST_EFFECT_SET_RATE(agent, 3.0); - EFFECT_FOLLOW(agent, Hash40::new("sys_damage_elec"), Hash40::new("top"), 0.0, 0.0, 0.0, 0, 0, 0, 1.3, true); - LAST_EFFECT_SET_COLOR(agent, 0.75, 0.40, 0.001); - } - wait(lua_state, 1.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, power, false, true); - EFFECT_OFF_KIND(agent, Hash40::new("sys_damage_elec"), false, true); - } - wait(lua_state, 1.0); + wait(lua_state, 2.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("palutena_elec"), Hash40::new("top"), 0.0, 0.0, -1.0, 0, 0, 0, 0.35, true); + LAST_EFFECT_SET_SCALE_W(agent, 0.55, 0.4, 0.4); + LAST_EFFECT_SET_COLOR(agent, 1.25, 0.65, 0.025); + LAST_EFFECT_SET_ALPHA(agent, 0.3); + let yellow = if VarModule::is_flag(owner_module_accessor.object(), vars::palutena::status::SPECIAL_N_PRIMARY_POWERED) {0.45} else {0.85}; + EFFECT_FOLLOW(agent, Hash40::new("palutena_elec"), Hash40::new("top"), 0.0, 0.0, -1.0, 0, 0, 0, 0.35, true); + LAST_EFFECT_SET_SCALE_W(agent, 0.75, 0.45, 0.45); + LAST_EFFECT_SET_COLOR(agent, 1.25, yellow, 0.025); + LAST_EFFECT_SET_ALPHA(agent, 0.4); } } } diff --git a/fighters/palutena/src/autoaimbullet/mod.rs b/fighters/palutena/src/autoaimbullet/mod.rs index adc6deb010..b0e93c3348 100644 --- a/fighters/palutena/src/autoaimbullet/mod.rs +++ b/fighters/palutena/src/autoaimbullet/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod status; pub fn install() { let agent = &mut Agent::new("palutena_autoaimbullet"); acmd::install(agent); + status::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/palutena/src/autoaimbullet/status.rs b/fighters/palutena/src/autoaimbullet/status.rs new file mode 100644 index 0000000000..93d732e483 --- /dev/null +++ b/fighters/palutena/src/autoaimbullet/status.rs @@ -0,0 +1,38 @@ +use super::*; + +unsafe extern "C" fn shot_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + MotionModule::change_motion(weapon.module_accessor, Hash40::new("shot"), 0.0, 1.0, false, 0.0, false, false); + weapon.fastshift(L2CValue::Ptr(shot_main_loop as *const () as _)) +} + +unsafe extern "C" fn shot_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { + let life = weapon.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE); + let pos = *PostureModule::pos(weapon.module_accessor); + if life <= 0 { + EffectModule::req(weapon.module_accessor, Hash40::new("palutena_bullet_break"), &Vector3f::new(pos.x, pos.y, pos.z), &Vector3f::zero(), 1.0, 0, -1, false, 0); + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + return 1.into(); + } + if GroundModule::is_touch(weapon.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) { + EffectModule::req(weapon.module_accessor, Hash40::new("sys_crown_collision"), &Vector3f::new(pos.x, pos.y - 3.0, pos.z), &Vector3f::zero(), 0.6, 0, -1, false, 0); + } + if GroundModule::is_touch(weapon.module_accessor, *GROUND_TOUCH_FLAG_ALL as u32) { + EffectModule::req(weapon.module_accessor, Hash40::new("sys_erace_smoke"), &Vector3f::new(pos.x, pos.y, pos.z), &Vector3f::zero(), 0.9, 0, -1, false, 0); + let handle = SoundModule::play_se(weapon.module_accessor, Hash40::new("se_item_pasaran_landing"), true, false, false, false, app::enSEType(0)); + SoundModule::set_se_vol(weapon.module_accessor, handle as i32, 2.0, 0); + SoundModule::play_se(weapon.module_accessor, Hash40::new("se_common_down_soil_ss"), true, false, false, false, app::enSEType(0)); + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + return 1.into(); + } + // clear whatever vanilla fx + EFFECT_OFF_KIND(weapon, Hash40::new("palutena_bullet"), false, true); + // tick life + if !StopModule::is_stop(weapon.module_accessor) { + weapon.dec_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE); + } + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *WEAPON_PALUTENA_AUTOAIMBULLET_STATUS_KIND_SHOT, shot_main); +} \ No newline at end of file diff --git a/fighters/palutena/src/explosiveflame/acmd.rs b/fighters/palutena/src/explosiveflame/acmd.rs index 44b8f8c125..6f187dedf2 100644 --- a/fighters/palutena/src/explosiveflame/acmd.rs +++ b/fighters/palutena/src/explosiveflame/acmd.rs @@ -3,62 +3,72 @@ use super::*; unsafe extern "C" fn effect_check(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 9.0); if is_excute(agent) { - let owner_module_accessor = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); - if owner_module_accessor.kind() == *FIGHTER_KIND_KIRBY { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, true); - } + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, true); } } unsafe extern "C" fn game_explode(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 160, 100, 50, 0, 4.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -0.7, 0.0, 5, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 135, 100, 40, 0, 2.0, 0.0, -3.1, 0.0, None, None, None, 1.0, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -0.7, 0.0, 5, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 165, 100, 40, 0, 5.1, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -0.7, 0.0, 5, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } - wait(lua_state, 4.0); + wait(lua_state, 6.0); if is_excute(agent) { - AttackModule::set_size(boma, 0, 6.0); + AttackModule::set_size(boma, 0, 3.3); + AttackModule::set_size(boma, 1, 6.4); } - wait(lua_state, 4.0); + wait(lua_state, 6.0); if is_excute(agent) { - AttackModule::set_size(boma, 0, 7.2); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::set_size(boma, 0, 8.4); + AttackModule::set_size(boma, 0, 4.6); + AttackModule::set_size(boma, 1, 7.7); } - wait(lua_state, 4.0); + wait(lua_state, 6.0); if is_excute(agent) { - AttackModule::set_size(boma, 0, 9.6); + AttackModule::set_size(boma, 0, 5.9); + AttackModule::set_size(boma, 1, 9.0); } - wait(lua_state, 4.0); + wait(lua_state, 5.0); if is_excute(agent) { - AttackModule::set_size(boma, 0, 10.8); + AttackModule::set_size(boma, 0, 7.2); + AttackModule::set_size(boma, 1, 10.3); } - wait(lua_state, 4.0); + wait(lua_state, 5.0); if is_excute(agent) { - AttackModule::set_size(boma, 0, 12.0); + AttackModule::clear_all(boma); + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + ATTACK(agent, 0, 1, Hash40::new("top"), 5.5, 84, 141, 0, 60, 13.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -2.7, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); } - wait(lua_state, 4.0); + wait(lua_state, 3.0); if is_excute(agent) { AttackModule::clear_all(boma); - //AREA_WIND_2ND_RAD(agent, 0, 1, 0.02, 1000, 1, 0, 0, 29); - ControlModule::set_rumble(boma, Hash40::new("rbkind_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - wait(lua_state, 1.0); +} + +unsafe extern "C" fn effect_explode(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 5.5, 84, 141, 0, 60, 15.5, 0.0, 0.0, 0.0, None, None, None, 1.25, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -2.7, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); + EFFECT(agent, Hash40::new("palutena_bomb"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, (30.0/28.0)); + EFFECT(agent, Hash40::new("palutena_bomb_appear"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); } - wait(lua_state, 2.0); + frame(lua_state, 28.0); if is_excute(agent) { - AttackModule::clear_all(boma); + EFFECT(agent, Hash40::new("palutena_bomb_finish"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.325); + EFFECT_OFF_KIND(agent, Hash40::new("palutena_bomb"), false, false); } } pub fn install(agent: &mut Agent) { agent.acmd("effect_check", effect_check, Priority::Low); + agent.acmd("game_explode", game_explode, Priority::Low); + agent.acmd("effect_explode", effect_explode, Priority::Low); } \ No newline at end of file diff --git a/fighters/palutena/src/explosiveflame/status.rs b/fighters/palutena/src/explosiveflame/status.rs index 4dd1cb3a1e..92566c0dc9 100644 --- a/fighters/palutena/src/explosiveflame/status.rs +++ b/fighters/palutena/src/explosiveflame/status.rs @@ -2,34 +2,11 @@ use super::*; use globals::*; unsafe extern "C" fn check_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { - let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; - let palutena = utils::util::get_battle_object_from_id(owner_id); - if (&mut *(*palutena).module_accessor).kind() == *FIGHTER_KIND_KIRBY { - StatusModule::set_status_kind_interrupt(weapon.module_accessor, statuses::palutena_explosiveflame::CHECK_KIRBY); - return 1.into(); - } - StatusModule::init_settings( - weapon.module_accessor, - app::SituationKind(*SITUATION_KIND_AIR), - *WEAPON_KINETIC_TYPE_NORMAL, - 0, - app::GroundCliffCheckKind(*GROUND_CORRECT_KIND_AIR), - false, - 0, - 0, - 0, - 0 - ); - - return 0.into(); -} - -unsafe extern "C" fn check_kirby_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { StatusModule::init_settings( weapon.module_accessor, app::SituationKind(*SITUATION_KIND_AIR), *WEAPON_KINETIC_TYPE_RESET, - 0, + *GROUND_CORRECT_KIND_AIR as u32, app::GroundCliffCheckKind(*GROUND_CORRECT_KIND_AIR), false, 0, @@ -41,44 +18,74 @@ unsafe extern "C" fn check_kirby_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { return 0.into(); } -unsafe extern "C" fn check_kirby_main(weapon: &mut L2CWeaponCommon) -> L2CValue { - weapon.set_int(21, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); +unsafe extern "C" fn check_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + weapon.set_int(29, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); MotionModule::change_motion(weapon.module_accessor, Hash40::new("check"), 0.0, 1.0, false, 0.0, false, false); - let pos_x = PostureModule::pos_x(weapon.module_accessor); - let pos_y = PostureModule::pos_y(weapon.module_accessor); - let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; - let owner_object = utils::util::get_battle_object_from_id(owner_id); - let offset_x = if VarModule::is_flag(owner_object, vars::kirby::status::PALUTENA_SPECIAL_N_HOLD) { 75.0 } else { 45.0 }; - PostureModule::set_pos(weapon.module_accessor, &Vector3f::new(pos_x + (offset_x * PostureModule::lr(weapon.module_accessor)), pos_y + 7.0, 0.0)); - if GroundModule::is_touch(weapon.module_accessor, (*GROUND_TOUCH_FLAG_LEFT | *GROUND_TOUCH_FLAG_UP | *GROUND_TOUCH_FLAG_RIGHT | *GROUND_TOUCH_FLAG_UP_LEFT - | *GROUND_TOUCH_FLAG_UP_RIGHT) as u32) { - weapon.on_flag(*WEAPON_PALUTENA_EXPLOSIVEFLAME_INSTANCE_WORK_ID_FLAG_RESERVE_MISS); - } - // if weapon.is_flag(*WEAPON_PALUTENA_EXPLOSIVEFLAME_INSTANCE_WORK_ID_FLAG_RESERVE_MISS) { - // app::WeaponSpecializer_ExplosiveFlame::is_touch_down() - // } - weapon.shift(L2CValue::Ptr(check_kirby_main_loop as *const () as _)) + let mut pos = *PostureModule::pos(weapon.get_owner_boma()); + pos.y += 11.0; // set height + PostureModule::set_pos(weapon.module_accessor, &pos); + PostureModule::init_pos(weapon.module_accessor, &pos, true, true); + weapon.shift(L2CValue::Ptr(check_main_loop as *const () as _)) } -unsafe extern "C" fn check_kirby_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { - EffectModule::kill_kind(weapon.module_accessor, Hash40::new("palutena_bullet"), true, true); +unsafe extern "C" fn check_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { weapon.dec_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE); + let life = weapon.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE); + if LinkModule::is_parent_damage_reaction(weapon.module_accessor, *WEAPON_LINK_NO_CONSTRAINT) { + weapon.on_flag(*WEAPON_PALUTENA_EXPLOSIVEFLAME_INSTANCE_WORK_ID_FLAG_RESERVE_MISS); + } + if life == 19 { + // use f0 pos, effective 9f to release special + let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; + let palutena = utils::util::get_battle_object_from_id(owner_id); + let palutena_boma: &mut BattleObjectModuleAccessor = &mut *(*palutena).module_accessor; + let palu_lr = palutena_boma.lr(); + let kirby = palutena_boma.kind() == *FIGHTER_KIND_KIRBY; + let base_range = if kirby {45.0} else {palutena_boma.get_param_float("param_special_s", "special_s_generate_range")}; + let held_range = if kirby {75.0} else {palutena_boma.get_param_float("param_special_s", "special_s_flick_generate_range")}; + // hold check, filter out mashed b inputs + let buffer = ControlModule::get_command_life_count_max(palutena_boma) as usize; + let hold_frames = InputModule::get_trigger_count(palutena, Buttons::Special); + let offset_x = if palutena_boma.is_button_on(Buttons::Special) && hold_frames >= buffer {held_range} else {base_range}; + // check where to put it + let pos = *PostureModule::pos(weapon.module_accessor); + let mut new_pos = Vector3f::new(pos.x + (offset_x * palu_lr), pos.y, pos.z); + let ground_pos_stage = &mut Vector2f::zero(); + // forces it to not clip as much thru stage (nerf) + // sideways clip + let start_pos_x = &Vector2f::new(pos.x, new_pos.y); + let end_pos_x = &Vector2f::new(new_pos.x+(palu_lr+5.25), new_pos.y); + let is_touch_side = GroundModule::line_segment_check(weapon.module_accessor, start_pos_x, end_pos_x, &Vector2f::zero(), ground_pos_stage, false); + if is_touch_side != 0 as *const *const u64 {new_pos.x = ground_pos_stage.x-(5.25*palu_lr)}; + // floor clip + let center_y = &Vector2f::new(new_pos.x, new_pos.y); + let bottom_y = &Vector2f::new(new_pos.x, new_pos.y - 10.5); + let is_touch_down = GroundModule::line_segment_check(weapon.module_accessor, center_y, bottom_y, &Vector2f::zero(), ground_pos_stage, false); + if is_touch_down != 0 as *const *const u64 {new_pos.y = ground_pos_stage.y+10.5}; + PostureModule::set_pos(weapon.module_accessor, &new_pos); + PostureModule::init_pos(weapon.module_accessor, &new_pos, true, true); + // if somehow spawns inside ground + //if GroundModule::is_touch(weapon.module_accessor, (*GROUND_TOUCH_FLAG_LEFT | *GROUND_TOUCH_FLAG_UP | *GROUND_TOUCH_FLAG_RIGHT | *GROUND_TOUCH_FLAG_UP_LEFT + //| *GROUND_TOUCH_FLAG_UP_RIGHT) as u32) { + // weapon.on_flag(*WEAPON_PALUTENA_EXPLOSIVEFLAME_INSTANCE_WORK_ID_FLAG_RESERVE_MISS); + //} + //if !weapon.is_flag(*WEAPON_PALUTENA_EXPLOSIVEFLAME_INSTANCE_WORK_ID_FLAG_RESERVE_MISS) + //&& WeaponSpecializer_PalutenaExplosiveflame::is_touch_down(weapon.battle_object as *mut smash::app::Weapon) { + // weapon.on_flag(*WEAPON_PALUTENA_EXPLOSIVEFLAME_INSTANCE_WORK_ID_FLAG_RESERVE_MISS); + //} + } if weapon.is_flag(*WEAPON_PALUTENA_EXPLOSIVEFLAME_INSTANCE_WORK_ID_FLAG_RESERVE_MISS) { weapon.change_status(WEAPON_PALUTENA_EXPLOSIVEFLAME_STATUS_KIND_MISS.into(), false.into()); } - if weapon.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE) <= 0 { - weapon.change_status(statuses::palutena_explosiveflame::EXPLODE_KIRBY.into(), false.into()); + if life <= 0 { + weapon.change_status(WEAPON_PALUTENA_EXPLOSIVEFLAME_STATUS_KIND_EXPLODE.into(), false.into()); } return 0.into(); } -unsafe extern "C" fn check_kirby_end(weapon: &mut L2CWeaponCommon) -> L2CValue { - return 0.into(); -} - -unsafe extern "C" fn explode_kirby_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { +unsafe extern "C" fn explode_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { StatusModule::init_settings( weapon.module_accessor, app::SituationKind(*SITUATION_KIND_AIR), @@ -95,22 +102,22 @@ unsafe extern "C" fn explode_kirby_pre(weapon: &mut L2CWeaponCommon) -> L2CValue return 0.into(); } -unsafe extern "C" fn explode_kirby_main(weapon: &mut L2CWeaponCommon) -> L2CValue { +unsafe extern "C" fn explode_main(weapon: &mut L2CWeaponCommon) -> L2CValue { weapon.set_int(36, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); MotionModule::change_motion(weapon.module_accessor, Hash40::new("explode"), 0.0, 1.0, false, 0.0, false, false); if StopModule::is_stop(weapon.module_accessor) { - explode_kirby_main_substatus(weapon); + explode_main_substatus(weapon); } - weapon.global_table[SUB_STATUS2].assign(&L2CValue::Ptr(explode_kirby_main_substatus as *const () as _)); - weapon.fastshift(L2CValue::Ptr(explode_kirby_main_loop as *const () as _)) + weapon.global_table[SUB_STATUS2].assign(&L2CValue::Ptr(explode_main_substatus as *const () as _)); + weapon.fastshift(L2CValue::Ptr(explode_main_loop as *const () as _)) } -unsafe extern "C" fn explode_kirby_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { +unsafe extern "C" fn explode_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { return 0.into(); } -unsafe extern "C" fn explode_kirby_main_substatus(weapon: &mut L2CWeaponCommon) -> L2CValue { +unsafe extern "C" fn explode_main_substatus(weapon: &mut L2CWeaponCommon) -> L2CValue { weapon.dec_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE); if weapon.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LIFE) <= 0 { notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); @@ -119,18 +126,15 @@ unsafe extern "C" fn explode_kirby_main_substatus(weapon: &mut L2CWeaponCommon) return 0.into(); } -unsafe extern "C" fn explode_kirby_end(weapon: &mut L2CWeaponCommon) -> L2CValue { +unsafe extern "C" fn explode_end(weapon: &mut L2CWeaponCommon) -> L2CValue { return 0.into(); } pub fn install(agent: &mut Agent) { agent.status(Pre, *WEAPON_PALUTENA_EXPLOSIVEFLAME_STATUS_KIND_CHECK, check_pre); + agent.status(Main, *WEAPON_PALUTENA_EXPLOSIVEFLAME_STATUS_KIND_CHECK, check_main); - agent.status(Pre, statuses::palutena_explosiveflame::CHECK_KIRBY, check_kirby_pre); - agent.status(Main, statuses::palutena_explosiveflame::CHECK_KIRBY, check_kirby_main); - agent.status(End, statuses::palutena_explosiveflame::CHECK_KIRBY, check_kirby_end); - - agent.status(Pre, statuses::palutena_explosiveflame::EXPLODE_KIRBY, explode_kirby_pre); - agent.status(Main, statuses::palutena_explosiveflame::EXPLODE_KIRBY, explode_kirby_main); - agent.status(End, statuses::palutena_explosiveflame::EXPLODE_KIRBY, explode_kirby_end); + agent.status(Pre, *WEAPON_PALUTENA_EXPLOSIVEFLAME_STATUS_KIND_EXPLODE, explode_pre); + agent.status(Main, *WEAPON_PALUTENA_EXPLOSIVEFLAME_STATUS_KIND_EXPLODE, explode_main); + agent.status(End, *WEAPON_PALUTENA_EXPLOSIVEFLAME_STATUS_KIND_EXPLODE, explode_end); } \ No newline at end of file diff --git a/fighters/palutena/src/lib.rs b/fighters/palutena/src/lib.rs index 227e04721b..596e50075b 100644 --- a/fighters/palutena/src/lib.rs +++ b/fighters/palutena/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/palutena/src/meteor/acmd.rs b/fighters/palutena/src/meteor/acmd.rs index daceeb5d7c..c020a46ada 100644 --- a/fighters/palutena/src/meteor/acmd.rs +++ b/fighters/palutena/src/meteor/acmd.rs @@ -6,7 +6,7 @@ unsafe extern "C" fn game_move(agent: &mut L2CAgentBase) { let owner_module_accessor = &mut *sv_battle_object::module_accessor((agent.get_int(*WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32); if is_excute(agent) { GroundModule::set_passable_check(boma, true); - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 82, 30, 0, 67, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_palutena_bullet"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 82, 30, 0, 67, 5.25, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_palutena_bullet"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_ENERGY); AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_kick_hit_m")); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } diff --git a/fighters/palutena/src/meteor/status.rs b/fighters/palutena/src/meteor/status.rs index 094e10c570..9b9c2dbc3f 100644 --- a/fighters/palutena/src/meteor/status.rs +++ b/fighters/palutena/src/meteor/status.rs @@ -18,28 +18,20 @@ unsafe extern "C" fn move_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { } unsafe extern "C" fn move_init(weapon: &mut L2CWeaponCommon) -> L2CValue { - let angle: f32 = 66.0; let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; let palutena = utils::util::get_battle_object_from_id(owner_id); let palutena_boma = &mut *(*palutena).module_accessor; let life = WorkModule::get_param_int(weapon.module_accessor, hash40("param_meteor"), hash40("life_s")); - let speed_max = WorkModule::get_param_float(weapon.module_accessor, hash40("param_meteor"), hash40("speed_s")); let lr = PostureModule::lr(weapon.module_accessor); let owner_pos_x = PostureModule::pos_x(palutena_boma); let owner_pos_y = PostureModule::pos_y(palutena_boma); let owner_pos_z = PostureModule::pos_z(palutena_boma); - let speed_x = angle.to_radians().cos() * speed_max * lr; - let speed_y = angle.to_radians().sin() * speed_max; WorkModule::set_int(weapon.module_accessor, life, *WEAPON_INSTANCE_WORK_ID_INT_INIT_LIFE); WorkModule::set_int(weapon.module_accessor, life, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); - ModelModule::set_scale(weapon.module_accessor, 1.7); - weapon.clear_lua_stack(); - sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, speed_x, -speed_y); - sv_kinetic_energy!(set_stable_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, speed_x, -speed_y); - sv_kinetic_energy!(set_accel, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); - KineticModule::enable_energy(weapon.module_accessor, *WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL); + ModelModule::set_scale(weapon.module_accessor, 2.65); PostureModule::set_pos(weapon.module_accessor, &Vector3f::new(owner_pos_x + 5.0 * lr, owner_pos_y + 40.0, owner_pos_z)); - + speed_reset(weapon); + return 0.into(); } @@ -75,12 +67,15 @@ unsafe extern "C" fn move_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); weapon.pop_lua_stack(1); } - + return 0.into(); } unsafe extern "C" fn move_exec(weapon: &mut L2CWeaponCommon) -> L2CValue { WorkModule::dec_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); + if KineticModule::get_sum_speed_y(weapon.module_accessor, *WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL).abs() < 0.1 { + speed_reset(weapon); + } return 0.into(); } @@ -88,6 +83,20 @@ unsafe extern "C" fn move_end(weapon: &mut L2CWeaponCommon) -> L2CValue { return 0.into(); } +unsafe extern "C" fn speed_reset(weapon: &mut L2CWeaponCommon) -> L2CValue { + let angle: f32 = 66.0; + let speed_max = WorkModule::get_param_float(weapon.module_accessor, hash40("param_meteor"), hash40("speed_s")); + let lr = PostureModule::lr(weapon.module_accessor); + let speed_x = angle.to_radians().cos() * speed_max * lr; + let speed_y = angle.to_radians().sin() * speed_max; + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, speed_x, -speed_y); + sv_kinetic_energy!(set_stable_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, speed_x, -speed_y); + sv_kinetic_energy!(set_accel, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); + KineticModule::enable_energy(weapon.module_accessor, *WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL); + + return 0.into(); +} + pub fn install(agent: &mut Agent) { agent.status(Pre, statuses::palutena_meteor::MOVE, move_pre); agent.status(Init, statuses::palutena_meteor::MOVE, move_init); diff --git a/fighters/palutena/src/opff.rs b/fighters/palutena/src/opff.rs index 3971e36c13..df6d4c4a25 100644 --- a/fighters/palutena/src/opff.rs +++ b/fighters/palutena/src/opff.rs @@ -7,56 +7,6 @@ extern "Rust" { fn gimmick_flash(boma: &mut BattleObjectModuleAccessor); } -unsafe fn teleport_logic(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if fighter.is_status(*FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_3) { - if StatusModule::is_changing(boma) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL); - } - else { - // Consume double jump, except when Teleport is initiated on ground - VarModule::off_flag(boma.object(), vars::palutena::status::SPECIAL_HI_TELEPORT_AIR_START); - if boma.get_num_used_jumps() < boma.get_jump_count_max() - && !VarModule::is_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL) { - VarModule::on_flag(boma.object(), vars::common::instance::UP_SPECIAL_CANCEL); - VarModule::on_flag(boma.object(), vars::palutena::status::SPECIAL_HI_TELEPORT_AIR_START); - if !VarModule::is_flag(boma.object(), vars::palutena::instance::SPECIAL_HI_TELEPORT_GROUND_START) { - WorkModule::inc_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - } - } - } - } - // Actionability when double jump isn't burned - if fighter.status_frame() == 8 { - if VarModule::is_flag(boma.object(), vars::palutena::status::SPECIAL_HI_TELEPORT_AIR_START) { - CancelModule::enable_cancel(boma); - } - } - // wallride behavior - if GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_FLAG_SIDE as u32) { - if KineticModule::get_sum_speed_y(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) > 0.0 { - let wall_ride = Vector3f{x: 0.0, y: 1.0, z: 1.0}; - KineticModule::mul_speed(boma, &wall_ride, *FIGHTER_KINETIC_ENERGY_ID_STOP); - } - } - if StatusModule::is_changing(boma) && boma.is_situation(*SITUATION_KIND_GROUND) { - KineticModule::mul_speed(boma, &Vector3f::new(0.6, 1.0, 1.0), *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); - } - } -} - -unsafe fn dj_upB_jump_refresh(fighter: &mut L2CFighterCommon) { - if fighter.is_status(*FIGHTER_STATUS_KIND_JUMP_AERIAL) { - // If first 3 frames of dj - if fighter.status_frame() <= 3 { - VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_JUMP_REFRESH); - } - else { - VarModule::off_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_JUMP_REFRESH); - } - } -} - // Power Board Death Reset unsafe fn var_reset(fighter: &mut L2CFighterCommon) { if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_REBIRTH]) { @@ -136,17 +86,6 @@ unsafe fn power_board(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectMod } -unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { - if !fighter.is_in_hitlag() - && !StatusModule::is_changing(fighter.module_accessor) - && fighter.is_status_one_of(&[ - *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_3, - ]) - && fighter.is_situation(*SITUATION_KIND_AIR) { - fighter.sub_air_check_dive(); - } -} - pub extern "C" fn palu_power_board(fighter: &mut smash::lua2cpp::L2CFighterCommon) { unsafe { if !sv_information::is_ready_go() && fighter.status_frame() < 1 { @@ -162,12 +101,9 @@ pub extern "C" fn palu_power_board(fighter: &mut smash::lua2cpp::L2CFighterCommo } pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - teleport_logic(fighter, boma); var_reset(fighter); - dj_upB_jump_refresh(fighter); power_board(fighter, boma); color_charge(fighter); - fastfall_specials(fighter); } pub extern "C" fn palutena_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterCommon) { diff --git a/fighters/palutena/src/reflectionboard/acmd.rs b/fighters/palutena/src/reflectionboard/acmd.rs index 09591f838f..94a46e1453 100644 --- a/fighters/palutena/src/reflectionboard/acmd.rs +++ b/fighters/palutena/src/reflectionboard/acmd.rs @@ -18,14 +18,7 @@ unsafe extern "C" fn effect_break(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - if sv_animcmd::get_value_float(lua_state, *SO_VAR_FLOAT_LR) < 0.0 { - EFFECT(agent, Hash40::new("palutena_mirror_break"), Hash40::new("top"), 0, 2, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 0.8); - } - else { - EFFECT(agent, Hash40::new("palutena_mirror_break"), Hash40::new("top"), 0, 2, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 0.8); - } + EFFECT(agent, Hash40::new("palutena_mirror_break"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.48, 0, 0, 0, 0, 0, 0, true); } } diff --git a/fighters/palutena/src/status/landing.rs b/fighters/palutena/src/status/landing.rs new file mode 100644 index 0000000000..70a742fdc4 --- /dev/null +++ b/fighters/palutena/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.empty_landing"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.empty_landing"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/palutena/src/status/mod.rs b/fighters/palutena/src/status/mod.rs index 4a0f7e96ac..ed17cf971b 100644 --- a/fighters/palutena/src/status/mod.rs +++ b/fighters/palutena/src/status/mod.rs @@ -2,12 +2,14 @@ use super::*; use globals::*; // status script import +mod landing; mod special_hi; mod special_lw; mod special_n; mod special_s; unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + // once per airtime teleport actionability if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { VarModule::off_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL); @@ -23,6 +25,7 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { pub fn install(agent: &mut Agent) { agent.on_start(on_start); + landing::install(agent); special_hi::install(agent); special_lw::install(agent); special_n::install(agent); diff --git a/fighters/palutena/src/status/special_hi.rs b/fighters/palutena/src/status/special_hi.rs index bc3702966c..e977bb77c4 100644 --- a/fighters/palutena/src/status/special_hi.rs +++ b/fighters/palutena/src/status/special_hi.rs @@ -1,3 +1,5 @@ +use core::f32; + use super::*; unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -5,6 +7,16 @@ unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue fighter.set_int(move_time, *FIGHTER_PALUTENA_STATUS_SPECIAL_HI_WORK_INT_MOVE_XLU); notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_01) + -1); + // dj leniency window + let teleport_jump_aerial_refresh_frame = ParamModule::get_int(fighter.battle_object, ParamType::Common, "teleport_jump_aerial_refresh_frame"); + let jump_max = fighter.get_jump_count_max(); + if fighter.get_num_used_jumps() == jump_max && fighter.is_prev_status(*FIGHTER_STATUS_KIND_JUMP_AERIAL) && fighter.global_table[PREV_STATUS_FRAME].get_i32() <= teleport_jump_aerial_refresh_frame { + fighter.set_int(jump_max - 1, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + fighter.clear_lua_stack(); + lua_args!(fighter, Hash40::new("sys_jump_aerial"), true, true); + smash::app::sv_animcmd::EFFECT_OFF_KIND(fighter.lua_state_agent); + } + fighter.main_shift(special_hi_main_loop) } @@ -15,6 +27,8 @@ unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2C if StatusModule::is_changing(fighter.module_accessor) || StatusModule::is_situation_changed(fighter.module_accessor) { if fighter.is_situation(*SITUATION_KIND_GROUND) { + // set ground start + VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_TELEPORT_GROUND_START); GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); if fighter.is_flag(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_FLAG_MOT_CHANGE) { @@ -36,26 +50,10 @@ unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2C fighter.on_flag(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_FLAG_MOT_CHANGE); } } - // set ground start - if fighter.is_situation(*SITUATION_KIND_GROUND) { - VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_TELEPORT_GROUND_START); - } - else { - VarModule::off_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_TELEPORT_GROUND_START); - } } if MotionModule::is_end(fighter.module_accessor) { fighter.change_status(FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_2.into(), false.into()); } - // double jump leniency - if fighter.is_prev_status(*FIGHTER_STATUS_KIND_JUMP_AERIAL) - && VarModule::is_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_JUMP_REFRESH) { - // Grants 1 extra jump if all jumps used up - if fighter.get_num_used_jumps() == fighter.get_jump_count_max() { - WorkModule::dec_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - } - VarModule::off_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_JUMP_REFRESH); - } return 0.into(); } @@ -89,17 +87,69 @@ unsafe extern "C" fn special_hi2_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } +unsafe extern "C" fn angler(fighter: &mut L2CFighterCommon) -> L2CValue { + let stick_x = fighter.left_stick_x(); + let stick_y = fighter.left_stick_y(); + let mut length = sv_math::vec2_length(stick_x, stick_y); + let wrap_stick = fighter.get_param_float("param_special_hi", "special_hi_wrap_stick"); + + PostureModule::set_stick_lr(fighter.module_accessor, 0.0); + PostureModule::update_rot_y_lr(fighter.module_accessor); + let lr = fighter.lr(); + let mut angle = if length >= wrap_stick { + stick_y.atan2(stick_x * lr) + } else { + 90.0_f32.to_radians() + }; + let test_angle = if angle < f32::consts::PI {angle} else {angle - f32::consts::PI}; + let mut detach = false; + if test_angle < f32::consts::PI && test_angle > 0.0 { + detach = true; + } + let wrap_speed_multi = fighter.get_param_float("param_special_hi", "special_hi_wrap_speed_multi"); + let wrap_speed_add = fighter.get_param_float("param_special_hi", "special_hi_wrap_speed_add"); + let mut speed_x = 0.0; + let mut speed_y = wrap_speed_multi + wrap_speed_add; + // if angled w/ stick + if length > wrap_stick { + let length_mul = wrap_speed_multi * length; + let speed = length_mul + wrap_speed_add; + let cos = angle.cos(); + speed_x = speed * cos; + speed_x *= lr; + + let sin = angle.sin(); + speed_y = speed * sin; + } + // If teleport angle is upwards or you are already in air + // force airborne state + if detach || fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::set_attach_ground(fighter.module_accessor, false); + GroundModule::set_correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + KineticModule::unable_energy_all(fighter.module_accessor); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_FREE, speed_x, speed_y, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, -1.0, -1.0); + sv_kinetic_energy!(enable, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP); + HitModule::set_whole(fighter.module_accessor, HitStatus(*HIT_STATUS_XLU), 0); + GroundModule::clear_cliff_point(fighter.module_accessor); + 0.into() +} + unsafe extern "C" fn special_hi2_main(fighter: &mut L2CFighterCommon) -> L2CValue { HitModule::set_whole(fighter.module_accessor, HitStatus(*HIT_STATUS_XLU), 0); VisibilityModule::set_whole(fighter.module_accessor, false); notify_event_msc_cmd!(fighter, Hash40::new_raw(0x1f20a9d549), false); fighter.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NAME_CURSOR); GroundModule::set_passable_check(fighter.module_accessor, true); - let cliff_check = fighter.get_int(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_WORK_INT_CLIFF_CHECK); - fighter.sub_fighter_cliff_check(cliff_check.into()); + fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_NONE.into()); if !StopModule::is_stop(fighter.module_accessor) { sub_special_hi2(fighter, false.into()); } + angler(fighter); fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_special_hi2 as *const () as _)); fighter.main_shift(special_hi2_main_loop) @@ -132,6 +182,9 @@ unsafe extern "C" fn special_hi2_main_loop(fighter: &mut L2CFighterCommon) -> L2 if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } + // floor ride + special_hi_2_check_ground(fighter); + let frame = fighter.get_int(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_WORK_INT_FRAME); let move_time = fighter.get_param_int("param_special_hi", "special_hi_move_time"); if frame >= move_time { @@ -142,42 +195,111 @@ unsafe extern "C" fn special_hi2_main_loop(fighter: &mut L2CFighterCommon) -> L2 if StatusModule::is_changing(fighter.module_accessor) || StatusModule::is_situation_changed(fighter.module_accessor) { fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + // slide-offs keep jump + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND + && GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) { // prevent weird interactions with sloped ledge? + VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_TELEPORT_GROUND_START); + } } } - if StatusModule::is_changing(fighter.module_accessor) { - if !VarModule::is_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_TELEPORT_GROUND_START) - && !(fighter.get_num_used_jumps() < fighter.get_jump_count_max()) { - VarModule::on_flag(fighter.battle_object, vars::palutena::status::SPECIAL_HI_TELEPORT_AIR_START); - } - } - // wallride behavior + + return 0.into(); +} + +// Copies nasty vanilla math +// with adjusted logic to control wall-ride/floor-ride behavior +unsafe extern "C" fn special_hi_2_check_ground(fighter: &mut L2CFighterCommon) { let init_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_X); let init_speed_y = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_Y); - if GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_SIDE as u32) - || (!GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_ID_NONE as u32) && init_speed_x.abs() <= 0.01) { - if !VarModule::is_flag(fighter.battle_object, vars::common::status::IS_TELEPORT_WALL_RIDE) { - VarModule::on_flag(fighter.battle_object, vars::common::status::IS_TELEPORT_WALL_RIDE); - } + let floor_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_FLOOR_SPEED_X); + if floor_speed_x.abs() > 0.0 && init_speed_y < 0.0 && init_speed_x.abs() > 0.0 + && (GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) && !GroundModule::is_passable_ground(fighter.module_accessor)) { + // Travel speed for diagonally-down floor-rides + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, floor_speed_x, 0.0, 0.0); + } else { + // Travel speed for all other scenarios + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, init_speed_x, init_speed_y, 0.0); } - if GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_SIDE as u32) { - if init_speed_y > 0.0 { - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, init_speed_y); - } - } else if VarModule::is_flag(fighter.battle_object, vars::common::status::IS_TELEPORT_WALL_RIDE) { - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, init_speed_x, init_speed_y); + // If on a platform, + // skip floor-ride speed redirection + if GroundModule::is_passable_check(fighter.module_accessor) && GroundModule::is_passable_ground(fighter.module_accessor) { + return; } - // Allow turnaround based on stick position when reappearing - if MotionModule::is_end(fighter.module_accessor) { - PostureModule::set_stick_lr(fighter.module_accessor, 0.0); - PostureModule::update_rot_y_lr(fighter.module_accessor); + let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed = Vector2f {x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; + // If not a diagonally-down teleport, + // or if already grounded, + // skip floor-ride speed redirection + if !GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) + || (speed.x.abs() < 0.001 || speed.y > -0.001) + || fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_AIR { + return; } - // Prevent actionability toggle when touching ground during the travel - if GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) - && !VarModule::is_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL) - && VarModule::is_flag(fighter.battle_object, vars::palutena::status::SPECIAL_HI_TELEPORT_AIR_START) { - VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL); + // Compute a new ground-aligned velocity vector + // for intended floor-ride speed redirection + // + // Only intended to run on the first frame you land during the travel + let mut length = sv_math::vec3_length(speed.x, speed.y, 0.0); + if length > 0.0 { + let touch_x = GroundModule::get_touch_normal_x(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); + let touch_y = GroundModule::get_touch_normal_y(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); + + let touch = fighter.Vector3__create(touch_x.into(), touch_y.into(), 0.0_f32.into()); + let something = fighter.Vector3__create(0.0_f32.into(), 0.0_f32.into(), 1.0_f32.into()); + let mut cross = fighter.Vector3__cross(touch.clone(), something); + + let math = 1.0 / length; + let speed_mul = Vector3f { + x: speed.x * math, + y: speed.y * math, + z: 0.0, + }; + let mut final_dot = sv_math::vec3_dot(cross["x"].get_f32(), cross["y"].get_f32(), cross["z"].get_f32(), speed_mul.x, speed_mul.y, speed_mul.z); + if -0.00001 <= final_dot && final_dot <= 0.00001 { + final_dot = sv_math::vec3_dot(cross["x"].get_f32(), cross["y"].get_f32(), cross["z"].get_f32(), fighter.lr(), 0.0, 0.0); + } + + if final_dot < 0.0 { + let x = cross["x"].get_f32(); + let y = cross["y"].get_f32(); + let z = cross["z"].get_f32(); + cross["x"].assign(&L2CValue::F32(x * -1.0)); + cross["y"].assign(&L2CValue::F32(y * -1.0)); + cross["z"].assign(&L2CValue::F32(z * -1.0)); + } + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, cross["x"].get_f32() * length, cross["y"].get_f32() * length, cross["z"].get_f32() * length); + // set new speed to be reapplied each frame + VarModule::set_float(fighter.battle_object, vars::common::status::TELEPORT_FLOOR_SPEED_X, cross["x"].get_f32() * length); } +} +unsafe extern "C" fn special_hi2_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { + // enable cancel + VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL); + if fighter.get_num_used_jumps() < fighter.get_jump_count_max() { + VarModule::off_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL); + } + // dj resource handling + if !VarModule::is_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_TELEPORT_GROUND_START) { + let jump_max = fighter.get_jump_count_max(); + fighter.set_int(jump_max, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + } + VarModule::off_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_TELEPORT_GROUND_START); + } + // reverse re-appearance + if StatusModule::status_kind_next(fighter.module_accessor) == *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_3 { + //if !VarModule::is_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL) { + if fighter.left_stick_x() * fighter.lr() + <= fighter.get_param_float("common", "turn_stick_x") { + // prevents turning around with buffered aerials + PostureModule::reverse_lr(fighter.module_accessor); + PostureModule::update_rot_y_lr(fighter.module_accessor); + } + //} + } else { + VisibilityModule::set_whole(fighter.module_accessor, true); + } return 0.into(); } @@ -210,11 +332,145 @@ unsafe extern "C" fn special_hi3_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } +// changed to work like zelda's but with additional max_speed params instead of purely relying on muls +unsafe extern "C" fn special_hi3_init(fighter: &mut L2CFighterCommon) -> L2CValue { + let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let mut speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let wrap_xy_speed = fighter.get_param_float("param_special_hi", "special_hi_wrap_xy_speed"); + let special_hi_wrap_x_max = fighter.get_param_float("param_special_hi", "special_hi_wrap_x_max"); + KineticModule::clear_speed_all(fighter.module_accessor); + if fighter.global_table[SITUATION_KIND] == *SITUATION_KIND_GROUND { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + lua_bind::KineticEnergy::reset_energy(stop_energy, *ENERGY_STOP_RESET_TYPE_GROUND, &Vector2f{x: speed_x*wrap_xy_speed, y: 0.0}, &Vector3f::zero(), fighter.module_accessor); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, special_hi_wrap_x_max, -1.0); + } else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP_X_NORMAL_MAX); + lua_bind::KineticEnergy::reset_energy(stop_energy, *ENERGY_STOP_RESET_TYPE_AIR, &Vector2f{x: speed_x*wrap_xy_speed, y: speed_y*wrap_xy_speed}, &Vector3f::zero(), fighter.module_accessor); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + let special_hi_fall_y_max = fighter.get_param_float("param_special_hi", "special_hi_fall_y_max"); + let air_speed_x_stable = fighter.get_param_float("air_speed_x_stable", ""); + let special_hi_fall_x_mull_value = fighter.get_param_float("param_special_hi", "special_hi_fall_x_mull_value"); + let mut x_cap = air_speed_x_stable * special_hi_fall_x_mull_value; + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, x_cap, special_hi_fall_y_max); + } + VisibilityModule::set_whole(fighter.module_accessor, true); + 0.into() +} + +unsafe extern "C" fn special_hi3_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.set_int(*SITUATION_KIND_GROUND, *FIGHTER_PALUTENA_STATUS_SPECIAL_HI_WORK_INT_START_SITUATION); + MotionModule::change_motion(fighter.module_accessor, "special_hi".to_hash(), 0.0, 1.0, false, 0.0, false, false); + } else { + fighter.set_int(*SITUATION_KIND_AIR, *FIGHTER_PALUTENA_STATUS_SPECIAL_HI_WORK_INT_START_SITUATION); + if !VarModule::is_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL) { + MotionModule::change_motion(fighter.module_accessor, "special_air_hi_cancel".to_hash(), 0.0, 1.0, false, 0.0, false, false); + VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); + } else { + MotionModule::change_motion(fighter.module_accessor, "special_air_hi".to_hash(), 0.0, 1.0, false, 0.0, false, false); + let landing_lag = fighter.get_param_float("param_special_hi", "special_hi_landing_frame"); + fighter.set_float(landing_lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + // special fall speed + let x_max = fighter.get_param_float("param_special_hi", "special_hi_fall_x_mull_value"); + fighter.set_float(x_max, *FIGHTER_INSTANCE_WORK_ID_FLOAT_FALL_X_MAX_MUL); + } + } + fighter.main_shift(special_hi3_main_loop) +} + +unsafe extern "C" fn special_hi3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + let control = ControlModule::get_attack_air_kind(fighter.module_accessor); + if control == *FIGHTER_COMMAND_ATTACK_AIR_KIND_NONE { + FighterControlModuleImpl::update_attack_air_kind(fighter.module_accessor, true); + } // ? + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()) + } else { + // special fall based on resource + if fighter.is_motion(Hash40::new("special_air_hi_cancel")) { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()) + } else { + fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()) + } + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + if fighter.is_motion(Hash40::new("special_air_hi_cancel")) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.empty_landing"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + } + fighter.change_status(FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL.into(), false.into()) + } else { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()) + } + } + // momentum and fastfall + if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { + reappearance_decel_drift(fighter); + } + return 0.into(); +} + +unsafe extern "C" fn reappearance_decel_drift(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_air_check_dive(); + // drift / fastfall enable flag (bypass manual enabling) + if fighter.is_flag(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_DIVE) { + fighter.sub_air_check_dive(); + } + // bypass manual drift code + if fighter.is_flag(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_CONTROL_ON) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + fighter.off_flag(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_CONTROL_ON); + } + // stall on re-appearance + gravity enable and speed limits + if !fighter.global_table[IS_STOPPING].get_bool() && KineticModule::get_kinetic_type(fighter.module_accessor) != *FIGHTER_KINETIC_TYPE_MOTION_FALL { //only runs the capping stuff before she can drift and fastfall + if !fighter.is_flag(*FIGHTER_PALUTENA_STATUS_SPECIAL_HI_DIVE) { + let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed = Vector2f{x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; + let hi3_brake_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.hi3_brake_y_mul"); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x, speed.y * hi3_brake_y_mul); + } else { + if !KineticModule::is_enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) { + let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed_y = lua_bind::KineticEnergy::get_speed_y(stop_energy); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + let air_speed_x_stable = fighter.get_param_float("air_speed_x_stable", ""); + let special_hi_fall_x_mull_value = fighter.get_param_float("param_special_hi", "special_hi_fall_x_mull_value"); + let mut x_cap = air_speed_x_stable * special_hi_fall_x_mull_value; + sv_kinetic_energy!(set_limit_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, x_cap, 0.0); + } // only set limits and enable gravity once + } + } + return 0.into(); +} + + pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_main); agent.status(Pre, *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_2, special_hi2_pre); agent.status(Main, *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_2, special_hi2_main); + agent.status(End, *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_2, special_hi2_end); agent.status(Pre, *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_3, special_hi3_pre); + agent.status(Init, *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_3, special_hi3_init); + agent.status(Main, *FIGHTER_PALUTENA_STATUS_KIND_SPECIAL_HI_3, special_hi3_main); } \ No newline at end of file diff --git a/fighters/palutena/src/status/special_n.rs b/fighters/palutena/src/status/special_n.rs index 4780c87b9e..72b763a0f0 100644 --- a/fighters/palutena/src/status/special_n.rs +++ b/fighters/palutena/src/status/special_n.rs @@ -258,7 +258,8 @@ unsafe extern "C" fn special_n_main_loop_common(fighter: &mut L2CFighterCommon, fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } } - return 0.into() + + return 0.into(); } unsafe extern "C" fn special_n_end_common(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -338,7 +339,41 @@ unsafe extern "C" fn special_n_p_main(fighter: &mut L2CFighterCommon) -> L2CValu } unsafe extern "C" fn special_n_p_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - special_n_main_loop_common(fighter, hash40("special_n_p"), hash40("special_air_n_p")) + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + fighter.sub_air_check_dive(); + if fighter.motion_frame() >= 18.0 { + fighter.check_land_cancel(Some(14.0)); + } + if !StatusModule::is_changing(fighter.module_accessor) + && StatusModule::is_situation_changed(fighter.module_accessor) { + palutena_special_n_momentum_helper(fighter, false.into()); + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_n_p"), -1.0, 1.0, 0.0, false, false); + } + else { + GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_n_p"), -1.0, 1.0, 0.0, false, false); + } + } + + if MotionModule::is_end(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + } + else { + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + } + } + + return 0.into(); } unsafe extern "C" fn special_n_p_end(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -358,67 +393,181 @@ unsafe extern "C" fn special_n_o_main_loop(fighter: &mut L2CFighterCommon) -> L2 } // green: spin attack -unsafe extern "C" fn special_n_g_init(fighter: &mut L2CFighterCommon) -> L2CValue { - palutena_special_n_momentum_helper(fighter, true.into()); - let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y); - if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); - } - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); +unsafe extern "C" fn special_n_g_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_status_pre_SpecialNCommon(); + + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_MOTION_FALL, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + 0.into() +} - let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); - let air_accel_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_mul"), 0); - let air_accel_x_add = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_add"), 0); - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * 0.4, 0.0); - sv_kinetic_energy!(controller_set_accel_x_mul, fighter, air_accel_x_mul); - sv_kinetic_energy!(controller_set_accel_x_add, fighter, air_accel_x_add); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.0, 0.0); - KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); +unsafe extern "C" fn special_n_g_init(fighter: &mut L2CFighterCommon) -> L2CValue { + // force airborne + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); + VarModule::on_flag(fighter.battle_object, vars::common::status::DISABLE_ECB_SHIFT); + // start speed mul + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, speed_y * 0.7, 0.0, 0.0, 0.0); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, speed_x * 0.7, 0.0, 0.0, 0.0, 0.0); + // tweak until it feels good idk + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -0.07); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.7); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.7, 0.0); return 0.into(); } unsafe extern "C" fn special_n_g_main(fighter: &mut L2CFighterCommon) -> L2CValue { - special_n_main_common(fighter, hash40("special_n_g"), hash40("special_air_n_g")); - + VarModule::set_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_LOOP, 1); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n_g_start"), 0.0, 1.0, false, 0.0, false, false); fighter.main_shift(special_n_g_main_loop) } unsafe extern "C" fn special_n_g_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - special_n_main_loop_common(fighter, hash40("special_n_g"), hash40("special_air_n_g")); - if fighter.is_situation(*SITUATION_KIND_AIR) { - let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - if speed_y < 0.0 { - let speed_y_stable = fighter.get_param_float("air_speed_y_stable", ""); - let accel_y = fighter.get_param_float("air_accel_y", ""); - if speed_y.abs() > speed_y_stable * 0.5 { - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -speed_y_stable * 0.5); + // end portion + if fighter.is_motion_one_of(&[Hash40::new("special_n_g_end"), Hash40::new("special_air_n_g_end")]) { + return special_n_g_end_main_loop(fighter).into(); + } + // rise portion + if fighter.is_motion(Hash40::new("special_n_g_loop")) { + return special_n_g_rise_main_loop(fighter).into(); + } + // start portion + if fighter.is_motion(Hash40::new("special_n_g_start")) { + return special_n_g_start_main_loop(fighter).into(); + } + return 0.into(); +} + +unsafe extern "C" fn special_n_g_start_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if MotionModule::is_end(fighter.module_accessor) { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n_g_loop"), 0.0, 1.0, false, 0.0, false, false); + VarModule::on_flag(fighter.battle_object, vars::palutena::instance::SPECIAL_N_FLUSH_BOARD); + } + return 1.into(); +} + +unsafe extern "C" fn special_n_g_rise_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + let timer = VarModule::get_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_BUTTON_TIMER); + let loop_count = VarModule::get_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_LOOP); + // repeat loop if hop initiated in last 12 frames + if MotionModule::is_end(fighter.module_accessor) { + VarModule::inc_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_LOOP); + if timer >= -7 + && loop_count < 2 { + // loop + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_n_g_loop"), 0.0, 1.0, false, 0.0, false, false); + } else { + //VarModule::off_flag(fighter.battle_object, vars::common::status::DISABLE_ECB_SHIFT); + VarModule::set_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_BUTTON_TIMER, 0); + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + // check if gr, kinetics + let ground = if GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) && speed_y < 0.001 {true} else {false}; + if ground { + StatusModule::set_situation_kind(fighter.module_accessor, SituationKind(*SITUATION_KIND_GROUND), false); + fighter.global_table[SITUATION_KIND].assign(&L2CValue::I32(*SITUATION_KIND_GROUND)); + // gr momentum transfer + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_UNIQ); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, speed_x*1.5, 0.0, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, -1.0, -1.0); + let ground_brake = fighter.get_param_float("ground_brake", ""); + sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ground_brake / 2.0, 0.0); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } else { + // pop up finisher + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, (speed_y + 0.5).clamp(-0.5, 1.0)); } - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -accel_y * 0.5); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y_stable * 0.5); - sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y_stable * 0.5); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *GROUND_CORRECT_KIND_AIR); + fighter.change_motion_by_situation("special_n_g_end", "special_air_n_g_end", 0.0, 1.0, false, 0.0, false, false); + return 1.into(); } } + if !StopModule::is_stop(fighter.module_accessor) { + // during rising spin, press special to rise + if timer <= 0 { + if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + VarModule::set_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_BUTTON_TIMER, 5); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let ground = if GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) && speed_y < 0.001 {true} else {false}; + let add_y = if ground {1.5} else {0.9}; // rise off ground easier + let max_y = if ground {1.5} else {1.2 - 0.0875*(loop_count as f32)}; // slower rise the longer the move goes on, 1.1125-0.85 + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, (speed_y + add_y).min(max_y)); + } + } + VarModule::dec_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_BUTTON_TIMER); + } + + return 0.into(); +} +unsafe extern "C" fn special_n_g_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + //fighter.sub_transition_group_check_air_cliff(); + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + // only fastfall when actionable + fighter.sub_air_check_dive(); + } + // cut speed on hitbox clear + if VarModule::get_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_BUTTON_TIMER) == 1 { + VarModule::set_int(fighter.battle_object, vars::palutena::status::SPECIAL_N_GREEN_BUTTON_TIMER, -1); + if !fighter.is_situation(*SITUATION_KIND_GROUND) { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, speed_y * 0.4, 0.0, 0.0, 0.0); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, speed_x * 0.4, 0.0, 0.0, 0.0, 0.0); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.sub_change_kinetic_type_by_situation(FIGHTER_KINETIC_TYPE_GROUND_STOP.into(), FIGHTER_KINETIC_TYPE_MOTION_FALL.into()); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *GROUND_CORRECT_KIND_AIR); + fighter.change_motion_inherit_frame_by_situation("special_n_g_end", "special_air_n_g_end", -1.0, 1.0, 0.0, false, false); + } return 0.into(); } + unsafe extern "C" fn special_n_g_end(fighter: &mut L2CFighterCommon) -> L2CValue { + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_club_tornado"), true, true); STOP_SE(fighter, Hash40::new("se_item_club_wind")); special_n_end_common(fighter) } -unsafe extern "C" fn special_n_g_exit(fighter: &mut L2CFighterCommon) -> L2CValue { - STOP_SE(fighter, Hash40::new("se_item_club_wind")); - return 0.into() -} pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_pre); @@ -451,9 +600,8 @@ pub fn install(agent: &mut Agent) { agent.status(Main, statuses::palutena::SPECIAL_N_O, special_n_o_main); agent.status(End, statuses::palutena::SPECIAL_N_O, special_n_end_common); - agent.status(Pre, statuses::palutena::SPECIAL_N_G, special_n_color_pre); + agent.status(Pre, statuses::palutena::SPECIAL_N_G, special_n_g_pre); agent.status(Init, statuses::palutena::SPECIAL_N_G, special_n_g_init); agent.status(Main, statuses::palutena::SPECIAL_N_G, special_n_g_main); agent.status(End, statuses::palutena::SPECIAL_N_G, special_n_g_end); - agent.status(Exit, statuses::palutena::SPECIAL_N_G, special_n_g_exit); } \ No newline at end of file diff --git a/fighters/palutena/src/status/special_s.rs b/fighters/palutena/src/status/special_s.rs index 6d56ad3a28..0e32999bc9 100644 --- a/fighters/palutena/src/status/special_s.rs +++ b/fighters/palutena/src/status/special_s.rs @@ -1,6 +1,6 @@ use super::*; -unsafe extern "C" fn special_n_color_pre(fighter: &mut L2CFighterCommon) -> L2CValue { +unsafe extern "C" fn special_s_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), @@ -8,9 +8,9 @@ unsafe extern "C" fn special_n_color_pre(fighter: &mut L2CFighterCommon) -> L2CV *GROUND_CORRECT_KIND_KEEP as u32, app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), true, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, - *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_PALUTENA_SPECIAL_S_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_PALUTENA_SPECIAL_S_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_PALUTENA_SPECIAL_S_FLOAT, 0 ); FighterStatusModuleImpl::set_fighter_status_data( @@ -20,9 +20,9 @@ unsafe extern "C" fn special_n_color_pre(fighter: &mut L2CFighterCommon) -> L2CV false, false, false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON | *FIGHTER_LOG_MASK_FLAG_SHOOT) as u64, *FIGHTER_STATUS_ATTR_START_TURN as u32, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, 0 ); 0.into() @@ -90,8 +90,8 @@ unsafe extern "C" fn special_s_init(fighter: &mut L2CFighterCommon) -> L2CValue unsafe extern "C" fn special_s_momentum_helper(fighter: &mut L2CFighterCommon, start: L2CValue) { let mut speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); if start.get_bool() { - let special_n_speed_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("special_s_speed_x_mul")); - speed_x *= special_n_speed_x_mul; + let special_s_speed_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("special_s_speed_x_mul")); + speed_x *= special_s_speed_x_mul; } let reset_type = if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { @@ -160,7 +160,8 @@ unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s"), 0.0, 1.0, false, 0.0, false, false); } - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x37b6ecdcec)); + //notify_event_msc_cmd!(fighter, Hash40::new_raw(0x37b6ecdcec)); + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_PALUTENA_GENERATE_ARTICLE_EXPLOSIVEFLAME, false, -1); fighter.main_shift(special_s_main_loop) } @@ -200,6 +201,7 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV } pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_init); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); } \ No newline at end of file diff --git a/fighters/peach/Cargo.toml b/fighters/peach/Cargo.toml index b2583ff42d..e9406720b6 100644 --- a/fighters/peach/Cargo.toml +++ b/fighters/peach/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/peach/src/acmd/aerials.rs b/fighters/peach/src/acmd/aerials.rs index c023a4d2d2..34f398e767 100644 --- a/fighters/peach/src/acmd/aerials.rs +++ b/fighters/peach/src/acmd/aerials.rs @@ -36,7 +36,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); MotionModule::set_rate(boma, (16.2 - 1.0)/15.0); frame(lua_state, 15.0); - if is_excute(agent) {//1-14 + if is_excute(agent) { // 1-14 agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 16.2); @@ -44,7 +44,8 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 14.0, 361, 80, 0, 50, 3.3, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("arml"), 14.0, 361, 80, 0, 50, 3.3, 0.2, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("arml"), 15.5, 361, 83, 0, 50, 3.7, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("arml"), 15.5, 361, 83, 0, 50, 3.7, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + AttackModule::set_optional_hit_sound(boma, 2, Hash40::new("se_common_sword_hit_l")); } frame(lua_state, 23.0); MotionModule::set_rate(boma, 1.0); @@ -67,10 +68,12 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 361, 107, 0, 10, 6.0, 0.0, 8.0, -5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); + AttackModule::set_optional_hit_effect(boma, 0, Hash40::new("peach_attack_heart")); } frame(lua_state, 8.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 361, 85, 0, 10, 6.0, 0.0, 8.0, -5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); + AttackModule::set_optional_hit_effect(boma, 0, Hash40::new("peach_attack_heart")); } frame(lua_state, 20.0); if is_excute(agent) { @@ -193,8 +196,8 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 12.0); for _ in 0..3 { if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 79, 45, 0, 19, 5.3, 0.0, -1.1, 1.1, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 366, 45, 0, 19, 4.7, 0.0, 4.0, -0.4, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 78, 45, 0, 19, 5.0, 0.0, -1.0, 0.5, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 366, 45, 0, 19, 4.3, 0.0, 4.3, -0.25, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); if is_excute(agent) { @@ -203,8 +206,8 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { wait(lua_state, 4.0); } if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 79, 120, 0, 40, 6.2, 0.0, -1.1, 1.1, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 79, 120, 0, 40, 5.5, 0.0, 4.0, -0.4, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 78, 120, 0, 40, 5.8, 0.0, -0.8, 0.5, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 78, 120, 0, 40, 5.1, 0.0, 4.0, -0.25, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/peach/src/acmd/ground.rs b/fighters/peach/src/acmd/ground.rs index 0a4eb6d018..4b153ab878 100644 --- a/fighters/peach/src/acmd/ground.rs +++ b/fighters/peach/src/acmd/ground.rs @@ -8,8 +8,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 74, 60, 0, 20, 2.5, 0.0, 9.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PEACH_BINTA, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 74, 60, 0, 20, 2.5, 0.0, 9.0, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PEACH_BINTA, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 74, 60, 0, 20, 3.5, 0.0, 9.0, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PEACH_BINTA, *ATTACK_REGION_PUNCH); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 3.0, 0.0, 3.5, 5.0, Some(0.0), Some(3.5), Some(10.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PEACH_BINTA, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 1.0); if is_excute(agent) { @@ -34,10 +35,10 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("bust"), 4.0, 20, 25, 0, 30, 3.0, -1.0, 0.75, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 25, 25, 0, 30, 3.2, 0.0, 7.0, 2.8, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); - //ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 85, 40, 0, 15, 4.0, 0.0, 6.5, 8.6, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 366, 25, 0, 30, 4.0, 0.0, 6.5, 8.6, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("bust"), 4.0, 20, 10, 0, 30, 3.0, -1.0, 1.0, 0.0, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 20, 10, 0, 30, 3.5, 0.0, 6.5, 3.0, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 100, 10, 0, 30, 4.2, 0.0, 6.0, 8.2, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 100, 0, 0, 22, 4.2, 0.0, 6.0, 8.2, None, None, None, 0.75, 0.75, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); } frame(lua_state, 10.0); if is_excute(agent) { @@ -45,9 +46,9 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("bust"), 6.5, 68, 90, 0, 68, 3.2, -1.0, 0.75, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.5, 68, 90, 0, 68, 4.1, 0.0, 7.0, 2.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.5, 80, 90, 0, 68, 5.6, 0.0, 7.5, 8.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("bust"), 6.5, 63, 105, 0, 55, 3.5, -0.75, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.5, 63, 105, 0, 55, 4.0, 0.0, 7.1, 2.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.5, 56, 105, 0, 55, 5.2, 0.0, 7.2, 8.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PUNCH); } frame(lua_state, 20.0); if is_excute(agent) { @@ -61,7 +62,7 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); - EFFECT_FOLLOW(agent, Hash40::new("peach_attack_impact"), Hash40::new("trans"), 0, 7.5, 8.3, 0, 90, 0, 1.0, true); + EFFECT_FOLLOW(agent, Hash40::new("peach_attack_impact"), Hash40::new("trans"), 0, 7.2, 7.9, 0, 90, 0, 1.0, true); let effect = EffectModule::get_last_handle(boma) as u64; VarModule::set_int64(agent.battle_object, vars::peach::status::EFFECT_HANDLER, effect); LAST_EFFECT_SET_RATE(agent, 11.0/10.0); @@ -71,7 +72,7 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { FOOT_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); let effect = VarModule::get_int64(agent.battle_object, vars::peach::status::EFFECT_HANDLER); EffectModule::set_rate(boma, effect as u32, 1.5); - EffectModule::set_scale(boma, effect as u32, &Vector3f::new(0.65, 0.65, 0.65)); + EffectModule::set_scale(boma, effect as u32, &Vector3f::new(0.59, 0.59, 0.59)); } frame(lua_state, 17.0); if is_excute(agent) { diff --git a/fighters/peach/src/acmd/other.rs b/fighters/peach/src/acmd/other.rs index 89f7711545..de581c49f2 100644 --- a/fighters/peach/src/acmd/other.rs +++ b/fighters/peach/src/acmd/other.rs @@ -64,16 +64,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -84,43 +80,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { agent.on_flag(*FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } -} - -unsafe extern "C" fn game_itemlightthrowf(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 8.0); - if is_excute(agent) { - if !VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { - agent.clear_lua_stack(); - lua_args!(agent, 12, 10, *ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_ANGLE, *ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_SPEED, *ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER); - sv_animcmd::THROW_ITEM_OFFSET(agent.lua_state_agent); - } - } - frame(lua_state, 9.0);//match anim to trajectory better - if is_excute(agent) { - if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { - let have_item = ItemModule::get_have_item_id(boma, 0) as u32; - let have_item_boma = sv_battle_object::module_accessor(have_item); - ItemModule::throw_item(boma, 53.0, 2.0, 1.0, 0, true, agent.get_float(*ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER)); - PostureModule::add_pos_2d(have_item_boma, &Vector2f {x: (4.0 * agent.lr()), y: 1.3}); - } - } -} -unsafe extern "C" fn sound_itemlightthrowf(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 9.0); - if is_excute(agent) { - if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { - PLAY_SE(agent, Hash40::new("se_item_item_throw")); - } - } } pub fn install(agent: &mut Agent) { @@ -137,9 +97,4 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_escapeair", game_escapeair, Priority::Low); agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); - - agent.acmd("game_itemlightthrowf", game_itemlightthrowf, Priority::Low); - agent.acmd("sound_itemlightthrowf", sound_itemlightthrowf, Priority::Low); - agent.acmd("game_itemlightthrowairf", game_itemlightthrowf, Priority::Low); - agent.acmd("sound_itemlightthrowairf", sound_itemlightthrowf, Priority::Low); } diff --git a/fighters/peach/src/acmd/smashes.rs b/fighters/peach/src/acmd/smashes.rs index 000e12ca63..d068ee3d53 100644 --- a/fighters/peach/src/acmd/smashes.rs +++ b/fighters/peach/src/acmd/smashes.rs @@ -75,14 +75,18 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("handr"), 18.0, 90, 84, 0, 40, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_MAGIC); ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 14.0, 84, 94, 0, 40, 4.25, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 135, 100, 90, 0, 3.6, 0.0, 8.0, 6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_MAGIC); - ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 135, 100, 90, 0, 3.6, 0.0, 8.0, -6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_MAGIC); + ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 133, 100, 99, 0, 3.6, 0.0, 8.0, -6.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_MAGIC); + AttackModule::set_optional_hit_effect(boma, 0, Hash40::new("peach_attack_heart")); + AttackModule::set_optional_hit_effect(boma, 1, Hash40::new("peach_attack_heart")); } frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handr"), 10.0, 75, 125, 0, 20, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 10.0, 75, 125, 0, 20, 4.25, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("handr"), 10.0, 79, 125, 0, 25, 5.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 10.0, 79, 125, 0, 25, 4.25, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_MAGIC); AttackModule::clear(boma, 2, false); AttackModule::clear(boma, 3, false); + AttackModule::set_optional_hit_effect(boma, 0, Hash40::new("peach_attack_heart")); + AttackModule::set_optional_hit_effect(boma, 1, Hash40::new("peach_attack_heart")); } frame(lua_state, 23.0); if is_excute(agent) { @@ -119,9 +123,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); for _ in 0..5 { if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 0, 100, 20, 0, 3.5, -2.5, 2.0, 0.0, Some(2.5), Some(2.0), Some(0.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 180, 100, 25, 0, 4.5, -2.5, 2.0, 7.5, Some(2.5), Some(2.0), Some(7.5), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 180, 100, 25, 0, 4.5, -2.5, 2.0, -7.5, Some(2.5), Some(2.0), Some(-7.5), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 0, 100, 20, 0, 3.5, -2.5, 3.0, 0.0, Some(2.5), Some(3.0), Some(0.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 180, 100, 25, 0, 3.25, -2.5, 2.5, 7.5, Some(2.5), Some(2.5), Some(7.5), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 180, 100, 25, 0, 3.25, -2.5, 2.5, -7.5, Some(2.5), Some(2.5), Some(-7.5), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -132,7 +136,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 28.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 151, 0, 47, 4.5, 0.0, 1.8, 8.25, Some(0.0), Some(1.8), Some(-8.25), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 151, 0, 47, 3.75, 0.0, 2.75, -7.5, Some(0.0), Some(2.75), Some(7.5), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 31.0); @@ -153,43 +157,43 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("peach_smash_arc"), Hash40::new("top"), 0, 1.8, 0.0, 90.0 + 90.0*boma.lr(), -55, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 1.33, 2.2); - LAST_EFFECT_SET_SCALE_W(agent, 0.95, 1.55, 0.95); + LAST_EFFECT_SET_SCALE_W(agent, 0.9, 1.55, 0.9); } frame(lua_state, 8.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("peach_smash_arc"), Hash40::new("top"), 0, 1.8, 0, 90.0 + 90.0*boma.lr(), 100, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 1.33, 2.2); - LAST_EFFECT_SET_SCALE_W(agent, 0.95, 1.55, 0.95); + LAST_EFFECT_SET_SCALE_W(agent, 0.9, 1.55, 0.9); } frame(lua_state, 12.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("peach_smash_arc"), Hash40::new("top"), 0, 1.8, 0, 90.0 + 90.0*boma.lr(), -110, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 1.33, 2.2); - LAST_EFFECT_SET_SCALE_W(agent, 0.95, 1.55, 0.95); + LAST_EFFECT_SET_SCALE_W(agent, 0.9, 1.55, 0.9); } frame(lua_state, 15.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("peach_smash_arc"), Hash40::new("top"), 0, 1.8, 0.0, 90.0 + 90.0*boma.lr(), 120, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 1.33, 2.2); - LAST_EFFECT_SET_SCALE_W(agent, 0.95, 1.55, 0.95); + LAST_EFFECT_SET_SCALE_W(agent, 0.9, 1.55, 0.9); } frame(lua_state, 19.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("peach_smash_arc"), Hash40::new("top"), 0, 1.8, 0, 90.0 + 90.0*boma.lr(), -110, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 1.33, 2.2); - LAST_EFFECT_SET_SCALE_W(agent, 0.95, 1.55, 0.95); + LAST_EFFECT_SET_SCALE_W(agent, 0.9, 1.55, 0.9); } frame(lua_state, 24.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, false); - LAST_EFFECT_SET_SCALE_W(agent, 0.96, 0.88, 0.96); + LAST_EFFECT_SET_SCALE_W(agent, 0.95, 0.88, 0.95); LAST_EFFECT_SET_RATE(agent, 1.5); } frame(lua_state, 25.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("peach_smash_arc"), Hash40::new("top"), 0, 1.8, 0, 90.0 + 90.0*boma.lr(), 115, 0, 1.0, true); LAST_EFFECT_SET_COLOR(agent, 0.2, 1.33, 2.2); - LAST_EFFECT_SET_SCALE_W(agent, 0.98, 1.55, 0.98); + LAST_EFFECT_SET_SCALE_W(agent, 0.925, 1.55, 0.925); LAST_EFFECT_SET_RATE(agent, 0.75); } } diff --git a/fighters/peach/src/acmd/specials.rs b/fighters/peach/src/acmd/specials.rs index 2bf59660b0..70aaeb153e 100644 --- a/fighters/peach/src/acmd/specials.rs +++ b/fighters/peach/src/acmd/specials.rs @@ -31,6 +31,52 @@ unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_specialn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 6, 7, 0, 0, 0, 1.6, true); + } + frame(lua_state, 6.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 3, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 8.0); + if is_excute(agent) { + FLASH(agent, 1, 1, 1, 0.75); + } + wait(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 2.5*boma.lr(), 6.5, 6, 0, 0, 0, 0.825, true); + LAST_EFFECT_SET_RATE(agent, 10.0/17.0); + } + for _ in 0..4 { + if is_excute(agent) { + FLASH(agent, 0.7, 0.7, 0.7, 0.5); + } + wait(lua_state, 2.0); + if is_excute(agent) { + FLASH(agent, 0.67, 0, 0.78, 0.31); + } + wait(lua_state, 2.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + wait(lua_state, 2.0); + } + if is_excute(agent) { + FLASH(agent, 0.7, 0.7, 0.7, 0.5); + } + wait(lua_state, 2.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + frame(lua_state, 43.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_erace_smoke"), Hash40::new("top"), 6, 5, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } +} + unsafe extern "C" fn game_specialnhit(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -112,36 +158,84 @@ unsafe extern "C" fn effect_specialnhit(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_specialsstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, -0.85, 0, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, false); + } +} + unsafe extern "C" fn game_specialsjump(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); if is_excute(agent) { - VarModule::on_flag(agent.battle_object, vars::peach::instance::DISABLE_SPECIAL_S); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); JostleModule::set_status(boma, false); - SEARCH(agent, 0, 0, Hash40::new("hip"), 2.5, 0.0, 0.0, 0.0, None, None, None, *COLLISION_KIND_MASK_HIT, *HIT_STATUS_MASK_NORMAL, 1, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false); - } - frame(lua_state, 4.0); - if is_excute(agent) { - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_S_BRAKE); + ATTACK(agent, 0, 0, Hash40::new("hip"), 0.0, 0, 0, 0, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_none"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); } frame(lua_state, 25.0); if is_excute(agent) { + AttackModule::clear_all(boma); WorkModule::enable_transition_term(boma, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); } } -unsafe extern "C" fn game_specialairsend(agent: &mut L2CAgentBase) { +//unsafe extern "C" fn game_specialsend(agent: &mut L2CAgentBase) { + // starts f1 instead of 0 +//} + +unsafe extern "C" fn effect_specialsend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 1.25, 0, 0, 0, 0.6, false); + } + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("sys_landing_smoke"), -1); + } +} + +unsafe extern "C" fn game_specialairsend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + // hit shield + let hit_status = VarModule::get_int(agent.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if hit_status & *COLLISION_KIND_MASK_SHIELD != 0 + && hit_status & *COLLISION_KIND_MASK_PARRY != 1 { + ATTACK(agent, 0, 0, Hash40::new("hip"), 4.0, 361, 20, 0, 20, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); + } + } + frame(lua_state, 3.0); + if is_excute(agent) { + AttackModule::clear_all(boma); agent.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE); } frame(lua_state, 7.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); } + frame(lua_state, 12.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE); + } // cancel into special landing frame + frame(lua_state, 30.0); + if is_excute(agent) { + // uncap max speeds + agent.on_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE); + } +} + +unsafe extern "C" fn expression_specialairsend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attacks"), 0); + } } unsafe extern "C" fn game_specialshitend(agent: &mut L2CAgentBase) { @@ -149,18 +243,18 @@ unsafe extern "C" fn game_specialshitend(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 55, 80, 0, 60, 7.7, 0.0, 5.0, 4.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 6, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HIP); - let special_air_s_end_control_accel_x = agent.get_param_float("param_special_s", "special_air_s_end_control_accel_x"); - sv_kinetic_energy!(controller_set_accel_x_mul, agent, special_air_s_end_control_accel_x); + KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } frame(lua_state, 5.0); if is_excute(agent) { AttackModule::clear_all(boma); - if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { - KineticModule::unable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - KineticModule::mul_speed(boma, &Vector3f::new(1.0, 0.67, 1.0), *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + let special_air_s_end_control_accel_x = agent.get_param_float("param_special_s", "special_air_s_end_control_accel_x"); + sv_kinetic_energy!(controller_set_accel_x_mul, agent, special_air_s_end_control_accel_x); + if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) { + KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } } - frame(lua_state, 17.0); + frame(lua_state, 10.0); if is_excute(agent) { KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } @@ -175,10 +269,6 @@ unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { ArticleModule::generate_article(boma, *FIGHTER_PEACH_GENERATE_ARTICLE_KASSAR, false, 0); ArticleModule::change_motion(boma, *FIGHTER_PEACH_GENERATE_ARTICLE_KASSAR, Hash40::new("special_hi_start"), false, 1.0); } - frame(lua_state, 3.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { @@ -227,8 +317,8 @@ unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { frame(lua_state, 30.0); if is_excute(agent) { AttackModule::set_attack_reference_joint_id(boma, Hash40::new("havel"), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y), app::AttackDirectionAxis(*ATTACK_DIRECTION_Y)); - ATTACK(agent, 0, 0, Hash40::new("havel"), 4.0, 74, 164, 0, 50, 5.0, 0.0, 4.0, -2.1, Some(0.0), Some(4.0), Some(2.1), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PARASOL); - ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 74, 164, 0, 50, 3.0, 0.0, -1.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PARASOL); + ATTACK(agent, 0, 0, Hash40::new("havel"), 4.0, 74, 120, 0, 60, 5.0, 0.0, 4.0, -2.1, Some(0.0), Some(4.0), Some(2.1), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PARASOL); + ATTACK(agent, 1, 0, Hash40::new("arml"), 4.0, 74, 120, 0, 60, 3.0, 0.0, -1.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_PARASOL); } frame(lua_state, 33.0); if is_excute(agent) { @@ -289,14 +379,14 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { ArticleModule::generate_article(boma, *FIGHTER_PEACH_GENERATE_ARTICLE_DAIKON, false, -1); let have_item = ItemModule::get_have_item_id(boma, 0) as u32; let have_item_boma = sv_battle_object::module_accessor(have_item); - StatusModule::change_status_request_from_script(have_item_boma, *ITEM_STATUS_KIND_HAVE, true);//fix invisibility + StatusModule::change_status_request_from_script(have_item_boma, *ITEM_STATUS_KIND_HAVE, true); // fix invisibility notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP); } else if item_kind == *ITEM_KIND_BOMBHEI { ItemModule::have_item(boma, app::ItemKind(*ITEM_KIND_BOMBHEI), 0, 0, false, false); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP);//make look better + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP); // make look better } else if item_kind == *ITEM_KIND_DOSEISAN { ItemModule::have_item(boma, app::ItemKind(*ITEM_KIND_DOSEISAN), 0, 0, false, false); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP);//make look better + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP); // make look better } else if item_kind == *ITEM_KIND_BEAMSWORD { ItemModule::have_item(boma, app::ItemKind(*ITEM_KIND_BEAMSWORD), 0, 0, false, false); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_PICKUP); @@ -310,16 +400,10 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP); } } - frame(lua_state, 16.0); - if is_excute(agent) { - if !agent.is_situation(*SITUATION_KIND_GROUND) { - agent.change_status_req(*FIGHTER_STATUS_KIND_FALL, false); - } - } frame(lua_state, 33.0); if is_excute(agent) { if item_kind == *ITEM_KIND_BEAMSWORD { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_PICKUP);//prevent face clipping + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_PICKUP); // prevent face clipping } } frame(lua_state, 40.0); @@ -361,21 +445,96 @@ unsafe extern "C" fn sound_speciallw(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + for _ in 0..5 { + if !ItemModule::is_have_item(boma, 0) { + ItemModule::pickup_item(boma, ItemSize{_address: *ITEM_SIZE_KIND_SMALL as u8}, *FIGHTER_HAVE_ITEM_WORK_MAIN, *ITEM_TRAIT_ALL, QuickItemTreatType{_address: *QUICK_ITEM_TREAT_TYPE_FORCE_HAVE as u8}, ItemPickupSearchMode{_address: *ITEM_PICKUP_SEARCH_MODE_IGNORE_GRASS as u8}); + } + wait(lua_state, 1.0); + } + } +} + +unsafe extern "C" fn effect_specialairlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + let facing = agent.lr(); + EffectModule::req_follow(boma, Hash40::new("sys_item_get"), Hash40::new("top"), &Vector3f::new(-3.0 * facing, 3.0, 3.0), &Vector3f::zero(), 0.5, false, 0, 0, 0, 0, 0, false, false); + } +} + +unsafe extern "C" fn game_speciallwthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + let have_item = ItemModule::get_have_item_id(boma, 0) as u32; + let have_item_boma = sv_battle_object::module_accessor(have_item); + ItemModule::throw_item(boma, 63.0, 2.3, 1.0, 0, true, agent.get_float(*ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER)); + PostureModule::add_pos_2d(have_item_boma, &Vector2f {x: (0.5 * agent.lr()), y: 1.5}); + } +} + +unsafe extern "C" fn effect_speciallwthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_speciallwthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_item_item_throw")); + } +} + +unsafe extern "C" fn expression_speciallwthrow(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 5.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 5, false, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_specialn", game_specialn, Priority::Low); agent.acmd("game_specialairn", game_specialn, Priority::Low); + agent.acmd("effect_specialn", effect_specialn, Priority::Low); + agent.acmd("effect_specialairn", effect_specialn, Priority::Low); agent.acmd("game_specialnhit", game_specialnhit, Priority::Low); agent.acmd("game_specialairnhit", game_specialnhit, Priority::Low); - agent.acmd("effect_specialnhit", effect_specialnhit, Priority::Low); agent.acmd("effect_specialairnhit", effect_specialnhit, Priority::Low); + + agent.acmd("effect_specialsstart", effect_specialsstart, Priority::Low); + agent.acmd("game_specialsjump", game_specialsjump, Priority::Low); + + agent.acmd("game_specialsend", acmd_stub, Priority::Low); agent.acmd("game_specialairsend", game_specialairsend, Priority::Low); + agent.acmd("expression_specialairsend", expression_specialairsend, Priority::Low); + agent.acmd("game_specialshitend", game_specialshitend, Priority::Low); + agent.acmd("game_specialhistart", game_specialhistart, Priority::Low); agent.acmd("game_specialairhistart", game_specialhistart, Priority::Low); agent.acmd("sound_specialhistart", sound_specialhistart, Priority::Low); @@ -385,7 +544,18 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialhiopen", game_specialhiopen, Priority::Low); + agent.acmd("game_speciallw", game_speciallw, Priority::Low); agent.acmd("effect_speciallw", effect_speciallw, Priority::Low); agent.acmd("sound_speciallw", sound_speciallw, Priority::Low); + + agent.acmd("game_specialairlw", game_specialairlw, Priority::Low); + agent.acmd("effect_specialairlw", effect_specialairlw, Priority::Low); + agent.acmd("sound_specialairlw", acmd_stub, Priority::Low); + agent.acmd("expression_specialairlw", expression_speciallwthrow, Priority::Low); + + agent.acmd("game_speciallwthrow", game_speciallwthrow, Priority::Low); + agent.acmd("effect_speciallwthrow", effect_speciallwthrow, Priority::Low); + agent.acmd("sound_speciallwthrow", sound_speciallwthrow, Priority::Low); + agent.acmd("expression_speciallwthrow", expression_speciallwthrow, Priority::Low); } \ No newline at end of file diff --git a/fighters/peach/src/acmd/throws.rs b/fighters/peach/src/acmd/throws.rs index 31550721be..26ad83eec7 100644 --- a/fighters/peach/src/acmd/throws.rs +++ b/fighters/peach/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 8.5, 0.0, Some(0.0), Some(8.5), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 8.5, 4.3, Some(0.0), Some(8.5), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 8.5, 4.0, Some(0.0), Some(8.5), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 8.5, 4.3, Some(0.0), Some(8.5), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 8.5, -4.0, Some(0.0), Some(8.5), Some(-13.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 8.5, -4.3, Some(0.0), Some(8.5), Some(-13.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -173,6 +172,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + AttackModule::set_optional_hit_effect(boma, 0, Hash40::new("peach_attack_heart")); } frame(lua_state, 40.0); if is_excute(agent) { @@ -189,7 +189,7 @@ unsafe extern "C" fn effect_throwhi(agent: &mut L2CAgentBase) { } frame(lua_state, 19.0); if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("peach_attack_heart"), Hash40::new("handr"), 0, 23.5, 0, 0, 90, 0, 0.5, true); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("peach_attack_heart"), Hash40::new("handr"), 0, 0.0, 0, 0, 90, 0, 0.5, true); EFFECT_FOLLOW(agent, Hash40::new("peach_attack_hi3"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.83, true); LAST_EFFECT_SET_RATE(agent, 1.33); } @@ -225,6 +225,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } frame(lua_state, 43.0); + FT_MOTION_RATE_RANGE(agent, 43.0, 67.0, 19.0); if is_excute(agent) { let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); @@ -235,6 +236,8 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { if is_excute(agent) { ArticleModule::remove_exist(boma, *FIGHTER_PEACH_GENERATE_ARTICLE_KINOPIO, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); } + frame(lua_state, 67.0); + FT_MOTION_RATE(agent, 1.0); } pub fn install(agent: &mut Agent) { diff --git a/fighters/peach/src/acmd/tilts.rs b/fighters/peach/src/acmd/tilts.rs index 4b7afacf92..19486bcc81 100644 --- a/fighters/peach/src/acmd/tilts.rs +++ b/fighters/peach/src/acmd/tilts.rs @@ -8,22 +8,23 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 6.7); FT_MOTION_RATE_RANGE(agent, 6.7, 10.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 90, 100, 0, 45, 3.6, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 100, 100, 0, 45, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footr"), 11.5, 100, 100, 0, 40, 3.6, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 9.0, 90, 105, 0, 45, 3.6, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 100, 105, 0, 45, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 11.5, 100, 105, 0, 40, 3.6, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 7.0); if is_excute(agent) { AttackModule::set_offset(boma, 2, &Vector3f{ x: 1.25, y: 0.0, z: 0.0}); } // reduce below-ledge coverage frame(lua_state, 10.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 90, 60, 0, 55, 3.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 90, 60, 0, 55, 3.8, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footr"), 6.0, 90, 60, 0, 55, 3.4, 1.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 90, 65, 0, 55, 3.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 90, 65, 0, 55, 3.8, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 6.0, 90, 65, 0, 55, 3.4, 1.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 15.0); - FT_MOTION_RATE_RANGE(agent, 15.0, 37.0, 19.0);//34 faf + FT_MOTION_RATE_RANGE(agent, 15.0, 37.0, 18.0); // 33 faf if is_excute(agent) { AttackModule::clear_all(boma); } @@ -37,7 +38,7 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 10.5, -0.1, 0, 9, 90, 0.9, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 1.5); + LAST_EFFECT_SET_RATE(agent, 1.4); FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, false); } } @@ -50,8 +51,10 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 83, 71, 0, 50, 8.1, 0.0, 23.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 83, 71, 0, 50, 4.2, 0.0, 12.5, 0.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 84, 72, 0, 49, 8.1, 0.0, 23.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 84, 72, 0, 49, 4.2, 0.0, 12.5, 0.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + AttackModule::set_optional_hit_effect(boma, 0, Hash40::new("peach_attack_heart")); + AttackModule::set_optional_hit_effect(boma, 1, Hash40::new("peach_attack_heart")); } frame(lua_state, 15.0); if is_excute(agent) { @@ -83,23 +86,23 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 11.0); // interp + frame(lua_state, 11.0); if is_excute(agent) { // Ground only - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 10.0, 280, 95, 0, 42, 3.3, -0.9, 0.0, 0.3, Some(0.0), Some(1.9), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handl"), 10.0, 275, 95, 0, 42, 4.0, 1.0, 0.0, -0.3, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 8.0, 281, 85, 0, 45, 3.3, -0.9, 0.0, 0.3, Some(0.0), Some(1.9), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handl"), 8.0, 274, 85, 0, 45, 4.0, 1.0, 0.0, -0.3, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); // Air only - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 10.0, 80, 95, 0, 42, 3.3, -0.9, 0.0, 0.3, Some(0.0), Some(1.9), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("handl"), 10.0, 85, 95, 0, 42, 4.0, 1.0, 0.0, -0.3, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 8.0, 79, 96, 0, 50, 3.3, -0.9, 0.0, 0.3, Some(0.0), Some(1.9), Some(1.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("handl"), 8.0, 86, 96, 0, 50, 4.0, 1.0, 0.0, -0.3, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_PUNCH); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 14.0); // 12 - FT_MOTION_RATE_RANGE(agent, 14.0, 28.0, 12.0); + FT_MOTION_RATE_RANGE(agent, 14.0, 29.0, 13.0); if is_excute(agent) { AttackModule::clear_all(boma); FighterAreaModuleImpl::enable_fix_jostle_area(boma, 3.0, 3.0); } - frame(lua_state, 28.0); // 24 + frame(lua_state, 29.0); // 25 FT_MOTION_RATE(agent, 1.0); } diff --git a/fighters/peach/src/lib.rs b/fighters/peach/src/lib.rs index d06cdd3ceb..efe974b81b 100644 --- a/fighters/peach/src/lib.rs +++ b/fighters/peach/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/peach/src/opff.rs b/fighters/peach/src/opff.rs index e4a6f1a765..ee784488c8 100644 --- a/fighters/peach/src/opff.rs +++ b/fighters/peach/src/opff.rs @@ -13,22 +13,6 @@ unsafe fn float_cancel(boma: &mut BattleObjectModuleAccessor, status_kind: i32) } } -unsafe fn wall_bounce(boma: &mut BattleObjectModuleAccessor, status_kind: i32) { - if status_kind == *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP { - let lr = PostureModule::lr(boma); - let frame = MotionModule::frame(boma) as i32; - let mut touch_wall = false; - if lr > 0.0 { - touch_wall = GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_FLAG_RIGHT as u32); - } else { - touch_wall = GroundModule::is_wall_touch_line(boma, *GROUND_TOUCH_FLAG_LEFT as u32); - }; - if touch_wall && (1..25).contains(&frame){ - StatusModule::change_status_request_from_script(boma, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END, true); - } - } -} - unsafe fn up_special_freefall_land_cancel(fighter: &mut L2CFighterCommon) { if (fighter.is_prev_status(*FIGHTER_STATUS_KIND_FALL_SPECIAL) || fighter.is_prev_status(*FIGHTER_PEACH_STATUS_KIND_SPECIAL_HI_AIR_END)) && fighter.is_status(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL) { @@ -50,7 +34,6 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { float_cancel(boma, status_kind); - wall_bounce(boma, status_kind); up_special_freefall_land_cancel(fighter); fastfall_specials(fighter); } diff --git a/fighters/peach/src/status/item_throw.rs b/fighters/peach/src/status/item_throw.rs deleted file mode 100644 index f693ebd952..0000000000 --- a/fighters/peach/src/status/item_throw.rs +++ /dev/null @@ -1,13 +0,0 @@ -use super::*; - -// FIGHTER_STATUS_KIND_ITEM_THROW - -unsafe extern "C" fn item_throw_end(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); - smashline::original_status(End, fighter, *FIGHTER_STATUS_KIND_ITEM_THROW)(fighter) -} - - -pub fn install(agent: &mut Agent) { - agent.status(End, *FIGHTER_STATUS_KIND_ITEM_THROW, item_throw_end); -} \ No newline at end of file diff --git a/fighters/peach/src/status/jump_aerial.rs b/fighters/peach/src/status/jump_aerial.rs index 8586333d22..7a353f6fcf 100644 --- a/fighters/peach/src/status/jump_aerial.rs +++ b/fighters/peach/src/status/jump_aerial.rs @@ -48,7 +48,11 @@ unsafe extern "C" fn jump_aerial_main(fighter: &mut L2CFighterCommon) -> L2CValu } unsafe extern "C" fn jump_aerial_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < 0.0 { + // prevent held-float from activating during dip of jump.. + let stick_y = fighter.left_stick_y(); + let squat_stick_y = fighter.get_param_float("common", "squat_stick_y"); + if stick_y > squat_stick_y + && KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) <= 0.0 { WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL); WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON); } else { diff --git a/fighters/peach/src/status/mod.rs b/fighters/peach/src/status/mod.rs index 0490bb9f24..0a7e8f07f8 100644 --- a/fighters/peach/src/status/mod.rs +++ b/fighters/peach/src/status/mod.rs @@ -3,7 +3,6 @@ use globals::*; // status script import mod attack_air; -mod item_throw; mod jump_aerial; mod special_n; mod special_hi; @@ -26,43 +25,28 @@ unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { VarModule::off_flag(fighter.battle_object, vars::peach::instance::DISABLE_SPECIAL_S); + fighter.on_flag(*FIGHTER_PEACH_INSTANCE_WORK_ID_FLAG_SPECIAL_N_RAISE); } true.into() } -// Holding Item -> Toss unsafe extern "C" fn should_use_special_lw_callback(fighter: &mut L2CFighterCommon) -> L2CValue { - //try turnaround but no reverse - let turn_stick_x = fighter.get_param_float("common", "turn_stick_x") * fighter.lr(); - let direc = if fighter.left_stick_x() <= turn_stick_x {-1.0} else {1.0}; - if !ItemModule::is_have_item(fighter.module_accessor, 0) && !fighter.is_situation(*SITUATION_KIND_GROUND) { - return false.into() - } else { - PostureModule::set_lr(fighter.module_accessor, direc); - PostureModule::update_rot_y_lr(fighter.module_accessor); - return true.into() - } + return true.into() } -unsafe extern "C" fn float_check_air_jump_aerial(fighter: &mut L2CFighterCommon) -> L2CValue { - let is_aerial = fighter.global_table[globals::PAD_FLAG].get_i32() & *FIGHTER_PAD_FLAG_ATTACK_TRIGGER != 0; +extern "Rust" { + #[link_name = "float_check_air_jump"] + fn float_check_air_jump(fighter: &mut L2CFighterCommon, float_status: L2CValue) -> L2CValue; + #[link_name = "float_check_air_jump_aerial"] + fn float_check_air_jump_aerial(fighter: &mut L2CFighterCommon, float_status: L2CValue) -> L2CValue; +} - if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON) { - if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PEACH_INSTANCE_WORK_ID_FLAG_UNIQ_FLOAT) { - let mut allow_float = false; - if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) { - if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < 0.0 { - allow_float = !is_aerial; - } - } +unsafe extern "C" fn air_jump_uniq(fighter: &mut L2CFighterCommon) -> L2CValue { + float_check_air_jump(fighter, FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT_START.into()) +} - if allow_float { - fighter.change_status(FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT_START.into(), true.into()); - return 1.into(); - } - } - } - 0.into() +unsafe extern "C" fn air_jump_aerial_uniq(fighter: &mut L2CFighterCommon) -> L2CValue { + float_check_air_jump_aerial(fighter, FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT_START.into()) } unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { @@ -71,14 +55,14 @@ unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); fighter.global_table[globals::USE_SPECIAL_LW_CALLBACK].assign(&L2CValue::Ptr(should_use_special_lw_callback as *const () as _)); fighter.global_table[0x26].assign(&false.into()); //transition term handler - fighter.global_table[0x33].assign(&L2CValue::Ptr(float_check_air_jump_aerial as *const () as _)); + fighter.global_table[0x32].assign(&L2CValue::Ptr(air_jump_uniq as *const () as _)); + fighter.global_table[0x33].assign(&L2CValue::Ptr(air_jump_aerial_uniq as *const () as _)); } pub fn install(agent: &mut Agent) { agent.on_start(on_start); attack_air::install(agent); - item_throw::install(agent); jump_aerial::install(agent); special_n::install(agent); special_hi::install(agent); diff --git a/fighters/peach/src/status/special_lw.rs b/fighters/peach/src/status/special_lw.rs index 2e222efb86..2aedef6fbf 100644 --- a/fighters/peach/src/status/special_lw.rs +++ b/fighters/peach/src/status/special_lw.rs @@ -3,6 +3,14 @@ use super::*; // FIGHTER_STATUS_KIND_SPECIAL_LW unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if ItemModule::is_have_item(fighter.module_accessor, 0) { + fighter.set_status_kind_interrupt(statuses::peach::SPECIAL_LW_THROW); + return 1.into() + } + if !fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.set_status_kind_interrupt(statuses::peach::SPECIAL_AIR_LW); + return 1.into() + } StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), @@ -27,17 +35,15 @@ unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, 0 ); - if ItemModule::is_have_item(fighter.module_accessor, 0) { - ControlModule::reset_trigger(fighter.module_accessor);//force soft toss - ControlModule::clear_command(fighter.module_accessor, true); - VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); - StatusModule::set_status_kind_interrupt(fighter.module_accessor, *FIGHTER_STATUS_KIND_ITEM_THROW); - return 1.into() - } 0.into() } unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + // turn around + let turn_stick_x = fighter.get_param_float("common", "turn_stick_x") * fighter.lr(); + let direc = if fighter.left_stick_x() <= turn_stick_x {-1.0} else {1.0}; + PostureModule::set_lr(fighter.module_accessor, direc); + PostureModule::update_rot_y_lr(fighter.module_accessor); fighter.on_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_ENABLE_ITEM_NO_COUNT); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw"), 0.0, 1.0, false, 0.0, false, false); notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, *FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, *FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_04 as i32 - 1 ); @@ -46,23 +52,26 @@ unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue } unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if CancelModule::is_enable_cancel(fighter.module_accessor) && (fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool()) { + if CancelModule::is_enable_cancel(fighter.module_accessor) + && (fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool()) { return 1.into(); } if MotionModule::is_end(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) {fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); } - else {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); } if !StatusModule::is_changing(fighter.module_accessor) { if StatusModule::is_situation_changed(fighter.module_accessor) { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - } - else { - GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_FALL); + if !fighter.is_situation(*SITUATION_KIND_GROUND) { EFFECT_DETACH_KIND(fighter, Hash40::new("peach_hikkonuki"), -1); + // cancel into air pull if visually coherent, most edge cancels happen first _ frames anyway + if MotionModule::frame(fighter.module_accessor) <= 10.0 { + fighter.change_status(statuses::peach::SPECIAL_AIR_LW.into(), false.into()); + return 1.into(); + } + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); } } } @@ -77,15 +86,158 @@ unsafe extern "C" fn special_lw_end(fighter: &mut L2CFighterCommon) -> L2CValue } else { notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2508b59a2b), FIGHTER_ITEM_HOLD_KIND_GRIP);//medium item anim } - if fighter.global_table[globals::STATUS_KIND] != FIGHTER_STATUS_KIND_FALL && fighter.global_table[CURRENT_FRAME].get_i32() < 35 { + if fighter.global_table[globals::STATUS_KIND] != FIGHTER_STATUS_KIND_FALL + && fighter.global_table[globals::STATUS_KIND] != statuses::peach::SPECIAL_AIR_LW + && MotionModule::frame(fighter.module_accessor) <= 35.0 { ItemModule::drop_item(fighter.module_accessor, 90.0, 0.0, 0); } } 0.into() } +// statuses::peach::SPECIAL_AIR_LW + +unsafe extern "C" fn special_air_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + let turn = if !ItemModule::is_have_item(fighter.module_accessor, 0) {*FIGHTER_STATUS_ATTR_START_TURN as u32} else {0}; + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_MOTION_FALL, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW as u64, + turn, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, + 0 + ); + 0.into() +} + +unsafe extern "C" fn special_air_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let air_speed_y_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_y_stable"), 0); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + if speed_y < -air_speed_y_stable { + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0, -air_speed_y_stable); + } + // should work as both ledge cancel and standalone? + if !ItemModule::is_have_item(fighter.module_accessor, 0) { + let start_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lw.air_start_x_mul"); + sv_kinetic_energy!(mul_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x, 0.0); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw"), 0.0, 1.0, false, 0.0, false, false); + } else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_lw"), -1.0, 1.0, 0.0, false, false); + } + fighter.main_shift(special_air_lw_main_loop) +} + +unsafe extern "C" fn special_air_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_air_check_dive(); + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + // empty pull land cancels (won't transition cleanly into any anim) + if fighter.is_motion(Hash40::new("special_air_lw")) { + fighter.check_land_cancel(None); + return 1.into(); + } + } + 0.into() +} + +unsafe extern "C" fn special_air_lw_end(fighter: &mut L2CFighterCommon) -> L2CValue { + 0.into() +} + +// statuses::peach::SPECIAL_LW_THROW + +unsafe extern "C" fn special_lw_throw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ON_DROP), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_THROW_ITEM as u64, + *FIGHTER_STATUS_ATTR_START_TURN as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_ITEM_SHOOT as u32, + 0 + ); + 0.into() +} + +unsafe extern "C" fn special_lw_throw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.change_motion_by_situation("special_lw_throw", "special_air_lw_throw", 0.0, 1.0, false, 0.0, false, false); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + fighter.main_shift(special_lw_throw_main_loop) +} + +unsafe extern "C" fn special_lw_throw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.sub_air_check_dive(); + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_motion_inherit_frame_by_situation("special_lw_throw", "special_air_lw_throw", -1.0, 1.0, 0.0, false, false); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + } + 0.into() +} + +unsafe extern "C" fn special_lw_throw_end(fighter: &mut L2CFighterCommon) -> L2CValue { + 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_main); agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_end); + + agent.status(Pre, statuses::peach::SPECIAL_AIR_LW, special_air_lw_pre); + agent.status(Main, statuses::peach::SPECIAL_AIR_LW, special_air_lw_main); + agent.status(End, statuses::peach::SPECIAL_AIR_LW, special_air_lw_end); + + agent.status(Pre, statuses::peach::SPECIAL_LW_THROW, special_lw_throw_pre); + agent.status(Main, statuses::peach::SPECIAL_LW_THROW, special_lw_throw_main); + agent.status(End, statuses::peach::SPECIAL_LW_THROW, special_lw_throw_end); } diff --git a/fighters/peach/src/status/special_n.rs b/fighters/peach/src/status/special_n.rs index 9b8e237494..ef2b5b16d7 100644 --- a/fighters/peach/src/status/special_n.rs +++ b/fighters/peach/src/status/special_n.rs @@ -6,12 +6,21 @@ unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_N)(fighter); // air stall wasnt working if !fighter.is_situation(*SITUATION_KIND_GROUND) { - let special_n_attack_speed_y = fighter.get_param_float("param_special_n", "special_n_attack_speed_y"); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, special_n_attack_speed_y); + let prev_status_0 = StatusModule::prev_status_kind(fighter.module_accessor, 0); + let prev_status_1 = StatusModule::prev_status_kind(fighter.module_accessor, 1); + if fighter.is_flag(*FIGHTER_PEACH_INSTANCE_WORK_ID_FLAG_SPECIAL_N_RAISE) + && !([*FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT, *FIGHTER_PEACH_STATUS_KIND_UNIQ_FLOAT_START].contains(&prev_status_1) + && prev_status_0 == *FIGHTER_STATUS_KIND_FALL + && fighter.global_table[PREV_STATUS_FRAME].get_i32() <= 10) + { + let special_n_attack_speed_y = fighter.get_param_float("param_special_n", "special_n_attack_speed_y"); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, special_n_attack_speed_y); + } let special_n_attack_stable_y = fighter.get_param_float("param_special_n", "special_n_attack_stable_y"); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -special_n_attack_stable_y); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, special_n_attack_stable_y); let special_n_attack_accel_y = fighter.get_param_float("param_special_n", "special_n_attack_accel_y"); sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -special_n_attack_accel_y); + fighter.off_flag(*FIGHTER_PEACH_INSTANCE_WORK_ID_FLAG_SPECIAL_N_RAISE); } ret } @@ -23,7 +32,7 @@ unsafe extern "C" fn special_n_hit_main(fighter: &mut L2CFighterCommon) -> L2CVa // set gravity limits to match first stage of move if !fighter.is_situation(*SITUATION_KIND_GROUND) { let special_n_attack_stable_y = fighter.get_param_float("param_special_n", "special_n_attack_stable_y"); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -special_n_attack_stable_y); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, special_n_attack_stable_y); let special_n_attack_accel_y = fighter.get_param_float("param_special_n", "special_n_attack_accel_y"); sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -special_n_attack_accel_y); } diff --git a/fighters/peach/src/status/special_s.rs b/fighters/peach/src/status/special_s.rs index 784b73299e..d8377fd005 100644 --- a/fighters/peach/src/status/special_s.rs +++ b/fighters/peach/src/status/special_s.rs @@ -25,7 +25,7 @@ unsafe extern "C" fn special_s_pre(fighter: &mut L2CFighterCommon) -> L2CValue { false, false, (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, - *FIGHTER_STATUS_ATTR_START_TURN as u32, + 0, *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, 0 ); @@ -33,13 +33,194 @@ unsafe extern "C" fn special_s_pre(fighter: &mut L2CFighterCommon) -> L2CValue { return 0.into(); } +unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_situation(L2CValue::I32(*SITUATION_KIND_AIR)); + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); + VarModule::on_flag(fighter.battle_object, vars::common::status::DISABLE_ECB_SHIFT); + fighter.change_motion_by_situation("special_s_start", "special_air_s_start", 0.0, 1.0, false, 0.0, false, false); + special_s_start_momentum(fighter, 1.0); + fighter.set_int(1, *FIGHTER_PEACH_STATUS_SPECIAL_S_WORK_INT_ENABLE_UNIQ); + + fighter.main_shift(special_s_main_loop) +} + +unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP.into(), false.into()); + } + if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < 0.0 + && GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) { + KineticModule::clear_speed_all(fighter.module_accessor); + KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } + + return 0.into(); +} + +unsafe fn special_s_start_momentum(fighter: &mut L2CFighterCommon, mul: f32) { + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let start_y = fighter.get_param_float("param_special_s", "special_s_start_speed_y"); + let stable_y = fighter.get_param_float("param_special_s", "special_s_jump_stable_y"); + let max_y = fighter.get_param_float("air_speed_y_stable", ""); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, stable_y); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, (speed_y+start_y).clamp(-max_y, max_y * mul)); +} + +unsafe extern "C" fn special_s_end(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + + 0.into() +} + + +// FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP + +unsafe extern "C" fn special_s_jump_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_FALL, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + + 0.into() +} + +unsafe extern "C" fn special_s_jump_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::peach::instance::DISABLE_SPECIAL_S); + WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_jump"), 0.0, 1.0, false, 0.0, false, false); + + fighter.main_shift(special_s_jump_main_loop) +} + +unsafe extern "C" fn special_s_jump_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + special_s_jump_momentum(fighter); + hit_check(fighter); + wall_check(fighter); + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if MotionModule::is_end(fighter.module_accessor) || fighter.is_situation(*SITUATION_KIND_GROUND) { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END.into(), false.into()); + return 1.into(); + } + if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT) { + WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END.into(), false.into()); + return 1.into(); + } + + return 0.into(); +} + +// rapidly decaying speed, drift to change distance +unsafe extern "C" fn special_s_jump_momentum(fighter: &mut L2CFighterCommon) -> L2CValue { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let lr = fighter.lr(); + let start_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_start_x"); + let min_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_min_x"); + let brake_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_brake_x"); + let accel_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_accel_x"); + let start_y = fighter.get_param_float("param_special_s", "special_s_jump_speed_y"); + let stable_y = fighter.get_param_float("param_special_s", "special_s_jump_stable_y"); + let jump_max_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_max_y"); + if StatusModule::is_changing(fighter.module_accessor) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x, 0.0); + sv_kinetic_energy!(set_accel_x_add, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0); + sv_kinetic_energy!(set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0); + sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x*lr, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, stable_y); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, (speed_y+start_y).clamp(-jump_max_y, jump_max_y)); + return 1.into(); + } + // speed cannot go below minimum, cannot exceed starting value due to higher brake value + let add_speed = (fighter.left_stick_x() * lr * accel_x) - brake_x; + let mut new_speed = (add_speed*lr) + speed_x; + new_speed = if lr > 0.0 {new_speed.clamp(min_x, start_x)} else {new_speed.clamp(-start_x, -min_x)}; + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, new_speed, 0.0); + 0.into() +} + +// hit check +unsafe extern "C" fn hit_check(fighter: &mut L2CFighterCommon) -> L2CValue { + // bounce on-hit + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END.into(), false.into()); + return 1.into(); + } + // end on-shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END.into(), false.into()); + return 1.into(); + } + // kill hitbox if minimum speed + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let min_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.jump_min_x"); + let lr = fighter.lr(); + if speed_x.abs() <= min_x + && AttackModule::is_attack(fighter.module_accessor, 0, false) { + AttackModule::clear_all(fighter.module_accessor); + EFFECT_OFF_KIND(fighter, Hash40::new("peach_bomber_jamp"), false, false); + WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_ID_TIME_OUT); + } + 0.into() +} + +// wall bounce if moving forward +unsafe extern "C" fn wall_check(fighter: &mut L2CFighterCommon) -> L2CValue { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let mut touch_wall = false; + if fighter.lr() > 0.0 { + touch_wall = GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_RIGHT as u32); + } else { + touch_wall = GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_LEFT as u32); + } + if touch_wall + && speed_x.abs() >= 0.0 { + fighter.change_status(FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END.into(), true.into()); + } + 0.into() +} + // FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END unsafe extern "C" fn special_s_away_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, app::SituationKind(*SITUATION_KIND_NONE), - *FIGHTER_KINETIC_TYPE_PEACH_SPECIAL_S_BRAKE, + *FIGHTER_KINETIC_TYPE_UNIQ, *GROUND_CORRECT_KIND_KEEP as u32, app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), true, @@ -56,7 +237,7 @@ unsafe extern "C" fn special_s_away_end_pre(fighter: &mut L2CFighterCommon) -> L false, false, false, - (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, 0, *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, 0 @@ -65,7 +246,115 @@ unsafe extern "C" fn special_s_away_end_pre(fighter: &mut L2CFighterCommon) -> L return 0.into(); } +unsafe extern "C" fn special_s_away_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.change_motion_by_situation("special_s_end", "special_air_s_end", 1.0, 1.0, false, 0.0, false, false); + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + special_s_end_momentum(fighter); + + fighter.main_shift(special_s_away_end_main_loop) +} + +unsafe extern "C" fn special_s_away_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + // wall bounce first 4 frames + let end_wall_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_s.end_wall_frame"); + if fighter.status_frame() < end_wall_frame { + wall_check(fighter); + } + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, false); + return 1.into(); + } + if !StatusModule::is_changing(fighter.module_accessor) + && StatusModule::is_situation_changed(fighter.module_accessor) { + // if returning to fall anim, cancel into heavy landing + if fighter.is_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE) { + // special landing lag if not actionable + let end_landing_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_landing_frame"); + let mut lag = Some(end_landing_frame); + if CancelModule::is_enable_cancel(fighter.module_accessor) { + lag = None; + } + fighter.check_land_cancel(lag); + return 1.into(); + } + // cancel into full lag ground slide if still in jump pose, ledge cancel + fighter.change_status_by_situation(*FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END, *FIGHTER_STATUS_KIND_FALL, false); + } + // enable drift frame + if fighter.is_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE) { + let control_accel_x = fighter.get_param_float("param_special_s", "special_air_s_end_control_accel_x"); + sv_kinetic_energy!(set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, control_accel_x); + // uncap speed frame (transition better to fall?) + if fighter.is_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_DONE_CONTROLLER_MOVE) { + let max_x = fighter.get_param_float("air_speed_x_stable", ""); + let max_y = fighter.get_param_float("air_speed_y_stable", ""); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, max_x, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, max_y); + } + fighter.off_flag(*FIGHTER_PEACH_STATUS_SPECIAL_S_JUMP_FLAG_START_CONTROLLER_MOVE); + } + + return 0.into(); +} + +// prevent excessive speed transfer? drift limits +unsafe fn special_s_end_momentum(fighter: &mut L2CFighterCommon) { + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let lr = fighter.lr(); + let mut end_landing_x_min = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_landing_x_min"); + let end_landing_x_max = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_landing_x_max"); + let end_x_stable = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_x_stable"); + let end_y_stable = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.end_y_stable"); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + // a2g speed transfer, clamped values if landed during dash to prevent broken looking speed + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + let mut new_speed = if lr > 0.0 {speed_x.clamp(end_landing_x_min, end_landing_x_max)} else {speed_x.clamp(-end_landing_x_max, -end_landing_x_min)}; + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, new_speed); + return; + } + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, end_x_stable, 0.0); + sv_kinetic_energy!(set_accel_x_add, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0); + sv_kinetic_energy!(set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, end_y_stable); +} + +unsafe extern "C" fn special_s_hit_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_HIT_END)(fighter); + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY != 0 { + let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); + let air_accel_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_mul"), 0); + let air_accel_x_add = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_add"), 0); + let speed_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_end_speed_x_mul"); + let accel_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_end_accel_mul"); + + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * speed_mul, 0.0); + sv_kinetic_energy!(controller_set_accel_x_mul, fighter, air_accel_x_mul * accel_mul); + sv_kinetic_energy!(controller_set_accel_x_add, fighter, air_accel_x_add * accel_mul); + } + + return ret; +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); + agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_end); + + agent.status(Pre, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP, special_s_jump_pre); + agent.status(Main, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_JUMP, special_s_jump_main); + agent.status(Pre, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END, special_s_away_end_pre); + agent.status(Main, *FIGHTER_PEACH_STATUS_KIND_SPECIAL_S_AWAY_END, special_s_away_end_main); } diff --git a/fighters/peach/src/status/uniq_float_start.rs b/fighters/peach/src/status/uniq_float_start.rs index 09b26e5419..907828128e 100644 --- a/fighters/peach/src/status/uniq_float_start.rs +++ b/fighters/peach/src/status/uniq_float_start.rs @@ -2,6 +2,7 @@ use super::*; #[no_mangle] unsafe fn peach_float_start_main_common(fighter: &mut L2CFighterCommon) -> L2CValue { + float_jump_leniency(fighter); float_drift_common(fighter); WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING_ATTACK_AIR); WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_UNIQ_FLOAT_TRANS_ID_FALL_CONTROL); @@ -16,6 +17,7 @@ unsafe fn peach_float_start_main_common(fighter: &mut L2CFighterCommon) -> L2CVa WorkModule::set_int(fighter.module_accessor, uniq_float_float_frame, *FIGHTER_PEACH_STATUS_UNIQ_FLOAT_WORK_INT_FLOAT_FRAME); WorkModule::set_int(fighter.module_accessor, 1, *FIGHTER_PEACH_STATUS_UNIQ_FLOAT_WORK_INT_ENABLE_UNIQ); WorkModule::on_flag(fighter.module_accessor, *FIGHTER_PEACH_INSTANCE_WORK_ID_FLAG_UNIQ_FLOAT); + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_FLOATING); MotionModule::change_motion( fighter.module_accessor, @@ -156,22 +158,6 @@ pub unsafe fn peach_float_main_loop_common(fighter: &mut L2CFighterCommon) -> L2 return 0.into(); } - let mut daikon = *ITEM_KIND_PEACHDAIKON; - if fighter.global_table[0x2].get_i32() == *FIGHTER_KIND_DAISY { - daikon = *ITEM_KIND_DAISYDAIKON; - } - if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_PEACH_STATUS_TRANS_ID_SPECIAL_LW_ITEM_THROW) { - if fighter.global_table[PAD_FLAG].get_i32() & *FIGHTER_PAD_FLAG_SPECIAL_TRIGGER != 0 { - let stick_y = fighter.left_stick_y(); - let special_stick_y = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("special_stick_y")); - if stick_y <= -special_stick_y - && ItemModule::get_have_item_kind(fighter.module_accessor, 0) == daikon { - fighter.change_status(FIGHTER_STATUS_KIND_ITEM_THROW.into(), true.into()); - return 0.into(); - } - } - } - if WorkModule::get_int(fighter.module_accessor, *FIGHTER_PEACH_STATUS_UNIQ_FLOAT_WORK_INT_ENABLE_UNIQ) == 1 { if WorkModule::get_int(fighter.module_accessor, *FIGHTER_PEACH_STATUS_UNIQ_FLOAT_WORK_INT_FLOAT_FRAME) > 0 { WorkModule::dec_int(fighter.module_accessor, *FIGHTER_PEACH_STATUS_UNIQ_FLOAT_WORK_INT_FLOAT_FRAME); @@ -234,6 +220,8 @@ unsafe extern "C" fn uniq_float_start_main(fighter: &mut L2CFighterCommon) -> L2 } extern "Rust" { + #[link_name = "float_jump_leniency"] + fn float_jump_leniency(fighter: &mut L2CFighterCommon) -> L2CValue; #[link_name = "float_drift_common"] fn float_drift_common(fighter: &mut L2CFighterCommon) -> L2CValue; } diff --git a/fighters/pfushigisou/Cargo.toml b/fighters/pfushigisou/Cargo.toml index bd90442eae..5ff268792e 100644 --- a/fighters/pfushigisou/Cargo.toml +++ b/fighters/pfushigisou/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pfushigisou/src/acmd/aerials.rs b/fighters/pfushigisou/src/acmd/aerials.rs index be760350af..8919807998 100644 --- a/fighters/pfushigisou/src/acmd/aerials.rs +++ b/fighters/pfushigisou/src/acmd/aerials.rs @@ -9,23 +9,23 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 365, 25, 0, 45, 5.0, 0.0, 5.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("leafb2"), 1.0, 365, 25, 0, 45, 5.0, -1.0, 1.5, 1.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("leaff2"), 1.0, 365, 25, 0, 45, 5.0, -1.0, 1.5, 1.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("leafr2"), 1.0, 365, 25, 0, 45, 5.0, -1.0, 1.5, 1.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 4, 0, Hash40::new("leafl2"), 1.0, 365, 25, 0, 45, 5.0, -1.0, 1.5, 1.5, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 365, 25, 0, 45, 5.0, 0.0, 5.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("leafb2"), 1.5, 365, 25, 0, 45, 5.0, -1.0, 1.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("leaff2"), 1.5, 365, 25, 0, 45, 5.0, -1.0, 1.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("leafr2"), 1.5, 365, 25, 0, 45, 5.0, -1.0, 1.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 4, 0, Hash40::new("leafl2"), 1.5, 365, 25, 0, 45, 5.0, -1.0, 1.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 5, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } - wait(lua_state, 20.0); + frame(lua_state, 26.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 28.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 55, 142, 0, 17, 5.5, 0.0, 5.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("leafb2"), 6.0, 55, 142, 0, 17, 5.5, -1.0, 1.5, 1.5, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("leaff2"), 6.0, 55, 142, 0, 17, 5.5, -1.0, 1.5, 1.5, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("leafr2"), 6.0, 55, 142, 0, 17, 5.5, -1.0, 1.5, 1.5, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 4, 0, Hash40::new("leafl2"), 6.0, 55, 142, 0, 17, 5.5, -1.0, 1.5, 1.5, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 55, 96, 0, 48, 5.5, 0.0, 5.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("leafb2"), 6.0, 55, 96, 0, 48, 5.5, -1.0, 1.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("leaff2"), 6.0, 55, 96, 0, 48, 5.5, -1.0, 1.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("leafr2"), 6.0, 55, 96, 0, 48, 5.5, -1.0, 1.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 4, 0, Hash40::new("leafl2"), 6.0, 55, 96, 0, 48, 5.5, -1.0, 1.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } frame(lua_state, 30.0); if is_excute(agent) { @@ -60,13 +60,22 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 13.0); + if is_excute(agent) { + // empty hitboxes for interpolation + ATTACK(agent, 0, 0, Hash40::new("vinel1"), 0.0, 54, 0, 0, 0, 0.1, 2.5, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("vinel2"), 0.0, 54, 0, 0, 0, 0.1, 2.5, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("vinel3"), 0.0, 54, 0, 0, 0, 0.1, 2.5, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("vinel4"), 0.0, 75, 0, 0, 0, 0.1, 2.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 4, 0, Hash40::new("vinel5"), 0.0, 75, 0, 0, 0, 0.1, 2.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("vinel1"), 9.0, 361, 85, 0, 30, 4.0, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("vinel2"), 9.0, 361, 85, 0, 30, 3.2, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("vinel3"), 9.0, 361, 85, 0, 30, 3.2, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("vinel4"), 12.0, 50, 90, 0, 31, 3.2, 2.5, -1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 4, 0, Hash40::new("vinel5"), 12.0, 50, 90, 0, 31, 3.2, 2.5, -1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("vinel1"), 9.0, 54, 75, 0, 30, 4.0, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("vinel2"), 9.0, 54, 75, 0, 30, 3.2, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("vinel3"), 9.0, 54, 75, 0, 30, 3.2, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("vinel4"), 12.0, 75, 75, 0, 45, 3.2, 2.5, -1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 4, 0, Hash40::new("vinel5"), 12.0, 75, 75, 0, 45, 3.2, 2.5, -1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); } frame(lua_state, 15.0); FT_MOTION_RATE(agent, 0.5); @@ -120,10 +129,10 @@ unsafe extern "C" fn expression_attackairf(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 6.75, 6.0); + frame(lua_state, 5.0); + FT_MOTION_RATE_RANGE(agent, 5.0, 6.75, 2.0); frame(lua_state, 6.75); - FT_MOTION_RATE_RANGE(agent, 6.75, 7.0, 1.0); + FT_MOTION_RATE_RANGE(agent, 6.75, 9.0, 3.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); ATTACK(agent, 0, 0, Hash40::new("viner1"), 4.0, 82, 100, 19, 0, 4.0, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); @@ -132,16 +141,19 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { ATTACK(agent, 3, 0, Hash40::new("viner4"), 4.0, 94, 100, 19, 0, 3.2, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 4, 0, Hash40::new("viner5"), 4.0, 98, 100, 19, 0, 3.2, 2.5, -1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); } - frame(lua_state, 7.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 10.0); - FT_MOTION_RATE_RANGE(agent, 10.0, 12.0, 4.0); + frame(lua_state, 9.0); + FT_MOTION_RATE_RANGE(agent, 9.0, 9.5, 1.0); + frame(lua_state, 9.5); + FT_MOTION_RATE_RANGE(agent, 9.5, 12.5, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 11.0); + FT_MOTION_RATE_RANGE(agent, 11.0, 12.5, 3.0); + frame(lua_state, 12.5); + FT_MOTION_RATE_RANGE(agent, 12.5, 13.0, 1.0); frame(lua_state, 13.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("vinel1"), 5.0, 60, 79, 0, 45, 4.0, 2.5, 1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("vinel2"), 5.0, 60, 79, 0, 45, 3.2, 2.5, 1.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); @@ -149,11 +161,15 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { ATTACK(agent, 3, 0, Hash40::new("vinel4"), 9.0, 80, 82, 0, 46, 3.2, 2.5, 1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 4, 0, Hash40::new("vinel5"), 9.0, 80, 82, 0, 46, 3.2, 2.5, 1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); } - frame(lua_state, 16.0); + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 16.0, 4.0); + frame(lua_state, 15.5); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 34.0); + frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 31.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -162,7 +178,7 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 5.5); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("pfushigisou_vine"), Hash40::new("viner5"), 0, 0, 0, 0, 0, 0, 1, true); EFFECT_FOLLOW_ALPHA(agent, Hash40::new("pfushigisou_vine"), Hash40::new("viner4"), 0, 0, 0, 0, 0, 0, 1, true, 0.5); @@ -170,12 +186,12 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_pfushigisou_vine_b1"), Hash40::new("tex_pfushigisou_vine_b2"), 4, Hash40::new("viner4"), 0, 0, 0, Hash40::new("viner4"), 6, 0, 0, true, Hash40::new("null"), Hash40::new("viner4"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_pfushigisou_vine_b1"), Hash40::new("tex_pfushigisou_vine_b2"), 4, Hash40::new("viner3"), 2, 0, 0, Hash40::new("viner3"), 6, 0, 0, true, Hash40::new("null"), Hash40::new("viner3"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); } - frame(lua_state, 10.0); + frame(lua_state, 9.5); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("pfushigisou_vine"), false, true); - AFTER_IMAGE_OFF(agent, 3); + AFTER_IMAGE_OFF(agent, 2); } - frame(lua_state, 12.0); + frame(lua_state, 12.5); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("pfushigisou_vine"), Hash40::new("vinel5"), 0, 0, 0, 0, 0, 0, 1, true); EFFECT_FOLLOW_ALPHA(agent, Hash40::new("pfushigisou_vine"), Hash40::new("vinel4"), 0, 0, 0, 0, 0, 0, 1, true, 0.5); @@ -183,10 +199,24 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_pfushigisou_vine_b1"), Hash40::new("tex_pfushigisou_vine_b2"), 4, Hash40::new("vinel4"), 0, 0, 0, Hash40::new("vinel4"), 6, 0, 0, true, Hash40::new("null"), Hash40::new("vinel4"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_pfushigisou_vine_b1"), Hash40::new("tex_pfushigisou_vine_b2"), 4, Hash40::new("vinel3"), 2, 0, 0, Hash40::new("vinel3"), 6, 0, 0, true, Hash40::new("null"), Hash40::new("vinel3"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); } - frame(lua_state, 17.0); + frame(lua_state, 15.5); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("pfushigisou_vine"), false, true); - AFTER_IMAGE_OFF(agent, 3); + AFTER_IMAGE_OFF(agent, 2); + } +} + +unsafe extern "C" fn sound_attackairb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.5); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_pfushigisou_attackair_b01")); + PLAY_SEQUENCE(agent, Hash40::new("seq_pfushigisou_rnd_attack")); + } + frame(lua_state, 12.5); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_pfushigisou_attackair_b02")); } } @@ -228,7 +258,7 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } HIT_NODE(agent, Hash40::new("flower"), *HIT_STATUS_XLU); ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 88, 79, 0, 67, 5.5, 0.0, 11.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 78, 79, 0, 67, 9.0, 0.0, 15.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 78, 79, 0, 67, 9.0, 0.0, 15.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } frame(lua_state, 14.0); if is_excute(agent) { @@ -274,10 +304,14 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { if KineticModule::get_sum_speed_y(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) < speed { SET_SPEED_EX(agent, 0, speed, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); } - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 270, 66, 0, 0, 5.5, 0.0, -3.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 75, 95, 0, 14, 9.0, 0.0, -7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 270, 66, 0, 0, 6.0, 0.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 80, 74, 0, 40, 9.5, 0.0, -5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } frame(lua_state, 13.0); + if is_excute(agent) { + AttackModule::clear(boma, 0, false); + } + frame(lua_state, 15.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -292,7 +326,7 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 11.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("pfushigisou_atk_hi4"), Hash40::new("top"), 2.5, -5, 0, 0, 0, 0, 0.5, true); + EFFECT_FOLLOW(agent, Hash40::new("pfushigisou_atk_hi4"), Hash40::new("top"), 2.5, -3.5, 0, 0, 0, 0, 0.5, true); } } @@ -307,6 +341,7 @@ pub fn install(agent: &mut Agent) {; agent.acmd("game_attackairb", game_attackairb, Priority::Low); agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); + agent.acmd("sound_attackairb", sound_attackairb, Priority::Low); agent.acmd("expression_attackairb", expression_attackairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); diff --git a/fighters/pfushigisou/src/acmd/ground.rs b/fighters/pfushigisou/src/acmd/ground.rs index 2bd7fd02df..4805bcd892 100644 --- a/fighters/pfushigisou/src/acmd/ground.rs +++ b/fighters/pfushigisou/src/acmd/ground.rs @@ -3,13 +3,16 @@ use super::*; unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 5.0); frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 83, 100, 20, 0, 2.3, 0.0, 3.6, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 83, 100, 20, 0, 2.3, 0.0, 3.6, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 97, 100, 20, 0, 2.3, 0.0, 3.6, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 107, 60, 20, 0, 2.8, 0.0, 3.6, 16.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 2.8, 0.0, 3.6, 6.0, Some(0.0), Some(3.6), Some(16.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); AttackModule::set_down_only(boma, 4, true); } @@ -17,7 +20,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 13.0); + frame(lua_state, 10.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } @@ -32,7 +35,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 83, 100, 20, 0, 3.0, 0.0, 3.6, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 97, 100, 20, 0, 3.0, 0.0, 3.6, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 107, 60, 20, 0, 3.0, 0.0, 3.6, 17.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 3.0, 0.0, 3.6, 7.0, Some(0.0), Some(3.6), Some(17.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); AttackModule::set_down_only(boma, 4, true); } @@ -43,9 +46,6 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); - } - frame(lua_state, 12.0); - if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 13.0); @@ -59,8 +59,8 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let boma = agent.boma(); wait(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 100, 0, 30, 5.0, 0.0, 6.5, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 100, 0, 30, 5.0, 0.0, 6.5, 15.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 90, 0, 50, 5.0, 0.0, 6.5, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 90, 0, 50, 5.0, 0.0, 6.5, 15.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); } frame(lua_state, 6.0); if is_excute(agent) { @@ -134,6 +134,21 @@ unsafe extern "C" fn expression_attack13(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_attack100end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + wait(lua_state, 4.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 45, 66, 0, 80, 5.5, 0.0, 6.5, 11.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 45, 66, 0, 80, 5.5, 0.0, 6.5, 16.5, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 45, 66, 0, 80, 5.5, 0.0, 6.5, 20.5, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); diff --git a/fighters/pfushigisou/src/acmd/other.rs b/fighters/pfushigisou/src/acmd/other.rs index ecc62f8377..225e5f5aa3 100644 --- a/fighters/pfushigisou/src/acmd/other.rs +++ b/fighters/pfushigisou/src/acmd/other.rs @@ -86,16 +86,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -106,10 +102,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealhi(agent: &mut L2CAgentBase) { diff --git a/fighters/pfushigisou/src/acmd/smashes.rs b/fighters/pfushigisou/src/acmd/smashes.rs index 7691d0ed6d..14f224f490 100644 --- a/fighters/pfushigisou/src/acmd/smashes.rs +++ b/fighters/pfushigisou/src/acmd/smashes.rs @@ -51,13 +51,13 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 45, 83, 0, 45, 5.5, 0.0, 4.5, -0.85, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 83, 0, 45, 4.5, 0.0, 4.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 45, 83, 0, 45, 4.5, 0.0, 4.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 34, 83, 0, 50, 4.0, 0.0, 3.5, 13.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 4, 0, Hash40::new("top"), 13.0, 34, 83, 0, 50, 4.0, 0.0, 3.5, -14.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 5, 0, Hash40::new("top"), 13.0, 34, 83, 0, 50, 4.0, 0.0, 3.0, 20.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 6, 0, Hash40::new("top"), 13.0, 34, 83, 0, 50, 4.0, 0.0, 3.0, -21.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 361, 83, 0, 45, 4.5, 0.0, 3.5, -0.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 361, 83, 0, 45, 4.5, 0.0, 3.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 361, 83, 0, 45, 4.5, 0.0, 3.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 34, 83, 0, 50, 4.0, 0.0, 2.5, 13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 4, 0, Hash40::new("top"), 13.0, 34, 83, 0, 50, 4.0, 0.0, 2.5, -14.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 5, 0, Hash40::new("top"), 13.0, 34, 83, 0, 50, 4.0, 0.0, 2.5, 20.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 6, 0, Hash40::new("top"), 13.0, 34, 83, 0, 50, 4.0, 0.0, 2.5, -21.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); diff --git a/fighters/pfushigisou/src/acmd/specials.rs b/fighters/pfushigisou/src/acmd/specials.rs index d30143195a..03db6cc828 100644 --- a/fighters/pfushigisou/src/acmd/specials.rs +++ b/fighters/pfushigisou/src/acmd/specials.rs @@ -145,30 +145,23 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if agent.is_situation(*SITUATION_KIND_AIR) { - if is_excute(agent) { - boma.off_flag(*FIGHTER_PFUSHIGISOU_INSTANCE_WORK_ID_FLAG_SPECIAL_AIR_HI_HOP); - ArticleModule::generate_article(boma, *FIGHTER_PFUSHIGISOU_GENERATE_ARTICLE_VINE, false, 0); - ArticleModule::set_visibility_whole(boma, *FIGHTER_PFUSHIGISOU_GENERATE_ARTICLE_VINE, false, app::ArticleOperationTarget(0)); - WorkModule::on_flag(boma, *FIGHTER_PFUSHIGISOU_STATUS_SPECIAL_HI_SET_MAP_COLL_OFFSET); - } - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 16.0); - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); - } - frame(lua_state, 14.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); - } + if is_excute(agent) { + boma.off_flag(*FIGHTER_PFUSHIGISOU_INSTANCE_WORK_ID_FLAG_SPECIAL_AIR_HI_HOP); + ArticleModule::generate_article(boma, *FIGHTER_PFUSHIGISOU_GENERATE_ARTICLE_VINE, false, 0); + ArticleModule::set_visibility_whole(boma, *FIGHTER_PFUSHIGISOU_GENERATE_ARTICLE_VINE, false, app::ArticleOperationTarget(0)); + WorkModule::on_flag(boma, *FIGHTER_PFUSHIGISOU_STATUS_SPECIAL_HI_SET_MAP_COLL_OFFSET); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + } + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 16.0); + frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); } - else { - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 16.0); - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 14.0); + if is_excute(agent) { + WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); } frame(lua_state, 15.0); if is_excute(agent) { @@ -213,11 +206,11 @@ unsafe extern "C" fn game_speciallwin(agent: &mut L2CAgentBase) { let parent_id = LinkModule::get_parent_id(boma, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; let object = utils::util::get_battle_object_from_id(parent_id); VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_LW_BACKWARDS_SWITCH); // we will turn this off in opff - if VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE) == *PLEDGE_STATE_NONE { + //if VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE) == *PLEDGE_STATE_NONE { VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE, *PLEDGE_STATE_GRASS); let pledge_duration_frame = ParamModule::get_int(agent.battle_object, ParamType::Agent, "param_special_lw.pledge_duration_frame"); VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, pledge_duration_frame); - } + //} let swap_lockout_frame = ParamModule::get_int(agent.battle_object, ParamType::Agent, "param_special_lw.swap_lockout_frame"); VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_LW_SWAP_TIMER, swap_lockout_frame); VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); diff --git a/fighters/pfushigisou/src/acmd/throws.rs b/fighters/pfushigisou/src/acmd/throws.rs index b228e93ceb..2fbab47049 100644 --- a/fighters/pfushigisou/src/acmd/throws.rs +++ b/fighters/pfushigisou/src/acmd/throws.rs @@ -12,7 +12,7 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 5.0, 0.0, Some(0.0), Some(5.0), Some(20.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.8, 0.0, 5.0, 3.8, Some(0.0), Some(5.0), Some(20.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -67,6 +67,33 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 52, 45, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 16.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 52, 45, 0, 70, 6.0, 0.0, 7.0, 6.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, 12, 2); + } + frame(lua_state, 17.0); + FT_MOTION_RATE_RANGE(agent, 17.0, 38.0, 16.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + AttackModule::clear_all(boma); + } + frame(lua_state, 38.0); // F33 + FT_MOTION_RATE(agent, 1.0); +} + unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -231,6 +258,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("game_throwb", game_throwb, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); diff --git a/fighters/pfushigisou/src/acmd/tilts.rs b/fighters/pfushigisou/src/acmd/tilts.rs index 94c1d4f0ff..50e556fa2a 100644 --- a/fighters/pfushigisou/src/acmd/tilts.rs +++ b/fighters/pfushigisou/src/acmd/tilts.rs @@ -4,23 +4,20 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 6.0); - for _ in 0..6 { - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 20, 20, 0, 15, 4.5, 0.0, 4.0, 7.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 130, 20, 0, 15, 3.5, 0.0, 3.0, 17.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 20, 20, 0, 15, 4.0, 0.0, 4.5, 2.5, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 20, 20, 0, 15, 4.5, 0.0, 3.5, 13.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - } - wait(lua_state, 1.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - wait(lua_state, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 20, 100, 8, 0, 4.5, 0.0, 4.0, 7.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 130, 100, 8, 0, 4.5, 0.0, 3.5, 18.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 20, 100, 8, 0, 4.5, 0.0, 3.5, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + } + frame(lua_state, 16.0); + if is_excute(agent) { + AttackModule::clear_all(boma); } + frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 136, 0, 55, 5.5, 0.0, 5.0, 6.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 136, 0, 55, 5.5, 0.0, 5.0, 12.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 136, 0, 55, 5.0, 0.0, 4.5, 17.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 139, 0, 33, 5.0, 0.0, 5.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 361, 139, 0, 33, 5.0, 0.0, 5.0, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 361, 139, 0, 33, 5.0, 0.0, 5.0, 18.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); } wait(lua_state, 2.0); if is_excute(agent) { @@ -57,8 +54,8 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 88, 105, 0, 40, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 80, 105, 0, 40, 4.0, 0.0, 4.0, -7.0, Some(0.0), Some(4.0), Some(7.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("hip"), 9.0, 88, 105, 0, 40, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 80, 105, 0, 40, 3.0, 0.0, 4.0, -7.0, Some(0.0), Some(4.0), Some(7.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 10.0); if is_excute(agent) { @@ -91,10 +88,10 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("vinel1"), 6.0, 30, 50, 0, 40, 3.0, 2.5, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("vinel2"), 6.0, 30, 50, 0, 40, 3.0, 2.5, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 90, 70, 0, 54, 4.0, 0.0, 3.5, 14.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 0, Hash40::new("top"), 8.0, 90, 70, 0, 54, 4.0, 0.0, 3.2, 20.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("vinel1"), 7.0, 48, 50, 0, 40, 3.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("vinel2"), 7.0, 48, 50, 0, 40, 3.0, 2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 48, 50, 0, 40, 4.0, 0.0, 3.2, 13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 110, 70, 0, 40, 4.0, 0.0, 3.2, 20.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_OBJECT); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 7.0); diff --git a/fighters/pfushigisou/src/lib.rs b/fighters/pfushigisou/src/lib.rs index 760bd0197f..ac0333be72 100644 --- a/fighters/pfushigisou/src/lib.rs +++ b/fighters/pfushigisou/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/pfushigisou/src/seed/status.rs b/fighters/pfushigisou/src/seed/status.rs index d7c7352c7a..54d3d2130a 100644 --- a/fighters/pfushigisou/src/seed/status.rs +++ b/fighters/pfushigisou/src/seed/status.rs @@ -2,7 +2,7 @@ use super::*; use globals::*; pub unsafe extern "C" fn move_main(weapon: &mut L2CWeaponCommon) -> L2CValue { - GroundModule::set_passable_check(weapon.module_accessor, true); + GroundModule::set_passable_check(weapon.module_accessor, false); MotionModule::change_motion(weapon.module_accessor, Hash40::new("move"), 0.0, 1.0, false, 0.0, false, false); if !StopModule::is_stop(weapon.module_accessor) { WorkModule::dec_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); @@ -92,6 +92,18 @@ pub unsafe extern "C" fn update_rot(weapon: &mut L2CWeaponCommon) { PostureModule::set_rot(weapon.module_accessor, &Vector3f::new(0.0, 0.0, angle - 90.0), 0); } +unsafe extern "C" fn move_end(weapon: &mut L2CWeaponCommon) -> L2CValue { + let owner_boma = weapon.get_owner_boma(); + if owner_boma.kind() == *FIGHTER_KIND_PFUSHIGISOU { + VarModule::off_flag(owner_boma.object(), vars::pfushigisou::instance::SPECIAL_N_SEED_FIRED); + } + else if owner_boma.kind() == *FIGHTER_KIND_KIRBY { + VarModule::off_flag(owner_boma.object(), vars::kirby::instance::SPECIAL_N_PFUSHIGISOU_SEED_FIRED); + } + + return 0.into(); +} + // unsafe extern "C" fn clash_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { // StatusModule::init_settings( // weapon.module_accessor, @@ -156,6 +168,7 @@ pub unsafe extern "C" fn clash_ground_main_loop(weapon: &mut L2CWeaponCommon) -> pub fn install(agent: &mut Agent) { agent.status(Main, *WEAPON_PFUSHIGISOU_SEED_STATUS_KIND_MOVE, move_main); agent.status(Init, *WEAPON_PFUSHIGISOU_SEED_STATUS_KIND_MOVE, move_init); + agent.status(End, *WEAPON_PFUSHIGISOU_SEED_STATUS_KIND_MOVE, move_end); agent.status(Main, *WEAPON_PFUSHIGISOU_SEED_STATUS_KIND_CLASH, clash_main); diff --git a/fighters/pfushigisou/src/status/mod.rs b/fighters/pfushigisou/src/status/mod.rs index a51adb169e..4d69643a5c 100644 --- a/fighters/pfushigisou/src/status/mod.rs +++ b/fighters/pfushigisou/src/status/mod.rs @@ -6,21 +6,71 @@ mod special_lw; mod special_n; mod special_s; +unsafe extern "C" fn should_use_special_n_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::pfushigisou::instance::SPECIAL_N_SEED_FIRED) { + false.into() + } else { + true.into() + } +} + +unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { + fighter.global_table[globals::USE_SPECIAL_N_CALLBACK].assign(&L2CValue::Ptr(should_use_special_n_callback as *const () as _)); + + VarModule::off_flag(fighter.battle_object, vars::pfushigisou::instance::SPECIAL_N_SEED_FIRED); +} + unsafe extern "C" fn entry_main(fighter: &mut L2CFighterCommon) -> L2CValue { reset_ptrainer_vars(fighter); smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_ENTRY)(fighter) } unsafe extern "C" fn dead_main(fighter: &mut L2CFighterCommon) -> L2CValue { - reset_ptrainer_vars(fighter); + if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { + let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; + let object = utils::util::get_battle_object_from_id(parent_id); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE, *PLEDGE_STATE_GRASS); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, 0); + VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_LW_SWAP_TIMER, 0); + } + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DEAD)(fighter) } unsafe extern "C" fn rebirth_main(fighter: &mut L2CFighterCommon) -> L2CValue { - reset_ptrainer_vars(fighter); + if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { + let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; + let object = utils::util::get_battle_object_from_id(parent_id); + let pledge_state = VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE); + if pledge_state == *PLEDGE_STATE_WATER { + let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_status_defense_up"), Hash40::new("hip"), &Vector3f::new(0.7, 0.0, 0.0), &Vector3f::zero(), 0.8, true, 0, 0, 0, 0, 0, true, true) as u32; + VarModule::set_int(fighter.object(), vars::pfushigisou::instance::SPECIAL_N_PLEDGE_EFFECT_HANDLE, handle as i32); + fighter.play_pledge_effect(*PLEDGE_STATE_WATER); + } + else if pledge_state == *PLEDGE_STATE_FIRE { + let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_status_attack_up"), Hash40::new("hip"), &Vector3f::new(0.7, 0.0, 0.0), &Vector3f::zero(), 0.8, true, 0, 0, 0, 0, 0, true, true) as u32; + VarModule::set_int(fighter.object(), vars::pfushigisou::instance::SPECIAL_N_PLEDGE_EFFECT_HANDLE, handle as i32); + fighter.play_pledge_effect(*PLEDGE_STATE_FIRE); + } + let pledge_duration_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_lw.pledge_duration_frame"); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, pledge_duration_frame); + VarModule::off_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); + } + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_REBIRTH)(fighter) } +unsafe extern "C" fn win_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_ptrainer_vars(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_WIN)(fighter) +} + +unsafe extern "C" fn lose_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_ptrainer_vars(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_LOSE)(fighter) +} + unsafe extern "C" fn reset_ptrainer_vars(fighter: &mut L2CFighterCommon) { if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; @@ -33,9 +83,13 @@ unsafe extern "C" fn reset_ptrainer_vars(fighter: &mut L2CFighterCommon) { } pub fn install(agent: &mut Agent) { + agent.on_start(on_start); + agent.status(Main, *FIGHTER_STATUS_KIND_ENTRY, entry_main); agent.status(Main, *FIGHTER_STATUS_KIND_DEAD, dead_main); agent.status(Main, *FIGHTER_STATUS_KIND_REBIRTH, rebirth_main); + agent.status(Main, *FIGHTER_STATUS_KIND_WIN, win_main); + agent.status(Main, *FIGHTER_STATUS_KIND_LOSE, lose_main); special_lw::install(agent); special_n::install(agent); diff --git a/fighters/pfushigisou/src/status/special_n.rs b/fighters/pfushigisou/src/status/special_n.rs index 81861830e3..f2a8e41f3d 100644 --- a/fighters/pfushigisou/src/status/special_n.rs +++ b/fighters/pfushigisou/src/status/special_n.rs @@ -19,6 +19,7 @@ unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CV } unsafe extern "C" fn special_n_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::pfushigisou::instance::SPECIAL_N_SEED_FIRED); special_n_mot_helper(fighter, Hash40::new("special_n_end"), Hash40::new("special_air_n_end"), false); fighter.main_shift(special_n_end_main_loop) } diff --git a/fighters/pichu/Cargo.toml b/fighters/pichu/Cargo.toml index c5b19454c3..504c710b30 100644 --- a/fighters/pichu/Cargo.toml +++ b/fighters/pichu/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pichu/src/acmd/other.rs b/fighters/pichu/src/acmd/other.rs index 061e1afdef..579d1c3029 100644 --- a/fighters/pichu/src/acmd/other.rs +++ b/fighters/pichu/src/acmd/other.rs @@ -91,15 +91,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -109,10 +105,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/pichu/src/acmd/throws.rs b/fighters/pichu/src/acmd/throws.rs index 0aa6ade1af..344e82d1ee 100644 --- a/fighters/pichu/src/acmd/throws.rs +++ b/fighters/pichu/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 7.0, Some(0.0), Some(6.6), Some(9.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -34,7 +33,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(9.75), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 6.0, Some(0.0), Some(6.6), Some(9.75), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -54,7 +53,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-14.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -7.0, Some(0.0), Some(6.6), Some(-14.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/pichu/src/lib.rs b/fighters/pichu/src/lib.rs index 0e1fb8b6a0..5e5acdd8e4 100644 --- a/fighters/pichu/src/lib.rs +++ b/fighters/pichu/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/pichu/src/status/mod.rs b/fighters/pichu/src/status/mod.rs index ede4421f84..ff9021eb47 100644 --- a/fighters/pichu/src/status/mod.rs +++ b/fighters/pichu/src/status/mod.rs @@ -2,6 +2,7 @@ use super::*; use globals::*; // status script import mod special_hi; +mod special_s; unsafe extern "C" fn special_lw_end(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::off_flag(fighter.battle_object, vars::pichu::instance::SPECIAL_LW_DISCHARGE_AIR_START); @@ -12,4 +13,5 @@ pub fn install(agent: &mut Agent) { agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_end); special_hi::install(agent); + special_s::install(agent); } \ No newline at end of file diff --git a/fighters/pichu/src/status/special_s.rs b/fighters/pichu/src/status/special_s.rs new file mode 100644 index 0000000000..a2791d3239 --- /dev/null +++ b/fighters/pichu/src/status/special_s.rs @@ -0,0 +1,27 @@ +use super::*; + +// FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_END + +unsafe extern "C" fn special_s_end_init(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Init, fighter, *FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_END)(fighter); + + // Reduce speed on shield + let prev_inflict_status = VarModule::get_int(fighter.battle_object, vars::common::instance::PREV_STATUS_INFLICT_STATUS); + if prev_inflict_status & *COLLISION_KIND_MASK_SHIELD != 0 || prev_inflict_status & *COLLISION_KIND_MASK_PARRY != 0 { + let shield_hit_end_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + shield_hit_end_speed_x * lr, + 0.0 + ); + } + + ret +} + +pub fn install(agent: &mut Agent) { + agent.status(Init, *FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_END, special_s_end_init); +} \ No newline at end of file diff --git a/fighters/pickel/Cargo.toml b/fighters/pickel/Cargo.toml index 841c907a54..3421bd5597 100644 --- a/fighters/pickel/Cargo.toml +++ b/fighters/pickel/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pickel/src/acmd/other.rs b/fighters/pickel/src/acmd/other.rs index ab60fdf007..036a321629 100644 --- a/fighters/pickel/src/acmd/other.rs +++ b/fighters/pickel/src/acmd/other.rs @@ -72,16 +72,12 @@ unsafe extern "C" fn effect_run(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -92,10 +88,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appeals(agent: &mut L2CAgentBase) { diff --git a/fighters/pickel/src/lib.rs b/fighters/pickel/src/lib.rs index 6b47453a0b..c8e32f4a8a 100644 --- a/fighters/pickel/src/lib.rs +++ b/fighters/pickel/src/lib.rs @@ -39,6 +39,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/pickel/src/melt/acmd.rs b/fighters/pickel/src/melt/acmd.rs index ef43221cb8..1a778b631d 100644 --- a/fighters/pickel/src/melt/acmd.rs +++ b/fighters/pickel/src/melt/acmd.rs @@ -10,10 +10,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } wait(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 14.0, 27, 62, 0, 59, 3.5, 0.0, 3.0, 4.0, Some(0.0), Some(3.0), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, -1.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 1, Hash40::new("top"), 14.0, 27, 62, 0, 59, 2.5, 0.0, 1.5, 9.5, Some(0.0), Some(1.5), Some(-5.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, -1.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 1, Hash40::new("top"), 14.0, 27, 62, 0, 59, 2.5, 0.0, 3.0, 4.0, Some(0.0), Some(3.0), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, -1.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - ATTACK(agent, 3, 1, Hash40::new("top"), 14.0, 27, 62, 0, 59, 1.5, 0.0, 1.5, 9.5, Some(0.0), Some(1.5), Some(-5.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, -1.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 1, Hash40::new("top"), 14.0, 27, 62, 0, 59, 3.5, 0.0, 3.0, 4.0, Some(0.0), Some(3.0), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, -1.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 1, Hash40::new("top"), 14.0, 27, 62, 0, 59, 2.5, 0.0, 1.5, 9.5, Some(0.0), Some(1.5), Some(-5.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, -1.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 2, 1, Hash40::new("top"), 14.0, 27, 62, 0, 59, 2.5, 0.0, 3.0, 4.0, Some(0.0), Some(3.0), Some(-4.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, -1.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + ATTACK(agent, 3, 1, Hash40::new("top"), 14.0, 27, 62, 0, 59, 1.5, 0.0, 1.5, 9.5, Some(0.0), Some(1.5), Some(-5.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, -1.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); } wait(lua_state, 6.0); if is_excute(agent) { diff --git a/fighters/pikachu/Cargo.toml b/fighters/pikachu/Cargo.toml index e1a23a5cee..913ed85a6b 100644 --- a/fighters/pikachu/Cargo.toml +++ b/fighters/pikachu/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pikachu/src/acmd/aerials.rs b/fighters/pikachu/src/acmd/aerials.rs index d25ed39f2d..611118038a 100644 --- a/fighters/pikachu/src/acmd/aerials.rs +++ b/fighters/pikachu/src/acmd/aerials.rs @@ -196,28 +196,30 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("tail4"), 0.0, 0, 0, 0, 0, 0.1, 0.0, 0.0, 2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_IF, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); } frame(lua_state, 4.0); - FT_MOTION_RATE_RANGE(agent, 4.0, 10.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("tail2"), 5.0, 100, 60, 0, 90, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("tail4"), 5.0, 100, 60, 0, 90, 5.0, 0.0, 0.0, 2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("tail2"), 4.0, 100, 60, 0, 90, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("tail4"), 4.0, 100, 60, 0, 90, 5.0, 0.0, 0.0, 2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); } frame(lua_state, 5.0); + FT_MOTION_RATE_RANGE(agent, 5.0, 6.5, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("tail1"), 8.0, 20, 60, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); ATTACK(agent, 1, 0, Hash40::new("tail4"), 8.0, 20, 60, 0, 45, 5.0, 0.0, 0.0, 2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); } - frame(lua_state, 9.0); + frame(lua_state, 6.5); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 8.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("tail2"), 5.0, 120, 60, 0, 75, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); ATTACK(agent, 1, 0, Hash40::new("tail4"), 5.0, 120, 60, 0, 75, 5.0, 0.0, 0.0, 2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); } - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 11.0); - FT_MOTION_RATE_RANGE(agent, 11.0, 27.0, 20.0); + frame(lua_state, 9.5); + FT_MOTION_RATE_RANGE(agent, 9.5, 11.0, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 11.0); + FT_MOTION_RATE_RANGE(agent, 11.0, 27.0, 20.0); frame(lua_state, 18.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); @@ -289,8 +291,8 @@ unsafe extern "C" fn effect_landingairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); if VarModule::is_flag(agent.battle_object, vars::pikachu::instance::ATTACK_AIR_LANDING_HIT) { - LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); LAST_EFFECT_SET_ALPHA(agent, 0.7); } diff --git a/fighters/pikachu/src/acmd/ground.rs b/fighters/pikachu/src/acmd/ground.rs index ef8fd299bb..f659c119a0 100644 --- a/fighters/pikachu/src/acmd/ground.rs +++ b/fighters/pikachu/src/acmd/ground.rs @@ -8,10 +8,13 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 1.5, 55, 150, 0, 0, 3.0, 0.0, 3.0, 7.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); ATTACK(agent, 1, 0, Hash40::new("top"), 1.5, 55, 150, 0, 0, 3.0, 0.0, 3.0, 9.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); ATTACK(agent, 2, 0, Hash40::new("top"), 1.5, 55, 150, 0, 0, 3.5, 0.0, 3.0, 12.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); - // jab lock hitboxes + // Jab lock hitboxes ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 361, 100, 30, 0, 3.0, 0.0, 3.0, 7.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); ATTACK(agent, 4, 0, Hash40::new("top"), 1.5, 361, 100, 30, 0, 3.0, 0.0, 3.0, 9.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); ATTACK(agent, 5, 0, Hash40::new("top"), 1.5, 361, 100, 30, 0, 3.5, 0.0, 3.0, 12.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + AttackModule::set_down_only(boma, 3, true); + AttackModule::set_down_only(boma, 4, true); + AttackModule::set_down_only(boma, 5, true); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/pikachu/src/acmd/other.rs b/fighters/pikachu/src/acmd/other.rs index 63ded40ab3..f119911877 100644 --- a/fighters/pikachu/src/acmd/other.rs +++ b/fighters/pikachu/src/acmd/other.rs @@ -72,15 +72,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -90,10 +86,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealhi(agent: &mut L2CAgentBase) { diff --git a/fighters/pikachu/src/acmd/specials.rs b/fighters/pikachu/src/acmd/specials.rs index 5fa16e1b9c..14accac420 100644 --- a/fighters/pikachu/src/acmd/specials.rs +++ b/fighters/pikachu/src/acmd/specials.rs @@ -5,14 +5,27 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::pikachu::instance::DISABLE_SPECIAL_S); boma.select_cliff_hangdata_from_name("special_s"); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); } frame(lua_state, 5.0); if is_excute(agent) { + let min_power = WorkModule::get_param_float(boma, hash40("param_special_s"), hash40("special_s_power_min_")); + let max_power = WorkModule::get_param_float(boma, hash40("param_special_s"), hash40("special_s_power_tame_")); + let max_charge = WorkModule::get_param_float(boma, hash40("param_special_s"), hash40("special_s_tame_time_")); + + let mut charge_frames = WorkModule::get_int(boma, *FIGHTER_PIKACHU_STATUS_WORK_ID_INT_SKULL_BASH_HOLD_COUNT).to_f32(); + if charge_frames == 20.0 { + charge_frames = 8.0; + } + let range = max_power - min_power; + let power_per_frame = range / max_charge; + let real_power = min_power + (power_per_frame * charge_frames); + JostleModule::set_status(boma, false); WorkModule::on_flag(boma, *FIGHTER_PIKACHU_STATUS_WORK_ID_FLAG_SKULL_BASH_ATTACK_TRIGGER); - ATTACK(agent, 0, 0, Hash40::new("rot"), 1.0, 361, 78, 0, 40, 3.0, 0.0, -0.7, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("rot"), real_power, 361, 78, 0, 40, 3.0, 0.0, -0.7, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); WorkModule::on_flag(boma, *FIGHTER_PIKACHU_STATUS_WORK_ID_FLAG_SKULL_BASH_CALC_ATTACK_POWER); AttackModule::set_attack_keep_rumble(boma, 0, true); } @@ -33,7 +46,7 @@ unsafe extern "C" fn game_specialairsmissend(agent: &mut L2CAgentBase) { boma.select_cliff_hangdata_from_name("special_s"); JostleModule::set_status(boma, true); } - frame(lua_state, 7.0); + frame(lua_state, 22.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); } diff --git a/fighters/pikachu/src/acmd/throws.rs b/fighters/pikachu/src/acmd/throws.rs index 412d6d2c0a..b4a8f529c7 100644 --- a/fighters/pikachu/src/acmd/throws.rs +++ b/fighters/pikachu/src/acmd/throws.rs @@ -7,13 +7,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.5, 3.5); } - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.5, 0.0, Some(0.0), Some(5.5), Some(7.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.5, 4.0, Some(0.0), Some(5.5), Some(7.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -33,7 +33,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.5, 0.0, Some(0.0), Some(5.5), Some(8.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.5, 3.5, Some(0.0), Some(5.5), Some(8.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -53,7 +53,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.5, 0.0, Some(0.0), Some(5.5), Some(-12.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.5, -3.5, Some(0.0), Some(5.5), Some(-12.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/pikachu/src/lib.rs b/fighters/pikachu/src/lib.rs index d5f9d73ff6..1bb24bd6c3 100644 --- a/fighters/pikachu/src/lib.rs +++ b/fighters/pikachu/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/pikachu/src/status/mod.rs b/fighters/pikachu/src/status/mod.rs index 4a9cefa34f..585a9120cb 100644 --- a/fighters/pikachu/src/status/mod.rs +++ b/fighters/pikachu/src/status/mod.rs @@ -2,7 +2,34 @@ use super::*; use globals::*; // status script import mod special_hi; +mod special_s; + +// Prevents sideB from being used again if it has already been used once in the current airtime +unsafe extern "C" fn should_use_special_s_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_AIR) && VarModule::is_flag(fighter.battle_object, vars::pikachu::instance::DISABLE_SPECIAL_S) { + false.into() + } else { + true.into() + } +} + +// Re-enables the ability to use sideB when connecting to ground or cliff +unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) + || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { + VarModule::off_flag(fighter.battle_object, vars::pikachu::instance::DISABLE_SPECIAL_S); + } + true.into() +} + +unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { + fighter.global_table[globals::USE_SPECIAL_S_CALLBACK].assign(&L2CValue::Ptr(should_use_special_s_callback as *const () as _)); + fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); +} pub fn install(agent: &mut Agent) { + agent.on_start(on_start); + special_hi::install(agent); + special_s::install(agent); } \ No newline at end of file diff --git a/fighters/pikachu/src/status/special_hi.rs b/fighters/pikachu/src/status/special_hi.rs index cef72a61f3..50ed7a5bbe 100644 --- a/fighters/pikachu/src/status/special_hi.rs +++ b/fighters/pikachu/src/status/special_hi.rs @@ -36,7 +36,6 @@ unsafe extern "C" fn special_hi_end_main(fighter: &mut L2CFighterCommon) -> L2CV ArticleModule::change_motion(fighter.module_accessor, *FIGHTER_PIKACHU_GENERATE_ARTICLE_SPECIALUPDUMMY, Hash40::new("special_air_hi_end"), false, -1.0); ArticleModule::set_frame(fighter.module_accessor, *FIGHTER_PIKACHU_GENERATE_ARTICLE_SPECIALUPDUMMY, 0.0); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi_end"), 0.0, 1.0, false, 0.0, false, false); - ControlModule::clear_command(fighter.module_accessor, false); fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_end_main_loop as *const () as _)) } @@ -45,6 +44,11 @@ unsafe extern "C" fn special_hi_end_main_loop(fighter: &mut L2CFighterCommon) -> return true.into(); } + if fighter.global_table[PREV_SITUATION_KIND] == SITUATION_KIND_GROUND + && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { + fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL, false); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { if VarModule::is_flag(fighter.battle_object, vars::pikachu::status::SPECIAL_HI_QUICK_ATTACK_CANCEL) && fighter.is_cat_flag(Cat1::AirEscape) { @@ -80,7 +84,7 @@ unsafe extern "C" fn special_hi_end_main_loop(fighter: &mut L2CFighterCommon) -> CancelModule::enable_cancel(fighter.module_accessor); // disable gravity and place pikachu in the air KineticModule::clear_speed_energy_id(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - PostureModule::add_pos(fighter.module_accessor, &Vector3f::new(0.0, 1.5, 0.0)); + PostureModule::add_pos(fighter.module_accessor, &Vector3f::new(0.0, 2.2, 0.0)); StatusModule::set_situation_kind(fighter.module_accessor, smash::app::SituationKind(*SITUATION_KIND_AIR), false); fighter.global_table[PREV_SITUATION_KIND].assign(&L2CValue::I32(situation_kind)); fighter.global_table[SITUATION_KIND].assign(&L2CValue::I32(*SITUATION_KIND_AIR)); diff --git a/fighters/pikachu/src/status/special_s.rs b/fighters/pikachu/src/status/special_s.rs new file mode 100644 index 0000000000..10a7281925 --- /dev/null +++ b/fighters/pikachu/src/status/special_s.rs @@ -0,0 +1,103 @@ +use super::*; +use globals::*; +// status script import + +unsafe extern "C" fn special_s_hold_init(fighter: &mut L2CFighterCommon) -> L2CValue { + WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_PIKACHU_STATUS_WORK_ID_INT_SKULL_BASH_HOLD_COUNT); + + return smashline::original_status(Init, fighter, *FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_HOLD)(fighter); +} + +unsafe extern "C" fn special_s_attack(fighter: &mut L2CFighterCommon) -> L2CValue { + + if fighter.is_situation(*SITUATION_KIND_AIR) { + VarModule::on_flag(fighter.battle_object, vars::pikachu::instance::DISABLE_SPECIAL_S); + } + + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_PIKACHU_STATUS_WORK_ID_FLAG_SKULL_BASH_HIT); + + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + StatusModule::set_situation_kind(fighter.module_accessor, app::SituationKind(*SITUATION_KIND_AIR), false); + + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s"), 0.0, 1.0, false, 0.0, false, false); + GroundModule::select_cliff_hangdata(fighter.module_accessor, *FIGHTER_PICHU_CLIFF_HANG_DATA_SPECIAL_S as u32); + + fighter.sub_shift_status_main(L2CValue::Ptr(special_s_attack_main_loop as *const () as _)) + + //return smashline::original_status(Main, fighter, *FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_ATTACK)(fighter); +} + +unsafe extern "C" fn special_s_attack_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return true.into(); + } + + if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PIKACHU_STATUS_WORK_ID_FLAG_SKULL_BASH_ATTACK_POWER_MODIFY) { + /*let min_power = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("special_s_power_min_")); + let max_power = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("special_s_power_tame_")); + let max_charge = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("special_s_tame_time_")); + + let charge_frames = WorkModule::get_int(fighter.module_accessor, *FIGHTER_PIKACHU_STATUS_WORK_ID_INT_SKULL_BASH_HOLD_COUNT); + let range = max_power - min_power; + let power_per_frame = range / max_charge; + let real_power = min_power + (power_per_frame * charge_frames.to_f32()); + AttackModule::set_power(fighter.module_accessor, 0, real_power, false);*/ + + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_PIKACHU_STATUS_WORK_ID_FLAG_SKULL_BASH_ATTACK_POWER_MODIFY); + } + + let mut touch_wall = false; + let bounce = Vector3f::new(2.5, 1.2, 0.0); + let gravity = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_lw"), hash40("special_lw_air_yaccel_")); + if PostureModule::lr(fighter.module_accessor) > 0.0 { + touch_wall = GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_RIGHT as u32); + } else { + touch_wall = GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_LEFT as u32); + } + + if touch_wall { + /*KineticModule::clear_speed_all(fighter.module_accessor); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, gravity); + KineticModule::add_speed(fighter.module_accessor, &bounce);*/ + + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_PIKACHU_STATUS_WORK_ID_FLAG_SKULL_BASH_HIT); + + EFFECT(fighter, Hash40::new("sys_crown"), Hash40::new("head"), 1, 0, 0, 0, 0, 90, 0.7, 0, 0, 0, 0, 0, 0, false); + + SoundModule::play_se(fighter.module_accessor, Hash40::new("se_common_down_m_01"), true, false, false, false, enSEType(0)); + fighter.change_status(FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + } + + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + } + + let x_speed = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let direction = PostureModule::lr(fighter.module_accessor); + let mut stop = false; + + if (direction > 0.0) { + if x_speed < 0.0 { + stop = true; + } + } else { + if x_speed > 0.0 { + stop = true; + } + } + + if (stop == true) { + lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + app::sv_kinetic_energy::set_speed(fighter.lua_state_agent); + + lua_args!(fighter,FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + app::sv_kinetic_energy::set_accel(fighter.lua_state_agent); + } + + return false.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Init, *FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_HOLD, special_s_hold_init); + agent.status(Main, *FIGHTER_PIKACHU_STATUS_KIND_SPECIAL_S_ATTACK, special_s_attack); +} \ No newline at end of file diff --git a/fighters/pikmin/Cargo.toml b/fighters/pikmin/Cargo.toml index 403de05cf1..53230c75a8 100644 --- a/fighters/pikmin/Cargo.toml +++ b/fighters/pikmin/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pikmin/src/acmd/other.rs b/fighters/pikmin/src/acmd/other.rs index cdf2198ef9..d5b4772bcc 100644 --- a/fighters/pikmin/src/acmd/other.rs +++ b/fighters/pikmin/src/acmd/other.rs @@ -49,15 +49,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -67,10 +63,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/pikmin/src/lib.rs b/fighters/pikmin/src/lib.rs index 0976ddb828..7f151e8273 100644 --- a/fighters/pikmin/src/lib.rs +++ b/fighters/pikmin/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/pikmin/src/pikmin/acmd/aerials.rs b/fighters/pikmin/src/pikmin/acmd/aerials.rs index cebe0fb421..e93ee4350e 100644 --- a/fighters/pikmin/src/pikmin/acmd/aerials.rs +++ b/fighters/pikmin/src/pikmin/acmd/aerials.rs @@ -6,8 +6,7 @@ use globals::*; unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 2.0); FT_MOTION_RATE_RANGE(agent, 2.0, 6.0, 2.0); @@ -15,27 +14,27 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 6.0, 22.0, 20.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); - let dmg = 8.8; - ATTACK(agent, 0, 0, Hash40::new("head2"), dmg * p.dmg, 75 + p.angle, 100, 0, 40, 2.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head2"), dmg * p.dmg, 75 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 2, 0, Hash40::new("head1"), dmg * p.dmg, 75 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 3, 0, Hash40::new("waist"), dmg * p.dmg, 75 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + let dmg = 8.0; + ATTACK(agent, 0, 0, Hash40::new("head2"), dmg, 75 + p.angle, 108.mul_f32(p.kbg), 0, 40, 2.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head2"), dmg, 75 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 2, 0, Hash40::new("head1"), dmg, 75 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 3, 0, Hash40::new("waist"), dmg, 75 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 10.0); if is_excute(agent) { - let dmg = 7.6; - ATTACK(agent, 0, 0, Hash40::new("head2"), dmg * p.dmg, 62 + p.angle, 100, 0, 40, 2.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head2"), dmg * p.dmg, 62 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 2, 0, Hash40::new("head1"), dmg * p.dmg, 62 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 3, 0, Hash40::new("waist"), dmg * p.dmg, 62 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + let dmg = 7.0; + ATTACK(agent, 0, 0, Hash40::new("head2"), dmg, 62 + p.angle, 108.mul_f32(p.kbg), 0, 40, 2.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head2"), dmg, 62 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 2, 0, Hash40::new("head1"), dmg, 62 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 3, 0, Hash40::new("waist"), dmg, 62 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 17.0); if is_excute(agent) { - let dmg = 6.4; - ATTACK(agent, 0, 0, Hash40::new("head2"), dmg * p.dmg, 50 + p.angle, 100, 0, 40, 2.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head2"), dmg * p.dmg, 50 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 2, 0, Hash40::new("head1"), dmg * p.dmg, 50 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 3, 0, Hash40::new("waist"), dmg * p.dmg, 50 + p.angle, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + let dmg = 6.0; + ATTACK(agent, 0, 0, Hash40::new("head2"), dmg, 50 + p.angle, 108.mul_f32(p.kbg), 0, 40, 2.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head2"), dmg, 50 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 2, 0, Hash40::new("head1"), dmg, 50 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 3, 0, Hash40::new("waist"), dmg, 50 + p.angle, 108.mul_f32(p.kbg), 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 10, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 22.0); FT_MOTION_RATE(agent, 1.0); @@ -48,8 +47,7 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); frame(lua_state, 6.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("pikmin_smash_trail"), Hash40::new("waist"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.5, true); @@ -67,23 +65,22 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 5.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); let dmg = 8.0; - ATTACK(agent, 0, 0, Hash40::new("head2"), dmg * p.dmg, 50 + p.angle, 76, 0, 60, 2.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head2"), dmg * p.dmg, 50 + p.angle, 76, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 2, 0, Hash40::new("head1"), dmg * p.dmg, 50 + p.angle, 76, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 3, 0, Hash40::new("waist"), dmg * p.dmg, 50 + p.angle, 76, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("head2"), dmg, 50 + p.angle, 76.mul_f32(p.kbg), 0, 60, 2.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head2"), dmg, 50 + p.angle, 76.mul_f32(p.kbg), 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 2, 0, Hash40::new("head1"), dmg, 50 + p.angle, 76.mul_f32(p.kbg), 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 3, 0, Hash40::new("waist"), dmg, 50 + p.angle, 76.mul_f32(p.kbg), 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 6.0); if is_excute(agent) { - let dmg = 11.2; - ATTACK(agent, 2, 0, Hash40::new("head1"), dmg * p.dmg, 50 + p.angle, 76, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 3, 0, Hash40::new("waist"), dmg * p.dmg, 50 + p.angle, 76, 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + let dmg = 11.0; + ATTACK(agent, 2, 0, Hash40::new("head1"), dmg, 50 + p.angle, 76.mul_f32(p.kbg), 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 3, 0, Hash40::new("waist"), dmg, 50 + p.angle, 76.mul_f32(p.kbg), 0, 60, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 10.0); if is_excute(agent) { @@ -92,18 +89,30 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let p = PikminInfo::from(agent.boma()); + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_arc_hdr"), Hash40::new("top"), 3, 6, 3.5, 10, -10, -70, 1, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_flash"), Hash40::new("waist"), 0, 0, 0.0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + } +} + unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); let dmg = 12.0; - ATTACK(agent, 0, 0, Hash40::new("head1"), dmg * p.dmg, 40 + p.angle, 110, 0, 30, 4.0, 0.0, 5.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head1"), dmg * p.dmg, 40 + p.angle, 110, 0, 22, 4.0, 0.0, -1.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("head1"), dmg, 40 + p.angle, 110.mul_f32(p.kbg), 0, 30, 4.0, 0.0, 5.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head1"), dmg, 40 + p.angle, 110.mul_f32(p.kbg), 0, 22, 4.0, 0.0, -1.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 15.0); if is_excute(agent) { @@ -112,20 +121,32 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let p = PikminInfo::from(agent.boma()); + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_arc_hdr"), Hash40::new("top"), 1, 7, -1, 180, 0, 60, 1.1, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_flash"), Hash40::new("waist"), 0, 0, 0.0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + } +} + unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 7.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); let dmg = 8.0; - ATTACK(agent, 0, 0, Hash40::new("head2"), dmg * p.dmg, 95 + p.angle, 113, 0, 43, 3.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head2"), dmg * p.dmg, 95 + p.angle, 113, 0, 43, 3.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 2, 0, Hash40::new("head1"), dmg * p.dmg, 95 + p.angle, 113, 0, 43, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 3, 0, Hash40::new("waist"), dmg * p.dmg, 95 + p.angle, 113, 0, 43, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("head2"), dmg, 95 + p.angle, 113.mul_f32(p.kbg), 0, 43, 3.5, 2.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head2"), dmg, 95 + p.angle, 113.mul_f32(p.kbg), 0, 43, 3.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 2, 0, Hash40::new("head1"), dmg, 95 + p.angle, 113.mul_f32(p.kbg), 0, 43, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 3, 0, Hash40::new("waist"), dmg, 95 + p.angle, 113.mul_f32(p.kbg), 0, 43, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 18.0); if is_excute(agent) { @@ -134,22 +155,44 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let p = PikminInfo::from(agent.boma()); + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_arc_hdr"), Hash40::new("top"), 0, 12, 1, -110, -90, 0, 0.75, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_flash"), Hash40::new("waist"), 0, 0, 0.0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + } + frame(lua_state, 14.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_arc_hdr"), Hash40::new("top"), 0, 11, -1, 0, 90, 90, 0.7, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + LAST_EFFECT_SET_RATE(agent, 1.4); + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_flash"), Hash40::new("waist"), 0, 0, 0.0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + } +} + + + unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); - let dmg = 10.08; - ATTACK(agent, 0, 0, Hash40::new("head1"), dmg * p.dmg, 270 + p.angle, 64, 0, 32, 3.5, 0.0, 3.0, 0.0, Some(0.0), Some(-1.5), Some(0.0), p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + let dmg = 10.0; + ATTACK(agent, 0, 0, Hash40::new("head1"), dmg, 270 + p.angle, 64.mul_f32(p.kbg), 0, 32, 3.5, 0.0, 3.0, 0.0, Some(0.0), Some(-1.5), Some(0.0), p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } wait(lua_state, 4.0); if is_excute(agent) { - let dmg = 6.4; - ATTACK(agent, 0, 0, Hash40::new("head1"), dmg * p.dmg, 50, 60, 0, 40, 2.5, 0.0, 3.0, 0.0, Some(0.0), Some(-1.5), Some(0.0), p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_S, p.sound, *ATTACK_REGION_PIKMIN); + let dmg = 6.0; + ATTACK(agent, 0, 0, Hash40::new("head1"), dmg, 50 + p.angle, 60.mul_f32(p.kbg), 0, 40, 2.5, 0.0, 3.0, 0.0, Some(0.0), Some(-1.5), Some(0.0), p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_S, p.sound, *ATTACK_REGION_PIKMIN); AttackModule::clear(boma, 1, false); } wait(lua_state, 11.0); @@ -159,6 +202,19 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let p = PikminInfo::from(agent.boma()); + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_arc_hdr"), Hash40::new("top"), 0, 1, -1, 260, -180, -250, 1.2, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + EFFECT_FOLLOW(agent, Hash40::new("pikmin_attack_flash"), Hash40::new("waist"), 0, 0, 0.0, 0, 0, 0, 1.0, true); + LAST_EFFECT_SET_COLOR(agent, p.color.x, p.color.y, p.color.z); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); agent.acmd("game_attackairn_y", game_attackairn, Priority::Low); @@ -176,22 +232,43 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairf_b", game_attackairf, Priority::Low); agent.acmd("game_attackairf_w", game_attackairf, Priority::Low); agent.acmd("game_attackairf_v", game_attackairf, Priority::Low); + agent.acmd("effect_attackairf", effect_attackairf, Priority::Low); + agent.acmd("effect_attackairf_y", effect_attackairf, Priority::Low); + agent.acmd("effect_attackairf_b", effect_attackairf, Priority::Low); + agent.acmd("effect_attackairf_w", effect_attackairf, Priority::Low); + agent.acmd("effect_attackairf_v", effect_attackairf, Priority::Low); agent.acmd("game_attackairb", game_attackairb, Priority::Low); agent.acmd("game_attackairb_y", game_attackairb, Priority::Low); agent.acmd("game_attackairb_b", game_attackairb, Priority::Low); agent.acmd("game_attackairb_w", game_attackairb, Priority::Low); agent.acmd("game_attackairb_v", game_attackairb, Priority::Low); + agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); + agent.acmd("effect_attackairb_y", effect_attackairb, Priority::Low); + agent.acmd("effect_attackairb_b", effect_attackairb, Priority::Low); + agent.acmd("effect_attackairb_w", effect_attackairb, Priority::Low); + agent.acmd("effect_attackairb_v", effect_attackairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); agent.acmd("game_attackairhi_y", game_attackairhi, Priority::Low); agent.acmd("game_attackairhi_b", game_attackairhi, Priority::Low); agent.acmd("game_attackairhi_w", game_attackairhi, Priority::Low); agent.acmd("game_attackairhi_v", game_attackairhi, Priority::Low); + agent.acmd("effect_attackairhi", effect_attackairhi, Priority::Low); + agent.acmd("effect_attackairhi_y", effect_attackairhi, Priority::Low); + agent.acmd("effect_attackairhi_b", effect_attackairhi, Priority::Low); + agent.acmd("effect_attackairhi_w", effect_attackairhi, Priority::Low); + agent.acmd("effect_attackairhi_v", effect_attackairhi, Priority::Low); + agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); agent.acmd("game_attackairlw_y", game_attackairlw, Priority::Low); agent.acmd("game_attackairlw_b", game_attackairlw, Priority::Low); agent.acmd("game_attackairlw_w", game_attackairlw, Priority::Low); agent.acmd("game_attackairlw_v", game_attackairlw, Priority::Low); + agent.acmd("effect_attackairlw", effect_attackairlw, Priority::Low); + agent.acmd("effect_attackairlw_y", effect_attackairlw, Priority::Low); + agent.acmd("effect_attackairlw_b", effect_attackairlw, Priority::Low); + agent.acmd("effect_attackairlw_w", effect_attackairlw, Priority::Low); + agent.acmd("effect_attackairlw_v", effect_attackairlw, Priority::Low); } diff --git a/fighters/pikmin/src/pikmin/acmd/mod.rs b/fighters/pikmin/src/pikmin/acmd/mod.rs index c3284d0fd4..4da45e1377 100644 --- a/fighters/pikmin/src/pikmin/acmd/mod.rs +++ b/fighters/pikmin/src/pikmin/acmd/mod.rs @@ -1,5 +1,6 @@ use super::*; use smash::lib::lua_const::*; +use smash_script::macros::ATTACK_ABS; mod aerials; mod other; diff --git a/fighters/pikmin/src/pikmin/acmd/smashes.rs b/fighters/pikmin/src/pikmin/acmd/smashes.rs index 85c788d275..cc14951550 100644 --- a/fighters/pikmin/src/pikmin/acmd/smashes.rs +++ b/fighters/pikmin/src/pikmin/acmd/smashes.rs @@ -6,26 +6,25 @@ use globals::*; unsafe extern "C" fn game_attacks4sjump(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); let dmg = 20.3; - ATTACK(agent, 0, 0, Hash40::new("head1"), dmg * p.dmg, 361, 75, 0, 33, 4.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head1"), dmg * p.dmg, 361, 75, 0, 33, 4.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("head1"), dmg, 44 + p.angle, 75.mul_f32(p.kbg), 0, 33, 4.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head1"), dmg, 44 + p.angle, 75.mul_f32(p.kbg), 0, 33, 4.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } wait(lua_state, 4.0); if is_excute(agent) { let dmg = 14.0; - ATTACK(agent, 0, 0, Hash40::new("head1"), dmg * p.dmg, 361, 75, 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head1"), dmg * p.dmg, 361, 75, 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("head1"), dmg, 44 + p.angle, 75.mul_f32(p.kbg), 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head1"), dmg, 44 + p.angle, 75.mul_f32(p.kbg), 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); } wait(lua_state, 5.0); if is_excute(agent) { let dmg = 8.4; - ATTACK(agent, 0, 0, Hash40::new("head1"), dmg * p.dmg, 361, 75, 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_S, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head1"), dmg * p.dmg, 361, 75, 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_S, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("head1"), dmg, 44 + p.angle, 75.mul_f32(p.kbg), 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_S, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head1"), dmg, 44 + p.angle, 75.mul_f32(p.kbg), 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_S, p.sound, *ATTACK_REGION_PIKMIN); } wait(lua_state, 10.0); if is_excute(agent) { @@ -37,20 +36,19 @@ unsafe extern "C" fn game_attacks4sjump(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); let dmg = 18.2; - ATTACK(agent, 0, 0, Hash40::new("top"), dmg * p.dmg, 83 + p.angle, 72, 0, 50, 6.0, 0.0, 3.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("top"), dmg * p.dmg, 83 + p.angle, 72, 0, 50, 6.0, 0.0, 3.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("top"), dmg, 80 + p.angle, 72.mul_f32(p.kbg), 0, 50, 6.0, 0.0, 3.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("top"), dmg, 80 + p.angle, 72.mul_f32(p.kbg), 0, 50, 6.0, 0.0, 3.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } - frame(lua_state, 4.0); + frame(lua_state, 3.0); if is_excute(agent) { let dmg = 14.0; - ATTACK(agent, 0, 0, Hash40::new("top"), dmg * p.dmg, 60 + p.angle, 68, 0, 50, 5.0, 0.0, 3.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("top"), dmg * p.dmg, 60 + p.angle, 68, 0, 50, 5.0, 0.0, 3.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("top"), dmg, 60 + p.angle, 68.mul_f32(p.kbg), 0, 50, 5.0, 0.0, 3.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("top"), dmg, 60 + p.angle, 68.mul_f32(p.kbg), 0, 50, 5.0, 0.0, 3.5, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg + 10.0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 11.0); if is_excute(agent) { @@ -62,20 +60,19 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("waist"), *HIT_STATUS_XLU); let dmg = 15.4; - ATTACK(agent, 0, 0, Hash40::new("head1"), dmg * p.dmg, 28 + p.angle, 71, 0, 32, 4.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.2, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head1"), dmg * p.dmg, 28 + p.angle, 71, 0, 32, 4.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.2, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("head1"), dmg, 28 + p.angle, 71.mul_f32(p.kbg), 0, 32, 4.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg + 10.0, 0.2, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head1"), dmg, 28 + p.angle, 71.mul_f32(p.kbg), 0, 32, 4.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg + 10.0, 0.2, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 4.0); if is_excute(agent) { let dmg = 12.6; - ATTACK(agent, 0, 0, Hash40::new("head1"), dmg * p.dmg, 28 + p.angle, 71, 0, 25, 4.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.2, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("head1"), dmg * p.dmg, 28 + p.angle, 71, 0, 25, 4.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg + 10.0 * (1.0 - p.shield_dmg), 0.2, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("head1"), dmg, 28 + p.angle, 71.mul_f32(p.kbg), 0, 25, 4.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg + 10.0, 0.2, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("head1"), dmg, 28 + p.angle, 71.mul_f32(p.kbg), 0, 25, 4.5, 0.0, 0.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg + 10.0, 0.2, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_M, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 9.0); if is_excute(agent) { diff --git a/fighters/pikmin/src/pikmin/acmd/specials.rs b/fighters/pikmin/src/pikmin/acmd/specials.rs index 15ce5b6ab1..cf816fabb4 100644 --- a/fighters/pikmin/src/pikmin/acmd/specials.rs +++ b/fighters/pikmin/src/pikmin/acmd/specials.rs @@ -4,7 +4,7 @@ unsafe extern "C" fn game_spsremved(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); if VarModule::is_flag(agent.battle_object, vars::pikmin::instance::SPECIAL_S_PIKMIN_DETONATE_IS_DETACH_FOR_DETONATE) { if is_excute(agent) { @@ -17,7 +17,7 @@ unsafe extern "C" fn game_spsremved(agent: &mut L2CAgentBase) { } else { 1.0 }; - ATTACK(agent, 0, 0, Hash40::new("waist"), dmg * p.dmg, 90, 105, 0, 65, 6.0, 0.0, 0.0, 0.0, None, None, None, hitlag * p.hitlag, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr_special, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("waist"), dmg, 90 + p.angle, 105.mul_f32(p.kbg), 0, 65, 6.0, 0.0, 0.0, 0.0, None, None, None, hitlag * p.hitlag, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr_special, *ATTACK_SOUND_LEVEL_L, p.sound, *ATTACK_REGION_PIKMIN); } frame(lua_state, 6.0); if is_excute(agent) { @@ -84,8 +84,8 @@ unsafe extern "C" fn game_spsthrown_v(agent: &mut L2CAgentBase) { let boma = agent.boma(); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.4, 361, 80, 0, 40, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -5.2, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PIKMIN); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.4, 361, 80, 0, 40, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -5.2, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 44, 100, 0, 20, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 44, 100, 0, 20, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PIKMIN); } frame(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/pikmin/src/pikmin/acmd/throws.rs b/fighters/pikmin/src/pikmin/acmd/throws.rs index ccad104ecb..4a12504b8e 100644 --- a/fighters/pikmin/src/pikmin/acmd/throws.rs +++ b/fighters/pikmin/src/pikmin/acmd/throws.rs @@ -1,14 +1,33 @@ use super::*; +unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + GrabModule::set_rebound(boma, true); + } + frame(lua_state, 4.0); + if is_excute(agent) { + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 5.0, 0.0, None, None, None, *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + } + wait(lua_state, 12.0); + if is_excute(agent) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); + GrabModule::set_rebound(boma, false); + } +} + unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { let dmg = if variation == 2 { 7.5 } else { 5.0 }; - ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_THROW, 0, dmg * p.dmg, 74 + p.angle, 49, 0, 84, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_THROW, 0, dmg, 74 + p.angle, 49.mul_f32(p.kbg), 0, 84, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 20.0); FT_MOTION_RATE(agent, 0.5); @@ -25,11 +44,11 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { let dmg = if variation == 2 { 13.0 } else { 8.5 }; - ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_THROW, 0, dmg * p.dmg, 45, 68, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_THROW, 0, dmg, 45 + p.angle, 68.mul_f32(p.kbg), 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 14.0); FT_MOTION_RATE(agent, 0.5); @@ -45,11 +64,11 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { let dmg = if variation == 2 { 12.0 } else { 8.0 }; - ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_THROW, 0, dmg * p.dmg, 86 + p.angle, 90, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_THROW, 0, dmg, 86 + p.angle, 90.mul_f32(p.kbg), 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 21.0); FT_MOTION_RATE(agent, 0.5); @@ -66,15 +85,15 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); let variation = WorkModule::get_int(boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(agent.boma()); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 22.0); if is_excute(agent) { let dmg = 1.0; - ATTACK(agent, 0, 0, Hash40::new("top"), dmg * p.dmg, 90 + p.angle, 200, 0, 50, 7.0, 0.0, 4.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_PIKMIN); + ATTACK(agent, 0, 0, Hash40::new("top"), dmg, 90 + p.angle, 200.mul_f32(p.kbg), 0, 50, 7.0, 0.0, 4.0, 0.0, None, None, None, p.hitlag, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, dmg * p.shield_dmg, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_PIKMIN); AttackModule::set_catch_only_all(boma, true, false); let dmg = if variation == 2 { 7.5 } else { 5.0 }; - ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_THROW, 0, dmg * p.dmg, 74 + p.angle, 49, 0, 84, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *WEAPON_PIKMIN_PIKMIN_ATTACK_ABSOLUTE_KIND_THROW, 0, dmg, 74 + p.angle, 49.mul_f32(p.kbg), 0, 84, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, p.attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 30.0); FT_MOTION_RATE(agent, 0.5); @@ -88,6 +107,12 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { } pub fn install(agent: &mut Agent) {; + agent.acmd("game_catchdash", game_catchdash, Priority::Low); + agent.acmd("game_catchdash_b", game_catchdash, Priority::Low); + agent.acmd("game_catchdash_v", game_catchdash, Priority::Low); + agent.acmd("game_catchdash_w", game_catchdash, Priority::Low); + agent.acmd("game_catchdash_y", game_catchdash, Priority::Low); + agent.acmd("game_throwb", game_throwb, Priority::Low); agent.acmd("game_throwb_b", game_throwb, Priority::Low); agent.acmd("game_throwb_v", game_throwb, Priority::Low); diff --git a/fighters/pikmin/src/pikmin/mod.rs b/fighters/pikmin/src/pikmin/mod.rs index 4ad99faf1c..daf2e943b4 100644 --- a/fighters/pikmin/src/pikmin/mod.rs +++ b/fighters/pikmin/src/pikmin/mod.rs @@ -4,7 +4,8 @@ pub mod status; #[repr(C)] pub struct PikminInfo { - dmg: f32, + dmg: f32, // applied in common staling damage hook - does not affect knockback + kbg: f32, shield_dmg: f32, hitlag: f32, attr: Hash40, @@ -15,64 +16,29 @@ pub struct PikminInfo { cling_frame: i32 } -impl From for PikminInfo { - fn from(other: i32) -> Self { - match other { - 0 => PikminInfo { // Red - dmg: 1.05, - shield_dmg: 0.45, - angle: 0, - hitlag: 1.0, - attr: Hash40::new("collision_attr_fire"), - attr_special: Hash40::new("collision_attr_fire"), - sound: *COLLISION_SOUND_ATTR_FIRE, - color: Vector3f{x: 1.0, y: 0.05, z: 0.0}, - cling_frame: 4 - }, - 1 => PikminInfo { // yellow - dmg: 0.94, - shield_dmg: 0.0, - angle: 8, - hitlag: 1.25, - attr: Hash40::new("collision_attr_elec"), - attr_special: Hash40::new("collision_attr_paralyze"), - sound: *COLLISION_SOUND_ATTR_ELEC, - color: Vector3f{x: 1.0, y: 1.0, z: 0.14}, - cling_frame: 7 - }, - 2 => PikminInfo { // Blue - dmg: 1.0, - shield_dmg: 0.0, - angle: 0, - hitlag: 1.0, - attr: Hash40::new("collision_attr_water"), - attr_special: Hash40::new("collision_attr_water"), - sound: *COLLISION_SOUND_ATTR_WATER, - color: Vector3f{x: 0.1, y: 0.4, z: 1.0}, - cling_frame: 4 - }, - 3 => PikminInfo { // White - dmg: 0.75, - shield_dmg: 0.55, - angle: 0, - hitlag: 1.0, - attr: Hash40::new("collision_attr_purple"), - attr_special: Hash40::new("collision_attr_flower"), - sound: *COLLISION_SOUND_ATTR_FIRE, - color: Vector3f{x: 1.0, y: 1.0, z: 1.0}, - cling_frame: 3 - }, - _ => PikminInfo { // Violet (Rock), also default - dmg: 1.2, - shield_dmg: 0.0, - angle: 0, - hitlag: 1.0, - attr: Hash40::new("collision_attr_normal"), - attr_special: Hash40::new("collision_attr_normal"), - sound: *COLLISION_SOUND_ATTR_KICK, - color: Vector3f{x: 0.36, y: 0.0, z: 1.0}, - cling_frame: 999 - }, +impl From<&mut BattleObjectModuleAccessor> for PikminInfo { + fn from(weapon_boma: &mut BattleObjectModuleAccessor) -> Self { + unsafe { + let variation = WorkModule::get_int(weapon_boma, *WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); + let prefix = format!("param_pikmin_particular.{}.", variation); + let param = |name: &str| -> String { format!("{}{}", prefix, name) }; + let battle_object = weapon_boma.get_owner_boma().object(); // olimar's battle object + return PikminInfo { + dmg: ParamModule::get_float(battle_object, ParamType::Agent, ¶m("damage_mul")), + kbg: ParamModule::get_float(battle_object, ParamType::Agent, ¶m("kbg_mul")), + shield_dmg: ParamModule::get_float(battle_object, ParamType::Agent, ¶m("shield_damage_mul")), + angle: ParamModule::get_int(battle_object, ParamType::Agent, ¶m("angle_mod")) as u64, + hitlag: ParamModule::get_float(battle_object, ParamType::Agent, ¶m("hitlag_mul")), + attr: Hash40::new(&ParamModule::get_string(battle_object, ParamType::Agent, ¶m("attr"))), + attr_special: Hash40::new(&ParamModule::get_string(battle_object, ParamType::Agent, ¶m("attr_special"))), + sound: ParamModule::get_int(battle_object, ParamType::Agent, ¶m("sound")), + color: Vector3f { + x: ParamModule::get_float(battle_object, ParamType::Agent, ¶m("color_r")), + y: ParamModule::get_float(battle_object, ParamType::Agent, ¶m("color_g")), + z: ParamModule::get_float(battle_object, ParamType::Agent, ¶m("color_b")) + }, + cling_frame: ParamModule::get_int(battle_object, ParamType::Agent, ¶m("cling_counter")) + }; } } } diff --git a/fighters/pikmin/src/pikmin/status.rs b/fighters/pikmin/src/pikmin/status.rs index 92d648b718..a0c615cab2 100644 --- a/fighters/pikmin/src/pikmin/status.rs +++ b/fighters/pikmin/src/pikmin/status.rs @@ -27,8 +27,7 @@ pub unsafe extern "C" fn special_s_cling_main(weapon: &mut L2CFighterCommon) -> AttackModule::set_power_mul_status(weapon.module_accessor, founder_power_mul_status); } - let variation = weapon.get_int(*WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(weapon.boma()); VarModule::set_int(weapon.battle_object, vars::pikmin::status::SPECIAL_S_PIKMIN_DETONATE_TIMER, 0); VarModule::off_flag(weapon.battle_object, vars::pikmin::status::SPECIAL_S_PIKMIN_DETONATE_IS_ATTACK_LAST_FRAME); VarModule::off_flag(weapon.battle_object, vars::pikmin::instance::SPECIAL_S_PIKMIN_DETONATE_IS_DETACH_FOR_DETONATE); @@ -40,8 +39,7 @@ unsafe extern "C" fn special_s_cling_main_loop(weapon: &mut L2CFighterCommon) -> let frame = MotionModule::frame(weapon.module_accessor); let clatter_time = ControlModule::get_clatter_time(weapon.module_accessor, 0); weapon.set_int(clatter_time as i32, *WEAPON_PIKMIN_PIKMIN_STATUS_SPECIAL_S_WORK_INT_CLATTER_TIME); - let variation = weapon.get_int(*WEAPON_PIKMIN_PIKMIN_INSTANCE_WORK_ID_INT_VARIATION); - let p = PikminInfo::from(variation); + let p = PikminInfo::from(weapon.boma()); if !weapon.global_table[IS_STOPPING].get_bool() && !StatusModule::is_changing(weapon.module_accessor) diff --git a/fighters/pit/Cargo.toml b/fighters/pit/Cargo.toml index 9cba4b8eae..41352b2eca 100644 --- a/fighters/pit/Cargo.toml +++ b/fighters/pit/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pit/src/acmd/ground.rs b/fighters/pit/src/acmd/ground.rs index 549fa4dd4f..dbb3e8bcff 100644 --- a/fighters/pit/src/acmd/ground.rs +++ b/fighters/pit/src/acmd/ground.rs @@ -11,10 +11,13 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 80, 40, 0, 10, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); ATTACK(agent, 1, 0, Hash40::new("bowr"), 3.0, 80, 40, 0, 10, 3.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); ATTACK(agent, 2, 0, Hash40::new("bowr"), 3.0, 80, 40, 0, 10, 3.0, 0.0, 7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - // Locking hitboxes + // Jab lock hitboxes ATTACK(agent, 3, 0, Hash40::new("armr"), 3.0, 361, 15, 0, 30, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); ATTACK(agent, 4, 0, Hash40::new("bowr"), 3.0, 361, 15, 0, 30, 3.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); ATTACK(agent, 5, 0, Hash40::new("bowr"), 3.0, 361, 15, 0, 30, 3.0, 0.0, 7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + AttackModule::set_down_only(boma, 3, true); + AttackModule::set_down_only(boma, 4, true); + AttackModule::set_down_only(boma, 5, true); } frame(lua_state, 5.5); FT_MOTION_RATE_RANGE(agent, 5.5, 7.0, 1.0); @@ -52,10 +55,13 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("arml"), 3.0, 60, 40, 70, 0, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); ATTACK(agent, 1, 0, Hash40::new("bowl"), 3.0, 90, 40, 70, 0, 3.2, 0.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); ATTACK(agent, 2, 0, Hash40::new("bowl"), 3.0, 145, 40, 85, 0, 3.2, 0.0, -7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - // Locking hitbox + // Jab lock hitboxes ATTACK(agent, 3, 0, Hash40::new("arml"), 3.0, 361, 15, 0, 30, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); ATTACK(agent, 4, 0, Hash40::new("bowl"), 3.0, 361, 15, 0, 30, 3.2, 0.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); ATTACK(agent, 5, 0, Hash40::new("bowl"), 3.0, 361, 15, 0, 30, 3.2, 0.0, -7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + AttackModule::set_down_only(boma, 3, true); + AttackModule::set_down_only(boma, 4, true); + AttackModule::set_down_only(boma,5, true); } frame(lua_state, 5.5); FT_MOTION_RATE_RANGE(agent, 5.5, 7.0, 1.0); diff --git a/fighters/pit/src/acmd/other.rs b/fighters/pit/src/acmd/other.rs index 5eac95d690..92027f4893 100644 --- a/fighters/pit/src/acmd/other.rs +++ b/fighters/pit/src/acmd/other.rs @@ -72,16 +72,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -92,10 +88,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_downattackd(agent: &mut L2CAgentBase) { diff --git a/fighters/pit/src/acmd/specials.rs b/fighters/pit/src/acmd/specials.rs index 875177e6fc..c7015470cb 100644 --- a/fighters/pit/src/acmd/specials.rs +++ b/fighters/pit/src/acmd/specials.rs @@ -55,11 +55,11 @@ unsafe extern "C" fn game_specialsend(agent: &mut L2CAgentBase) { } frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 80, 63, 0, 102, 6.0, 0.0, 6.0, 9.0, Some(0.0), Some(10.0), Some(9.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 80, 63, 0, 102, 6.0, 0.0, 6.0, 9.0, Some(0.0), Some(10.0), Some(9.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 16, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 80, 63, 0, 102, 6.0, 0.0, 13.0, 9.0, Some(0.0), Some(19.0), Some(5.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 21, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 80, 63, 0, 102, 6.0, 0.0, 13.0, 9.0, Some(0.0), Some(19.0), Some(5.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 16, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 6.0); if is_excute(agent) { diff --git a/fighters/pit/src/acmd/throws.rs b/fighters/pit/src/acmd/throws.rs index 4d64db4bb9..b6d5ad054c 100644 --- a/fighters/pit/src/acmd/throws.rs +++ b/fighters/pit/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 6.1, Some(0.0), Some(8.0), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 5.6, Some(0.0), Some(8.0), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-15.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, -4.1, Some(0.0), Some(8.0), Some(-15.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/pit/src/lib.rs b/fighters/pit/src/lib.rs index d846ebcd81..fa796d24ec 100644 --- a/fighters/pit/src/lib.rs +++ b/fighters/pit/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/pit/src/opff.rs b/fighters/pit/src/opff.rs index 0fd9dbe50d..071c75aa9d 100644 --- a/fighters/pit/src/opff.rs +++ b/fighters/pit/src/opff.rs @@ -10,20 +10,11 @@ pub unsafe extern "Rust" fn pits_common(fighter: &mut L2CFighterCommon, boma: &m fastfall_specials(fighter); } -// Pits Power of Flight cancel -// unsafe fn power_of_flight_cancel(boma: &mut BattleObjectModuleAccessor, status_kind: i32) { -// if status_kind == *FIGHTER_PIT_STATUS_KIND_SPECIAL_HI_RUSH { -// if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_GUARD) { -// StatusModule::change_status_request_from_script(boma, *FIGHTER_PIT_STATUS_KIND_SPECIAL_HI_RUSH_END, false); -// } -// } -// } - unsafe fn upperdash_arm_jump_and_aerial_cancel(boma: &mut BattleObjectModuleAccessor) { if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_S) || (boma.is_status(*FIGHTER_PIT_STATUS_KIND_SPECIAL_S_END) && boma.status_frame() > 6) { if (boma.is_situation(*SITUATION_KIND_GROUND) || WorkModule::is_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_CLIFF_FALL_ONOFF)) && boma.status_frame() > 28 { - boma.check_jump_cancel(true, false); + boma.check_jump_cancel(true, false, true); } } if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_S) { diff --git a/fighters/pitb/Cargo.toml b/fighters/pitb/Cargo.toml index 68f39f6d81..4f6b13d7e5 100644 --- a/fighters/pitb/Cargo.toml +++ b/fighters/pitb/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pitb/src/acmd/aerials.rs b/fighters/pitb/src/acmd/aerials.rs index a06a2ac42d..ea10a3ac38 100644 --- a/fighters/pitb/src/acmd/aerials.rs +++ b/fighters/pitb/src/acmd/aerials.rs @@ -10,7 +10,7 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); FT_MOTION_RATE_RANGE(agent, 5.0, 24.0, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 366, 100, 40, 0, 8.0, 1.0, 9.0, 5.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 4.0, angle: 366, kbg: 100, fkb: 40, bkb: 0, size: 8.0, x: 1.0, y: 9.0, z: 5.5, facing: LrCheck::F, }); } frame(lua_state, 16.0); if is_excute(agent) { @@ -19,7 +19,7 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 24.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 7.0, 361, 85, 0, 50, 9.0, 1.0, 10.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, bone: "top", dmg: 7.0, angle: 361, kbg: 85, bkb: 50, size: 9.0, x: 1.0, y: 10.0, z: 3.0, facing: LrCheck::F, }); } frame(lua_state, 26.0); if is_excute(agent) { @@ -118,29 +118,34 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 10.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); + FT_MOTION_RATE_RANGE(agent, 12.0, 24.0, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 45, 91, 0, 22, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 361, 110, 0, 21, 3.0, 0.0, 5.0, 7.0, Some(0.0), Some(5.0), Some(22.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "armr", dmg: 9.0, angle: 40, kbg: 91, bkb: 22, size: 3.0, x: 0.0, y: 0.0, z: 0.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 1, bone: "top", dmg: 9.0, angle: 40, kbg: 91, bkb: 22, size: 3.0, x: 0.0, y: 5.0, z: 7.0, x2: 0.0, y2: 5.0, z2: 10.0 }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 2, bone: "top", dmg: 11.0, angle: 361, kbg: 104, bkb: 22, size: 3.0, x: 0.0, y: 5.0, z: 7.0, x2: 0.0, y2: 5.0, z2: 21.0 }); } - frame(lua_state, 14.0); + frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 9.0, 45, 91, 0, 22, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 91, 0, 22, 3.0, 0.0, 5.0, 7.0, Some(0.0), Some(5.0), Some(22.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "armr", dmg: 9.0, angle: 40, kbg: 91, bkb: 22, size: 3.0, x: 0.0, y: 0.0, z: 0.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 1, bone: "top", dmg: 9.0, angle: 40, kbg: 91, bkb: 22, size: 3.0, x: 0.0, y: 5.0, z: 7.0, x2: 0.0, y2: 5.0, z2: 10.0 }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 2, bone: "top", dmg: 9.0, angle: 40, kbg: 91, bkb: 22, size: 3.0, x: 0.0, y: 5.0, z: 7.0, x2: 0.0, y2: 5.0, z2: 21.0 }); } - frame(lua_state, 18.0); + frame(lua_state, 20.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 24.0); + FT_MOTION_RATE_RANGE(agent, 24.0, 39.0, 18.0); frame(lua_state, 34.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 39.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { @@ -169,15 +174,16 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); FT_MOTION_RATE_RANGE(agent, 10.0, 11.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 43, 100, 0, 28, 3.5, 0.0, 6.2, -11.0, Some(0.0), Some(6.2), Some(-6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 43, 101, 0, 31, 3.7, 0.0, 6.2, -18.9, Some(0.0), Some(6.2), Some(-15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 10.0, angle: 43, kbg: 100, bkb: 28, size: 3.5, x: 0.0, y: 6.2, z: -11.0, x2: 0.0, y2: 6.2, z2: -6.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 1, bone: "top", dmg: 13.0, angle: 43, kbg: 101, bkb: 31, size: 3.7, x: 0.0, y: 6.2, z: -18.9, x2: 0.0, y2: 6.2, z2: -15.0, }); } - frame(lua_state, 11.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 10.66); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 43, 100, 0, 30, 3.5, 0.0, 6.2, -16.4, Some(0.0), Some(6.2), Some(-6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 8.0, angle: 43, kbg: 100, bkb: 30, size: 3.5, x: 0.0, y: 6.2, z: -16.4, x2: 0.0, y2: 6.2, z2: -6.0, }); AttackModule::clear(boma, 1, false); } + frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 18.0); if is_excute(agent) { AttackModule::clear_all(boma); @@ -217,17 +223,17 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 75, 106, 0, 20, 3.5, 0.0, 11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 75, 106, 0, 20, 4.5, 0.0, 17.0, -5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 75, 106, 0, 20, 4.5, 0.0, 17.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 3, 0, Hash40::new("top"), 12.0, 75, 106, 0, 20, 4.5, 0.0, 17.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, bone: "top", dmg: 9.0, angle: 75, kbg: 114, bkb: 20, size: 3.5, x: 0.0, y: 11.0, z: 0.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 1, bone: "top", dmg: 11.0, angle: 75, kbg: 114, bkb: 20, size: 4.5, x: 0.0, y: 17.0, z: -5.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 2, bone: "top", dmg: 11.0, angle: 75, kbg: 114, bkb: 20, size: 4.5, x: 0.0, y: 17.0, z: 7.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 3, bone: "top", dmg: 11.0, angle: 75, kbg: 114, bkb: 20, size: 4.5, x: 0.0, y: 17.0, z: 2.0, }); } wait(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 75, 100, 0, 20, 3.5, 0.0, 9.6, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 75, 100, 0, 20, 4.0, 0.0, 17.0, -5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 75, 100, 0, 20, 4.0, 0.0, 17.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 75, 100, 0, 20, 4.0, 0.0, 17.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 7.0, angle: 75, kbg: 108, bkb: 20, size: 3.5, x: 0.0, y: 9.6, z: 0.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 1, bone: "top", dmg: 9.0, angle: 75, kbg: 108, bkb: 20, size: 4.0, x: 0.0, y: 17.0, z: -5.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 2, bone: "top", dmg: 9.0, angle: 75, kbg: 108, bkb: 20, size: 4.0, x: 0.0, y: 17.0, z: 7.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 3, bone: "top", dmg: 9.0, angle: 75, kbg: 108, bkb: 20, size: 4.0, x: 0.0, y: 17.0, z: 2.0, }); } frame(lua_state, 24.0); if is_excute(agent) { @@ -268,23 +274,23 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 9.0); FT_MOTION_RATE_RANGE(agent, 9.0, 10.0, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 11.0, 54, 74, 0, 46, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("bowl"), 11.0, 54, 74, 0, 46, 3.5, 0.0, -2.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("bowl"), 11.0, 54, 74, 0, 46, 3.5, 0.0, -7.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "arml", dmg: 9.0, angle: 54, kbg: 88, bkb: 45, size: 3.0, x: 2.0, y: 0.0, z: 0.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 1, bone: "bowl", dmg: 9.0, angle: 54, kbg: 88, bkb: 45, size: 3.5, x: 0.0, y: -2.0, z: -2.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 2, bone: "bowl", dmg: 9.0, angle: 54, kbg: 88, bkb: 45, size: 3.5, x: 0.0, y: -6.0, z: -2.0, }); } frame(lua_state, 9.5); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 11.0, 270, 45, 0, 34, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("bowl"), 11.0, 270, 45, 0, 34, 3.5, 0.0, -2.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("bowl"), 11.0, 270, 45, 0, 34, 3.5, 0.0, -7.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "arml", dmg: 9.0, angle: 54, kbg: 88, bkb: 45, size: 3.0, x: 2.0, y: 0.0, z: 0.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 1, bone: "bowl", dmg: 10.0, angle: 270, kbg: 56, bkb: 22, size: 3.5, x: 0.0, y: -2.0, z: -2.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 2, bone: "bowl", dmg: 10.0, angle: 270, kbg: 56, bkb: 22, size: 3.5, x: 0.0, y: -6.0, z: -2.0, }); } frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 10.0, 54, 70, 0, 40, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("bowl"), 10.0, 54, 70, 0, 40, 3.5, 0.0, -2.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("bowl"), 10.0, 54, 70, 0, 40, 3.5, 0.0, -7.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "arml", dmg: 9.0, angle: 54, kbg: 76, bkb: 39, size: 3.0, x: 2.0, y: 0.0, z: 0.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 1, bone: "bowl", dmg: 9.0, angle: 54, kbg: 76, bkb: 39, size: 3.5, x: 0.0, y: -2.0, z: -2.0, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 2, bone: "bowl", dmg: 9.0, angle: 54, kbg: 76, bkb: 39, size: 3.5, x: 0.0, y: -6.0, z: -2.0, }); } frame(lua_state, 13.0); if is_excute(agent) { diff --git a/fighters/pitb/src/acmd/ground.rs b/fighters/pitb/src/acmd/ground.rs index 9a7fb4fec0..cc78202dcb 100644 --- a/fighters/pitb/src/acmd/ground.rs +++ b/fighters/pitb/src/acmd/ground.rs @@ -8,13 +8,16 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); FT_MOTION_RATE_RANGE(agent, 5.0, 5.5, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 80, 40, 0, 10, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("bowr"), 3.0, 80, 40, 0, 10, 3.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("bowr"), 3.0, 80, 40, 0, 10, 3.0, 0.0, 7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - // Locking hitboxes - ATTACK(agent, 3, 0, Hash40::new("armr"), 3.0, 361, 15, 0, 30, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 4, 0, Hash40::new("bowr"), 3.0, 361, 15, 0, 30, 3.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 5, 0, Hash40::new("bowr"), 3.0, 361, 15, 0, 30, 3.0, 0.0, 7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 0, bone: "armr", dmg: 3.0, angle: 80, kbg: 40, bkb: 10, size: 3.0, x: 2.0, y: 0.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::GA_d, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 1, bone: "bowr", dmg: 3.0, angle: 80, kbg: 40, bkb: 10, size: 3.0, x: 0.0, y: 2.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::GA_d, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 2, bone: "bowr", dmg: 3.0, angle: 80, kbg: 40, bkb: 10, size: 3.0, x: 0.0, y: 7.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::GA_d, }); + // Jab lock hitboxes + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 3, bone: "armr", dmg: 3.0, angle: 361, kbg: 15, bkb: 30, size: 3.0, x: 2.0, y: 0.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::G, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 4, bone: "bowr", dmg: 3.0, angle: 361, kbg: 15, bkb: 30, size: 3.0, x: 0.0, y: 2.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::G, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 5, bone: "bowr", dmg: 3.0, angle: 361, kbg: 15, bkb: 30, size: 3.0, x: 0.0, y: 7.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::G, }); + AttackModule::set_down_only(boma, 3, true); + AttackModule::set_down_only(boma, 4, true); + AttackModule::set_down_only(boma, 5, true); } frame(lua_state, 5.5); FT_MOTION_RATE_RANGE(agent, 5.5, 7.0, 1.0); @@ -49,13 +52,16 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); FT_MOTION_RATE_RANGE(agent, 5.0, 5.5, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 3.0, 60, 40, 70, 0, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("bowl"), 3.0, 90, 40, 70, 0, 3.2, 0.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("bowl"), 3.0, 145, 40, 85, 0, 3.2, 0.0, -7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - // Locking hitbox - ATTACK(agent, 3, 0, Hash40::new("arml"), 3.0, 361, 15, 0, 30, 3.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 4, 0, Hash40::new("bowl"), 3.0, 361, 15, 0, 30, 3.2, 0.0, -2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 5, 0, Hash40::new("bowl"), 3.0, 361, 15, 0, 30, 3.2, 0.0, -7.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 0, bone: "arml", dmg: 3.0, angle: 60, kbg: 40, fkb: 70, bkb: 0, size: 3.0, x: 2.0, y: 0.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::GA_d, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 1, bone: "bowl", dmg: 3.0, angle: 90, kbg: 40, fkb: 70, bkb: 0, size: 3.2, x: 0.0, y: -2.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::GA_d, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 2, bone: "bowl", dmg: 3.0, angle: 145, kbg: 40, fkb: 85, bkb: 0, size: 3.2, x: 0.0, y: -7.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::GA_d, }); + // Jab lock hitboxes + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 3, bone: "arml", dmg: 3.0, angle: 361, kbg: 15, bkb: 30, size: 3.0, x: 2.0, y: 0.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::G, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 4, bone: "bowl", dmg: 3.0, angle: 361, kbg: 15, bkb: 30, size: 3.2, x: 0.0, y: -2.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::G, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_S, id: 5, bone: "bowl", dmg: 3.0, angle: 361, kbg: 15, bkb: 30, size: 3.2, x: 0.0, y: -7.0, z: 0.0, facing: LrCheck::F, situation: CollisionSituation::G, }); + AttackModule::set_down_only(boma, 3, true); + AttackModule::set_down_only(boma, 4, true); + AttackModule::set_down_only(boma, 5, true); } frame(lua_state, 5.5); FT_MOTION_RATE_RANGE(agent, 5.5, 7.0, 1.0); @@ -95,9 +101,9 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { frame(lua_state, 3.0); FT_MOTION_RATE_RANGE(agent, 3.0, 4.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 4.0, 70, 100, 0, 60, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("bowr"), 4.0, 70, 100, 0, 60, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("bowr"), 4.0, 70, 100, 0, 60, 4.0, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "armr", dmg: 4.0, angle: 70, kbg: 100, bkb: 60, size: 4.0, x: 2.0, y: 0.0, z: 0.0, facing: LrCheck::F, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 1, bone: "bowr", dmg: 4.0, angle: 70, kbg: 100, bkb: 60, size: 4.0, x: 0.0, y: 2.0, z: 0.0, facing: LrCheck::F, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 2, bone: "bowr", dmg: 4.0, angle: 70, kbg: 100, bkb: 60, size: 4.0, x: 0.0, y: 6.0, z: 0.0, facing: LrCheck::F, }); } frame(lua_state, 4.0); FT_MOTION_RATE_RANGE(agent, 4.0, 32.0, 25.0); @@ -166,7 +172,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 7.0, 8.0, 3.0); sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.85 * 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 70, 113, 0, 30, 3.5, 0.0, 4.0, 11.5, Some(0.0), Some(7.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, part: 0, bone: "top", dmg: 8.0, angle: 64, kbg: 124, bkb: 29, size: 3.5, x: 0.0, y: 4.0, z: 11.5, x2: 0.0, y2: 7.0, z2: 4.0, facing: LrCheck::F, }); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); diff --git a/fighters/pitb/src/acmd/other.rs b/fighters/pitb/src/acmd/other.rs index 2138f9cfb4..97c1c3316d 100644 --- a/fighters/pitb/src/acmd/other.rs +++ b/fighters/pitb/src/acmd/other.rs @@ -87,15 +87,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -105,10 +101,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_appealsl(agent: &mut L2CAgentBase) { diff --git a/fighters/pitb/src/acmd/smashes.rs b/fighters/pitb/src/acmd/smashes.rs index 937bcb1829..f3c401e9ce 100644 --- a/fighters/pitb/src/acmd/smashes.rs +++ b/fighters/pitb/src/acmd/smashes.rs @@ -12,7 +12,8 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { // without set_speed_mul 0.0 here, motion speed on this frame makes the 366 fail sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 366, 100, 53, 0, 5.4, 0.0, 7.0, 5.0, Some(0.0), Some(7.0), Some(12.0), 1.0, 1.15, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); } + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 5.0, angle: 366, kbg: 100, fkb: 53, bkb: 0, size: 5.4, x: 0.0, y: 7.0, z: 5.0, x2: 0.0, y2: 7.0, z2: 12.0, sdi: 1.15, facing: LrCheck::F, set_weight: true, }); + } frame(lua_state, 11.0); sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); if is_excute(agent) { @@ -21,7 +22,7 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { frame(lua_state, 21.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 10.0, 361, 121, 0, 42, 6.0, 0.0, 8.0, 13.5, Some(0.0), Some(8.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, part: 1, bone: "top", dmg: 10.0, angle: 361, kbg: 121, bkb: 42, size: 6.0, x: 0.0, y: 8.0, z: 13.5, x2: 0.0, y2: 8.0, z2: 6.0, facing: LrCheck::F, shield_dmg: ShieldDamage::Add(10.0), }); } frame(lua_state, 24.0); FT_MOTION_RATE_RANGE(agent, 24.0, 55.0, 36.0); @@ -74,22 +75,20 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 5.0, 0.0, 26.5, 0.0, None, None, None, 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 5.5, 0.0, 24.0, 7.0, Some(0.0), Some(24.0), Some(4.5), 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 5.5, 0.0, 24.0, -6.0, Some(0.0), Some(24.0), Some(-4.5), 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 3, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 5.5, 0.0, 24.0, 7.0, Some(0.0), Some(24.0), Some(-6.0), 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 4, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 5.5, 0.0, 24.0, 7.0, Some(0.0), Some(24.0), Some(-6.0), 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 5, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 5.5, 0.0, 18.0, -5.5, Some(0.0), Some(18.0), Some(-4.5), 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 6, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 5.5, 0.0, 18.0, -5.5, Some(0.0), Some(18.0), Some(-4.5), 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 52, size: 5.0, x: 0.0, y: 26.5, z: 0.0, hitlag: 1.25, sdi: 0.5, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 1, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 52, size: 5.5, x: 0.0, y: 24.0, z: 7.0, x2: 0.0, y2: 24.0, z2: 4.5, hitlag: 1.25, sdi: 0.5, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 2, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 52, size: 5.5, x: 0.0, y: 24.0, z: -6.0, x2: 0.0, y2: 24.0, z2: -4.5, hitlag: 1.25, sdi: 0.5, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 3, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 52, size: 5.5, x: 0.0, y: 24.0, z: 7.0, x2: 0.0, y2: 24.0, z2: -6.0, hitlag: 1.25, sdi: 0.5, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 4, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 52, size: 5.5, x: 0.0, y: 18.0, z: -5.5, x2: 0.0, y2: 18.0, z2: -4.5, hitlag: 1.25, sdi: 0.5, }); } frame(lua_state, 7.0); FT_MOTION_RATE_RANGE(agent, 7.0, 9.0, 1.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 6.0, 0.0, 14.0, 9.0, Some(0.0), Some(12.0), Some(7.0), 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 4, 0, Hash40::new("top"), 5.0, 105, 159, 0, 62, 6.0, 0.0, 14.0, 9.0, Some(0.0), Some(12.0), Some(7.0), 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - AttackModule::clear(boma, 0, false); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 52, size: 6.0, x: 0.0, y: 14.0, z: 9.0, x2: 0.0, y2: 12.0, z2: 7.0, hitlag: 1.25, sdi: 0.5, }); + AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); AttackModule::clear(boma, 3, false); + AttackModule::clear(boma, 4, false); } frame(lua_state, 9.0); FT_MOTION_RATE(agent, 1.0); @@ -99,9 +98,9 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); FT_MOTION_RATE_RANGE(agent, 10.0, 12.0, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 6.0, 94, 139, 0, 62, 5.5, 0.0, 28.0, 0.0, None, None, None, 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 1, Hash40::new("top"), 6.0, 94, 139, 0, 62, 6.0, 0.0, 24.0, 6.0, None, None, None, 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 1, Hash40::new("top"), 6.0, 94, 139, 0, 62, 6.0, 0.0, 24.0, -6.0, None, None, None, 1.25, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, part: 1, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 62, size: 5.5, x: 0.0, y: 28.0, z: 0.0, hitlag: 1.25, sdi: 0.5, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 1, part: 1, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 62, size: 6.0, x: 0.0, y: 24.0, z: 6.0, hitlag: 1.25, sdi: 0.5, }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 2, part: 1, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 62, size: 6.0, x: 0.0, y: 24.0, z: -6.0, hitlag: 1.25, sdi: 0.5, }); } frame(lua_state, 12.0); FT_MOTION_RATE_RANGE(agent, 12.0, 16.0, 1.0); @@ -112,10 +111,10 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 2, Hash40::new("top"), 7.0, 90, 123, 0, 62, 6.0, 0.0, 34.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 2, Hash40::new("top"), 7.0, 90, 123, 0, 62, 7.0, 0.0, 24.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 2, Hash40::new("top"), 7.0, 90, 123, 0, 62, 7.0, 0.0, 31.0, 6.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 3, 2, Hash40::new("top"), 7.0, 90, 123, 0, 62, 7.0, 0.0, 31.0, -6.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, part: 2, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 62, size: 6.0, x: 0.0, y: 34.0, z: 0.0, hitlag: 1.25, shield_dmg: ShieldDamage::Add(10.0), }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 1, part: 2, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 62, size: 7.0, x: 0.0, y: 24.0, z: 0.0, hitlag: 1.25, shield_dmg: ShieldDamage::Add(10.0), }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 2, part: 2, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 62, size: 7.0, x: 0.0, y: 31.0, z: 6.0, hitlag: 1.25, shield_dmg: ShieldDamage::Add(10.0), }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 3, part: 2, bone: "top", dmg: 6.0, angle: 90, kbg: 139, bkb: 62, size: 7.0, x: 0.0, y: 31.0, z: -6.0, hitlag: 1.25, shield_dmg: ShieldDamage::Add(10.0), }); } wait(lua_state, 2.0); if is_excute(agent) { @@ -170,9 +169,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 48, 98, 0, 40, 3.7, 0.0, 3.3, 6.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 48, 98, 0, 40, 3.6, 0.0, 2.8, 12.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 48, 93, 0, 35, 3.4, 0.0, 2.0, 17.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, bone: "top", dmg: 12.0, angle: 48, kbg: 98, bkb: 40, size: 3.7, x: 0.0, y: 3.3, z: 6.4, shield_dmg: ShieldDamage::Add(5.0), }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 1, bone: "top", dmg: 12.0, angle: 48, kbg: 98, bkb: 40, size: 3.6, x: 0.0, y: 2.8, z: 12.4, shield_dmg: ShieldDamage::Add(5.0), }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 2, bone: "top", dmg: 10.0, angle: 48, kbg: 93, bkb: 35, size: 3.4, x: 0.0, y: 2.0, z: 17.4, shield_dmg: ShieldDamage::Add(5.0), }); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -181,9 +180,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 30, 93, 0, 25, 3.7, 0.0, 3.3, -8.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 30, 93, 0, 25, 3.6, 0.0, 2.8, -14.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 30, 93, 0, 25, 3.4, 0.0, 2.0, -19.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, bone: "top", dmg: 12.0, angle: 30, kbg: 93, bkb: 25, size: 3.7, x: 0.0, y: 3.3, z: -8.4, shield_dmg: ShieldDamage::Add(5.0), }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 1, bone: "top", dmg: 12.0, angle: 30, kbg: 93, bkb: 25, size: 3.6, x: 0.0, y: 2.8, z: -14.4, shield_dmg: ShieldDamage::Add(5.0), }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 2, bone: "top", dmg: 10.0, angle: 30, kbg: 93, bkb: 25, size: 3.4, x: 0.0, y: 2.0, z: -19.4, shield_dmg: ShieldDamage::Add(5.0), }); } wait(lua_state, 3.0); if is_excute(agent) { diff --git a/fighters/pitb/src/acmd/specials.rs b/fighters/pitb/src/acmd/specials.rs index e5c3aab6f9..bc12808784 100644 --- a/fighters/pitb/src/acmd/specials.rs +++ b/fighters/pitb/src/acmd/specials.rs @@ -4,35 +4,32 @@ unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_MOVE_FRONT); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_MOVE_FRONT); } frame(lua_state, 11.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_MOVE_FRONT); - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_ALWAYS, 0); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_MOVE_FRONT); } frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 31.0, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 361, 0, 0, 0, 2.0, 0.0, 12.0, 9.0, Some(0.0), Some(4.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0.0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_search"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_HIT_CHECK_ONOFF); + hitbox!(agent, { extends: BASE_SEARCHBOX, id: 0, bone: "top", size: 2.0, x: 0.0, y: 12.0, z: 9.0, x2: 0.0, y2: 4.0, z2: 9.0, facing: LrCheck::F, }); shield!(agent, *MA_MSC_CMD_SHIELD_ON, *COLLISION_KIND_REFLECTOR, *FIGHTER_PIT_REFLECTOR_KIND_SPECIAL_S, *FIGHTER_PIT_REFLECTOR_GROUP_SPECIAL_S); - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_CLIFF_FALL_ONOFF); - } - frame(lua_state, 26.0); - if is_excute(agent) { - damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_HIT_CHECK_ONOFF); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_CLIFF_FALL_ONOFF); } frame(lua_state, 31.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_GRAVITY_ONOFF); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_GRAVITY_ONOFF); } - frame(lua_state, 36.0); + frame(lua_state, 34.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_MTRANS_AIR_UNABLE); AttackModule::clear_all(boma); - WorkModule::off_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_HIT_CHECK_ONOFF); shield!(agent, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, *FIGHTER_PIT_REFLECTOR_KIND_SPECIAL_S, *FIGHTER_PIT_REFLECTOR_GROUP_SPECIAL_S); - // WorkModule::off_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_CLIFF_FALL_ONOFF); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_MTRANS_AIR_UNABLE); + agent.off_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_HIT_CHECK_ONOFF); + // agent.off_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_CLIFF_FALL_ONOFF); } } @@ -44,36 +41,44 @@ unsafe extern "C" fn game_specialsend(agent: &mut L2CAgentBase) { } frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 40, 80, 0, 57, 6.0, 0.0, 4.0, 9.0, Some(0.0), Some(10.0), Some(9.0), 1.15, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 26, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_PUNCH); + hitbox!(agent, { extends: BASE_HITBOX, id: 0, bone: "top", dmg: 16.0, angle: 40, kbg: 80, bkb: 57, size: 6.0, x: 0.0, y: 4.0, z: 9.0, x2: 0.0, y2: 10.0, z2: 9.0, hitlag: 1.15, clank:SetOff::Thru, facing: LrCheck::F, shield_dmg: ShieldDamage::Add(16.0), effect: "collision_attr_elec", sound_level: SoundLevel::L, hit_sound: CollisionSound::Elec, region: AttackRegion::Punch, }); } frame(lua_state, 5.0); + FT_MOTION_RATE_RANGE(agent, 5.0, 16.0, 5.0); if is_excute(agent) { AttackModule::clear_all(boma); shield!(agent, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, *FIGHTER_PIT_REFLECTOR_KIND_SPECIAL_S, *FIGHTER_PIT_REFLECTOR_GROUP_SPECIAL_S); } + frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 52.0, 30.0); + frame(lua_state, 52.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn game_specialairsstart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 20.0, 15.0); if is_excute(agent) { boma.select_cliff_hangdata_from_name("special_s"); - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_MOVE_FRONT); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_MOVE_FRONT); } - frame(lua_state, 19.0); + frame(lua_state, 20.0); // F16 + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 361, 0, 0, 0, 2.0, 0.0, 14.0, 9.0, Some(0.0), Some(4.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0.0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_search"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_HIT_CHECK_ONOFF); + hitbox!(agent, { extends: BASE_SEARCHBOX, id: 0, bone: "top", size: 2.0, x: 0.0, y: 14.0, z: 9.0, x2: 0.0, y2: 4.0, z2: 9.0, facing: LrCheck::F, }); shield!(agent, *MA_MSC_CMD_SHIELD_ON, *COLLISION_KIND_REFLECTOR, *FIGHTER_PIT_REFLECTOR_KIND_SPECIAL_S, *FIGHTER_PIT_REFLECTOR_GROUP_SPECIAL_S); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_HIT_CHECK_ONOFF); } - frame(lua_state, 31.0); + frame(lua_state, 33.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_GRAVITY_ONOFF); + agent.on_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_GRAVITY_ONOFF); } frame(lua_state, 36.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_HIT_CHECK_ONOFF); + agent.off_flag(*FIGHTER_PIT_STATUS_SPECIAL_S_WORK_ID_FLAG_HIT_CHECK_ONOFF); shield!(agent, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, *FIGHTER_PIT_REFLECTOR_KIND_SPECIAL_S, *FIGHTER_PIT_REFLECTOR_GROUP_SPECIAL_S); AttackModule::clear_all(boma); } @@ -86,13 +91,17 @@ unsafe extern "C" fn game_specialairsstart(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 15.0, 23.0); if is_excute(agent) { boma.select_cliff_hangdata_from_name("special_hi_start"); } - frame(lua_state, 6.0); + frame(lua_state, 4.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); } + frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { @@ -100,11 +109,11 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("bust"), 14.0, 75, 83, 0, 43, 5.0, 0.0, -3.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_BODY); + hitbox!(agent, { extends: BASE_HITBOX, id: 0, bone: "bust", dmg: 14.0, angle: 75, kbg: 73, bkb: 63, size: 4.0, x: 0.0, y: -3.0, z: -1.0, facing: LrCheck::F, effect: "collision_attr_magic", sound_level: SoundLevel::L, hit_sound: CollisionSound::Magic, region: AttackRegion::Body, }); } - frame(lua_state, 12.0); + frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("bust"), 8.0, 75, 73, 0, 58, 5.0, 0.0, -3.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_BODY); + hitbox!(agent, { extends: BASE_HITBOX, id: 0, bone: "bust", dmg: 8.0, angle: 75, kbg: 73, bkb: 73, size: 3.5, x: 0.0, y: -3.0, z: -1.0, facing: LrCheck::F, effect: "collision_attr_magic", sound_level: SoundLevel::M, hit_sound: CollisionSound::Magic, region: AttackRegion::Body, }); } frame(lua_state, 43.0); if is_excute(agent) { @@ -144,7 +153,7 @@ unsafe extern "C" fn game_speciallwstart(agent: &mut L2CAgentBase) { frame(lua_state, 6.9); FT_MOTION_RATE_RANGE(agent, 6.9, 7.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 70, 85, 0, 77, 7.5, 0.0, 7.0, -1.5, Some(0.0), Some(7.0), Some(1.5), 0.72, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_NONE); + hitbox!(agent, { extends: BASE_HITBOX, id: 0, bone: "top", dmg: 5.0, angle: 70, kbg: 85, bkb: 77, size: 7.5, x: 0.0, y: 7.0, z: -1.5, x2: 0.0, y2: 7.0, z2: 1.5, hitlag: 0.72, clank: SetOff::Off, effect: "collision_attr_magic", sound_level: SoundLevel::M, hit_sound: CollisionSound::Magic, region: AttackRegion::None, }); } frame(lua_state, 6.933); if is_excute(agent) { diff --git a/fighters/pitb/src/acmd/throws.rs b/fighters/pitb/src/acmd/throws.rs index 2f5235f9c0..0f14d838cd 100644 --- a/fighters/pitb/src/acmd/throws.rs +++ b/fighters/pitb/src/acmd/throws.rs @@ -4,17 +4,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.200); - } - frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.2); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.000); - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 6.0, Some(0.0), Some(8.0), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -34,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(6.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -54,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-15.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-14.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -69,15 +66,17 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 48, 125, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 45, 125, 0, 72, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 13.0); - frame(lua_state, 12.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 11.0, 15.0); + frame(lua_state, 11.0); FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 94, 0, 64, 6.0, 0.0, 12.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); AttackModule::set_catch_only_all(boma, true, false); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, bone: "top", dmg: 6.0, angle: 361, kbg: 112, bkb: 61, size: 6.0, x: 0.0, y: 12.0, z: 9.0, clank: SetOff::Off, facing: LrCheck::F, }); + AttackModule::set_catch_only_all(boma, true, false); } frame(lua_state, 14.0); if is_excute(agent) { @@ -116,7 +115,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 100, 0, 30, 6.0, 0.0, 21.0, 0.0, Some(0.0), Some(13.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + hitbox!(agent, { extends: PITB_KICK_HITBOX_L, id: 0, bone: "top", dmg: 4.0, angle: 361, kbg: 100, bkb: 30, size: 6.0, x: 0.0, y: 21.0, z: 0.0, x2: 0.0, y2: 13.0, z2: 0.0, clank: SetOff::Off, facing: LrCheck::F, }); AttackModule::set_catch_only_all(boma, true, false); } frame(lua_state, 15.0); @@ -129,6 +128,35 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + FT_LEAVE_NEAR_OTTOTTO(agent, -3, 3); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 68, 77, 0, 77, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 13.0); + if is_excute(agent) { + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 0, bone: "top", dmg: 2.0, angle: 361, kbg: 40, bkb: 80, size: 6.0, x: 0.0, y: 2.0, z: -4.0, clank: SetOff::Off, facing: LrCheck::F, }); + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, 0, 0); + // lua_bind::FighterCutInManager::set_throw_finish_zoom_rate(singletons::FighterCutInManager(), 1.2); + } + frame(lua_state, 15.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 16.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + unsafe extern "C" fn effect_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -159,5 +187,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_throwf", game_throwf, Priority::Low); agent.acmd("effect_throwf", effect_throwf, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); + agent.acmd("game_throwlw", game_throwlw, Priority::Low); agent.acmd("effect_throwlw", effect_throwlw, Priority::Low); } \ No newline at end of file diff --git a/fighters/pitb/src/acmd/tilts.rs b/fighters/pitb/src/acmd/tilts.rs index bff72a06c0..7af87028ab 100644 --- a/fighters/pitb/src/acmd/tilts.rs +++ b/fighters/pitb/src/acmd/tilts.rs @@ -9,8 +9,8 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 361, 100, 0, 40, 4.0, 0.0, 7.5, 8.0, Some(0.0), Some(7.5), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 361, 100, 0, 40, 4.0, 0.0, 7.5, 15.0, Some(0.0), Some(7.5), Some(6.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 7.0, angle: 361, kbg: 100, bkb: 40, size: 4.0, x: 0.0, y: 7.5, z: 8.0, x2: 0.0, y2: 7.5, z2: 6.0 }); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_L, id: 1, bone: "top", dmg: 9.0, angle: 361, kbg: 100, bkb: 40, size: 4.0, x: 0.0, y: 7.5, z: 14.0, x2: 0.0, y2: 7.5, z2: 6.0, hitlag: 1.1, }); } wait(lua_state, 5.0); if is_excute(agent) { @@ -42,7 +42,7 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 368, 100, 45, 0, 4.0, 0.0, 24.0, 2.4, Some(0.0), Some(10.0), Some(8.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + hitbox!(agent, { extends: PITB_KICK_HITBOX_S, id: 0, bone: "top", dmg: 4.0, angle: 368, kbg: 100, fkb: 45, bkb: 0, size: 4.0, x: 0.0, y: 24.0, z: 2.4, x2: 0.0, y2: 10.0, z2: 8.0, sdi: 0.5, facing: LrCheck::F, set_weight: true, }); let hitVec = Vector2f { x: 5.5, y: 21.75 }; AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &hitVec, 10, false); } @@ -52,7 +52,7 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 69, 44, 0, 71, 6.0, 0.0, 23.5, 6.0, Some(0.0), Some(20.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + hitbox!(agent, { extends: PITB_KICK_HITBOX_L, id: 0, bone: "top", dmg: 6.0, angle: 69, kbg: 44, bkb: 71, size: 6.0, x: 0.0, y: 23.5, z: 6.0, x2: 0.0, y2: 20.0, z2: 5.0, facing: LrCheck::F, }); } frame(lua_state, 17.0); FT_MOTION_RATE_RANGE(agent, 17.0, 34.0, 11.0); @@ -68,7 +68,7 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 69, 48, 0, 61, 3.5, 0.0, 3.0, 19.5, Some(0.0), Some(5.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.2, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PALUTENA); + hitbox!(agent, { extends: PITB_SWORD_HITBOX_M, id: 0, bone: "top", dmg: 7.0, angle: 69, kbg: 53, bkb: 60, size: 3.5, x: 0.0, y: 3.0, z: 19.5, x2: 0.0, y2: 5.0, z2: 9.0, }); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 8.0); diff --git a/fighters/pitb/src/bowarrow/acmd.rs b/fighters/pitb/src/bowarrow/acmd.rs new file mode 100644 index 0000000000..53ba434af7 --- /dev/null +++ b/fighters/pitb/src/bowarrow/acmd.rs @@ -0,0 +1,44 @@ +use super::*; + +hitbox_templates!( + pub PITB_BOWARROW_HITBOX = { + extends: ENERGY_PROJECTILE_HITBOX, + effect: "collision_attr_sting", + sound_level: SoundLevel::S, + hit_sound: CollisionSound::Cutup, + region: AttackRegion::Palutena, + }; +); + +unsafe extern "C" fn game_fly(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + hitbox!(agent, { extends: PITB_BOWARROW_HITBOX, id: 0, bone: "top", dmg: 1.0, angle: 45, kbg: 100, bkb: 4, size: 1.3, x: 0.0, y: 0.0, z: -1.5, }); + AttackModule::enable_safe_pos(boma); + } +} + +// unsafe extern "C" fn effect_fly(agent: &mut L2CAgentBase) { +// let lua_state = agent.lua_state_agent; +// let boma = agent.boma(); +// if is_excute(agent) { +// EFFECT_FOLLOW(agent, Hash40::new("pitb_pa_fly_arrow"), Hash40::new("rot"), 0, 0, 0, 0, 0, 0, 1, true); +// EFFECT_FOLLOW(agent, Hash40::new("pitb_pa_fly_arrow2"), Hash40::new("rot"), 0, 0, 0, 0, 0, 0, 1, true); +// } +// } + +// unsafe extern "C" fn sound_fly(agent: &mut L2CAgentBase) { +// let lua_state = agent.lua_state_agent; +// let boma = agent.boma(); +// if is_excute(agent) { +// PLAY_STATUS(agent, Hash40::new("se_pitb_special_n03")); +// SET_TAKEOUT_SE(agent, Hash40::new("se_pitb_special_n02")); +// } +// } + +pub fn install(agent: &mut Agent) { + agent.acmd("game_fly", game_fly, Priority::Low); + // agent.acmd("effect_fly", effect_fly, Priority::Low); + // agent.acmd("sound_fly", sound_fly, Priority::Low); +} \ No newline at end of file diff --git a/fighters/pitb/src/bowarrow/mod.rs b/fighters/pitb/src/bowarrow/mod.rs new file mode 100644 index 0000000000..a34c995180 --- /dev/null +++ b/fighters/pitb/src/bowarrow/mod.rs @@ -0,0 +1,11 @@ +use super::*; + +mod acmd; +mod status; + +pub fn install() { + let agent = &mut Agent::new("pitb_bowarrow"); + acmd::install(agent); + status::install(agent); + agent.install(); +} \ No newline at end of file diff --git a/fighters/pitb/src/bowarrow/status.rs b/fighters/pitb/src/bowarrow/status.rs new file mode 100644 index 0000000000..b5eea77d36 --- /dev/null +++ b/fighters/pitb/src/bowarrow/status.rs @@ -0,0 +1,42 @@ +use super::*; + +unsafe extern "C" fn fly_exec(weapon: &mut L2CWeaponCommon) -> L2CValue { + if weapon.is_flag(*WEAPON_INSTANCE_WORK_ID_FLAG_SWALLOWED) { + return false.into(); + } + + let (stick_mag, stick_rad) = weapon.stick_polar(); + let arrow_deg = weapon.get_float(*WEAPON_PIT_BOWARROW_INSTANCE_WORK_ID_FLOAT_ANGLE); + let was_reflected = AttackModule::is_infliction_status(weapon.module_accessor, *COLLISION_KIND_MASK_REFLECTOR | *COLLISION_KIND_MASK_PARRY); + + let new_deg = if was_reflected { // when parried, snap the arrow to one of 8 directions + AttackModule::clear_inflict_kind_status(weapon.module_accessor); + (arrow_deg / 45.0).round() * 45.0 + } + else if stick_mag > 1e-5 { // if stick is not neutral, control the arrow + let mut delta = arrow_deg - stick_rad.to_degrees(); + while delta > 180.0 { delta -= 360.0; } + while delta < -180.0 { delta += 360.0; } + + let control_angle = weapon.get_param_float("param_bowarrow", "control_angle"); + let max_turn = control_angle * stick_mag; + arrow_deg - delta.clamp(-max_turn, max_turn) + } else { + arrow_deg + }; + + // apply new angle to velocity + let speed = weapon.get_float(*WEAPON_PIT_BOWARROW_INSTANCE_WORK_ID_FLOAT_SPEED); + let speed_x = speed * new_deg.to_radians().cos(); + let speed_y = speed * new_deg.to_radians().sin(); + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, speed_x, speed_y); + weapon.set_float(speed, *WEAPON_PIT_BOWARROW_INSTANCE_WORK_ID_FLOAT_SPEED); + weapon.set_float(new_deg, *WEAPON_PIT_BOWARROW_INSTANCE_WORK_ID_FLOAT_ANGLE); + PostureModule::set_rot(weapon.module_accessor, &Vector3f::new(-new_deg, 90.0, 0.0), 0); + + return false.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Exec, *WEAPON_PIT_BOWARROW_STATUS_KIND_FLY, fly_exec); +} \ No newline at end of file diff --git a/fighters/pitb/src/lib.rs b/fighters/pitb/src/lib.rs index 7147efa1fa..f7a268127e 100644 --- a/fighters/pitb/src/lib.rs +++ b/fighters/pitb/src/lib.rs @@ -7,6 +7,8 @@ pub mod acmd; pub mod opff; pub mod status; +pub mod bowarrow; + use smash::{ lib::{ L2CValue, @@ -30,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -39,10 +42,52 @@ use utils::{ use smashline::*; #[macro_use] extern crate smash_script; +hitbox_templates!( + pub PITB_SWORD_HITBOX = { + extends: BASE_HITBOX, + effect: "collision_attr_cutup", + hit_sound: CollisionSound::Cutup, + region: AttackRegion::Palutena, + }; + pub PITB_SWORD_HITBOX_S = { + extends: PITB_SWORD_HITBOX, + sound_level: SoundLevel::S, + }; + pub PITB_SWORD_HITBOX_M = { + extends: PITB_SWORD_HITBOX, + sound_level: SoundLevel::M, + }; + pub PITB_SWORD_HITBOX_L = { + extends: PITB_SWORD_HITBOX, + effect: "collision_attr_sting", + sound_level: SoundLevel::L, + }; + pub PITB_KICK_HITBOX = { + extends: BASE_HITBOX, + effect: "collision_attr_normal", + hit_sound: CollisionSound::Kick, + region: AttackRegion::Kick, + }; + pub PITB_KICK_HITBOX_S = { + extends: PITB_KICK_HITBOX, + sound_level: SoundLevel::S, + }; + pub PITB_KICK_HITBOX_M = { + extends: PITB_KICK_HITBOX, + sound_level: SoundLevel::M, + }; + pub PITB_KICK_HITBOX_L = { + extends: PITB_KICK_HITBOX, + sound_level: SoundLevel::L, + }; +); + pub fn install() { let agent = &mut Agent::new("pitb"); acmd::install(agent); opff::install(agent); status::install(agent); agent.install(); + + bowarrow::install(); } diff --git a/fighters/pitb/src/opff.rs b/fighters/pitb/src/opff.rs index 369bbb7794..b49859a259 100644 --- a/fighters/pitb/src/opff.rs +++ b/fighters/pitb/src/opff.rs @@ -12,9 +12,36 @@ unsafe fn bow_lc(boma: &mut BattleObjectModuleAccessor) { // Dark Pit Guardian Orbitar Jump Cancels unsafe fn guardian_orbitar_jc(fighter: &mut L2CFighterCommon) { - if fighter.is_status_one_of(&[*FIGHTER_PIT_STATUS_KIND_SPECIAL_LW_HOLD, *FIGHTER_PIT_STATUS_KIND_SPECIAL_LW_END]) - && !fighter.is_in_hitlag() { - fighter.check_jump_cancel(false, false); + + // resets the disable jump cancel flag + if fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, + ]) + && StatusModule::is_changing(fighter.module_accessor) { + VarModule::off_flag(fighter.battle_object, vars::pitb::instance::SPECIAL_LW_DISABLE_JC); + } + + // disables jump cancels when parried between statuses + if fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, + *FIGHTER_PIT_STATUS_KIND_SPECIAL_LW_HOLD, + *FIGHTER_PIT_STATUS_KIND_SPECIAL_LW_END, + ]) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY) { + VarModule::on_flag(fighter.battle_object, vars::pitb::instance::SPECIAL_LW_DISABLE_JC); + if !fighter.is_status(*FIGHTER_PIT_STATUS_KIND_SPECIAL_LW_END) + && !fighter.is_in_hitlag() { + fighter.change_status(FIGHTER_PIT_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); + } + } + + if fighter.is_status_one_of(&[ + *FIGHTER_PIT_STATUS_KIND_SPECIAL_LW_HOLD, + *FIGHTER_PIT_STATUS_KIND_SPECIAL_LW_END + ]) + && !fighter.is_in_hitlag() + && !VarModule::is_flag(fighter.battle_object, vars::pitb::instance::SPECIAL_LW_DISABLE_JC) { + fighter.check_jump_cancel(false, false, false); } } diff --git a/fighters/pitb/src/status/mod.rs b/fighters/pitb/src/status/mod.rs index 77dac10f3b..b8afb18a09 100644 --- a/fighters/pitb/src/status/mod.rs +++ b/fighters/pitb/src/status/mod.rs @@ -3,7 +3,9 @@ use globals::*; // status script import mod special_hi; +mod special_n; pub fn install(agent: &mut Agent) { special_hi::install(agent); + special_n::install(agent); } \ No newline at end of file diff --git a/fighters/pitb/src/status/special_n.rs b/fighters/pitb/src/status/special_n.rs new file mode 100644 index 0000000000..5913477f05 --- /dev/null +++ b/fighters/pitb/src/status/special_n.rs @@ -0,0 +1,29 @@ +use super::*; + +unsafe extern "C" fn special_n_dir_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_PIT_STATUS_KIND_SPECIAL_N_DIR)(fighter); + + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_status_func as *const () as _)); + + ret +} + +unsafe extern "C" fn special_n_turn_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_PIT_STATUS_KIND_SPECIAL_N_TURN)(fighter); + + fighter.global_table[SUB_STATUS].assign(&L2CValue::Ptr(sub_status_func as *const () as _)); + + ret +} + +unsafe extern "C" fn sub_status_func(fighter: &mut L2CFighterCommon, param_1: L2CValue) -> L2CValue { + if !param_1.get_bool() { + fighter.inc_int(*FIGHTER_PIT_STATUS_SPECIAL_N_CHARGE_INT_CHARGE); + } + return false.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_PIT_STATUS_KIND_SPECIAL_N_DIR, special_n_dir_main); + agent.status(Main, *FIGHTER_PIT_STATUS_KIND_SPECIAL_N_TURN, special_n_turn_main); +} \ No newline at end of file diff --git a/fighters/plizardon/Cargo.toml b/fighters/plizardon/Cargo.toml index 249065918c..426d1a6c84 100644 --- a/fighters/plizardon/Cargo.toml +++ b/fighters/plizardon/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/plizardon/src/acmd/aerials.rs b/fighters/plizardon/src/acmd/aerials.rs index 39b086ee64..b861359beb 100644 --- a/fighters/plizardon/src/acmd/aerials.rs +++ b/fighters/plizardon/src/acmd/aerials.rs @@ -68,18 +68,21 @@ unsafe extern "C" fn expression_attackairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 5.0); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 8.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 11.0, 45, 129, 0, 12, 4.7, 7.0, 0.0, 1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 8.0, 45, 129, 0, 12, 3.8, 0.0, 0.0, 1.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 8.0, 45, 129, 0, 12, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("arml"), 11.0, 44, 104, 0, 22, 4.7, 7.0, 0.0, 1.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 9.0, 44, 104, 0, 22, 3.8, 0.0, 0.0, 1.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 9.0, 44, 104, 0, 22, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 14.0); - FT_MOTION_RATE_RANGE(agent, 14.0, 18.0, 10.0); + FT_MOTION_RATE_RANGE(agent, 14.0, 18.0, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -129,6 +132,16 @@ unsafe extern "C" fn sound_attackairf(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_landingairf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("plizardon_scratch2_l"), true, true); + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_a"), Hash40::new("top"), 0, 0, 0, 0, 180, 0, 1.25, 0, 0, 0, 0, 0, 0, true); + LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.75, 0, 0, 0, 0, 0, 0, true); + } +} + unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -182,12 +195,11 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { if is_excute(agent) { if agent.lr() < 0.0 { EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("plizardon_atk_fire_air2"), Hash40::new("fire"), 0, 0, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_RATE(agent, 0.8); } else { EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("plizardon_atk_fire_air2"), Hash40::new("fire"), 0, 0, 0, 180, 0, 0, 1, true); - LAST_EFFECT_SET_RATE(agent, 0.8); } + LAST_EFFECT_SET_RATE(agent, 0.8); } frame(lua_state, 17.0); if is_excute(agent) { @@ -199,28 +211,26 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 4.0); - FT_MOTION_RATE_RANGE(agent, 4.0, 9.0, 7.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 9.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 10.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("neck2"), *HIT_STATUS_XLU); } - frame(lua_state, 10.0); + frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("head"), 10.0, 80, 110, 0, 40, 5.5, 0.0, 3.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("neck2"), 10.0, 80, 110, 0, 40, 4.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("neck"), 10.0, 80, 110, 0, 40, 4.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("head"), 13.0, 84, 95, 0, 40, 4.5, 0.0, 2.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("neck2"), 10.0, 80, 105, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("neck"), 10.0, 80, 105, 0, 40, 4.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } - frame(lua_state, 16.0); + frame(lua_state, 18.0); if is_excute(agent) { HitModule::set_status_all(boma, app::HitStatus(*HIT_STATUS_NORMAL), 0); AttackModule::clear_all(boma); } - frame(lua_state, 38.0); + frame(lua_state, 41.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -229,21 +239,45 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 10.0); + frame(lua_state, 12.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), -1, 15.5, -3, -90, 65, 0, 1.15, true, *EF_FLIP_YZ); - LAST_EFFECT_SET_RATE(agent, 1.2); + if agent.lr() < 0.0 { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("plizardon_atk_fire_air2"), Hash40::new("head"), -2.25, 6.5, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + else { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("plizardon_atk_fire_air2"), Hash40::new("head"), -2.25, 6.5, 0, 180, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("plizardon_atk_fire_air2"), false, false); + } +} + +unsafe extern "C" fn sound_attackairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_plizardon_rnd_attack")); + } + frame(lua_state, 13.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_plizardon_attackair_b01")); + PLAY_SE(agent, Hash40::new("se_plizardon_attackair_h01")); } } unsafe extern "C" fn expression_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 8.0); + frame(lua_state, 11.0); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 10.0); + frame(lua_state, 13.0); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); } @@ -303,12 +337,14 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairf", game_attackairf, Priority::Low); agent.acmd("effect_attackairf", effect_attackairf, Priority::Low); agent.acmd("sound_attackairf", sound_attackairf, Priority::Low); + agent.acmd("effect_landingairf", effect_landingairf, Priority::Low); agent.acmd("game_attackairb", game_attackairb, Priority::Low); agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); agent.acmd("effect_attackairhi", effect_attackairhi, Priority::Low); + agent.acmd("sound_attackairhi", sound_attackairhi, Priority::Low); agent.acmd("expression_attackairhi", expression_attackairhi, Priority::Low); agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); diff --git a/fighters/plizardon/src/acmd/ground.rs b/fighters/plizardon/src/acmd/ground.rs index 86cd1c9d96..814d79e418 100644 --- a/fighters/plizardon/src/acmd/ground.rs +++ b/fighters/plizardon/src/acmd/ground.rs @@ -5,10 +5,10 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 100, 22, 0, 2.5, 0.0, 8.0, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 100, 22, 0, 2.75, 0.0, 8.0, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 120, 100, 26, 0, 3.0, 0.0, 8.0, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - // Locking hitbox + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 50, 50, 0, 20, 2.5, 0.0, 8.0, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 65, 50, 0, 20, 2.75, 0.0, 8.0, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 80, 50, 0, 20, 3.0, 0.0, 8.0, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 2.5, 0.0, 3.5, 4.0, Some(0.0), Some(3.5), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); AttackModule::set_down_only(boma, 3, true); } @@ -42,10 +42,10 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 30, 50, 0, 25, 2.8, 0.0, 8.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 55, 50, 0, 25, 2.8, 0.0, 8.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 50, 50, 0, 25, 2.8, 0.0, 8.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 65, 50, 0, 25, 2.8, 0.0, 8.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 80, 50, 0, 25, 3.2, 0.0, 8.0, 13.0, Some(0.0), Some(8.0), Some(15.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 361, 15, 0, 25, 2.5, 0.0, 3.5, 5.0, Some(0.0), Some(3.5), Some(14.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); AttackModule::set_down_only(boma, 3, true); } diff --git a/fighters/plizardon/src/acmd/other.rs b/fighters/plizardon/src/acmd/other.rs index dd5fa331d8..dea0fde760 100644 --- a/fighters/plizardon/src/acmd/other.rs +++ b/fighters/plizardon/src/acmd/other.rs @@ -87,16 +87,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -107,10 +103,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn expression_landingheavy(agent: &mut L2CAgentBase) { @@ -119,7 +112,7 @@ unsafe extern "C" fn expression_landingheavy(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_landl"), 0, false, 0x50000000 /* default value */); slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - if !agent.is_prev_status(*FIGHTER_STATUS_KIND_ESCAPE_AIR) { + if !agent.is_prev_status_one_of(&[*FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_STATUS_KIND_DAMAGE_AIR]) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } diff --git a/fighters/plizardon/src/acmd/smashes.rs b/fighters/plizardon/src/acmd/smashes.rs index 07cff43ac8..58cfaa1a6a 100644 --- a/fighters/plizardon/src/acmd/smashes.rs +++ b/fighters/plizardon/src/acmd/smashes.rs @@ -171,9 +171,9 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("wingr2"), 8.0, 83, 117, 0, 63, 5.5, 3.6, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("wingr4"), 8.0, 83, 117, 0, 63, 5.0, 2.7, -2.0, -2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("wingr7"), 8.0, 83, 117, 0, 63, 4.5, 6.5, 0.0, 6.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("wingr2"), 8.0, 90, 111, 0, 65, 5.5, 3.6, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("wingr4"), 8.0, 90, 111, 0, 65, 5.0, 2.7, -2.0, -2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("wingr7"), 8.0, 90, 111, 0, 65, 4.5, 6.5, 0.0, 6.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_BODY); } wait(lua_state, 6.0); if is_excute(agent) { @@ -222,13 +222,13 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 361, 90, 0, 40, 5.0, 0.0, 5.5, 18.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 361, 90, 0, 40, 5.0, 0.0, 5.5, -13.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 361, 90, 0, 40, 7.0, 0.0, 6.0, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); - ATTACK(agent, 3, 0, Hash40::new("top"), 14.0, 361, 90, 0, 40, 7.0, 0.0, 6.0, -3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 361, 90, 0, 40, 5.0, 0.0, 4.0, 18.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 361, 90, 0, 40, 5.0, 0.0, 4.0, -13.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 2, 0, Hash40::new("top"), 14.0, 361, 90, 0, 40, 6.0, 0.0, 5.0, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 3, 0, Hash40::new("top"), 14.0, 361, 90, 0, 40, 6.0, 0.0, 5.0, -3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } - wait(lua_state, 3.0); + wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } diff --git a/fighters/plizardon/src/acmd/specials.rs b/fighters/plizardon/src/acmd/specials.rs index d148c33355..0b0ae4b779 100644 --- a/fighters/plizardon/src/acmd/specials.rs +++ b/fighters/plizardon/src/acmd/specials.rs @@ -43,26 +43,26 @@ unsafe extern "C" fn game_specialnstart(agent: &mut L2CAgentBase) { if pledge == *PLEDGE_STATE_WATER { // Water Pledge if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 13.0, 361, 87, 0, 65, 7.0, 0.0, 8.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 0, 0, 0, 0, 8.0, 0.0, 8.5, 11.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 1, Hash40::new("top"), 13.0, 361, 100, 0, 40, 7.0, 0.0, 8.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 0, 0, 0, 0, 8.0, 0.0, 8.5, 11.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } frame(lua_state, 23.0); if is_excute(agent) { AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 1, Hash40::new("top"), 13.0, 361, 87, 0, 65, 9.0, 0.0, 8.5, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 0, 0, 0, 0, 10.0, 0.0, 8.5, 14.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 1, Hash40::new("top"), 13.0, 361, 100, 0, 40, 9.0, 0.0, 8.5, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 0, 0, 0, 0, 10.0, 0.0, 8.5, 14.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } frame(lua_state, 26.0); if is_excute(agent) { AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 1, Hash40::new("top"), 11.0, 361, 87, 0, 67, 11.0, 0.0, 8.5, 17.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 0, 0, 0, 0, 12.0, 0.0, 8.5, 17.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 1, Hash40::new("top"), 11.0, 361, 100, 0, 40, 11.0, 0.0, 8.5, 17.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 0, 0, 0, 0, 12.0, 0.0, 8.5, 17.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } frame(lua_state, 29.0); if is_excute(agent) { AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 1, Hash40::new("top"), 11.0, 361, 87, 0, 67, 13.0, 0.0, 8.5, 20.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 0, 0, 0, 0, 14.0, 0.0, 8.5, 20.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 1, Hash40::new("top"), 11.0, 361, 100, 0, 40, 13.0, 0.0, 8.5, 20.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 0, 0, 0, 0, 14.0, 0.0, 8.5, 20.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } } else if pledge == *PLEDGE_STATE_GRASS { @@ -83,31 +83,31 @@ unsafe extern "C" fn game_specialnstart(agent: &mut L2CAgentBase) { frame(lua_state, 29.0); if is_excute(agent) { AttackModule::clear_all(boma); - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 361, 100, 0, 59, 11.5, 0.0, 8.5, 21.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 361, 100, 0, 60, 11.5, 0.0, 8.5, 21.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } } else { if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 11.0, 361, 100, 0, 20, 7.0, 0.0, 8.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 1, Hash40::new("top"), 11.0, 361, 100, 0, 40, 7.0, 0.0, 8.5, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 0, 0, 0, 0, 8.0, 0.0, 8.5, 11.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } frame(lua_state, 23.0); if is_excute(agent) { AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 1, Hash40::new("top"), 9.0, 361, 80, 0, 20, 7.5, 0.0, 8.5, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 0, 0, 0, 0, 8.5, 0.0, 8.5, 13.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 1, Hash40::new("top"), 11.0, 361, 100, 0, 40, 7.5, 0.0, 8.5, 13.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 0, 0, 0, 0, 8.5, 0.0, 8.5, 13.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 2, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } frame(lua_state, 26.0); if is_excute(agent) { AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 1, Hash40::new("top"), 7.0, 361, 70, 0, 20, 8.0, 0.0, 8.5, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 0, 0, 0, 0, 9.0, 0.0, 8.5, 15.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 1, Hash40::new("top"), 7.0, 361, 100, 0, 40, 8.0, 0.0, 8.5, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 0, 0, 0, 0, 9.0, 0.0, 8.5, 15.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } frame(lua_state, 29.0); if is_excute(agent) { AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 1, Hash40::new("top"), 5.0, 361, 60, 0, 20, 8.5, 0.0, 8.5, 17.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 0, 0, 0, 0, 9.5, 0.0, 8.5, 17.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 1, Hash40::new("top"), 7.0, 361, 100, 0, 40, 8.5, 0.0, 8.5, 17.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 0, 0, 0, 0, 9.5, 0.0, 8.5, 17.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, true, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_NONE); } } frame(lua_state, 32.0); @@ -370,25 +370,62 @@ unsafe extern "C" fn expression_specialnstart(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 21.0, 17.0); + frame(lua_state, 21.0); + FT_MOTION_RATE(agent, 1.0); +} + unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); if is_excute(agent) { - JostleModule::set_status(boma, false); - ATTACK(agent, 0, 0, Hash40::new("neck"), 0.0, 366, 0, 0, 0, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 366, 0, 0, 0, 4.5, 0.0, 6.5, 4.5, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("neck"), 21.0, 361, 70, 0, 50, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 21.0, 361, 70, 0, 50, 4.5, 0.0, 6.5, 4.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BODY); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_kick_hit_l")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_kick_hit_l")); + } + frame(lua_state, 8.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("neck"), 14.0, 361, 82, 0, 50, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 361, 82, 0, 50, 4.5, 0.0, 6.5, 4.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BODY); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_kick_hit_l")); + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_kick_hit_l")); } } unsafe extern "C" fn game_specialairs(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); if is_excute(agent) { + KineticModule::mul_speed(boma, &Vector3f::new(0.8, 1.0, 1.0), *FIGHTER_KINETIC_ENERGY_ID_STOP); DamageModule::set_no_reaction_mode_status(boma, DamageNoReactionMode{_address: *DAMAGE_NO_REACTION_MODE_NORMAL as u8}, -1.0, -1.0, -1); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); JostleModule::set_status(boma, false); - ATTACK(agent, 0, 0, Hash40::new("neck"), 0.0, 366, 0, 0, 0, 4.5, 0.0, 0.0, 0.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BODY); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.0, 366, 0, 0, 0, 4.5, 0.0, 6.5, 4.5, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("neck"), 21.0, 46, 70, 0, 50, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 21.0, 46, 70, 0, 50, 4.5, 0.0, 6.5, 4.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -2, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BODY); + } + frame(lua_state, 8.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("neck"), 14.0, 361, 82, 0, 50, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BODY); + ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 361, 82, 0, 50, 4.5, 0.0, 6.5, 4.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, -7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BODY); + } +} + +unsafe extern "C" fn sound_specialsblown(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if !SoundModule::is_playing(boma, Hash40::new("se_plizardon_special_s02")) { + PLAY_SE(agent, Hash40::new("vc_plizardon_special_s01")); + PLAY_SE(agent, Hash40::new("se_plizardon_special_s02")); + SET_PLAY_INHIVIT(agent, Hash40::new("se_plizardon_special_s02"), 20); + } } } @@ -512,11 +549,11 @@ unsafe extern "C" fn game_speciallwin(agent: &mut L2CAgentBase) { let parent_id = LinkModule::get_parent_id(boma, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; let object = utils::util::get_battle_object_from_id(parent_id); VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_LW_BACKWARDS_SWITCH); // we will turn this off in opff - if VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE) == *PLEDGE_STATE_NONE { + //if VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE) == *PLEDGE_STATE_NONE { VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE, *PLEDGE_STATE_FIRE); let pledge_duration_frame = ParamModule::get_int(agent.battle_object, ParamType::Agent, "param_special_lw.pledge_duration_frame"); VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, pledge_duration_frame); - } + //} let swap_lockout_frame = ParamModule::get_int(agent.battle_object, ParamType::Agent, "param_special_lw.swap_lockout_frame"); VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_LW_SWAP_TIMER, swap_lockout_frame); VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); @@ -534,8 +571,13 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_specialnstart", expression_specialnstart, Priority::Low); agent.acmd("expression_specialairnstart", expression_specialnstart, Priority::Low); + agent.acmd("game_specialsstart", game_specialsstart, Priority::Low); + agent.acmd("game_specialairsstart", game_specialsstart, Priority::Low); + agent.acmd("game_specials", game_specials, Priority::Low); - agent.acmd("game_specialairs", game_specialairs, Priority::Low); + agent.acmd("game_specialairs", game_specials, Priority::Low); + agent.acmd("sound_specialsblown", sound_specialsblown, Priority::Low); + agent.acmd("sound_specialairsblown", sound_specialsblown, Priority::Low); agent.acmd("game_specialsend", game_specialsend, Priority::Low); agent.acmd("game_specialairsend", game_specialairsend, Priority::Low); agent.acmd("effect_specialsend", effect_specialsend, Priority::Low); diff --git a/fighters/plizardon/src/acmd/throws.rs b/fighters/plizardon/src/acmd/throws.rs index 16d0c12f80..a65ca3c94b 100644 --- a/fighters/plizardon/src/acmd/throws.rs +++ b/fighters/plizardon/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.875); - frame(lua_state, 7.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(17.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 7.0, Some(0.0), Some(8.0), Some(17.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -163,18 +162,14 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 1.0); - if pledge == *PLEDGE_STATE_WATER { - FT_MOTION_RATE_RANGE(agent, 1.0, 20.0, 5.0); - } else { - FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 4.0); - frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.0); - } + FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 4.0); + frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 20.0); FT_MOTION_RATE_RANGE(agent, 20.0, 24.0, 1.0); frame(lua_state, 24.0); let game_frames = match (pledge) { - _ if pledge == *PLEDGE_STATE_WATER => 9.0, + _ if pledge == *PLEDGE_STATE_WATER => 7.0, _ if pledge == *PLEDGE_STATE_GRASS => 49.0, _ => 25.0 }; diff --git a/fighters/plizardon/src/explosion/acmd.rs b/fighters/plizardon/src/explosion/acmd.rs index 24e6b41d30..443a952b0b 100644 --- a/fighters/plizardon/src/explosion/acmd.rs +++ b/fighters/plizardon/src/explosion/acmd.rs @@ -4,8 +4,8 @@ unsafe extern "C" fn game_start(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 50, 77, 0, 60, 11.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("top"), 17.0, 50, 77, 0, 60, 5.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(-10.0), 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 50, 77, 0, 60, 11.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("top"), 17.0, 50, 77, 0, 60, 5.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(-10.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_BOMB); } } diff --git a/fighters/plizardon/src/lib.rs b/fighters/plizardon/src/lib.rs index 77824eec4b..347da12019 100644 --- a/fighters/plizardon/src/lib.rs +++ b/fighters/plizardon/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/plizardon/src/rockstone/acmd.rs b/fighters/plizardon/src/rockstone/acmd.rs index 3cdabb3549..ddf44e528d 100644 --- a/fighters/plizardon/src/rockstone/acmd.rs +++ b/fighters/plizardon/src/rockstone/acmd.rs @@ -4,7 +4,7 @@ unsafe extern "C" fn game_move(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 2.0, 70, 108, 0, 46, 3.6, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, true, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 1, Hash40::new("have"), 2.0, 70, 108, 0, 46, 3.6, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 3, 0.0, 0, true, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_OBJECT); AttackModule::enable_safe_pos(agent.module_accessor); } } diff --git a/fighters/plizardon/src/status/mod.rs b/fighters/plizardon/src/status/mod.rs index 69e6771eb1..d5d6a82520 100644 --- a/fighters/plizardon/src/status/mod.rs +++ b/fighters/plizardon/src/status/mod.rs @@ -38,15 +38,51 @@ unsafe extern "C" fn entry_main(fighter: &mut L2CFighterCommon) -> L2CValue { } unsafe extern "C" fn dead_main(fighter: &mut L2CFighterCommon) -> L2CValue { - reset_ptrainer_vars(fighter); + if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { + let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; + let object = utils::util::get_battle_object_from_id(parent_id); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE, *PLEDGE_STATE_FIRE); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, 0); + VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_LW_SWAP_TIMER, 0); + } + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DEAD)(fighter) } unsafe extern "C" fn rebirth_main(fighter: &mut L2CFighterCommon) -> L2CValue { - reset_ptrainer_vars(fighter); + if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { + let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; + let object = utils::util::get_battle_object_from_id(parent_id); + let pledge_state = VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE); + if pledge_state == *PLEDGE_STATE_WATER { + let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_status_defense_up"), Hash40::new("hip"), &Vector3f::new(0.7, 0.0, 0.0), &Vector3f::zero(), 0.9, true, 0, 0, 0, 0, 0, true, true) as u32; + VarModule::set_int(fighter.object(), vars::plizardon::instance::SPECIAL_N_PLEDGE_EFFECT_HANDLE, handle as i32); + fighter.play_pledge_effect(*PLEDGE_STATE_WATER); + } + else if pledge_state == *PLEDGE_STATE_GRASS { + let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_status_speed_up"), Hash40::new("hip"), &Vector3f::new(0.7, 0.0, 0.0), &Vector3f::zero(), 0.9, true, 0, 0, 0, 0, 0, true, true) as u32; + VarModule::set_int(fighter.object(), vars::plizardon::instance::SPECIAL_N_PLEDGE_EFFECT_HANDLE, handle as i32); + fighter.play_pledge_effect(*PLEDGE_STATE_GRASS); + } + let pledge_duration_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_lw.pledge_duration_frame"); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, pledge_duration_frame); + VarModule::off_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); + } + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_REBIRTH)(fighter) } +unsafe extern "C" fn win_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_ptrainer_vars(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_WIN)(fighter) +} + +unsafe extern "C" fn lose_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_ptrainer_vars(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_LOSE)(fighter) +} + unsafe extern "C" fn reset_ptrainer_vars(fighter: &mut L2CFighterCommon) { if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; @@ -64,6 +100,8 @@ pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_ENTRY, entry_main); agent.status(Main, *FIGHTER_STATUS_KIND_DEAD, dead_main); agent.status(Main, *FIGHTER_STATUS_KIND_REBIRTH, rebirth_main); + agent.status(Main, *FIGHTER_STATUS_KIND_WIN, win_main); + agent.status(Main, *FIGHTER_STATUS_KIND_LOSE, lose_main); attack_s4::install(agent); special_n::install(agent); diff --git a/fighters/plizardon/src/status/special_s.rs b/fighters/plizardon/src/status/special_s.rs index f89bbeae2e..7be125f1e2 100644 --- a/fighters/plizardon/src/status/special_s.rs +++ b/fighters/plizardon/src/status/special_s.rs @@ -80,8 +80,110 @@ unsafe extern "C" fn special_s_end_pre(fighter: &mut L2CFighterCommon) -> L2CVal return 0.into(); } +unsafe extern "C" fn special_s_rush_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.off_flag(*FIGHTER_PLIZARDON_INSTANCE_WORK_ID_FLAG_SPECIAL_S_IS_HIT_SLOPE); + fighter.off_flag(*FIGHTER_PLIZARDON_STATUS_SPECIAL_S_FLAG_IS_STATUS_CHANGE_BLOWN); + fighter.set_int(0, *FIGHTER_PLIZARDON_INSTANCE_WORK_ID_INT_EXPLOSION_DELAY_FRAME); + fighter.set_int(0, *FIGHTER_PLIZARDON_STATUS_SPECIAL_S_WORK_INT_SPECIAL_S_ROTATE_COUNT); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + let facing = fighter.lr(); + let speed_x = fighter.get_param_float("param_special_s", "speed_x_") * facing; + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_GROUND, speed_x, 0.0, 0.0, 0.0, 0.0); + let brake_x = fighter.get_param_float("param_special_s", "brake_x_") * facing; + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, -brake_x, 0.0); // the vanilla script does this, don't look at me + sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, -1.0, -1.0); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FREE, 0.0, 0.0, 0.0, 0.0, 0.0); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_GROUND_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + } + else { + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, ENERGY_MOTION_RESET_TYPE_AIR_TRANS, 0.0, 0.0, 0.0, 0.0, 0.0); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + let rush_damage = fighter.get_param_float("param_special_s", "rush_damage_"); + DamageModule::add_damage(fighter.module_accessor, rush_damage, 0); + let super_armor_damage = fighter.get_param_float("param_special_s", "super_armor_damage_"); + DamageModule::set_no_reaction_mode_status(fighter.module_accessor, DamageNoReactionMode{_address: *DAMAGE_NO_REACTION_MODE_DAMAGE_POWER as u8}, -1.0, super_armor_damage, -1); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + let end_frame = MotionModule::end_frame_from_hash(fighter.module_accessor, Hash40::new("special_s")); + let la0 = (end_frame + 1.0) / 2.0; // l90 + let rush_rotate_frame = fighter.get_param_float("param_special_s", "rush_rotate_frame_"); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s"), 0.0, la0 / rush_rotate_frame, false, 0.0, false, false); + } + else { + let end_frame = MotionModule::end_frame_from_hash(fighter.module_accessor, Hash40::new("special_air_s")); + let la0 = (end_frame + 1.0) / 2.0; // l90 + let rush_rotate_frame = fighter.get_param_float("param_special_s", "rush_rotate_frame_"); + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_s"), 0.0, la0 / rush_rotate_frame, false, 0.0, false, false); + } + + fighter.main_shift(special_s_main_loop) +} + +unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if (fighter.lr() > 0.0 && GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_RIGHT as u32)) + || (fighter.lr() < 0.0 && GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_LEFT as u32)) + || AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + fighter.change_status(FIGHTER_PLIZARDON_STATUS_KIND_SPECIAL_S_BLOWN.into(), true.into()); + return 0.into(); + } + let motion = if fighter.is_situation(*SITUATION_KIND_GROUND) { Hash40::new("special_s") } else { Hash40::new("special_air_s") }; + let end_frame = MotionModule::end_frame_from_hash(fighter.module_accessor, motion); + let la0 = (end_frame + 1.0) / 2.0; // l90 + let rush_rotate_frame = fighter.get_param_float("param_special_s", "rush_rotate_frame_"); + let rate = la0 / rush_rotate_frame; + if MotionModule::frame(fighter.module_accessor) >= end_frame - 1.0 { + fighter.inc_int(*FIGHTER_PLIZARDON_STATUS_SPECIAL_S_WORK_INT_SPECIAL_S_ROTATE_COUNT); + let rotate_count = fighter.get_int(*FIGHTER_PLIZARDON_STATUS_SPECIAL_S_WORK_INT_SPECIAL_S_ROTATE_COUNT); + let rush_rotate_count = fighter.get_param_float("param_special_s", "rush_rotate_count_"); + if rush_rotate_count - 0.1 >= rotate_count as f32 { + fighter.change_motion_inherit_frame_by_situation("special_s", "special_air_s", -1.0, 1.0, 0.0, false, false); + MotionModule::set_frame(fighter.module_accessor, 0.0, true); + MotionModule::set_rate(fighter.module_accessor, rate); + return 0.into(); + } + } + else { + if StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_s"), -1.0, 1.0, 0.0, false, false); + MotionModule::set_rate(fighter.module_accessor, rate); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); + } + else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new("special_air_s"), -1.0, 1.0, 0.0, false, false); + MotionModule::set_rate(fighter.module_accessor, rate); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + } + return 0.into(); + } + fighter.change_status(FIGHTER_PLIZARDON_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + return 1.into(); +} + +unsafe extern "C" fn special_s_rush_check_attack(fighter: &mut L2CFighterCommon, param_2: &L2CValue, param_3: &L2CValue) -> L2CValue { + EFFECT(fighter, Hash40::new("sys_bomb_a"), Hash40::new("bust"), 0, 0, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, true); + + return 0.into(); +} + pub fn install(agent: &mut Agent) { agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_init); agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); + + agent.status(Main, *FIGHTER_PLIZARDON_STATUS_KIND_SPECIAL_S_RUSH, special_s_rush_main); + agent.status(CheckAttack, *FIGHTER_PLIZARDON_STATUS_KIND_SPECIAL_S_RUSH, special_s_rush_check_attack); + agent.status(Pre, *FIGHTER_PLIZARDON_STATUS_KIND_SPECIAL_S_END, special_s_end_pre); } diff --git a/fighters/ptrainer/Cargo.toml b/fighters/ptrainer/Cargo.toml index 6753d8ee2e..eac05bbd8d 100644 --- a/fighters/ptrainer/Cargo.toml +++ b/fighters/ptrainer/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/ptrainer/src/lib.rs b/fighters/ptrainer/src/lib.rs index f4ece79f0e..8bfda88ef5 100644 --- a/fighters/ptrainer/src/lib.rs +++ b/fighters/ptrainer/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/ptrainer/src/ptrainer/status/mod.rs b/fighters/ptrainer/src/ptrainer/status/mod.rs index f1b8f553b3..a989d5160d 100644 --- a/fighters/ptrainer/src/ptrainer/status/mod.rs +++ b/fighters/ptrainer/src/ptrainer/status/mod.rs @@ -5,6 +5,7 @@ use globals::*; mod special_lw; unsafe extern "C" fn on_start(weapon: &mut L2CWeaponCommon) { + CameraModule::set_enable_camera(weapon.module_accessor, false, 0); VarModule::set_int(weapon.battle_object, vars::ptrainer::instance::SPECIAL_LW_SWAP_TIMER, 0); } diff --git a/fighters/purin/Cargo.toml b/fighters/purin/Cargo.toml index f3c5ebbbb4..5b7e05f7d0 100644 --- a/fighters/purin/Cargo.toml +++ b/fighters/purin/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/purin/src/acmd/ground.rs b/fighters/purin/src/acmd/ground.rs index 89fd94365e..db56921fae 100644 --- a/fighters/purin/src/acmd/ground.rs +++ b/fighters/purin/src/acmd/ground.rs @@ -8,8 +8,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 44, 50, 0, 8, 2.5, 0.0, 5.8, 7.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 44, 50, 0, 8, 3.0, 0.0, 5.8, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 44, 50, 0, 8, 3.0, 0.0, 5.8, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 3.0, 0.0, 3.5, 7.5, Some(0.0), Some(3.5), Some(10.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/purin/src/acmd/other.rs b/fighters/purin/src/acmd/other.rs index 0fa3f89f55..8f8ced8832 100644 --- a/fighters/purin/src/acmd/other.rs +++ b/fighters/purin/src/acmd/other.rs @@ -72,15 +72,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -90,10 +86,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/purin/src/acmd/specials.rs b/fighters/purin/src/acmd/specials.rs index 0724149720..85c536a67c 100644 --- a/fighters/purin/src/acmd/specials.rs +++ b/fighters/purin/src/acmd/specials.rs @@ -12,18 +12,34 @@ unsafe extern "C" fn game_specialn(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_specialn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 16.0); + frame(lua_state, 14.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_h"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW(agent, Hash40::new("sys_piyo"), Hash40::new("top"), 0, 5, 6, 45, 0, 0, 1.5, true); + if agent.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false); + } } } unsafe extern "C" fn sound_specialn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 10.0); + if is_excute(agent) { + PLAY_STATUS(agent, Hash40::new("se_purin_special_n03")); + } frame(lua_state, 14.0); if is_excute(agent) { - PLAY_STATUS(agent, Hash40::new("vc_purin_003")); + let echo_handle = SoundModule::play_se(boma, Hash40::new("se_purin_disarmingvoice_echo"), true, false, false, false, app::enSEType(0)); + SoundModule::set_se_vol(boma, echo_handle as i32, 1.5, 0); + let handle = SoundModule::play_se(boma, Hash40::new("se_purin_appeal_l01"), true, false, false, false, app::enSEType(0)); + SoundModule::set_se_vol(boma, handle as i32, 0.75, 0); + let rand = sv_math::rand(hash40("fighter"), 2); + if rand == 0 { + let handle = SoundModule::play_se(boma, Hash40::new("vc_purin_heavyget"), true, false, false, false, app::enSEType(0)); + SoundModule::set_se_vol(boma, handle as i32, 2.0, 0); + } + STOP_SE(agent, Hash40::new("se_purin_special_n03")); } } @@ -48,8 +64,8 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 75, 75, 0, 52, 4.5, 0.0, 4.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 34, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 75, 75, 0, 52, 4.5, 0.0, 5.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 34, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 75, 75, 0, 52, 4.5, 0.0, 4.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 30, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 75, 75, 0, 52, 4.5, 0.0, 5.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 30, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_PUNCH); AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); AttackModule::set_add_reaction_frame(boma, 1, 2.0, false); } @@ -64,8 +80,8 @@ unsafe extern "C" fn game_specialairs(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 75, 75, 0, 52, 3.5, 0.0, 4.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 34, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 75, 75, 0, 52, 3.5, 0.0, 5.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 34, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 75, 75, 0, 52, 3.5, 0.0, 4.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 30, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 75, 75, 0, 52, 3.5, 0.0, 5.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 30, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HARISEN, *ATTACK_REGION_PUNCH); AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); AttackModule::set_add_reaction_frame(boma, 1, 2.0, false); WorkModule::on_flag(boma, *FIGHTER_PURIN_STATUS_SPECIAL_S_FLAG_INPUT); diff --git a/fighters/purin/src/acmd/throws.rs b/fighters/purin/src/acmd/throws.rs index 3ddde5eb29..d65e882c7c 100644 --- a/fighters/purin/src/acmd/throws.rs +++ b/fighters/purin/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.2, 0.0, Some(0.0), Some(5.2), Some(8.35), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.2, 3.5, Some(0.0), Some(5.2), Some(8.35), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.2, -3.5, Some(0.0), Some(5.2), Some(-14.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 5.2, -4.5, Some(0.0), Some(5.2), Some(-14.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/purin/src/disarmingvoice/status.rs b/fighters/purin/src/disarmingvoice/status.rs index e52370456b..c60ef521ec 100644 --- a/fighters/purin/src/disarmingvoice/status.rs +++ b/fighters/purin/src/disarmingvoice/status.rs @@ -135,6 +135,15 @@ unsafe extern "C" fn shoot_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); weapon.pop_lua_stack(1); } + // hit vfx workaround + if AttackModule::is_infliction(weapon.module_accessor, *COLLISION_KIND_MASK_HIT) { + EffectModule::req_on_joint(weapon.module_accessor, Hash40::new("sys_hit_magic"), Hash40::new("top"), &Vector3f::zero(), &Vector3f::zero(), 0.3, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0); + EffectModule::detach_kind(weapon.module_accessor, Hash40::new("sys_hit_magic"), 0); + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + } + if AttackModule::is_infliction(weapon.module_accessor, *COLLISION_KIND_MASK_SHIELD) { + notify_event_msc_cmd!(weapon, Hash40::new_raw(0x199c462b5d)); + } return false.into(); } diff --git a/fighters/purin/src/lib.rs b/fighters/purin/src/lib.rs index 5246dca0b9..793b32fe12 100644 --- a/fighters/purin/src/lib.rs +++ b/fighters/purin/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/purin/src/status/special_lw.rs b/fighters/purin/src/status/special_lw.rs index 1b2568a928..effde12b08 100644 --- a/fighters/purin/src/status/special_lw.rs +++ b/fighters/purin/src/status/special_lw.rs @@ -27,22 +27,23 @@ unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2C } } - if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PURIN_STATUS_SPECIAL_LW_FLAG_HIT) - && ( - !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) - || AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) - ) - && !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PURIN_STATUS_SPECIAL_LW_FLAG_HIT_CANCEL_OK) { - let frame = fighter.global_table[CURRENT_FRAME].get_i32(); - let cancel_frame = WorkModule::get_int(fighter.module_accessor, *FIGHTER_PURIN_STATUS_SPECIAL_LW_WORK_INT_ENABLE_HIT_CANCEL_FRAME); - - if frame == cancel_frame - 30 { - // Skip to wake-up animation, 30 frames before on-hit FAF - // Wake-up anim lasts 30 frames - MotionModule::set_frame_sync_anim_cmd(fighter.module_accessor, 179.0, true, true, false); - WorkModule::on_flag(fighter.module_accessor, *FIGHTER_PURIN_STATUS_SPECIAL_LW_FLAG_HIT_CANCEL_OK); - } - } + // Handles separate FAF when hitting the move + // if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PURIN_STATUS_SPECIAL_LW_FLAG_HIT) + // && ( + // !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) + // || AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) + // ) + // && !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_PURIN_STATUS_SPECIAL_LW_FLAG_HIT_CANCEL_OK) { + // let frame = fighter.global_table[CURRENT_FRAME].get_i32(); + // let cancel_frame = WorkModule::get_int(fighter.module_accessor, *FIGHTER_PURIN_STATUS_SPECIAL_LW_WORK_INT_ENABLE_HIT_CANCEL_FRAME); + // + // if frame == cancel_frame - 30 { + // // Skip to wake-up animation, 30 frames before on-hit FAF + // // Wake-up anim lasts 30 frames + // MotionModule::set_frame_sync_anim_cmd(fighter.module_accessor, 179.0, true, true, false); + // WorkModule::on_flag(fighter.module_accessor, *FIGHTER_PURIN_STATUS_SPECIAL_LW_FLAG_HIT_CANCEL_OK); + // } + // } if !StatusModule::is_changing(fighter.module_accessor) && StatusModule::is_situation_changed(fighter.module_accessor) { diff --git a/fighters/pzenigame/Cargo.toml b/fighters/pzenigame/Cargo.toml index 1af91aba79..3d6e998848 100644 --- a/fighters/pzenigame/Cargo.toml +++ b/fighters/pzenigame/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/pzenigame/src/acmd/aerials.rs b/fighters/pzenigame/src/acmd/aerials.rs index 5b8baec9aa..7af6a79ffe 100644 --- a/fighters/pzenigame/src/acmd/aerials.rs +++ b/fighters/pzenigame/src/acmd/aerials.rs @@ -9,11 +9,11 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { HIT_NODE(agent, Hash40::new("head"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("tail2"), *HIT_STATUS_XLU); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("bust"), 10.0, 361, 100, 0, 25, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("bust"), 10.0, 361, 128, 0, 15, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("bust"), 7.0, 361, 120, 0, 25, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); + ATTACK(agent, 0, 0, Hash40::new("bust"), 7.0, 361, 128, 0, 15, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_BODY); } frame(lua_state, 30.0); if is_excute(agent) { @@ -30,26 +30,27 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 4.0); - sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.15); - frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 48, 67, 0, 53, 4.0, 0.0, 5.0, 7.5, Some(0.0), Some(5.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 48, 67, 0, 53, 3.5, 0.0, 5.0, 4.0, Some(0.0), Some(5.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 48, 100, 0, 20, 3.5, 0.0, 5.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 361, 100, 0, 20, 4.0, 0.0, 5.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 10.0); + frame(lua_state, 8.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 48, 120, 0, 0, 3.0, 0.0, 5.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 48, 120, 0, 0, 3.5, 0.0, 5.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 13.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 16.0); - sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0); - FT_MOTION_RATE_RANGE(agent, 16.0, 36.0, 24.0); - frame(lua_state, 22.0); + frame(lua_state, 23.0); // F24 if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 36.0); - FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { @@ -72,8 +73,8 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("tail1"), 2.0, 365, 30, 0, 30, 4.2, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("tail2"), 2.0, 365, 30, 0, 30, 4.2, 4.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("tail1"), 3.0, 65, 60, 0, 50, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("tail2"), 3.0, 65, 60, 0, 50, 3.5, 4.0, 2.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); } frame(lua_state, 9.0); if is_excute(agent) { @@ -81,10 +82,10 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("tail1"), 5.0, 55, 79, 0, 45, 4.2, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("tail2"), 5.0, 55, 79, 0, 45, 4.2, 4.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("tail1"), 6.0, 55, 90, 0, 42, 4.2, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("tail2"), 6.0, 55, 90, 0, 42, 4.2, 4.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); } - frame(lua_state, 16.0); + frame(lua_state, 18.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -161,9 +162,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 4.5, 5.0, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("tail2"), 7.0, 55, 110, 0, 40, 4.0, 4.5, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("tail2"), 7.0, 55, 110, 0, 40, 4.0, 1.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("tail2"), 7.0, 55, 110, 0, 40, 3.5, -2.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("tail2"), 7.0, 58, 128, 0, 24, 4.0, 4.5, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("tail2"), 7.0, 58, 128, 0, 24, 4.0, 1.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); } frame(lua_state, 5.0); FT_MOTION_RATE(agent, 1.0); @@ -173,7 +173,6 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("tail2"), 5.0, 70, 90, 0, 40, 4.0, 4.5, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); ATTACK(agent, 1, 0, Hash40::new("tail2"), 5.0, 70, 90, 0, 40, 4.0, 1.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); - ATTACK(agent, 2, 0, Hash40::new("tail2"), 5.0, 70, 90, 0, 40, 3.5, -2.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_TAIL); } frame(lua_state, 14.0); FT_MOTION_RATE_RANGE(agent, 14.0, 22.0, 10.0); @@ -195,6 +194,11 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 11, -0.5, 20, 50, 90, 0.97, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 1.6); } + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 11, -0.5, 20, 90, 90, 0.97, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.6); + } } unsafe extern "C" fn expression_attackairhi(agent: &mut L2CAgentBase) { diff --git a/fighters/pzenigame/src/acmd/ground.rs b/fighters/pzenigame/src/acmd/ground.rs index 10514993e9..7bb626a867 100644 --- a/fighters/pzenigame/src/acmd/ground.rs +++ b/fighters/pzenigame/src/acmd/ground.rs @@ -5,10 +5,10 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 70, 100, 20, 0, 1.5, 0.0, 5.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 70, 100, 20, 0, 1.8, 0.0, 5.0, 7.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 70, 100, 20, 0, 2.2, 0.0, 5.0, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - // Locking hitbox + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 55, 115, 0, 0, 1.5, 0.0, 5.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 55, 115, 0, 0, 1.8, 0.0, 5.0, 7.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 55, 115, 0, 0, 2.2, 0.0, 5.0, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 2.2, 0.0, 3.0, 5.0, Some(0.0), Some(3.0), Some(9.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_down_only(boma, 3, true); } @@ -27,11 +27,11 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 2.0, 65, 100, 20, 0, 2.2, -1.5, -0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.0, 65, 100, 20, 0, 2.5, 1.2, -0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 2.0, 65, 100, 20, 0, 2.8, 4.0, -0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - // Locking hitbox - ATTACK(agent, 3, 0, Hash40::new("kneer"), 2.0, 361, 15, 0, 30, 2.5, -1.5, -0.5, 0.0, Some(4.0), Some(-0.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 3.0, 65, 115, 0, 0, 2.2, -1.5, -0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 65, 115, 0, 0, 2.5, 1.2, -0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 3.0, 65, 115, 0, 0, 2.8, 4.0, -0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("kneer"), 3.0, 361, 15, 0, 30, 2.5, -1.5, -0.5, 0.0, Some(4.0), Some(-0.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 6.0); diff --git a/fighters/pzenigame/src/acmd/other.rs b/fighters/pzenigame/src/acmd/other.rs index 3ec3ee6f1d..a5cb6233fb 100644 --- a/fighters/pzenigame/src/acmd/other.rs +++ b/fighters/pzenigame/src/acmd/other.rs @@ -136,15 +136,11 @@ unsafe extern "C" fn effect_turnrunbrake(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -154,10 +150,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appealhi(agent: &mut L2CAgentBase) { diff --git a/fighters/pzenigame/src/acmd/smashes.rs b/fighters/pzenigame/src/acmd/smashes.rs index 081d69d1fe..1a3a27712f 100644 --- a/fighters/pzenigame/src/acmd/smashes.rs +++ b/fighters/pzenigame/src/acmd/smashes.rs @@ -7,18 +7,36 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } + frame(lua_state, 7.0); + FT_MOTION_RATE_RANGE(agent, 7.0, 20.0, 7.0); frame(lua_state, 20.0); + FT_MOTION_RATE_RANGE(agent, 20.0, 22.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 361, 95, 0, 40, 4.2, 0.0, 4.8, 7.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); - ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 361, 95, 0, 40, 3.6, 0.0, 5.4, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); - ATTACK(agent, 2, 0, Hash40::new("top"), 15.0, 361, 95, 0, 40, 3.4, 0.0, 5.6, 18.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 361, 84, 0, 40, 4.2, 0.0, 4.8, 7.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 361, 84, 0, 40, 3.6, 0.0, 4.4, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 2, 0, Hash40::new("top"), 15.0, 361, 84, 0, 40, 3.4, 0.0, 2.8, 20.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); } - wait(lua_state, 3.0); + frame(lua_state, 20.6); + if is_excute(agent) { + AttackModule::set_offset(boma, 0, &Vector3f::new(0.0, 4.8, 7.8)); + AttackModule::set_offset(boma, 1, &Vector3f::new(0.0, 5.4, 14.0)); + AttackModule::set_offset(boma, 2, &Vector3f::new(0.0, 5.6, 20.0)); + } + frame(lua_state, 21.2); + if is_excute(agent) { + AttackModule::set_offset(boma, 0, &Vector3f::new(0.0, 4.8, 7.8)); + AttackModule::set_offset(boma, 1, &Vector3f::new(0.0, 7.4, 14.0)); + AttackModule::set_offset(boma, 2, &Vector3f::new(0.0, 10.6, 20.0)); + } + frame(lua_state, 22.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 25.0); - FT_MOTION_RATE(agent, 0.7); + FT_MOTION_RATE_RANGE(agent, 25.0, 60.0, 22.0); + frame(lua_state, 60.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { @@ -27,21 +45,21 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 5, 12, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } - frame(lua_state, 18.0); + frame(lua_state, 17.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("pzenigame_mouth_water"), Hash40::new("head"), -0.5, 3, 0, -80, 0, 0, 1, true); if agent.lr() < 0.0 { - EFFECT_FOLLOW(agent, Hash40::new("pzenigame_water_smash"), Hash40::new("top"), 0, 0, -3, 3, 180, 20, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("pzenigame_water_smash"), Hash40::new("top"), 0, 0, -1, 13, 160, 10, 0.8, true); } else { - EFFECT_FOLLOW(agent, Hash40::new("pzenigame_water_smash_r"), Hash40::new("top"), 0, 0, -3, 3, 180, -20, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("pzenigame_water_smash_r"), Hash40::new("top"), 0, 0, 1, 3, 160, -10, 0.8, true); } } frame(lua_state, 19.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), -4, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 23.0); + frame(lua_state, 21.2); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("pzenigame_mouth_water"), false, false); } @@ -54,45 +72,52 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } + frame(lua_state, 7.0); + FT_MOTION_RATE_RANGE(agent, 7.0, 19.0, 6.0); frame(lua_state, 19.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 110, 92, 110, 0, 7.0, 0.0, 3.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 110, 92, 110, 0, 7.0, 0.0, 3.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 110, 92, 110, 0, 5.5, 0.0, 3.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 110, 92, 110, 0, 5.5, 0.0, 3.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); } wait(lua_state, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); + ATTACK(agent, 2, 0, Hash40::new("top"), 11.0, 95, 60, 0, 60, 5.5, 0.0, 5.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 3, 0, Hash40::new("top"), 11.0, 95, 60, 0, 60, 5.5, 0.0, 5.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); } frame(lua_state, 21.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 95, 92, 0, 60, 5.5, 0.0, 10.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 95, 92, 0, 60, 5.5, 0.0, 10.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 95, 60, 0, 60, 5.5, 0.0, 8.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 95, 60, 0, 60, 5.5, 0.0, 8.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + AttackModule::clear(boma, 2, false); + AttackModule::clear(boma, 3, false); } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 95, 92, 0, 60, 5.5, 0.0, 18.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); - ATTACK(agent, 3, 0, Hash40::new("top"), 12.0, 95, 92, 0, 60, 5.5, 0.0, 18.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 95, 60, 0, 60, 4.5, 0.0, 14.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 95, 60, 0, 60, 4.5, 0.0, 14.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); AttackModule::clear(boma, 0, false); AttackModule::clear(boma, 1, false); } frame(lua_state, 23.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 95, 92, 0, 60, 5.0, 0.0, 24.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 95, 92, 0, 60, 5.0, 0.0, 24.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 95, 60, 0, 60, 4.5, 0.0, 18.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 95, 60, 0, 60, 4.5, 0.0, 18.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); AttackModule::clear(boma, 2, false); AttackModule::clear(boma, 3, false); } frame(lua_state, 24.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 95, 92, 0, 60, 4.0, 0.0, 29.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); - ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 95, 92, 0, 60, 4.0, 0.0, 29.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 95, 60, 0, 60, 3.5, 0.0, 20.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 95, 60, 0, 60, 3.5, 0.0, 20.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); AttackModule::clear(boma, 0, false); AttackModule::clear(boma, 1, false); } frame(lua_state, 25.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 95, 92, 0, 60, 3.0, 0.0, 32.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 95, 92, 0, 60, 3.0, 0.0, 32.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 95, 60, 0, 60, 3.5, 0.0, 22.0, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 95, 60, 0, 60, 3.5, 0.0, 22.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); AttackModule::clear(boma, 2, false); AttackModule::clear(boma, 3, false); } @@ -100,24 +125,57 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 30.0); + FT_MOTION_RATE_RANGE(agent, 30.0, 60.0, 18.0); + frame(lua_state, 60.0); + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("pzenigame_water_ripple"), Hash40::new("top"), 0, 0, 7, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.6); + EFFECT(agent, Hash40::new("pzenigame_water_ripple"), Hash40::new("top"), 0, 0, -7, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.6); + } + frame(lua_state, 16.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 16.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("pzenigame_atk_hi4"), Hash40::new("top"), 0, 0, 7, 0, 0, 0, 0.7, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + EFFECT_FOLLOW(agent, Hash40::new("pzenigame_atk_hi4"), Hash40::new("top"), 0, 0, -7, 0, 0, 0, 0.7, true); + LAST_EFFECT_SET_RATE(agent, 1.1); + } } unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 3.0); frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 8.0); - FT_MOTION_RATE_RANGE(agent, 8.0, 17.0, 5.0); + FT_MOTION_RATE_RANGE(agent, 8.0, 17.0, 2.0); frame(lua_state, 17.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 35, 83, 0, 50, 4.2, 0.0, 4.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 35, 83, 0, 50, 4.0, 0.0, 3.8, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); - ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 35, 83, 0, 50, 3.8, 0.0, 3.5, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 35, 83, 0, 50, 4.0, 0.0, 3.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 35, 83, 0, 50, 4.0, 0.0, 3.0, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 35, 83, 0, 50, 3.8, 0.0, 3.0, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 21.0); @@ -128,9 +186,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 25.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 35, 78, 0, 50, 4.2, 0.0, 4.0, -6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); - ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 35, 78, 0, 50, 4.0, 0.0, 3.8, -10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); - ATTACK(agent, 2, 0, Hash40::new("top"), 13.0, 35, 78, 0, 50, 3.8, 0.0, 3.5, -15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 35, 83, 0, 50, 4.0, 0.0, 3.0, -6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 35, 83, 0, 50, 4.0, 0.0, 3.0, -10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); + ATTACK(agent, 2, 0, Hash40::new("top"), 12.0, 35, 83, 0, 50, 3.8, 0.0, 3.0, -15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_SLAP, *ATTACK_REGION_WATER); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 3.0); @@ -138,7 +196,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } frame(lua_state, 30.0); - FT_MOTION_RATE_RANGE(agent, 30.0, 60.0, 16.0); + FT_MOTION_RATE_RANGE(agent, 30.0, 60.0, 23.0); frame(lua_state, 60.0); FT_MOTION_RATE(agent, 1.0); } @@ -198,6 +256,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_attacks4lw", effect_attacks4, Priority::Low); agent.acmd("game_attackhi4", game_attackhi4, Priority::Low); + agent.acmd("effect_attackhi4", effect_attackhi4, Priority::Low); agent.acmd("game_attacklw4", game_attacklw4, Priority::Low); agent.acmd("effect_attacklw4", effect_attacklw4, Priority::Low); diff --git a/fighters/pzenigame/src/acmd/specials.rs b/fighters/pzenigame/src/acmd/specials.rs index dc91e23fa5..ad26803fc1 100644 --- a/fighters/pzenigame/src/acmd/specials.rs +++ b/fighters/pzenigame/src/acmd/specials.rs @@ -178,7 +178,7 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { frame(lua_state, 43.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 75, 117, 0, 60, 7.0, 0.0, 4.0, 6.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 75, 121, 0, 60, 7.0, 0.0, 4.0, 6.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_WATER, *ATTACK_REGION_WATER); } frame(lua_state, 45.0); if is_excute(agent) { @@ -219,11 +219,11 @@ unsafe extern "C" fn game_speciallwin(agent: &mut L2CAgentBase) { let parent_id = LinkModule::get_parent_id(boma, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; let object = utils::util::get_battle_object_from_id(parent_id); VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_LW_BACKWARDS_SWITCH); // we will turn this off in opff - if VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE) == *PLEDGE_STATE_NONE { + //if VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE) == *PLEDGE_STATE_NONE { VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE, *PLEDGE_STATE_WATER); let pledge_duration_frame = ParamModule::get_int(agent.battle_object, ParamType::Agent, "param_special_lw.pledge_duration_frame"); VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, pledge_duration_frame); - } + //} let swap_lockout_frame = ParamModule::get_int(agent.battle_object, ParamType::Agent, "param_special_lw.swap_lockout_frame"); VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_LW_SWAP_TIMER, swap_lockout_frame); VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); diff --git a/fighters/pzenigame/src/acmd/throws.rs b/fighters/pzenigame/src/acmd/throws.rs index 7f80da995c..cd8bff01a7 100644 --- a/fighters/pzenigame/src/acmd/throws.rs +++ b/fighters/pzenigame/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 6.0, 0.0, Some(0.0), Some(6.0), Some(10.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 6.5, Some(0.0), Some(6.0), Some(10.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 6.0, 4.0, Some(0.0), Some(6.0), Some(9.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 2.0, Some(0.0), Some(6.0), Some(6.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.1, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-14.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, -5.5, Some(0.0), Some(6.0), Some(-14.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -176,15 +175,15 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 48, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 40, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 26.0); + frame(lua_state, 22.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); CHECK_FINISH_CAMERA(agent, 11, 9); } - frame(lua_state, 27.0); + frame(lua_state, 23.0); if is_excute(agent) { REVERSE_LR(agent); let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); @@ -198,7 +197,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 90, 150, 0, 48, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 90, 125, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 16.0); @@ -223,7 +222,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { FT_LEAVE_NEAR_OTTOTTO(agent, -3.2, 3.2); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 60, 154, 0, 57, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 130, 50, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 10.0); @@ -232,7 +231,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 361, 100, 40, 0, 4.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 100, 40, 0, 4.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 0, 0); } diff --git a/fighters/pzenigame/src/acmd/tilts.rs b/fighters/pzenigame/src/acmd/tilts.rs index 3dbd941e7b..f6ac44cb54 100644 --- a/fighters/pzenigame/src/acmd/tilts.rs +++ b/fighters/pzenigame/src/acmd/tilts.rs @@ -41,9 +41,9 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("head"), 6.0, 88, 90, 0, 50, 5.0, 1.7, 0.7, 0.7, Some(1.7), Some(0.7), Some(0.7), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("hip"), 6.0, 88, 90, 0, 50, 5.2, 1.7, 1.2, 1.2, Some(1.7), Some(1.2), Some(1.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 88, 90, 0, 50, 4.0, 0.0, 4.0, -3.5, Some(0.0), Some(4.0), Some(3.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("head"), 6.0, 80, 90, 0, 50, 4.0, 1.7, 0.7, 0.7, Some(1.7), Some(0.7), Some(0.7), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("hip"), 6.0, 80, 90, 0, 50, 4.0, 1.7, 1.2, 1.2, Some(1.7), Some(1.2), Some(1.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 80, 90, 0, 50, 3.5, 0.0, 4.5, -3.0, Some(0.0), Some(4.5), Some(3.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_HEAD); } wait(lua_state, 1.0); if is_excute(agent) { @@ -60,14 +60,14 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 65, 75, 0, 53, 3.5, 0.0, 3.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WATER); - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 65, 75, 0, 53, 4.0, 0.0, 3.0, 12.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WATER); - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 65, 75, 0, 53, 2.5, 0.0, 3.4, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WATER); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 64, 75, 0, 53, 3.5, 0.0, 3.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WATER); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 70, 75, 0, 53, 3.5, 0.0, 3.0, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WATER); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 76, 75, 0, 53, 2.5, 0.0, 3.4, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WATER); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 65, 75, 0, 53, 4.5, 0.0, 3.4, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WATER); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 76, 75, 0, 53, 4.5, 0.0, 3.4, 15.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_water"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WATER); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 5.0); diff --git a/fighters/pzenigame/src/lib.rs b/fighters/pzenigame/src/lib.rs index 9839ab442a..d2ca3b3592 100644 --- a/fighters/pzenigame/src/lib.rs +++ b/fighters/pzenigame/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/pzenigame/src/status/mod.rs b/fighters/pzenigame/src/status/mod.rs index 1037833038..c190fc5dbe 100644 --- a/fighters/pzenigame/src/status/mod.rs +++ b/fighters/pzenigame/src/status/mod.rs @@ -15,15 +15,52 @@ unsafe extern "C" fn entry_main(fighter: &mut L2CFighterCommon) -> L2CValue { } unsafe extern "C" fn dead_main(fighter: &mut L2CFighterCommon) -> L2CValue { - reset_ptrainer_vars(fighter); + if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { + let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; + let object = utils::util::get_battle_object_from_id(parent_id); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE, *PLEDGE_STATE_WATER); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, 0); + VarModule::on_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_LW_SWAP_TIMER, 0); + } + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DEAD)(fighter) } unsafe extern "C" fn rebirth_main(fighter: &mut L2CFighterCommon) -> L2CValue { - reset_ptrainer_vars(fighter); + if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { + let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; + let object = utils::util::get_battle_object_from_id(parent_id); + let pledge_state = VarModule::get_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_STATE); + //println!("pledge_state: {}", pledge_state); + if pledge_state == *PLEDGE_STATE_GRASS { + let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_status_speed_up"), Hash40::new("hip"), &Vector3f::new(0.7, 0.0, 0.0), &Vector3f::zero(), 0.7, true, 0, 0, 0, 0, 0, true, true) as u32; + VarModule::set_int(fighter.object(), vars::pzenigame::instance::SPECIAL_N_PLEDGE_EFFECT_HANDLE, handle as i32); + fighter.play_pledge_effect(*PLEDGE_STATE_GRASS); + } + else if pledge_state == *PLEDGE_STATE_FIRE { + let handle = EffectModule::req_follow(fighter.module_accessor, Hash40::new("sys_status_attack_up"), Hash40::new("hip"), &Vector3f::new(0.7, 0.0, 0.0), &Vector3f::zero(), 0.7, true, 0, 0, 0, 0, 0, true, true) as u32; + VarModule::set_int(fighter.object(), vars::pzenigame::instance::SPECIAL_N_PLEDGE_EFFECT_HANDLE, handle as i32); + fighter.play_pledge_effect(*PLEDGE_STATE_FIRE); + } + let pledge_duration_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_lw.pledge_duration_frame"); + VarModule::set_int(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_TIMER, pledge_duration_frame); + VarModule::off_flag(object, vars::ptrainer::instance::SPECIAL_N_PLEDGE_PAUSE_TIMER); + } + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_REBIRTH)(fighter) } +unsafe extern "C" fn win_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_ptrainer_vars(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_WIN)(fighter) +} + +unsafe extern "C" fn lose_main(fighter: &mut L2CFighterCommon) -> L2CValue { + reset_ptrainer_vars(fighter); + smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_LOSE)(fighter) +} + unsafe extern "C" fn reset_ptrainer_vars(fighter: &mut L2CFighterCommon) { if LinkModule::is_link(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER) { let parent_id = LinkModule::get_parent_id(fighter.module_accessor, *FIGHTER_POKEMON_LINK_NO_PTRAINER, true) as u32; @@ -39,6 +76,8 @@ pub fn install(agent: &mut Agent) { agent.status(Main, *FIGHTER_STATUS_KIND_ENTRY, entry_main); agent.status(Main, *FIGHTER_STATUS_KIND_DEAD, dead_main); agent.status(Main, *FIGHTER_STATUS_KIND_REBIRTH, rebirth_main); + agent.status(Main, *FIGHTER_STATUS_KIND_WIN, win_main); + agent.status(Main, *FIGHTER_STATUS_KIND_LOSE, lose_main); landing_fall_special::install(agent); run::install(agent); diff --git a/fighters/pzenigame/src/status/special_s.rs b/fighters/pzenigame/src/status/special_s.rs index bdc9490f36..4a3942e28c 100644 --- a/fighters/pzenigame/src/status/special_s.rs +++ b/fighters/pzenigame/src/status/special_s.rs @@ -118,8 +118,8 @@ unsafe extern "C" fn special_s_loop_main_loop(fighter: &mut L2CFighterCommon) -> } let limit_frame_min = fighter.get_param_int("param_special_s", "limit_frame_min"); if counter >= limit_frame_min { - let buffer = ControlModule::get_command_life_count_max(fighter.module_accessor) as usize; - if InputModule::get_trigger_count(fighter.battle_object, Buttons::Guard) < buffer + if fighter.is_cat_flag(Cat2::CommonGuard) + || fighter.is_cat_flag(Cat1::AttackN) || fighter.is_cat_flag(Cat1::SpecialAny) { fighter.change_status(FIGHTER_PZENIGAME_STATUS_KIND_SPECIAL_S_END.into(), true.into()); return 0.into(); diff --git a/fighters/reflet/Cargo.toml b/fighters/reflet/Cargo.toml index 94752775d6..f1c682e26c 100644 --- a/fighters/reflet/Cargo.toml +++ b/fighters/reflet/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/reflet/src/acmd/aerials.rs b/fighters/reflet/src/acmd/aerials.rs index bce812c2bd..338e10e200 100644 --- a/fighters/reflet/src/acmd/aerials.rs +++ b/fighters/reflet/src/acmd/aerials.rs @@ -10,21 +10,21 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 0.75); frame(lua_state, 4.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 13.0, 361, 60, 0, 61, 4.3, 0.0, 7.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 13.0, 361, 60, 0, 61, 4.0, 0.0, 1.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 13.0, 361, 60, 0, 61, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 13.0, 50, 76, 0, 40, 4.3, 0.0, 7.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 13.0, 50, 76, 0, 40, 4.0, 0.0, 1.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 13.0, 50, 76, 0, 40, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); } else { - ATTACK(agent, 0, 0, Hash40::new("sword"), 9.0, 55, 68, 0, 36, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 9.0, 55, 68, 0, 36, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 9.0, 55, 68, 0, 36, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 8.0, 55, 87, 0, 40, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 8.0, 55, 87, 0, 40, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 8.0, 55, 87, 0, 40, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } frame(lua_state, 13.0); @@ -33,41 +33,42 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 22.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 13.0, 41, 60, 0, 61, 4.3, 0.0, 7.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 13.0, 41, 60, 0, 61, 4.0, 0.0, 1.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 13.0, 41, 60, 0, 61, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 14.0, 361, 76, 0, 40, 4.3, 0.0, 7.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 14.0, 361, 76, 0, 40, 4.0, 0.0, 1.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 14.0, 361, 76, 0, 40, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); } else { - ATTACK(agent, 0, 0, Hash40::new("sword"), 9.0, 45, 73, 0, 36, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 9.0, 45, 73, 0, 36, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 9.0, 45, 73, 0, 36, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 9.0, 361, 86, 0, 40, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 9.0, 361, 86, 0, 40, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 9.0, 361, 86, 0, 40, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } frame(lua_state, 26.0); + FT_MOTION_RATE_RANGE(agent, 26.0, 36.0, 8.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 65, 80, 0, 45, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 361, 80, 0, 40, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); + } else { + AttackModule::clear_all(boma); } - else { + } + frame(lua_state, 32.25); + if is_excute(agent) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AttackModule::clear_all(boma); } } - wait(lua_state, 5.0); + frame(lua_state, 33.0); if is_excute(agent) { - AttackModule::clear_all(boma); + LEVIN_OFF(boma); } - frame(lua_state, 34.0); + frame(lua_state, 36.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) == 0 { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); - WorkModule::off_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); - } - } - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } @@ -76,7 +77,7 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 5, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 10.5, 0.0, true, Hash40::new("reflet_thunderswoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); } @@ -84,17 +85,14 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 5, Hash40::new("sword"), 0.0, 0.4, 0.0, Hash40::new("sword"), 0.0, 8.5, 0.0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); } } - frame(lua_state, 12.0); - if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 3); - } frame(lua_state, 13.0); if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 1); EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); } frame(lua_state, 20.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 5, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 11.0, 0.0, true, Hash40::new("reflet_thunderswoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); } @@ -104,11 +102,11 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 26.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 3); + AFTER_IMAGE_OFF(agent, 1); } - frame(lua_state, 27.0); + frame(lua_state, 31.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed"), true, true); } } @@ -122,26 +120,25 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 9.0/(12.0)); frame(lua_state, 6.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 11.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 13.0, 67, 90, 0, 51, 4.3, 0.0, 7.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 13.0, 67, 90, 0, 51, 4.0, 0.0, 1.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 13.0, 67, 90, 0, 51, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - } - else { - ATTACK(agent, 0, 0, Hash40::new("sword"), 8.5, 67, 86, 0, 51, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 8.5, 67, 86, 0, 51, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 8.5, 67, 86, 0, 51, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 12.5, 66, 95, 0, 42, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 12.5, 66, 95, 0, 42, 4.0, 0.0, 1.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 12.5, 71, 95, 0, 42, 4.3, 0.0, 7.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + } else { + ATTACK(agent, 0, 0, Hash40::new("armr"), 7.5, 66, 110, 0, 40, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 7.5, 66, 110, 0, 40, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 7.5, 71, 110, 0, 40, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } - wait(lua_state, 5.0); + frame(lua_state, 16.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 72, 80, 0, 45, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 71, 80, 0, 40, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); } @@ -149,29 +146,26 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear_all(boma); + frame(lua_state, 21.0); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if is_excute(agent) { + AttackModule::clear_all(boma); + } } frame(lua_state, 22.0); if is_excute(agent) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) == 0 { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); - WorkModule::off_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); - } - } + LEVIN_OFF(boma); } frame(lua_state, 27.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } unsafe extern "C" fn expression_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { if is_excute(agent) { AttackModule::set_attack_reference_joint_id(boma, Hash40::new("sword"), AttackDirectionAxis(*ATTACK_DIRECTION_Z), AttackDirectionAxis(*ATTACK_DIRECTION_Y), AttackDirectionAxis(*ATTACK_DIRECTION_X)); } @@ -183,7 +177,7 @@ unsafe extern "C" fn expression_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); app::sv_animcmd::execute(lua_state, 11.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { RUMBLE_HIT(agent, Hash40::new("rbkind_slashl"), 0); } else { RUMBLE_HIT(agent, Hash40::new("rbkind_slashm"), 0); @@ -196,25 +190,23 @@ unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 10.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 7, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 10.5, 0.0, true, Hash40::new("null"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed_flare"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); } - else{ + else { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 6, Hash40::new("sword"), 0.0, 0.4, 0.0, Hash40::new("sword"), 0.0, 8.5, 0.0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); } } frame(lua_state, 16.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 3); + AFTER_IMAGE_OFF(agent, 1); } - frame(lua_state, 20.0); + frame(lua_state, 21.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed_flare"), false, false); - } + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed"), true, true); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed_flare"), true, true); } } @@ -224,26 +216,27 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { if is_excute(agent) { VarModule::set_int(agent.battle_object, vars::reflet::instance::ATTACK_AIR_LEVIN_LENIENCY, 5); } + frame(lua_state, 4.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 9.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 15.0, 361, 98, 0, 36, 4.3, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 15.0, 361, 98, 0, 36, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 15.0, 361, 98, 0, 36, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 14.5, 361, 101, 0, 25, 4.3, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 14.5, 361, 101, 0, 25, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 14.5, 361, 101, 0, 25, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); } else { - ATTACK(agent, 0, 0, Hash40::new("sword"), 11.5, 361, 79, 0, 36, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 11.5, 361, 79, 0, 36, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 11.5, 361, 79, 0, 36, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 9.5, 361, 114, 0, 25, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 9.5, 361, 114, 0, 25, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 9.5, 361, 114, 0, 25, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } - wait(lua_state, 4.0); + frame(lua_state, 13.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 65, 80, 0, 45, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 361, 80, 0, 40, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); } @@ -251,22 +244,17 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } } - wait(lua_state, 4.0); + frame(lua_state, 18.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 21.0); - if is_excute(agent) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) == 0 { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); - WorkModule::off_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); - } - } + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + LEVIN_OFF(boma); } frame(lua_state, 27.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } @@ -275,25 +263,32 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 7.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 6, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 10.75, 0.0, true, Hash40::new("null"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1.2, true); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed_flare"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); + } else { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 4, Hash40::new("sword"), 0.0, 0.4, 0.0, Hash40::new("sword"), 0.0, 8.5, 0.0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + } + } + frame(lua_state, 8.0); + if is_excute(agent) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + EFFECT_FOLLOW(agent, Hash40::new("reflet_attack_flash"), Hash40::new("sword"), 0, 8.5, 0, 0, 0, 0, 1.35, true); } else{ - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword"), 0, 7.0, 0, 0, 0, 0, 0.5, true); - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 4, Hash40::new("sword"), 0.0, 0.4, 0.0, Hash40::new("sword"), 0.0, 8.5, 0.0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + EFFECT_FOLLOW(agent, Hash40::new("reflet_attack_flash"), Hash40::new("sword"), 0, 7.0, 0, 0, 0, 0, 1.15, true); } } frame(lua_state, 13.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 4); + AFTER_IMAGE_OFF(agent, 1); } - frame(lua_state, 21.0); + frame(lua_state, 18.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed_flare"), false, false); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed"), true, true); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed_flare"), true, true); } } } @@ -306,50 +301,48 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 10.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 14.0, 80, 86, 0, 50, 4.3, 0.0, 7.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 14.0, 80, 86, 0, 50, 4.0, 0.0, 1.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 14.0, 80, 86, 0, 50, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 14.0, 79, 90, 0, 40, 4.3, 0.0, 7.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 14.0, 79, 90, 0, 40, 4.0, 0.0, 1.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 14.0, 79, 90, 0, 40, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); } else { - ATTACK(agent, 0, 0, Hash40::new("sword"), 10.0, 80, 75, 0, 51, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 10.0, 80, 75, 0, 51, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 80, 75, 0, 51, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 9.0, 79, 102, 0, 40, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 9.0, 79, 102, 0, 40, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 9.0, 79, 102, 0, 40, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } - wait(lua_state, 5.0); + frame(lua_state, 15.0); + FT_MOTION_RATE_RANGE(agent, 15.0, 27.0, 10.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 65, 80, 0, 45, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 79, 80, 0, 40, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); - } - else { + } else { AttackModule::clear_all(boma); } } - wait(lua_state, 7.0); + frame(lua_state, 21.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AttackModule::clear_all(boma); } } frame(lua_state, 27.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + LEVIN_OFF(boma); } + frame(lua_state, 29.0); if is_excute(agent) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) == 0 { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); - WorkModule::off_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); - } - } + agent.off_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 44.0); } unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { @@ -357,7 +350,7 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 9.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 6, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 10.75, 0.0, true, Hash40::new("null"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed_flare"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); @@ -366,14 +359,14 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 4, Hash40::new("sword"), 0.0, 0.4, 0.0, Hash40::new("sword"), 0.0, 8.5, 0.0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); } } - frame(lua_state, 13.0); + frame(lua_state, 15.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 4); + AFTER_IMAGE_OFF(agent, 1); } - frame(lua_state, 24.0); - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed_flare"), false, false); + frame(lua_state, 20.0); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed"), true, true); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed_flare"), true, true); } } @@ -383,76 +376,71 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { VarModule::set_int(agent.battle_object, vars::reflet::instance::ATTACK_AIR_LEVIN_LENIENCY, 5); } - frame(lua_state, 2.0); + frame(lua_state, 6.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 13.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - //Air-Only Hitboxes - ATTACK(agent, 0, 0, Hash40::new("sword"), 14.0, 270, 49, 0, 24, 4.3, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 14.0, 270, 49, 0, 24, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 14.0, 270, 49, 0, 24, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - //Ground-Only Hitboxes - ATTACK(agent, 3, 0, Hash40::new("sword"), 14.0, 70, 81, 0, 24, 4.3, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword"), 14.0, 70, 81, 0, 24, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 5, 0, Hash40::new("armr"), 14.0, 70, 81, 0, 24, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + //Air-Only + ATTACK(agent, 0, 0, Hash40::new("sword"), 15.0, 270, 46, 0, 22, 4.3, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 15.0, 270, 46, 0, 22, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 15.0, 270, 46, 0, 22, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + //Ground-Only + ATTACK(agent, 3, 0, Hash40::new("sword"), 15.0, 70, 76, 0, 24, 4.3, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword"), 15.0, 70, 76, 0, 24, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 5, 0, Hash40::new("armr"), 15.0, 70, 76, 0, 24, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); } else { - ATTACK(agent, 0, 0, Hash40::new("sword"), 10.2, 361, 61, 0, 58, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 10.2, 361, 61, 0, 58, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 10.2, 361, 61, 0, 58, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - } - } - frame(lua_state, 16.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 15.0, 40, 66, 0, 57, 4.3, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 15.0, 40, 66, 0, 57, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 15.0, 40, 66, 0, 57, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); - AttackModule::clear(boma, 3, false); - AttackModule::clear(boma, 4, false); - AttackModule::clear(boma, 5, false); - } - else { - ATTACK(agent, 0, 0, Hash40::new("sword"), 9.0, 361, 58, 0, 49, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 9.0, 361, 58, 0, 49, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 9.0, 361, 58, 0, 49, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + //Air-Only + ATTACK(agent, 0, 0, Hash40::new("sword"), 10.0, 270, 50, 0, 22, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 10.0, 270, 50, 0, 22, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 270, 50, 0, 22, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + //Ground-Only + ATTACK(agent, 3, 0, Hash40::new("sword"), 10.0, 70, 85, 0, 24, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword"), 10.0, 70, 85, 0, 24, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 5, 0, Hash40::new("armr"), 10.0, 70, 85, 0, 24, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + } + frame(lua_state, 15.0); + if is_excute(agent) { + AttackModule::clear(boma, 3, false); + AttackModule::clear(boma, 4, false); + AttackModule::clear(boma, 5, false); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + ATTACK(agent, 0, 0, Hash40::new("sword"), 15.0, 361, 75, 0, 30, 4.3, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 15.0, 361, 75, 0, 30, 4.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 15.0, 361, 75, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + } else { + ATTACK(agent, 0, 0, Hash40::new("sword"), 10.0, 361, 84, 0, 30, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 10.0, 361, 84, 0, 30, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 361, 84, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } - frame(lua_state, 19.0); + frame(lua_state, 18.0); + FT_MOTION_RATE_RANGE(agent, 18.0, 48.0, 25.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 65, 80, 0, 45, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { //lev + ATTACK(agent, 0, 0, Hash40::new("sword"), 5.0, 361, 80, 0, 40, 2.5, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); - } - } - frame(lua_state, 21.0); - if is_excute(agent) { - if !WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + } else { AttackModule::clear_all(boma); } } - frame(lua_state, 22.0); + frame(lua_state, 24.0); // 23 if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - AttackModule::clear_all(boma); - } + AttackModule::clear_all(boma); } frame(lua_state, 27.0); if is_excute(agent) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) == 0 { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); - WorkModule::off_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); - } - } + LEVIN_OFF(boma); } - frame(lua_state, 48.0); + frame(lua_state, 48.0); // 43 + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag( *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } @@ -461,45 +449,38 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword"), 0, 5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } } frame(lua_state, 11.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 6, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 10.75, 0.0, true, Hash40::new("null"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed_flare"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); - } + } else { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 4, Hash40::new("sword"), 0.0, 0.4, 0.0, Hash40::new("sword"), 0.0, 8.5, 0.0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + EFFECT_FOLLOW(agent, Hash40::new("reflet_swoed_flare2"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); + } // makes bronze have a trail arc too } frame(lua_state, 13.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { EFFECT_FOLLOW(agent, Hash40::new("reflet_attack_flash"), Hash40::new("sword"), 0, 8.5, 0, 0, 0, 0, 1.8, true); - } - else { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 4, Hash40::new("sword"), 0.0, 0.4, 0.0, Hash40::new("sword"), 0.0, 8.5, 0.0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + } else { EFFECT_FOLLOW(agent, Hash40::new("reflet_attack_flash"), Hash40::new("sword"), 0, 7, 0, 0, 0, 0, 1.3, true); } } frame(lua_state, 18.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("reflet_swoed_flare2"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); - } - frame(lua_state, 19.0); - if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 2); - } - frame(lua_state, 21.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); - } + AFTER_IMAGE_OFF(agent, 1); + EFFECT_OFF_KIND(agent, Hash40::new("reflet_swoed_flare2"), false, false); } - wait(lua_state, 2.0); + frame(lua_state, 23.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed_flare"), false, false); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed"), true, true); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed_flare"), true, true); } } diff --git a/fighters/reflet/src/acmd/ground.rs b/fighters/reflet/src/acmd/ground.rs index c193093509..c97f6366f6 100644 --- a/fighters/reflet/src/acmd/ground.rs +++ b/fighters/reflet/src/acmd/ground.rs @@ -8,19 +8,19 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 3.0); FT_MOTION_RATE_RANGE(agent, 3.0, 4.75, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 3.0, 361, 25, 0, 30, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 3.0, 361, 25, 0, 30, 3.5, 0.0, 2.0, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 361, 25, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 60, 20, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 3.0, 65, 20, 0, 30, 3.5, 0.0, 2.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 3.0, 75, 20, 0, 25, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 4.75); FT_MOTION_RATE_RANGE(agent, 4.75, 6.0, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 6.0); + frame(lua_state, 10.0); FT_MOTION_RATE_RANGE(agent, 6.0, 19.0, 10.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } frame(lua_state, 19.0); FT_MOTION_RATE(agent, 1.0); @@ -62,34 +62,45 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + KineticModule::add_speed(boma, &Vector3f::new(0.57, 0.0, 0.0)); + } frame(lua_state, 3.0); FT_MOTION_RATE_RANGE(agent, 3.0, 4.25, 1.0); frame(lua_state, 4.25); FT_MOTION_RATE_RANGE(agent, 4.25, 5.0, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 3.0, 361, 20, 0, 20, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 3.0, 361, 25, 0, 25, 3.5, 0.0, 2.0, -2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 361, 25, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 60, 20, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 3.0, 65, 20, 0, 25, 3.5, 0.0, 2.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 3.0, 75, 20, 0, 20, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 5.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) > 1 { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); + } + frame(lua_state, 9.0); + if is_excute(agent) { + if agent.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) > 0 { + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } } - frame(lua_state, 7.0); + frame(lua_state, 10.0); if is_excute(agent) { - if WorkModule::get_float(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLOAT_SPECIAL_S_CURRENT_POINT) > 0.1 { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + if agent.get_float(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLOAT_SPECIAL_S_CURRENT_POINT) > 0.1 { + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } else { + ComboModule::reset(boma); } } - frame(lua_state, 9.0); + frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 22.0, 4.0); if is_excute(agent) { agent.off_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } + frame(lua_state, 22.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { @@ -129,12 +140,25 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 361, 124, 0, 70, 7.0, 0.0, 12.0, 16.0, Some(0.0), Some(12.0), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 109, 0, 70, 7.0, 0.0, 12.0, 16.0, Some(0.0), Some(12.0), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); } wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 26.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } +} + +unsafe extern "C" fn game_attack100start(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + KineticModule::add_speed(boma, &Vector3f::new(0.14, 0.0, 0.0)); + } } unsafe extern "C" fn game_attack100(agent: &mut L2CAgentBase) { @@ -171,9 +195,9 @@ unsafe extern "C" fn game_attack100sub(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.4, 55, 10, 0, 9, 8.0, 0.0, 9.0, 12.0, Some(0.0), Some(9.0), Some(8.0), 0.4, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); - AttackModule::set_add_reaction_frame(boma, 0, 3.0, false); - ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 3); + ATTACK(agent, 0, 0, Hash40::new("top"), 0.6, 361, 10, 0, 11, 8.0, 0.0, 9.0, 8.0, Some(0.0), Some(9.0), Some(12.0), 0.4, 0.4, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); + AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 3.0); } wait(lua_state, 1.0); if is_excute(agent) { @@ -182,21 +206,50 @@ unsafe extern "C" fn game_attack100sub(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attack100(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_flash"), Hash40::new("havel"), 0, 1, 0, 0, 0, 0, 0.45, true); + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("reflet_magic_wind"), Hash40::new("top"), 0, 10.8, 9, 0, 0, 0, 0.88, true); + } +} + unsafe extern "C" fn game_attack100end(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 5.0); if is_excute(agent) { AttackModule::clear_all(boma); ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 74, 186, 0, 80, 5.0, 0.0, 13.0, 9.0, Some(0.0), Some(6.5), Some(9.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 74, 186, 0, 80, 5.0, 0.0, 13.0, 17.0, Some(0.0), Some(6.5), Some(17.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_MAGIC); } - wait(lua_state, 2.0); - FT_MOTION_RATE(agent, 1.1); - frame(lua_state, 10.0); + frame(lua_state, 7.0); + FT_MOTION_RATE_RANGE(agent, 7.0, 18.0, 7.0);//speed up stationary portion + frame(lua_state, 11.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 18.0); + FT_MOTION_RATE(agent, 1.0);//-8 faf (40) + frame(lua_state, 24.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } +}//44 MOT END + +unsafe extern "C" fn effect_attack100end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_flash"), Hash40::new("havel"), 0, 1, 0, 0, 0, 0, 0.6, true); + EFFECT_FOLLOW(agent, Hash40::new("reflet_attack100_finish"), Hash40::new("top"), 0, 10.8, 12.5, 0, 0, 0, 0.93, true); + } + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("reflet_magic_wind"), false, false); + } } unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { @@ -204,15 +257,15 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 12.5, 361, 64, 0, 38, 4.0, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 12.5, 361, 64, 0, 38, 4.0, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 12.5, 361, 64, 0, 38, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 12.0, 361, 74, 0, 34, 4.0, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 12.0, 361, 74, 0, 34, 4.0, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 12.0, 361, 74, 0, 34, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 7.5, 38, 80, 0, 30, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 7.5, 38, 80, 0, 30, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 7.5, 38, 80, 0, 30, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 7.0, 38, 84, 0, 30, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 7.0, 38, 84, 0, 30, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 7.0, 38, 84, 0, 30, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 19.0); if is_excute(agent) { @@ -231,8 +284,11 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attack13", game_attack13, Priority::Low); + agent.acmd("game_attack100start", game_attack100start, Priority::Low); agent.acmd("game_attack100", game_attack100, Priority::Low); + agent.acmd("effect_attack100", effect_attack100, Priority::Low); agent.acmd("game_attack100end", game_attack100end, Priority::Low); + agent.acmd("effect_attack100end", effect_attack100end, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); } \ No newline at end of file diff --git a/fighters/reflet/src/acmd/mod.rs b/fighters/reflet/src/acmd/mod.rs index d8a22387b4..552ece7de0 100644 --- a/fighters/reflet/src/acmd/mod.rs +++ b/fighters/reflet/src/acmd/mod.rs @@ -8,6 +8,15 @@ mod specials; mod throws; mod other; +pub unsafe fn LEVIN_OFF(boma: &mut BattleObjectModuleAccessor) { + if boma.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) <= 0 + && boma.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + VarModule::off_flag(utils::util::get_battle_object_from_accessor(boma), vars::reflet::instance::DISCARD_SKIP_STATUS); + VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); + boma.off_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); + } +} + pub fn install(agent: &mut Agent) { ground::install(agent); tilts::install(agent); diff --git a/fighters/reflet/src/acmd/other.rs b/fighters/reflet/src/acmd/other.rs index 5131f0780f..91dc2e739a 100644 --- a/fighters/reflet/src/acmd/other.rs +++ b/fighters/reflet/src/acmd/other.rs @@ -53,7 +53,7 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_DASH_FLAG_TURN_DASH); + agent.on_flag(*FIGHTER_STATUS_DASH_FLAG_TURN_DASH); } frame(lua_state, 17.0); if is_excute(agent) { @@ -64,15 +64,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -80,11 +76,16 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 29.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); + agent.on_flag(*FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); + +} + +unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + PostureModule::add_pos(boma, &Vector3f::new(0.0, -2.0, 0.0)); } } @@ -176,6 +177,24 @@ unsafe extern "C" fn effect_slipattack(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn sound_fuwafuwa(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + let sfx_handle = SoundModule::play_status_se(boma, Hash40::new("se_common_spirits_wind_loop"), true, false, false); + SoundModule::set_se_vol(boma, sfx_handle as i32, 0.1325, 0); + } +} + +unsafe extern "C" fn expression_fuwafuwa(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_13_floating"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_cliffescape", acmd_stub, Priority::Low); @@ -191,16 +210,18 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_escapeair", game_escapeair, Priority::Low); agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); + agent.acmd("game_cliffjump2", game_cliffjump2, Priority::Low); + agent.acmd("effect_downattackd", effect_downattackd, Priority::Low); agent.acmd("effect_downattacku", effect_downattacku, Priority::Low); agent.acmd("effect_slipattack", effect_slipattack, Priority::Low); agent.acmd("game_fuwafuwastart", acmd_stub, Priority::Low); agent.acmd("effect_fuwafuwastart", acmd_stub, Priority::Low); - agent.acmd("sound_fuwafuwastart", acmd_stub, Priority::Low); - agent.acmd("expression_fuwafuwastart", acmd_stub, Priority::Low); + agent.acmd("sound_fuwafuwastart", sound_fuwafuwa, Priority::Low); + agent.acmd("expression_fuwafuwastart", expression_fuwafuwa, Priority::Low); agent.acmd("game_fuwafuwa", acmd_stub, Priority::Low); agent.acmd("effect_fuwafuwa", acmd_stub, Priority::Low); - agent.acmd("sound_fuwafuwa", acmd_stub, Priority::Low); - agent.acmd("expression_fuwafuwa", acmd_stub, Priority::Low); + agent.acmd("sound_fuwafuwa", sound_fuwafuwa, Priority::Low); + agent.acmd("expression_fuwafuwa", expression_fuwafuwa, Priority::Low); } diff --git a/fighters/reflet/src/acmd/smashes.rs b/fighters/reflet/src/acmd/smashes.rs index 9f7bc24b33..d8988ceebd 100644 --- a/fighters/reflet/src/acmd/smashes.rs +++ b/fighters/reflet/src/acmd/smashes.rs @@ -9,11 +9,11 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag( *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 16.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { ATTACK(agent, 0, 0, Hash40::new("sword"), 18.0, 361, 87, 0, 55, 4.3, 1.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword"), 18.0, 361, 87, 0, 55, 4.0, 1.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("armr"), 18.0, 361, 87, 0, 55, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); @@ -24,9 +24,9 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { ATTACK(agent, 2, 0, Hash40::new("armr"), 12.6, 361, 83, 0, 54, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } } - wait(lua_state, 3.0); + frame(lua_state, 20.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { ATTACK(agent, 0, 0, Hash40::new("sword"), 10.0, 361, 100, 0, 60, 3.0, 0.0, 9.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); @@ -35,17 +35,13 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } } - wait(lua_state, 6.0); + frame(lua_state, 25.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 32.0); if is_excute(agent) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) == 0 { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); - } - } + LEVIN_OFF(boma); } } @@ -54,7 +50,7 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 14.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 5, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 10.75, 0.0, true, Hash40::new("null"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed_flare"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); @@ -67,16 +63,21 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, true); } - frame(lua_state, 18.0); + frame(lua_state, 16.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 6); + if !agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + EFFECT_FOLLOW(agent, Hash40::new("reflet_attack_flash"), Hash40::new("sword"), 0, 7, 0, 0, 0, 0, 1.3, true); + LAST_EFFECT_SET_RATE(agent, 5.0/4.0); + } } - frame(lua_state, 30.0); + frame(lua_state, 20.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed_flare"), false, false); - } + AFTER_IMAGE_OFF(agent, 1); + } + frame(lua_state, 25.0); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed"), true, true); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed_flare"), true, true); } } @@ -85,11 +86,11 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag( *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 12.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { ATTACK(agent, 0, 0, Hash40::new("sword"), 15.0, 92, 86, 0, 55, 3.5, 1.0, 7.5, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword"), 15.0, 92, 86, 0, 55, 3.5, 1.0, 3.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 70, 79, 0, 70, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); @@ -107,10 +108,12 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { ATTACK(agent, 0, 0, Hash40::new("sword"), 10.0, 70, 80, 0, 60, 2.5, 0.0, 8.0, 0.0, Some(0.0), Some(2.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); AttackModule::clear(boma, 1, false); AttackModule::clear(boma, 2, false); + } else { + AttackModule::clear_all(boma); } } frame(lua_state, 25.0); @@ -119,19 +122,14 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 39.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) == 0 { - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); - WorkModule::off_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); - } - } + LEVIN_OFF(boma); } } unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { frame(lua_state, 11.0); if is_excute(agent) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 10, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 10.75, 0.0, true, Hash40::new("null"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); @@ -143,6 +141,15 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); } + frame(lua_state, 20.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 1); + } + frame(lua_state, 25.0); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed"), true, true); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed_flare"), true, true); + } } else { frame(lua_state, 11.0); @@ -154,23 +161,15 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 20, 2, -90, 0, 0, 0.4, true); LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); } - frame(lua_state, 14.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("reflet_attack_flash"), Hash40::new("sword"), 0, 8, 0, 0, 0, 0, 1.3, 0, 0, 0, 0, 0, 0, true); - } - frame(lua_state, 16.0); + frame(lua_state, 13.0); if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("reflet_attack_flash"), Hash40::new("sword"), 0, 7, 0, 0, 0, 0, 1.3, true); + LAST_EFFECT_SET_RATE(agent, 5.0/4.0); EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 20, 2, -90, 0, 0, 0.4, true); } - } - frame(lua_state, 22.0); - if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 3); - } - frame(lua_state, 30.0); - if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); + frame(lua_state, 17.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 1); } } } @@ -181,12 +180,12 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { frame(lua_state, 4.0); FT_MOTION_RATE_RANGE(agent, 4.0, 15.2, 12.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag( *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 15.2); FT_MOTION_RATE_RANGE(agent, 15.2, 15.5, 1.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); ATTACK(agent, 0, 0, Hash40::new("sword"), 13.0, 55, 111, 0, 48, 4.3, 0.0, 9.0, -2.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword"), 13.0, 55, 111, 0, 48, 4.0, 0.0, 2.0, -2.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); @@ -208,10 +207,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { frame(lua_state, 19.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 100, 0, 50, 3.5, 0.0, 3.5, 10.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 6, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 9.0, 45, 100, 0, 50, 3.5, 0.0, 3.5, 7.0, Some(0.0), Some(3.5), Some(10.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 6, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("top"), 9.0, 45, 100, 0, 50, 3.5, 0.0, 3.5, -2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 6, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_SWORD); } frame(lua_state, 20.0); @@ -243,12 +242,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 0.8); frame(lua_state, 30.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) == 0 { - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); - WorkModule::off_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); - } - } + LEVIN_OFF(boma); } } @@ -262,7 +256,7 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_levin"), Hash40::new("tex_reflet_sword2"), 4, Hash40::new("sword"), 0.0, 0.0, 0.0, Hash40::new("sword"), 0.0, 11.5, 0.0, true, Hash40::new("reflet_thunderswoed_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); EFFECT_FOLLOW(agent, Hash40::new("reflet_thunderswoed"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, true); } @@ -272,7 +266,7 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + if agent.is_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { EFFECT(agent, Hash40::new("reflet_attacklw4_spark"), Hash40::new("top"), -0.0, 3, 4, 0, 90, 0, 1, 0, 0, 0, 0, 0, 0, true); LAST_EFFECT_SET_RATE(agent, 1.3); } @@ -281,15 +275,14 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 1, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 22.0); + frame(lua_state, 19.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 4); + AFTER_IMAGE_OFF(agent, 1); } - frame(lua_state, 34.0); + frame(lua_state, 27.0); if is_excute(agent) { - if WorkModule::is_flag(boma, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { - EFFECT_OFF_KIND(agent, Hash40::new("reflet_thunderswoed"), false, false); - } + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed"), true, true); + EffectModule::kill_kind(boma, Hash40::new("reflet_thunderswoed_flare"), true, true); } } diff --git a/fighters/reflet/src/acmd/specials.rs b/fighters/reflet/src/acmd/specials.rs index eb77c4976d..50dac8d9c3 100644 --- a/fighters/reflet/src/acmd/specials.rs +++ b/fighters/reflet/src/acmd/specials.rs @@ -1,27 +1,73 @@ use super::*; -unsafe extern "C" fn game_specialntronstart(agent: &mut L2CAgentBase) { - //let lua_state = agent.lua_state_agent; - //let boma = agent.boma(); - //17 -> 20 +unsafe extern "C" fn game_specialnstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 8.0);//2f more startu } -unsafe extern "C" fn game_specialairntronstart(agent: &mut L2CAgentBase) { - //let lua_state = agent.lua_state_agent; - //let boma = agent.boma(); - //17 -> 20 +unsafe extern "C" fn game_specialnshoot(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.7); + frame(lua_state, 11.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_REFLET_STATUS_SPECIAL_N_SHOOT_FLAG_TRY); + } + frame(lua_state, 13.0); + if !agent.is_flag(*FIGHTER_REFLET_STATUS_SPECIAL_S_FLAG_SHOOT_OK) { + FT_MOTION_RATE_RANGE(agent, 13.0, 42.0, 26.0);//45 empty + } + frame(lua_state, 39.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } } unsafe extern "C" fn game_specialntronend(agent: &mut L2CAgentBase) { - //let lua_state = agent.lua_state_agent; - //let boma = agent.boma(); - //FAF is frame 80/84 + let lua_state = agent.lua_state_agent; + let boma = agent.boma();//FAF is frame 80/86 + frame(lua_state, 34.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } } unsafe extern "C" fn game_specialairntronend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE_RANGE(agent, 1.0, 65.0, 47.0); //FAF is frame 80/84 + FT_MOTION_RATE_RANGE(agent, 1.0, 65.0, 47.0); //FAF is frame 80/86 + frame(lua_state, 4.0); + if is_excute(agent) {//wait to start falling until she starts to move arm (end status starts rly early in anim) + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_AIR_STOP); + let gravity_mul = agent.get_param_float("param_special_n", "special_n_air_invoke_fall_speed_mul"); + let air_accel_y = agent.get_param_float("air_accel_y", ""); + sv_kinetic_energy!(set_accel, agent, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y * gravity_mul); + } + frame(lua_state, 34.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } +} + +unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if !agent.is_flag(*FIGHTER_REFLET_STATUS_SPECIAL_S_FLAG_SHOOT_OK) { + FT_MOTION_RATE_RANGE(agent, 5.0, 54.0, 40.0); + } + frame(lua_state, 17.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_REFLET_STATUS_SPECIAL_S_FLAG_TRY); + } + frame(lua_state, 46.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } } unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { @@ -29,6 +75,10 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + agent.dec_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT); + if agent.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) <= 0 { + FighterSpecializer_Reflet::set_flag_to_table(agent.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + } } frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 8.0); @@ -36,7 +86,8 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ArticleModule::generate_article(boma, *FIGHTER_REFLET_GENERATE_ARTICLE_ELWIND, false, 0); - WorkModule::on_flag(boma, *FIGHTER_REFLET_STATUS_SPECIAL_HI_FLAG_JUMP); + agent.on_flag(*FIGHTER_REFLET_STATUS_SPECIAL_HI_FLAG_JUMP); + agent.on_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_HI_FAILURE_HOP); } frame(lua_state, 9.0); if is_excute(agent) { @@ -49,7 +100,9 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { for _ in 0..30 { if is_excute(agent) { if ControlModule::check_button_on(boma, *CONTROL_PAD_BUTTON_SPECIAL) { - WorkModule::on_flag(boma, *FIGHTER_REFLET_STATUS_SPECIAL_HI_FLAG_TRY_2ND); + agent.on_flag( *FIGHTER_REFLET_STATUS_SPECIAL_HI_FLAG_TRY_2ND); + } else if boma.motion_frame() >= 30.0 && VarModule::is_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); } } wait(lua_state, 1.0); @@ -61,27 +114,217 @@ unsafe extern "C" fn game_specialhi2(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); + agent.dec_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT); + if agent.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) <= 0 { + FighterSpecializer_Reflet::set_flag_to_table(agent.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + } } frame(lua_state, 17.0); if is_excute(agent) { ArticleModule::generate_article(boma, *FIGHTER_REFLET_GENERATE_ARTICLE_ELWIND, false, -1); - WorkModule::on_flag(boma, *FIGHTER_REFLET_STATUS_SPECIAL_HI_FLAG_JUMP); + agent.on_flag(*FIGHTER_REFLET_STATUS_SPECIAL_HI_FLAG_JUMP); } frame(lua_state, 27.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); } + frame(lua_state, 42.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } +} + +unsafe extern "C" fn game_specialhifail(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_REFLET_STATUS_SPECIAL_HI_FLAG_JUMP); + } + frame(lua_state, 9.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); + } + frame(lua_state, 35.0); + FT_MOTION_RATE_RANGE(agent, 35.0, 52.0, 10.0); +} + +unsafe extern "C" fn game_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if !agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE) { + FT_MOTION_RATE_RANGE(agent, 1.0, 20.0, 17.0);//+3 + } else { + FT_MOTION_RATE_RANGE(agent, 1.0, 20.0, 11.0);//-5 total + } + frame(lua_state, 20.0); + if !agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE) { + FT_MOTION_RATE_RANGE(agent, 20.0, 23.0, 7.0);//+5 + if is_excute(agent) { + CATCH(agent, 0, Hash40::new("top"), 5.5, 0.0, 9.5, 29.0, None, None, None, *FIGHTER_STATUS_KIND_CATCHED_REFLET, *COLLISION_SITUATION_MASK_G); + CATCH(agent, 1, Hash40::new("top"), 5.5, 0.0, 9.5, 29.0, None, None, None, *FIGHTER_STATUS_KIND_CATCHED_REFLET, *COLLISION_SITUATION_MASK_A); + } + } + frame(lua_state, 22.5); + if !agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE) { + if is_excute(agent) {//fix last frame grab cancelling out of grab (status checks flag before it gets set?) + agent.clear_lua_stack(); + lua_args!(agent, MA_MSC_CMD_GRAB_CLEAR, 0); + sv_module_access::grab(agent.lua_state_agent); + agent.clear_lua_stack(); + lua_args!(agent, MA_MSC_CMD_GRAB_CLEAR, 1); + sv_module_access::grab(agent.lua_state_agent); + } + } +} + +unsafe extern "C" fn effect_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if !agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE) { + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_flash"), Hash40::new("top"), 0, 9.5, 29.0, 0, 0, 0, 0.50, true); + LAST_EFFECT_SET_COLOR(agent, 0.30, 0.0, 1.0); + LAST_EFFECT_SET_RATE(agent, 8.0/12.0); + } + frame(lua_state, 10.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 14.0); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("sys_flash"), Hash40::new("havel"), -1, 1, 0, 0, 0, 0, 0.45, true); + } + frame(lua_state, 16.5); + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("reflet_rizaia"), Hash40::new("top"), 0, 5, 29.0, 0, 0, 0, 0.92, true); + LAST_EFFECT_SET_RATE(agent, 3.9); + } + } +} + +unsafe extern "C" fn game_speciallwcapture(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 0.0, 70, 100, 0, 0, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 6.0); + if is_excute(agent) { + ATTACK(agent, 1, 1, Hash40::new("top"), 2.0, 70, 100, 50, 0, 7.0, 0.0, 9.5, 29.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 8, false, false, false, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_curse_poison"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK_IGNORE_THROW(agent, 2, 1, Hash40::new("top"), 2.0, 70, 100, 100, 0, 7.0, 0.0, 9.5, 29.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_curse_poison"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_MAGIC); + AttackModule::set_poison_param(agent.module_accessor, 1, 81, 20, 0.5, false); + AttackModule::set_poison_param(agent.module_accessor, 2, 81, 20, 0.5, false); + agent.set_int(1, *FIGHTER_REFLET_STATUS_SPECIAL_LW_CAPTURE_INT_ATTACK_ID); + AttackModule::set_catch_only_all(boma, true, false); + } +} + +unsafe extern "C" fn effect_speciallwcapture(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + loop { + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("reflet_rizaia_capture"), Hash40::new("top"), 0, 5, 29.0, 0, 0, 0, 1.02, true); + agent.clear_lua_stack(); + lua_args!(agent, *FIGHTER_REFLET_STATUS_SPECIAL_LW_CAPTURE_INT_EFFECT_HANDLE); + smash::app::sv_animcmd::LAST_EFFECT_SET_WORK_INT(lua_state); + } + wait(lua_state, 30.0); + } +} + + +unsafe extern "C" fn game_speciallwend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE) { + FT_MOTION_RATE_RANGE(agent, 1.0, 38.0, 32.0);//faf 58 faf -> 45 empty + } else if !agent.is_flag(*FIGHTER_REFLET_STATUS_SPECIAL_LW_CAPTURE_FLAG_MISS) { + if is_excute(agent) {//idk how to code this to work with whatever capture status is used and however it decides when to mash out of the grab + ATTACK(agent, 0, 1, Hash40::new("top"), 2.0, 70, 200, 0, 40, 8.0, 0.0, 9.5, 29.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_purple"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + } + } + frame(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 13.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES);//van + } + frame(lua_state, 18.0); + if !agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE) { + FT_MOTION_RATE_RANGE(agent, 18.0, 38.0, 15.0);//ending 40 faf -> 40, 65 faf whiff (+7) + } + frame(lua_state, 31.0); + if is_excute(agent) { + VarModule::off_flag(agent.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } + frame(lua_state, 38.0);//46 end + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_speciallwend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if !agent.is_flag(*FIGHTER_REFLET_STATUS_SPECIAL_LW_CAPTURE_FLAG_MISS) + && !agent.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE) { + if is_excute(agent) { + EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("reflet_rizaia"), Hash40::new("top"), 0, 5, 29.0, 0, 0, 0, 1.03, true); + LAST_EFFECT_SET_RATE(agent, 4.5); + } + frame(lua_state, 3.0); + if is_excute(agent) { + EFFECT_DETACH_KIND(agent, Hash40::new("reflet_rizaia"), -1); + } + } else { + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("sys_flash"), true, true); + EFFECT_DETACH_KIND(agent, Hash40::new("reflet_rizaia"), -1); + } + + } } pub fn install(agent: &mut Agent) { - agent.acmd("game_specialntronstart", game_specialntronstart, Priority::Low); - agent.acmd( "game_specialairntronstart",game_specialairntronstart, Priority::Low); - agent.acmd("game_specialntronend", game_specialntronend, Priority::Low); + agent.acmd("game_specialnstart", game_specialnstart, Priority::Low);//8 -> 10 + agent.acmd("game_specialairnstart", game_specialnstart, Priority::Low); + + agent.acmd("game_specialnshoot", game_specialnshoot, Priority::Low); + agent.acmd("game_specialairnshoot", game_specialnshoot, Priority::Low); + + agent.acmd("game_specialntronstart", acmd_stub, Priority::Low); + agent.acmd( "game_specialairntronstart",acmd_stub, Priority::Low);//17 -> 20 + agent.acmd("game_specialntronend", game_specialntronend, Priority::Low);//faf 80/86 agent.acmd("game_specialairntronend", game_specialairntronend, Priority::Low); - + + agent.acmd("game_specials", game_specials, Priority::Low); + agent.acmd("game_specialairs", game_specials, Priority::Low); + agent.acmd("game_specialhi", game_specialhi, Priority::Low); agent.acmd("game_specialairhi", game_specialhi, Priority::Low); agent.acmd("game_specialhi2", game_specialhi2, Priority::Low); agent.acmd("game_specialairhi2", game_specialhi2, Priority::Low); + + agent.acmd("game_specialairhifail", game_specialhifail, Priority::Low); + + agent.acmd("game_speciallwstart", game_speciallwstart, Priority::Low); + agent.acmd("effect_speciallwstart", effect_speciallwstart, Priority::Low); + agent.acmd("game_specialairlwstart", game_speciallwstart, Priority::Low); + agent.acmd("effect_specialairlwstart", effect_speciallwstart, Priority::Low); + + agent.acmd("game_speciallwcapture", game_speciallwcapture, Priority::Low); + agent.acmd("effect_speciallwcapture", effect_speciallwcapture, Priority::Low); + agent.acmd("game_specialairlwcapture", game_speciallwcapture, Priority::Low); + agent.acmd("effect_specialairlwcapture", effect_speciallwcapture, Priority::Low); + + agent.acmd("game_speciallwend", game_speciallwend, Priority::Low); + agent.acmd("effect_speciallwend", effect_speciallwend, Priority::Low); + agent.acmd("game_specialairlwend", game_speciallwend, Priority::Low); + agent.acmd("effect_specialairlwend", effect_speciallwend, Priority::Low); } \ No newline at end of file diff --git a/fighters/reflet/src/acmd/throws.rs b/fighters/reflet/src/acmd/throws.rs index 29e91d0e1d..d2cc5a3392 100644 --- a/fighters/reflet/src/acmd/throws.rs +++ b/fighters/reflet/src/acmd/throws.rs @@ -5,21 +5,20 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 2.0); - frame(lua_state, 2.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 6.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 2.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); if is_excute(agent) { grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); - WorkModule::on_flag(boma, *FIGHTER_STATUS_CATCH_FLAG_CATCH_WAIT); + agent.on_flag(*FIGHTER_STATUS_CATCH_FLAG_CATCH_WAIT); GrabModule::set_rebound(boma, false); } } @@ -31,6 +30,11 @@ unsafe extern "C" fn effect_catch(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("handr"), 1.5, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); EFFECT(agent, Hash40::new("reflet_catch_start"), Hash40::new("top"), 0, 5.5, 5, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.25); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("reflet_catch_start"), true, true); } } @@ -49,11 +53,31 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { wait(lua_state, 2.0); if is_excute(agent) { grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); - WorkModule::on_flag(boma, *FIGHTER_STATUS_CATCH_FLAG_CATCH_WAIT); + agent.on_flag(*FIGHTER_STATUS_CATCH_FLAG_CATCH_WAIT); GrabModule::set_rebound(boma, false); } } +unsafe extern "C" fn effect_catchdash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("handr"), 1.5, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + EFFECT_FOLLOW(agent, Hash40::new("reflet_catch_start"), Hash40::new("top"), 0, 3.5, 6.4, 0, 0, 0, 0.42, true); + LAST_EFFECT_SET_RATE(agent, 1.25); + } + frame(lua_state, 11.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 13.0); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("reflet_catch_start"), true, true); + } +} + + unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -69,11 +93,29 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { wait(lua_state, 2.0); if is_excute(agent) { grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); - WorkModule::on_flag(boma, *FIGHTER_STATUS_CATCH_FLAG_CATCH_WAIT); + agent.on_flag(*FIGHTER_STATUS_CATCH_FLAG_CATCH_WAIT); GrabModule::set_rebound(boma, false); } } +unsafe extern "C" fn effect_catchturn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash_s"), Hash40::new("handr"), 1.5, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("reflet_catch_start"), Hash40::new("top"), 0, 3, -17, 0, 0, 0, 0.45, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.25); + } + frame(lua_state, 14.0); + if is_excute(agent) { + EffectModule::kill_kind(boma, Hash40::new("reflet_catch_start"), true, true); + } +} + unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -83,15 +125,15 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { } frame(lua_state, 24.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); + agent.on_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); CHECK_FINISH_CAMERA(agent, 21, 9); } frame(lua_state, 25.0); if is_excute(agent) { REVERSE_LR(agent); - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let target = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } } @@ -100,7 +142,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 97, 60, 0, 86, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 103, 60, 0, 80, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 5.0); @@ -113,9 +155,9 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let target = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } frame(lua_state, 18.0); @@ -128,18 +170,21 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 81, 108, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 82, 108, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 5.0); + FT_MOTION_RATE_RANGE(agent, 5.0, 15.0, 12.0); frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 11, 6); } frame(lua_state, 16.0); if is_excute(agent) { - let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); - let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); - let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + let target = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = agent.get_int64(*FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } frame(lua_state, 24.0); @@ -153,7 +198,10 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_catch", effect_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); + agent.acmd("effect_catchdash", effect_catchdash, Priority::Low); + agent.acmd("game_catchturn", game_catchturn, Priority::Low); + agent.acmd("effect_catchturn", effect_catchturn, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); diff --git a/fighters/reflet/src/acmd/tilts.rs b/fighters/reflet/src/acmd/tilts.rs index b5a3a22fc5..a6e28042ad 100644 --- a/fighters/reflet/src/acmd/tilts.rs +++ b/fighters/reflet/src/acmd/tilts.rs @@ -3,13 +3,17 @@ use super::*; unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + KineticModule::add_speed(boma, &Vector3f::new(0.7, 0.0, 0.0)); + } frame(lua_state, 7.0); FT_MOTION_RATE(agent, 2.0); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 11.0, 35, 59, 0, 67, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 11.0, 35, 59, 0, 67, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 11.0, 35, 59, 0, 67, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 10.0, 35, 80, 0, 50, 3.5, 0.0, 6.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 10.0, 35, 80, 0, 50, 3.5, 0.0, 0.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 35, 80, 0, 50, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 10.0); FT_MOTION_RATE_RANGE(agent, 10.0, 30.0, 17.0); @@ -63,9 +67,9 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { frame(lua_state, 5.25); FT_MOTION_RATE_RANGE(agent, 5.25, 6.0, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 9.5, 110, 60, 0, 66, 3.5, 0.0, 5.5, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 9.5, 110, 60, 0, 66, 3.5, 0.0, 1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 9.5, 110, 60, 0, 66, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 9.0, 110, 80, 0, 60, 3.5, 0.0, 5.5, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 9.0, 110, 80, 0, 60, 3.5, 0.0, 1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("armr"), 9.0, 110, 80, 0, 60, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); @@ -117,7 +121,7 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 4.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 5.0); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 3.5, 4.0); } @@ -126,21 +130,19 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 0.0, 5.0); } frame(lua_state, 7.0); - FT_MOTION_RATE_RANGE(agent, 7.0, 8.0, 3.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 8.0, 85, 46, 0, 63, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 8.0, 85, 46, 0, 63, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("armr"), 8.0, 75, 46, 0, 63, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 8.0, 75, 65, 0, 50, 3.5, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 8.0, 85, 65, 0, 50, 3.5, 0.0, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 8.0, 85, 65, 0, 50, 3.5, 0.0, 6.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } - frame(lua_state, 8.0); - FT_MOTION_RATE_RANGE(agent, 8.0, 22.0, 19.0); + frame(lua_state, 10.0); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 5.0, 5.0); AttackModule::clear_all(boma); } - frame(lua_state, 22.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 26.0); } unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { @@ -148,36 +150,15 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 4, Hash40::new("sword"), 0, 0.4, 0, Hash40::new("sword"), 0, 8.5, 0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_reflet_sword_hdr"), Hash40::new("tex_reflet_sword5"), 5, Hash40::new("sword"), 0, 0.4, 0, Hash40::new("sword"), 0, 8.5, 0, true, Hash40::new("reflet_swoed_flare"), Hash40::new("sword"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.1); } frame(lua_state, 6.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -8, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 8.0); - if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 6); - } -} - -unsafe extern "C" fn expression_attacklw3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - AttackModule::set_attack_reference_joint_id(boma, Hash40::new("sword"), AttackDirectionAxis(*ATTACK_DIRECTION_Z), AttackDirectionAxis(*ATTACK_DIRECTION_Y), AttackDirectionAxis(*ATTACK_DIRECTION_X)); - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 4); - } - frame(lua_state, 4.5); - if is_excute(agent) { - ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - } - frame(lua_state, 6.5); - if is_excute(agent) { - RUMBLE_HIT(agent, Hash40::new("rbkind_slashm"), 0); - } - frame(lua_state, 33.0); + frame(lua_state, 11.0); if is_excute(agent) { - slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 10); + AFTER_IMAGE_OFF(agent, 3.5); } } @@ -192,5 +173,4 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attacklw3", game_attacklw3, Priority::Low); agent.acmd("effect_attacklw3", effect_attacklw3, Priority::Low); - agent.acmd("expression_attacklw3", expression_attacklw3, Priority::Low); } \ No newline at end of file diff --git a/fighters/reflet/src/elwind/acmd.rs b/fighters/reflet/src/elwind/acmd.rs index 9fa286a465..5f82553f31 100644 --- a/fighters/reflet/src/elwind/acmd.rs +++ b/fighters/reflet/src/elwind/acmd.rs @@ -17,7 +17,7 @@ unsafe extern "C" fn game_landing(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 361, 100, 55, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 361, 100, 55, 0, 10.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); AttackModule::clear(boma, 1, false); } frame(lua_state, 5.0); diff --git a/fighters/reflet/src/gigafire/acmd.rs b/fighters/reflet/src/gigafire/acmd.rs index d84fd4a099..25d36b2155 100644 --- a/fighters/reflet/src/gigafire/acmd.rs +++ b/fighters/reflet/src/gigafire/acmd.rs @@ -1,46 +1,62 @@ use super::*; -unsafe extern "C" fn game_burn(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_shoot0(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - AREA_WIND_2ND_RAD_arg9(agent, 0, 1, 0.05, 200, 0.8, 0, 9, 15, 60); - ATTACK(agent, 0, 0, Hash40::new("top"), 1.3, 120, 100, 15, 0, 3.8, 0.0, 8.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -0.5, 0.0, 8, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); - } - wait(lua_state, 10.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.3, 115, 100, 15, 0, 4.0, 0.0, 9.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -0.5, 0.0, 8, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); - } - wait(lua_state, 10.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.3, 110, 100, 15, 0, 4.0, 0.0, 9.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -0.5, 0.0, 8, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 115, 100, 40, 0, 1.8, 0.0, 0.7, -0.7, None, None, None, 1.0, 0.8, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -1, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); } } unsafe extern "C" fn game_rise(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { + if is_excute(agent) {//this one has hard coded life + agent.set_int(14, *WEAPON_INSTANCE_WORK_ID_INT_LIFE);//20 van QUAKE(agent, *CAMERA_QUAKE_KIND_S); AREA_WIND_2ND_RAD_arg9(agent, 0, 1, 0.05, 200, 1, 0, 5, 12, 60); - ATTACK(agent, 0, 0, Hash40::new("top"), 1.3, 96, 100, 15, 0, 3.4, 0.0, 7.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -0.5, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 123, 100, 35, 0, 3.6, 0.0, 1.0, 0.0, None, None, None, 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 148, 100, 18, 0, 3.6, 0.0, 7.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); } - wait(lua_state, 10.0); + wait(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.3, 96, 100, 15, 0, 3.6, 0.0, 7.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.5, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, -0.5, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 123, 100, 35, 0, 3.8, 0.0, 1.0, 0.0, None, None, None, 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 148, 100, 18, 0, 3.8, 0.0, 7.5, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); } } unsafe extern "C" fn effect_rise(agent: &mut L2CAgentBase) { if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("reflet_gigafire_firepillar"), Hash40::new("top"), -0.0, 0, 0, 0, 0, 0, 1, true); - LAST_EFFECT_SET_RATE(agent, 1.45); + EFFECT_FOLLOW(agent, Hash40::new("reflet_gigafire_firepillar"), Hash40::new("top"), -0.0, 0, 0, 0, 0, 0, 0.96, true); + LAST_EFFECT_SET_RATE(agent, 50.0/35.0);//van takes 51 frames to reach finisher (20 hard, 30 param) + } +} + +unsafe extern "C" fn game_burn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) {//this one uses param + AREA_WIND_2ND_RAD_arg9(agent, 0, 1, 0.05, 200, 0.8, 0, 9, 15, 60); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 123, 100, 35, 0, 4.0, 0.0, 1.0, 0.0, None, None, None, 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 148, 100, 18, 0, 4.0, 0.0, 8.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + } + wait(lua_state, 7.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 123, 100, 35, 0, 4.2, 0.0, 1.0, 0.0, None, None, None, 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 148, 100, 18, 0, 4.2, 0.0, 8.5, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + } + wait(lua_state, 7.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.8, 123, 100, 35, 0, 4.4, 0.0, 1.0, 0.0, None, None, None, 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.8, 148, 100, 18, 0, 4.4, 0.0, 9.0, 0.0, Some(0.0), Some(1.0), Some(0.0), 0.75, 0.8, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0.0, 0.0, 7, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_MAGIC); } } pub fn install(agent: &mut Agent) { - agent.acmd("game_burn", game_burn, Priority::Low); - + agent.acmd("game_shoot0", game_shoot0, Priority::Low); + agent.acmd("game_rise", game_rise, Priority::Low); agent.acmd("effect_rise", effect_rise, Priority::Low); + + agent.acmd("game_burn", game_burn, Priority::Low);//2nd stage } diff --git a/fighters/reflet/src/gigafire/mod.rs b/fighters/reflet/src/gigafire/mod.rs index 336fda9e89..550abe86ee 100644 --- a/fighters/reflet/src/gigafire/mod.rs +++ b/fighters/reflet/src/gigafire/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod opff; pub fn install() { let agent = &mut Agent::new("reflet_gigafire"); acmd::install(agent); + opff::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/reflet/src/gigafire/opff.rs b/fighters/reflet/src/gigafire/opff.rs new file mode 100644 index 0000000000..98060cf672 --- /dev/null +++ b/fighters/reflet/src/gigafire/opff.rs @@ -0,0 +1,16 @@ +// opff import +utils::import_noreturn!(common::opff::fighter_common_opff); +use super::*; +use globals::*; + +unsafe extern "C" fn gigafire_frame(weapon: &mut L2CFighterBase) { + if AttackModule::is_infliction_status(weapon.module_accessor, *COLLISION_KIND_MASK_REFLECTOR | *COLLISION_KIND_MASK_PARRY) + && weapon.is_status_one_of(&[*WEAPON_REFLET_GIGAFIRE_STATUS_KIND_BURN, *WEAPON_REFLET_GIGAFIRE_STATUS_KIND_RISE]) { + AttackModule::clear_inflict_kind_status(weapon.module_accessor); + weapon.change_status(WEAPON_REFLET_GIGAFIRE_STATUS_KIND_RISE.into(), true.into()); + } +} + +pub fn install(agent: &mut Agent) { + agent.on_line(Main, gigafire_frame); +} \ No newline at end of file diff --git a/fighters/reflet/src/lib.rs b/fighters/reflet/src/lib.rs index 35474ae73e..5de01ea894 100644 --- a/fighters/reflet/src/lib.rs +++ b/fighters/reflet/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/reflet/src/opff.rs b/fighters/reflet/src/opff.rs index ecf26b088f..17dddeddee 100644 --- a/fighters/reflet/src/opff.rs +++ b/fighters/reflet/src/opff.rs @@ -2,38 +2,6 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; - -unsafe fn nspecial_cancels(boma: &mut BattleObjectModuleAccessor) { - //PM-like neutral-b canceling - if boma.is_status(*FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_CANCEL) { - if boma.is_situation(*SITUATION_KIND_AIR) { - if WorkModule::get_int(boma, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS) == *FIGHTER_STATUS_KIND_ESCAPE_AIR { - WorkModule::set_int(boma, *STATUS_KIND_NONE, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); - ControlModule::clear_command_one(boma, *FIGHTER_PAD_COMMAND_CATEGORY1, *FIGHTER_PAD_CMD_CAT1_AIR_ESCAPE); - } - } - } - // Allow charge jump cancel even when left stick is down - if boma.is_status(*FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_HOLD) { - if boma.is_input_jump() && boma.get_num_used_jumps() < boma.get_jump_count_max() { - StatusModule::change_status_request_from_script(boma, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_JUMP_CANCEL, false); - WorkModule::set_int(boma, *FIGHTER_STATUS_KIND_JUMP_AERIAL, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); - } - } -} - -// move to hi_main -unsafe fn elwind_cost(fighter: &mut L2CFighterCommon) { - //cost of each elwind 1 -> 2 - //if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_SPECIAL_HI, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_HI_2]) - if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) - && StatusModule::is_changing(fighter.module_accessor) { - fighter.dec_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT); - if fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) <= 0 { - FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); - } - } -} unsafe fn levin_leniency(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { // move to attack_air @@ -43,19 +11,20 @@ unsafe fn levin_leniency(fighter: &mut L2CFighterCommon, boma: &mut BattleObject Hash40::new("attack_air_b"), Hash40::new("attack_air_hi"), Hash40::new("attack_air_lw"), - ]) - && VarModule::get_int(fighter.battle_object, vars::reflet::instance::ATTACK_AIR_LEVIN_LENIENCY) > 0 { - VarModule::dec_int(fighter.battle_object, vars::reflet::instance::ATTACK_AIR_LEVIN_LENIENCY); - if !fighter.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) - && boma.is_button_on(Buttons::Smash | Buttons::SpecialRaw | Buttons::Guard) { - let levin = *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT; - if WorkModule::get_int(boma, levin) > 0 { - if WorkModule::get_int(boma, levin) == 1 { - app::FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_SWORD, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + ]) { + if VarModule::get_int(fighter.battle_object, vars::reflet::instance::ATTACK_AIR_LEVIN_LENIENCY) > 0 { + VarModule::dec_int(fighter.battle_object, vars::reflet::instance::ATTACK_AIR_LEVIN_LENIENCY); + if !fighter.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) + && boma.is_button_on(Buttons::Smash | Buttons::SpecialRaw | Buttons::Catch) { + let levin = *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT; + if WorkModule::get_int(boma, levin) > 0 { + if WorkModule::get_int(boma, levin) == 1 { + app::FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_SWORD, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + } + fighter.on_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); + VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_thunder").hash as i64); + WorkModule::dec_int(boma, levin); } - fighter.on_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); - VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_thunder").hash as i64); - WorkModule::dec_int(boma, levin); } } } @@ -75,14 +44,72 @@ unsafe fn sword_length(boma: &mut BattleObjectModuleAccessor) { } } -// upB freefalls after one use per airtime -unsafe fn up_special_freefall(fighter: &mut L2CFighterCommon) { - // move to hi_end - if fighter.is_prev_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) { - if StatusModule::is_changing(fighter.module_accessor) { - VarModule::on_flag(fighter.battle_object, vars::reflet::instance::SPECIAL_HI_ENABLE_FREEFALL); +// mess w book +unsafe fn resource_depleted(fighter: &mut L2CFighterCommon) { + let status = fighter.global_table[STATUS_KIND].get_i32(); + let prev_status = fighter.global_table[PREV_STATUS_KIND].get_i32(); + //enables discard + if StatusModule::is_changing(fighter.module_accessor) + && !(prev_status == statuses::reflet::FLOAT && status == *FIGHTER_STATUS_KIND_ATTACK_AIR) + && ![*FIGHTER_STATUS_KIND_ATTACK_100, + *FIGHTER_STATUS_KIND_ATTACK_S4, + *FIGHTER_STATUS_KIND_ATTACK_S4_HOLD, + *FIGHTER_STATUS_KIND_ATTACK_HI4, + *FIGHTER_STATUS_KIND_ATTACK_HI4_HOLD, + *FIGHTER_STATUS_KIND_ATTACK_LW4, + *FIGHTER_STATUS_KIND_ATTACK_LW4_HOLD, + *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_SHOOT, + *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_START, + *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_HOLD, + *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_END, + *FIGHTER_STATUS_KIND_SPECIAL_LW, + *FIGHTER_REFLET_STATUS_KIND_SPECIAL_LW_CAPTURE, + *FIGHTER_REFLET_STATUS_KIND_SPECIAL_LW_END, + *FIGHTER_REFLET_STATUS_KIND_SPECIAL_HI_2, + ].contains(&status) { + VarModule::off_flag(fighter.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } + let magic = app::FighterSpecializer_Reflet::get_magickind(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + let discard_type = VarModule::get_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE);//not sure if needed + //if discard queue'd in vanilla system, bypass to avoid hardcoded auto-toss-cancel mechanic + if magic > -1 { + if discard_type > 0 && magic != discard_type {//prevent buggy rapid-fire spawns (should already be fixed in statuses but) + spawn_items(fighter);//prevent overriding discard queue (shouldnt be able to discard 2 resources same status but) } + if magic < 4 { + VarModule::set_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE, fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_LAST_USED_MAGIC_KIND)); + } else { + VarModule::set_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE, magic); + } + FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, magic, false, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + VarModule::on_flag(fighter.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } + //if eligible to discard + if discard_type > -1 + && !VarModule::is_flag(fighter.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS)//move that caused discard waits until x frame (generally when returning from attack pose) + && (!StopModule::is_damage(fighter.module_accessor) || !ItemModule::is_have_item(fighter.module_accessor, 0))//if holding an item already dont toss until hitstun over + { + spawn_items(fighter); + } +} + +unsafe fn spawn_items(fighter: &mut L2CFighterCommon) { + let discard_type = VarModule::get_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE); + if ItemModule::is_have_item(fighter.module_accessor, 0) { + ItemModule::throw_item(fighter.module_accessor, 110.0, 1.62, 1.0, 0, true, fighter.get_float(*ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER)); + } + if discard_type != *FIGHTER_REFLET_MAGIC_KIND_SWORD { + ItemModule::have_item(fighter.module_accessor, app::ItemKind(*ITEM_KIND_BOOK), 0, 0, false, false); + let item_id = ItemModule::get_have_item_id(fighter.module_accessor, 0); + let item_boma = sv_battle_object::module_accessor(item_id as u32); + MotionModule::set_rate_material(item_boma, 0.0, MaterialAnimeKind{_address: 0}); + MotionModule::set_frame_material(item_boma, discard_type as f32, MaterialAnimeKind{_address: 0}); + } else { + ItemModule::have_item(fighter.module_accessor, app::ItemKind(*ITEM_KIND_THUNDERSWORD), 0, 0, false, false); + app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, -1);//bookless + ItemModule::set_have_item_visibility(fighter.module_accessor, true, 0); } + VarModule::set_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE, -1); } unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { @@ -103,11 +130,9 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - nspecial_cancels(boma); - elwind_cost(fighter); levin_leniency(fighter, boma); sword_length(boma); - up_special_freefall(fighter); + resource_depleted(fighter); fastfall_specials(fighter); } diff --git a/fighters/reflet/src/status/appeal.rs b/fighters/reflet/src/status/appeal.rs new file mode 100644 index 0000000000..73799a3fb8 --- /dev/null +++ b/fighters/reflet/src/status/appeal.rs @@ -0,0 +1,114 @@ +use super::*; + +// FIGHTER_STATUS_KIND_APPEAL + +pub unsafe extern "C" fn appeal_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + let boma = fighter.boma(); + let frame = fighter.status_frame(); + let magic = fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_LAST_USED_MAGIC_KIND); + if frame == 0 { + LEVIN_ON_TAUNT(boma);//show if you have levin + let mut reflet_fighter = app::Fighter{battle_object: *(fighter.battle_object)}; + FighterSpecializer_Reflet::change_hud_kind(&mut reflet_fighter, magic);//show magic meter if you taunt + } + if frame > 4 && frame < 24 { + KILL_RESOURCE(fighter, boma); + } else if frame == 25 { + VarModule::off_flag(fighter.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + } + return 0.into(); +} + +pub unsafe fn LEVIN_OFF(boma: &mut BattleObjectModuleAccessor) { + if boma.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) <= 0 + && boma.is_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON) { + VarModule::off_flag(utils::util::get_battle_object_from_accessor(boma), vars::reflet::instance::DISCARD_SKIP_STATUS); + VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_normal").hash as i64); + boma.off_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); + } +} + +pub unsafe fn LEVIN_ON_TAUNT(boma: &mut BattleObjectModuleAccessor) { + if boma.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) > 0 { + VisibilityModule::set_int64(boma, Hash40::new("sword").hash as i64, Hash40::new("sword_thunder").hash as i64); + boma.on_flag( *FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_THUNDER_SWORD_ON); + } +} + +pub unsafe fn KILL_RESOURCE(fighter: &mut L2CAgentBase, boma: &mut BattleObjectModuleAccessor) { + if is_training_mode() && !VarModule::is_flag(fighter.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS) { + let mut reflet_fighter = app::Fighter{battle_object: *(fighter.battle_object)}; + if boma.is_button_on(Buttons::Attack) { + VarModule::on_flag(fighter.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + app::FighterSpecializer_Reflet::change_hud_kind(&mut reflet_fighter, *FIGHTER_REFLET_MAGIC_KIND_SWORD); + if boma.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT) > 0 { + boma.set_int(0, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT); + FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_SWORD, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + LEVIN_OFF(boma); + ItemModule::set_have_item_visibility(boma, true, 0); + app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, -1); + } else { + let resource_cap = fighter.get_param_int("param_private", "thunder_sword_usage_count_max"); + boma.set_int(resource_cap, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT); + LEVIN_ON_TAUNT(boma); + FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_SWORD, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_RECOVER_TABLE); + ItemModule::set_have_item_visibility(boma, false, 0); + } + } else if boma.is_button_on(Buttons::Special) { + VarModule::on_flag(fighter.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS); + let magic = boma.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_LAST_USED_MAGIC_KIND); + app::FighterSpecializer_Reflet::change_hud_kind(&mut reflet_fighter, magic); + match magic { + 4 => { + // fire + let resource_cap = fighter.get_param_int("param_private", "grimoire_giga_fire_usage_count_max"); + MAGIC_HANDLER(fighter, boma, magic, *FIGHTER_REFLET_INSTANCE_WORK_ID_FLOAT_SPECIAL_S_CURRENT_POINT, resource_cap); + }, + 5 => { + // wind + let resource_cap = fighter.get_param_int("param_private", "grimoire_el_window_usage_count_max"); + MAGIC_HANDLER(fighter, boma, magic, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT, resource_cap); + }, + 6 => { + // nosferatu + let resource_cap = fighter.get_param_int("param_private", "grimoire_rizaia_usage_count_max"); + MAGIC_HANDLER(fighter, boma, magic, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_LW_CURRENT_POINT, resource_cap); + }, + _ => { + // thunder + let resource_cap = fighter.get_param_int("param_private", "grimoire_thunder_usage_count_max"); + MAGIC_HANDLER(fighter, boma, magic, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_CURRENT_POINT, resource_cap); + } + } + } + } +} + +pub unsafe fn MAGIC_HANDLER(fighter: &mut L2CAgentBase, boma: &mut BattleObjectModuleAccessor, last_magic_kind: i32, resource_kind: i32, resource_cap: i32) { + if CHECK_MAGIC(fighter) { + if last_magic_kind == *FIGHTER_REFLET_MAGIC_KIND_GIGA_FIRE {boma.set_float(0.0, resource_kind); } + else {boma.set_int(0, resource_kind); } + if ItemModule::is_have_item(boma, 0) { + ItemModule::throw_item(boma, 110.0, 1.62, 1.0, 0, true, fighter.get_float(*ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER)); + } + ItemModule::have_item(boma, app::ItemKind(*ITEM_KIND_BOOK), 0, 0, false, false); + let item_id = ItemModule::get_have_item_id(boma, 0); + let item_boma = sv_battle_object::module_accessor(item_id as u32); + MotionModule::set_rate_material(item_boma, 0.0, MaterialAnimeKind{_address: 0}); + MotionModule::set_frame_material(item_boma, last_magic_kind as f32, MaterialAnimeKind{_address: 0}); + FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, last_magic_kind, false, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, -1); + ItemModule::set_have_item_visibility(boma, true, 0); + + } else { + if last_magic_kind == *FIGHTER_REFLET_MAGIC_KIND_GIGA_FIRE {boma.set_float(resource_cap as f32, resource_kind); } + else {boma.set_int(resource_cap, resource_kind); } + FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, last_magic_kind, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_RECOVER_TABLE); + app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, last_magic_kind); + ItemModule::set_have_item_visibility(boma, false, 0); + } +} + +pub fn install(agent: &mut Agent) { + agent.status(Exec, *FIGHTER_STATUS_KIND_APPEAL, appeal_exec); +} \ No newline at end of file diff --git a/fighters/reflet/src/status/attack_100.rs b/fighters/reflet/src/status/attack_100.rs new file mode 100644 index 0000000000..9578a6f407 --- /dev/null +++ b/fighters/reflet/src/status/attack_100.rs @@ -0,0 +1,32 @@ +use super::*; + +// FIGHTER_STATUS_KIND_ATTACK_100 + +unsafe extern "C" fn attack_100_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + let attack_100_count_loop = fighter.get_param_int("param_special_hi", "special_hi_hundred_attack_point"); + let attack_100_count = fighter.get_int(*FIGHTER_REFLET_STATUS_ATTACK_INT_COUNT_FOR_ATTACK_100); + if attack_100_count > 0 { + fighter.dec_int(*FIGHTER_REFLET_STATUS_ATTACK_INT_COUNT_FOR_ATTACK_100); + } else if fighter.is_flag(*FIGHTER_STATUS_ATTACK_FLAG_100_CONTINUE) { + if fighter.is_button_off(Buttons::AttackAll) || fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) == 0 { + fighter.dec_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT); + if fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) <= 0 { + FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + } + fighter.off_flag(*FIGHTER_STATUS_ATTACK_FLAG_100_CONTINUE); + } else { + fighter.set_int(attack_100_count_loop, *FIGHTER_REFLET_STATUS_ATTACK_INT_COUNT_FOR_ATTACK_100); + fighter.dec_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT); + } + } + 0.into() +} + +unsafe extern "C" fn attack_100_end(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_end_Attack100()//discard queue handled during status (not end) to play nice with discard mech +} + +pub fn install(agent: &mut Agent) { + agent.status(Exec, *FIGHTER_STATUS_KIND_ATTACK_100, attack_100_exec); + agent.status(End, *FIGHTER_STATUS_KIND_ATTACK_100, attack_100_end); +} \ No newline at end of file diff --git a/fighters/reflet/src/status/float.rs b/fighters/reflet/src/status/float.rs index fea663da97..cf4e0595fa 100644 --- a/fighters/reflet/src/status/float.rs +++ b/fighters/reflet/src/status/float.rs @@ -9,6 +9,8 @@ extern "Rust" { fn float_set_aerial(fighter: &mut L2CFighterCommon); #[link_name = "float_drift_common"] fn float_drift_common(fighter: &mut L2CFighterCommon) -> L2CValue; + #[link_name = "float_jump_leniency"] + fn float_jump_leniency(fighter: &mut L2CFighterCommon) -> L2CValue; #[link_name = "float_end_common"] fn float_end_common(fighter: &mut L2CFighterCommon) -> L2CValue; } @@ -27,6 +29,7 @@ unsafe extern "C" fn float_main(fighter: &mut L2CFighterCommon) -> L2CValue { sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); float_drift_common(fighter); + float_jump_leniency(fighter); WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING_ATTACK_AIR); WorkModule::enable_transition_term_group(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_LANDING); @@ -34,11 +37,11 @@ unsafe extern "C" fn float_main(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::set_int(fighter.battle_object, vars::common::status::FLOAT_FRAME, 30); VarModule::set_int(fighter.battle_object, vars::common::status::FLOAT_ENABLE_UNIQ, 1); - VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_FLOAT); + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_FLOATING); MotionModule::change_motion(fighter.module_accessor, Hash40::new("fuwafuwa_start"), 0.0, 1.0, false, 0.0, false, false); - WorkModule::off_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_DAMAGE_FLY_AIR); + fighter.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_DAMAGE_FLY_AIR); let shield_stiff_mul_attack_air = WorkModule::get_param_float(fighter.module_accessor, hash40("common"), hash40("shield_stiff_mul_attack_air")); AttackModule::set_shield_stiff_mul(fighter.module_accessor, shield_stiff_mul_attack_air); float_check_aerial(fighter); @@ -62,7 +65,7 @@ unsafe extern "C" fn reflet_float_main_loop(fighter: &mut L2CFighterCommon) -> L if WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_LANDING_ATTACK_AIR) && fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND - && WorkModule::is_flag(fighter.module_accessor, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING) { + && fighter.is_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING) { fighter.change_status(FIGHTER_STATUS_KIND_LANDING_ATTACK_AIR.into(), false.into()); return 0.into(); } @@ -85,7 +88,7 @@ unsafe extern "C" fn reflet_float_main_loop(fighter: &mut L2CFighterCommon) -> L } if VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_MTRANS) == 2 - && WorkModule::get_int(fighter.module_accessor, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) <= 0 { + && fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) < 0 { ControlModule::clear_command_one(fighter.module_accessor, *FIGHTER_PAD_COMMAND_CATEGORY1, *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_N); let cat1 = ControlModule::get_command_flag_cat(fighter.module_accessor, 0); fighter.global_table[CMD_CAT1].assign(&L2CValue::I32(cat1)); @@ -94,7 +97,7 @@ unsafe extern "C" fn reflet_float_main_loop(fighter: &mut L2CFighterCommon) -> L } if VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_MTRANS) == 1 - && WorkModule::get_int(fighter.module_accessor, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) <= 0 { + && fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) < 0 { fighter.change_status(FIGHTER_STATUS_KIND_ATTACK_AIR.into(), true.into()); return 0.into(); } @@ -107,11 +110,15 @@ unsafe extern "C" fn reflet_float_main_loop(fighter: &mut L2CFighterCommon) -> L let mut reflet_fighter = app::Fighter{battle_object: *(fighter.battle_object)}; app::FighterSpecializer_Reflet::change_hud_kind(&mut reflet_fighter, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND); app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND); - WorkModule::set_int(fighter.module_accessor, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_LAST_USED_MAGIC_KIND); + fighter.set_int(*FIGHTER_REFLET_MAGIC_KIND_EL_WIND, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_LAST_USED_MAGIC_KIND); } if VarModule::get_int(fighter.battle_object, vars::common::status::FLOAT_FRAME) % 10 == 0 { WorkModule::dec_int(fighter.module_accessor, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT); + if fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) <= 0 { + //VarModule::set_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE, magic); + FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + } } VarModule::dec_int(fighter.battle_object, vars::common::status::FLOAT_FRAME); @@ -161,11 +168,9 @@ unsafe extern "C" fn reflet_float_main_loop(fighter: &mut L2CFighterCommon) -> L } unsafe extern "C" fn float_end(fighter: &mut L2CFighterCommon) -> L2CValue { - EffectModule::kill_kind(fighter.module_accessor, Hash40::new("reflet_catch"), false, true); - EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_aura_light"), false, true); - if WorkModule::get_int(fighter.module_accessor, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT) <= 0 { - FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_EL_WIND, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); - } + STOP_SE(fighter, Hash40::new("se_common_spirits_wind_loop")); + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("reflet_catch"), true, true); + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_aura_light"), true, true); float_end_common(fighter) } diff --git a/fighters/reflet/src/status/landing.rs b/fighters/reflet/src/status/landing.rs new file mode 100644 index 0000000000..bd6ddef0aa --- /dev/null +++ b/fighters/reflet/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/reflet/src/status/mod.rs b/fighters/reflet/src/status/mod.rs index 335b05f54d..c4f2b6d76a 100644 --- a/fighters/reflet/src/status/mod.rs +++ b/fighters/reflet/src/status/mod.rs @@ -2,11 +2,14 @@ use super::*; use globals::*; // status script import +mod appeal; mod attack_air; - -mod special_n; - +mod attack_100; mod float; +mod special_n; +mod special_hi; +mod special_lw; +mod landing; extern "Rust" { #[link_name = "float_check_air_jump"] @@ -33,6 +36,10 @@ unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { VarModule::off_flag(fighter.battle_object, vars::reflet::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::off_flag(fighter.battle_object, vars::common::instance::STALL_PREVENTION); + } + if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL, statuses::reflet::FLOAT]) { + spawn_items(fighter); } true.into() } @@ -42,14 +49,79 @@ unsafe extern "C" fn reflet_on_start(fighter: &mut L2CFighterCommon) { fighter.global_table[0x33].assign(&L2CValue::Ptr(reflet_air_jump_aerial_uniq as *const () as _)); fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); VarModule::set_int(fighter.battle_object, vars::common::instance::FLOAT_STATUS_KIND, statuses::reflet::FLOAT); + VarModule::set_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE, -1);//0 is thunder +} + +unsafe fn spawn_items(fighter: &mut L2CFighterCommon) { + let discard_type = VarModule::get_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE); + if discard_type > -1 + && !VarModule::is_flag(fighter.battle_object, vars::reflet::instance::DISCARD_SKIP_STATUS) { + if ItemModule::is_have_item(fighter.module_accessor, 0) { + ItemModule::throw_item(fighter.module_accessor, 110.0, 1.6, 1.0, 0, true, fighter.get_float(*ITEM_FIGHTER_VAR_FLOAT_ITEM_THROW_POWER));//should have no hitbox maybe? + //ItemModule::drop_item(fighter.module_accessor, 90.0, 0.0, 0); + //could copy vanilla and just make new item be the one to toss/drop + } + if discard_type != *FIGHTER_REFLET_MAGIC_KIND_SWORD { + ItemModule::have_item(fighter.module_accessor, app::ItemKind(*ITEM_KIND_BOOK), 0, 0, false, false); + let item_id = ItemModule::get_have_item_id(fighter.module_accessor, 0); + let item_boma = sv_battle_object::module_accessor(item_id as u32); + MotionModule::set_rate_material(item_boma, 0.0, MaterialAnimeKind{_address: 0}); + MotionModule::set_frame_material(item_boma, discard_type as f32, MaterialAnimeKind{_address: 0}); + } else { + ItemModule::have_item(fighter.module_accessor, app::ItemKind(*ITEM_KIND_THUNDERSWORD), 0, 0, false, false); + } + VarModule::set_int(fighter.battle_object, vars::reflet::instance::DISCARD_TYPE, -1); + } +} + +pub unsafe extern "C" fn mot_handler(fighter: &mut L2CFighterCommon) -> L2CValue {//van handling + let mot_gr = fighter.get_int64(*FIGHTER_REFLET_STATUS_COMMON_INT_MOTION_KIND_GROUND); + let mot_air = fighter.get_int64(*FIGHTER_REFLET_STATUS_COMMON_INT_MOTION_KIND_AIR); + let kin_gr = fighter.get_int(*FIGHTER_REFLET_STATUS_COMMON_INT_KINETIC_GROUND); + let kin_air = fighter.get_int(*FIGHTER_REFLET_STATUS_COMMON_INT_KINETIC_AIR); + let cor_gr = fighter.get_int(*FIGHTER_REFLET_STATUS_COMMON_INT_CORRECT_GROUND); + let cor_air = fighter.get_int(*FIGHTER_REFLET_STATUS_COMMON_INT_CORRECT_AIR); + if StatusModule::is_changing(fighter.module_accessor) { + fighter.ground_correct_by_situation(cor_gr, cor_air); + fighter.change_kinetic_by_situation(kin_gr, kin_air); + fighter.sub_change_motion_by_situation(Hash40::new_raw(mot_gr).into(), Hash40::new_raw(mot_air).into(), false.into()); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.ground_correct_by_situation(cor_gr, cor_air); + fighter.change_kinetic_by_situation(kin_gr, kin_air); + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new_raw(mot_gr), -1.0, 1.0, 0.0, false, false); + } else { + MotionModule::change_motion_inherit_frame(fighter.module_accessor, Hash40::new_raw(mot_air), -1.0, 1.0, 0.0, false, false); + } + } + 0.into() +} + +pub unsafe fn CHECK_MAGIC(fighter: &mut L2CAgentBase) -> bool { + let magic = fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_LAST_USED_MAGIC_KIND); + let tome_level = match magic { + _ if magic == *FIGHTER_REFLET_MAGIC_KIND_GIGA_FIRE => fighter.get_float(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLOAT_SPECIAL_S_CURRENT_POINT).ceil() as i32, + _ if magic == *FIGHTER_REFLET_MAGIC_KIND_EL_WIND => fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT), + _ if magic == *FIGHTER_REFLET_MAGIC_KIND_RIZAIA => fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_LW_CURRENT_POINT), + _ => fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_CURRENT_POINT), + }; + if tome_level > 0 { + return true.into(); + } + FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut FighterModuleAccessor, -1); + false.into() } pub fn install(agent: &mut Agent) { agent.on_start(reflet_on_start); + appeal::install(agent); attack_air::install(agent); - - special_n::install(agent); - + attack_100::install(agent); float::install(agent); + special_n::install(agent); + special_hi::install(agent); + special_lw::install(agent); + landing::install(agent); } diff --git a/fighters/reflet/src/status/special_hi.rs b/fighters/reflet/src/status/special_hi.rs new file mode 100644 index 0000000000..1a951f91cd --- /dev/null +++ b/fighters/reflet/src/status/special_hi.rs @@ -0,0 +1,12 @@ +use super::*; + +unsafe extern "C" fn special_hi_end(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::reflet::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_end); + agent.status(End, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_HI_FAIL, special_hi_end); +} diff --git a/fighters/reflet/src/status/special_lw.rs b/fighters/reflet/src/status/special_lw.rs new file mode 100644 index 0000000000..8eae9417d8 --- /dev/null +++ b/fighters/reflet/src/status/special_lw.rs @@ -0,0 +1,103 @@ +use super::*; + +unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + //set vars/flags/momentum + fighter.set_int64(hash40("special_lw_start") as i64, *FIGHTER_REFLET_STATUS_COMMON_INT_MOTION_KIND_GROUND); + fighter.set_int64(hash40("special_air_lw_start") as i64, *FIGHTER_REFLET_STATUS_COMMON_INT_MOTION_KIND_AIR); + fighter.set_int(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_KINETIC_GROUND); + fighter.set_int(*FIGHTER_KINETIC_TYPE_AIR_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_KINETIC_AIR); + fighter.set_int(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_CORRECT_GROUND); + fighter.set_int(*GROUND_CORRECT_KIND_AIR, *FIGHTER_REFLET_STATUS_COMMON_INT_CORRECT_AIR); + fighter.set_int(0x50000000,*FIGHTER_REFLET_STATUS_SPECIAL_LW_CAPTURE_INT_OBJECT_ID); + AttackModule::set_overlap_hit(fighter.module_accessor, true);//what is this + mot_handler(fighter);//mot/kin + air_start_stall(fighter); + //update book + let mut reflet_fighter = app::Fighter{battle_object: *(fighter.battle_object)}; + FighterSpecializer_Reflet::change_hud_kind(&mut reflet_fighter, *FIGHTER_REFLET_MAGIC_KIND_RIZAIA); + fighter.set_int(*FIGHTER_REFLET_MAGIC_KIND_RIZAIA, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_LAST_USED_MAGIC_KIND); + if !CHECK_MAGIC(fighter) {//if empty before starting + fighter.on_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE); + } else { + FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_RIZAIA); + fighter.off_flag(*FIGHTER_REFLET_INSTANCE_WORK_ID_FLAG_SPECIAL_FAILURE); + fighter.off_flag(*FIGHTER_REFLET_STATUS_SPECIAL_LW_CAPTURE_FLAG_MISS); + //resource + fighter.dec_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_LW_CURRENT_POINT); + if fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_LW_CURRENT_POINT) <= 0 {//if using final bar + FighterSpecializer_Reflet::set_flag_to_table(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_RIZAIA, true, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THROWAWAY_TABLE); + } + } + fighter.sub_shift_status_main(L2CValue::Ptr(special_lw_main_loop as *const () as _)) +} + +unsafe fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.clear_lua_stack(); + lua_args!(fighter, MA_MSC_CMD_GRAB_IS_GRAB, 0); + sv_module_access::grab(fighter.lua_state_agent); + if fighter.pop_lua_stack(1).get_bool() { + if !FighterSpecializer_Reflet::check_special_lw_pos(fighter.module_accessor as *mut FighterModuleAccessor) { + fighter.clear_lua_stack(); + lua_args!(fighter, MA_MSC_CMD_GRAB_CLEAR, 0); + sv_module_access::grab(fighter.lua_state_agent); + fighter.clear_lua_stack(); + lua_args!(fighter, MA_MSC_CMD_GRAB_CLEAR, 1); + sv_module_access::grab(fighter.lua_state_agent); + } + } + if fighter.get_int(*FIGHTER_REFLET_STATUS_SPECIAL_LW_CAPTURE_WORK_INT_CATCH_STATUS) == *FIGHTER_REFLET_STATUS_SPECIAL_LW_CATCH_STATUS_CATCH_START { + fighter.change_status(FIGHTER_REFLET_STATUS_KIND_SPECIAL_LW_CAPTURE.into(), false.into()) + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_REFLET_STATUS_KIND_SPECIAL_LW_END.into(), false.into()) + } + mot_handler(fighter);//mot/kin + false.into() +} + +pub unsafe extern "C" fn air_start_stall(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + let prev_status_0 = StatusModule::prev_status_kind(fighter.module_accessor, 0); + let prev_status_1 = StatusModule::prev_status_kind(fighter.module_accessor, 1); + let start_x_speed_mul = fighter.get_param_float("param_special_lw", "start_x_speed_mul"); + let start_y_speed_mul = fighter.get_param_float("param_special_lw", "start_y_speed_mul");//start mul and stable mul + let air_accel_y = fighter.get_param_float("param_special_lw", "special_lw_air_catch_fall_accel"); + let air_speed_y_stable = fighter.get_param_float("air_speed_y_stable", "0"); + KineticModule::mul_speed(fighter.module_accessor, &Vector3f::new(start_x_speed_mul, 1.0, 1.0), *FIGHTER_KINETIC_ENERGY_ID_STOP);//x stall + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y);//air accel stall + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, air_speed_y_stable * start_y_speed_mul); + if prev_status_1 == statuses::reflet::FLOAT && prev_status_0 == *FIGHTER_STATUS_KIND_FALL && fighter.global_table[PREV_STATUS_FRAME].get_i32() < 10 {//unfloat grab + //VarModule::on_flag(fighter.battle_object, vars::common::instance::STALL_PREVENTION);//if used out of float do not cut y speed + } else { + //hardcode set-speed stall + if !VarModule::is_flag(fighter.battle_object, vars::common::instance::STALL_PREVENTION) { + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 1.0); + } else {//if not first use, vanilla stall + KineticModule::mul_speed(fighter.module_accessor, &Vector3f::new(1.0, start_y_speed_mul, 1.0), *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } + } + VarModule::on_flag(fighter.battle_object, vars::common::instance::STALL_PREVENTION); + } + 0.into() +} + +unsafe extern "C" fn special_lw_end(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::reflet::instance::SPECIAL_HI_ENABLE_FREEFALL); + if fighter.global_table[STATUS_KIND].get_i32() != *FIGHTER_REFLET_STATUS_KIND_SPECIAL_LW_CAPTURE { + if CatchModule::is_catch(fighter.module_accessor) { + CatchModule::catch_cut(fighter.module_accessor, false, false); + } + EFFECT_DETACH_KIND(fighter, Hash40::new("reflet_rizaia"), -1); + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_flash"), true, true); + } + if fighter.global_table[STATUS_KIND].get_i32() != *FIGHTER_REFLET_STATUS_KIND_SPECIAL_LW_END { + EFFECT_DETACH_KIND(fighter, Hash40::new("reflet_rizaia"), -1); + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_flash"), true, true); + } + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_main); + agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_end); +} diff --git a/fighters/reflet/src/status/special_n.rs b/fighters/reflet/src/status/special_n.rs index 6bc7e1a53d..69c611a22b 100644 --- a/fighters/reflet/src/status/special_n.rs +++ b/fighters/reflet/src/status/special_n.rs @@ -1,5 +1,208 @@ use super::*; +// FIGHTER_STATUS_KIND_SPECIAL_N + +pub unsafe extern "C" fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + fighter.set_int(*FIGHTER_REFLET_MAGIC_KIND_THUNDER, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_LAST_USED_MAGIC_KIND); + fighter.set_int64(hash40("special_n_start") as i64, *FIGHTER_REFLET_STATUS_COMMON_INT_MOTION_KIND_GROUND); + fighter.set_int64(hash40("special_air_n_start") as i64, *FIGHTER_REFLET_STATUS_COMMON_INT_MOTION_KIND_AIR); + fighter.set_int(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_KINETIC_GROUND); + fighter.set_int(*FIGHTER_KINETIC_TYPE_AIR_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_KINETIC_AIR); + fighter.set_int(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_CORRECT_GROUND); + fighter.set_int(*GROUND_CORRECT_KIND_AIR, *FIGHTER_REFLET_STATUS_COMMON_INT_CORRECT_AIR); + ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 10); + fighter.main_shift(special_n_main_loop) +} + +pub unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if !StatusModule::is_changing(fighter.module_accessor) { + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_HOLD.into(), false.into()) + } + if fighter.is_button_trigger(Buttons::Special | Buttons::Attack) { + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + } // buffered release + } + mot_handler(fighter) +} + +// FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_HOLD + +pub unsafe extern "C" fn special_n_hold_main(fighter: &mut L2CFighterCommon) -> L2CValue { + // set vars + fighter.set_int64(hash40("special_n_hold") as i64, *FIGHTER_REFLET_STATUS_COMMON_INT_MOTION_KIND_GROUND); + fighter.set_int64(hash40("special_air_n_hold") as i64, *FIGHTER_REFLET_STATUS_COMMON_INT_MOTION_KIND_AIR); + fighter.set_int(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_KINETIC_GROUND); + fighter.set_int(*FIGHTER_KINETIC_TYPE_AIR_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_KINETIC_AIR); + fighter.set_int(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *FIGHTER_REFLET_STATUS_COMMON_INT_CORRECT_GROUND); + fighter.set_int(*GROUND_CORRECT_KIND_AIR, *FIGHTER_REFLET_STATUS_COMMON_INT_CORRECT_AIR); + fighter.set_int(0, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); + fighter.enable_transition_term_many(&[ + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_GUARD_ON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE_F, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE_B, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT_BUTTON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_FLY_BUTTON, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_FLY, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_FLY_NEXT, + *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ESCAPE_AIR + ]); + let stage = fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_THUNDER_KIND); + let mut init_count = 0; // set charge frame depending on last reached charge stage, fx + if stage == *FIGHTER_REFLET_MAGIC_KIND_GIGA_THUNDER { + init_count = fighter.get_param_float("param_special_n", "special_n_giga_thunder_shoot_time") as i32; + charge_handler(fighter, hash40("reflet_specialn_hold3"), *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_EFFECT_HANDLE3, *FIGHTER_REFLET_MAGIC_KIND_GIGA_THUNDER); + } else if stage == *FIGHTER_REFLET_MAGIC_KIND_EL_THUNDER { + init_count = fighter.get_param_float("param_special_n", "special_n_el_thunder_shoot_time") as i32; + charge_handler(fighter, hash40("reflet_specialn_hold2"), *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_EFFECT_HANDLE2, *FIGHTER_REFLET_MAGIC_KIND_EL_THUNDER); + } else { + charge_handler(fighter, hash40("reflet_specialn_hold"), *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_EFFECT_HANDLE, *FIGHTER_REFLET_MAGIC_KIND_THUNDER); + } + // set book and charge frame + fighter.set_int(init_count, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_COUNT); + app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, stage); + air_charge_stall(fighter); + fighter.main_shift(special_n_hold_main_loop) +} + +pub unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_button_trigger(Buttons::Special | Buttons::Attack) + || VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { // buffered fire + VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + fighter.change_status(FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_SHOOT.into(), true.into()) + } else if cancel_check(fighter) {//cancel + fighter.change_status(FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_CANCEL.into(), true.into()) + } + // charge frame + fighter.inc_int(*FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_COUNT); + if !CHECK_MAGIC(fighter) { + fighter.change_status(FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_SHOOT.into(), true.into()) // fail status + } + let hold_frame = fighter.get_int(*FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_COUNT) as f32; + let stage = fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_THUNDER_KIND); + let el_frame = fighter.get_param_float("param_special_n", "special_n_el_thunder_shoot_time"); + let arc_frame = fighter.get_param_float("param_special_n", "special_n_giga_thunder_shoot_time"); + let thoron_frame = fighter.get_param_float("param_special_n", "special_n_tron_shoot_time"); + // set vars&fx by stage + if stage >= *FIGHTER_REFLET_MAGIC_KIND_GIGA_THUNDER { + if hold_frame >= thoron_frame { + fighter.set_int(*FIGHTER_REFLET_MAGIC_KIND_TRON, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_THUNDER_KIND); + fighter.change_status(FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_CANCEL.into(), true.into()) + }//thoron fx moved to end stat + } else if stage == *FIGHTER_REFLET_MAGIC_KIND_EL_THUNDER { + if hold_frame >= arc_frame { + fighter.set_int(*FIGHTER_REFLET_MAGIC_KIND_GIGA_THUNDER, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_THUNDER_KIND); + app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_GIGA_THUNDER); + eff_clear(fighter, hash40("reflet_specialn_hold2")); + charge_handler(fighter, hash40("reflet_specialn_hold3"), *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_EFFECT_HANDLE3, *FIGHTER_REFLET_MAGIC_KIND_GIGA_THUNDER); + + } + } else { + if hold_frame >= el_frame { + fighter.set_int(*FIGHTER_REFLET_MAGIC_KIND_EL_THUNDER, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_THUNDER_KIND); + app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_EL_THUNDER); + eff_clear(fighter, hash40("reflet_specialn_hold")); + charge_handler(fighter, hash40("reflet_specialn_hold2"), *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_EFFECT_HANDLE2, *FIGHTER_REFLET_MAGIC_KIND_EL_THUNDER); + } + } + if StatusModule::is_situation_changed(fighter.module_accessor) {air_charge_stall(fighter); } + mot_handler(fighter); // set mot/physics by var + // mot rate + let motion_rate = fighter.get_float(*FIGHTER_REFLET_INSTANCE_WORK_ID_SPECIAL_N_CHARGE_RATE); + MotionModule::set_rate(fighter.module_accessor, motion_rate); + 0.into() +} + +unsafe extern "C" fn special_n_hold_end(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.get_int(*FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_THUNDER_KIND) == *FIGHTER_REFLET_MAGIC_KIND_TRON { + app::FighterSpecializer_Reflet::change_grimoire(fighter.module_accessor as *mut app::FighterModuleAccessor, *FIGHTER_REFLET_MAGIC_KIND_TRON); + EffectModule::req_common(fighter.module_accessor, Hash40::new("charge_max"), 0.0); + EffectModule::req_follow(fighter.module_accessor, Hash40::new("reflet_specialn_max"), Hash40::new("handl"), &Vector3f{x: 1.0, y: 2.0, z: 0.0}, &Vector3f::zero(), 1.0, false, 0, 0, -1, 0, 0, false, false) as u32; + app::FighterUtil::flash_eye_info(fighter.module_accessor); + } + eff_clear(fighter, hash40("reflet_specialn_hold3")); + eff_clear(fighter, hash40("reflet_specialn_hold2")); + eff_clear(fighter, hash40("reflet_specialn_hold")); + 0.into() // kill vfx on exit +} + +unsafe extern "C" fn eff_clear(fighter: &mut L2CFighterCommon, eff_hash: u64) -> L2CValue { + fighter.clear_lua_stack(); + lua_args!(fighter, MA_MSC_CMD_EFFECT_EFFECT_OFF_KIND, Hash40::new_raw(eff_hash), true, true); + sv_module_access::effect(fighter.lua_state_agent); + 0.into() +} + +unsafe extern "C" fn charge_handler(fighter: &mut L2CFighterCommon, eff_hash: u64, eff_handle: i32, thunder_kind: i32) -> L2CValue { // 1, 3, 4 + let el_frame = fighter.get_param_float("param_special_n", "special_n_el_thunder_shoot_time"); + let arc_frame = fighter.get_param_float("param_special_n", "special_n_giga_thunder_shoot_time"); + let thoron_frame = fighter.get_param_float("param_special_n", "special_n_tron_shoot_time"); + if fighter.kind() == *FIGHTER_KIND_KIRBY { + let eff_pos = &Vector3f{x: -2.5, y: -1.2, z: -1.0}; + if fighter.lr() > 0.0 { + let eff_pos = &Vector3f{x: -2.0, y: -1.2, z: 1.5}; + } + let effect = EffectModule::req_follow(fighter.module_accessor, Hash40::new_raw(eff_hash), Hash40::new("handr"), eff_pos, &Vector3f::zero(), 1.0, false, 0, 0, -1, 0, 0, false, false) as u32; + fighter.set_int(effect as i32, eff_handle); + } else { + let effect = EffectModule::req_follow(fighter.module_accessor, Hash40::new_raw(eff_hash), Hash40::new("handl"), &Vector3f{x: 1.0, y: 2.0, z: 0.0}, &Vector3f::zero(), 1.0, false, 0, 0, -1, 0, 0, false, false) as u32; + fighter.set_int(effect as i32, eff_handle); + } + match thunder_kind { + _ if thunder_kind == *FIGHTER_REFLET_MAGIC_KIND_THUNDER => fighter.set_float(el_frame/64.0, *FIGHTER_REFLET_INSTANCE_WORK_ID_SPECIAL_N_CHARGE_RATE), + _ if thunder_kind == *FIGHTER_REFLET_MAGIC_KIND_EL_THUNDER => fighter.set_float((arc_frame - el_frame)/64.0, *FIGHTER_REFLET_INSTANCE_WORK_ID_SPECIAL_N_CHARGE_RATE), + _ if thunder_kind == *FIGHTER_REFLET_MAGIC_KIND_GIGA_THUNDER => fighter.set_float((thoron_frame - arc_frame)/64.0, *FIGHTER_REFLET_INSTANCE_WORK_ID_SPECIAL_N_CHARGE_RATE), + _ => fighter.set_float(1.0, *FIGHTER_REFLET_INSTANCE_WORK_ID_SPECIAL_N_CHARGE_RATE), + } + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + FOOT_EFFECT(fighter, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); // ? + } + 0.into() +} + +unsafe extern "C" fn cancel_check(fighter: &mut L2CFighterCommon) -> bool { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + if fighter.sub_check_jump_in_charging().get_bool() { + fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_SQUAT, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); + return true.into() + } + else if fighter.sub_check_command_guard().get_bool() { + fighter.set_int(0, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); + return true.into() + } + return false.into() + } + if fighter.get_num_used_jumps() < fighter.get_jump_count_max() + && fighter.sub_check_jump_in_charging().get_bool() { + fighter.set_int(*FIGHTER_STATUS_KIND_JUMP_AERIAL, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); + return true.into(); + } + if fighter.is_cat_flag(Cat1::AirEscape) { + fighter.set_int(0, *FIGHTER_REFLET_STATUS_SPECIAL_N_HOLD_INT_NEXT_STATUS); + return true.into() + } + false.into() +} + +pub unsafe extern "C" fn air_charge_stall(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + let air_accel_y = fighter.get_param_float("air_accel_y", ""); + let special_n_air_invoke_fall_speed_mul = fighter.get_param_float("param_special_n", "special_n_air_invoke_fall_speed_mul"); + let special_n_air_invoke_speed_y_limit = fighter.get_param_float("param_special_n", "special_n_air_invoke_speed_y_limit"); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y * special_n_air_invoke_fall_speed_mul); + let mut speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + if -special_n_air_invoke_speed_y_limit > speed_y { + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -special_n_air_invoke_speed_y_limit); + } + } + 0.into() +} + // FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_START pub unsafe extern "C" fn special_n_tron_start_main(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -17,6 +220,7 @@ pub unsafe extern "C" fn special_n_tron_start_main(fighter: &mut L2CFighterCommo pub unsafe extern "C" fn special_n_tron_hold_main(fighter: &mut L2CFighterCommon) -> L2CValue { let ret = smashline::original_status(Main, fighter, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_HOLD)(fighter); if !fighter.is_situation(*SITUATION_KIND_GROUND) { + KineticModule::clear_speed_all(fighter.module_accessor); KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_BIND); } ret @@ -27,14 +231,15 @@ pub unsafe extern "C" fn special_n_tron_hold_main(fighter: &mut L2CFighterCommon pub unsafe extern "C" fn special_n_tron_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { let ret = smashline::original_status(Main, fighter, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_END)(fighter); if !fighter.is_situation(*SITUATION_KIND_GROUND) { - let gravity_mul = fighter.get_param_float("param_special_n", "special_n_air_invoke_fall_speed_mul"); - let air_accel_y = fighter.get_param_float("air_accel_y", ""); - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y * gravity_mul); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_BIND); } ret } pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_N, special_n_main); + agent.status(Main, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_HOLD, special_n_hold_main); + agent.status(End, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_HOLD, special_n_hold_end); agent.status(Main, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_START, special_n_tron_start_main); agent.status(Main, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_HOLD, special_n_tron_hold_main); agent.status(Main, *FIGHTER_REFLET_STATUS_KIND_SPECIAL_N_TRON_END, special_n_tron_end_main); diff --git a/fighters/reflet/src/thunder/acmd.rs b/fighters/reflet/src/thunder/acmd.rs index c2462c333c..ed07081925 100644 --- a/fighters/reflet/src/thunder/acmd.rs +++ b/fighters/reflet/src/thunder/acmd.rs @@ -5,12 +5,12 @@ unsafe extern "C" fn game_shoot2(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"),0, false, *BATTLE_OBJECT_ID_INVALID as u32); - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 70, 35, 0, 50, 3.2, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 70, 35, 0, 50, 3.2, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); AttackModule::enable_safe_pos(boma); } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 70, 35, 0, 50, 3.2, 0.0, -0.7, 0.0, Some(0.0), Some(0.7), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 70, 35, 0, 50, 3.2, 0.0, -0.7, 0.0, Some(0.0), Some(0.7), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); } } @@ -19,16 +19,17 @@ unsafe extern "C" fn game_gigaspark(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_explosionm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); - ATTACK(agent, 0, 0, Hash40::new("top"), 2.4, 110, 100, 20, 0, 6.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(0.0), 0.2, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.4, 366, 100, 16, 0, 2.0, 0.0, 12.0, 12.0, Some(0.0), Some(-12.0), Some(-12.0), 0.2, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.4, 366, 100, 16, 0, 2.0, 0.0, 12.0, -12.0, Some(0.0), Some(-12.0), Some(12.0), 0.2, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 110, 100, 20, 0, 6.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 366, 100, 16, 0, 2.0, 0.0, 12.0, 12.0, Some(0.0), Some(-12.0), Some(-12.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 366, 100, 16, 0, 2.0, 0.0, 12.0, -12.0, Some(0.0), Some(-12.0), Some(12.0), 0.5, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); } - frame(lua_state, 24.0); + frame(lua_state, 28.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 3.0, 50, 166, 0, 75, 3.0, 0.0, 12.0, 12.0, Some(0.0), Some(-12.0), Some(-12.0), 0.6, 1.0,*ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 5, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); - ATTACK(agent, 1, 1, Hash40::new("top"), 3.0, 50, 166, 0, 75, 3.0, 0.0, 12.0, -12.0, Some(0.0), Some(-12.0), Some(12.0), 0.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 5, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + AttackModule::clear_all(boma); + ATTACK(agent, 0, 1, Hash40::new("top"), 3.0, 50, 166, 0, 75, 3.0, 0.0, 12.0, 12.0, Some(0.0), Some(-12.0), Some(-12.0), 1.0, 1.0,*ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 1, Hash40::new("top"), 3.0, 50, 166, 0, 75, 3.0, 0.0, 12.0, -12.0, Some(0.0), Some(-12.0), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); } - frame(lua_state, 25.0); + frame(lua_state, 31.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -43,7 +44,7 @@ unsafe extern "C" fn game_tron0(agent: &mut L2CAgentBase) { 0x6 => 1.0 + VarModule::get_float(owner_module_accessor.object(), vars::kirby::instance::SPECIAL_N_CHARGE) / 2.0, _ => 3.5 }; - ATTACK(agent, 0, 0, Hash40::new("top"), damage, 45, 145, 0, 75, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(0.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -0.5, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("top"), damage, 45, 145, 0, 70, 3.0, 0.0, 0.0, 0.0, Some(0.0), Some(0.0), Some(0.0), 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -0.5, 0.0, 4, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_MAGIC); AttackModule::set_no_finish_camera(agent.boma(), 0, true, false); } } diff --git a/fighters/richter/Cargo.toml b/fighters/richter/Cargo.toml index 33dc560d22..3d6d8cca1a 100644 --- a/fighters/richter/Cargo.toml +++ b/fighters/richter/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/richter/src/acmd/aerials.rs b/fighters/richter/src/acmd/aerials.rs index ba8c6c8141..8cba0dd777 100644 --- a/fighters/richter/src/acmd/aerials.rs +++ b/fighters/richter/src/acmd/aerials.rs @@ -10,43 +10,43 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 45, 95, 0, 45, 4.5, 0.0, 10.0, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 105, 0, 45, 4.4, 0.0, 12.3, 7.0, Some(0.0), Some(6.5), Some(18.1), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 45, 105, 0, 45, 4.4, 0.0, 14.8, 5.6, Some(0.0), Some(6.5), Some(18.1), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 105, 0, 45, 4.4, 0.0, 11.0, 7.5, Some(0.0), Some(5.3), Some(19.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 45, 105, 0, 45, 4.4, 0.0, 13.3, 6.6, Some(0.0), Some(5.3), Some(19.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 105, 0, 45, 4.3, 0.0, 10.0, 7.0, Some(0.0), Some(5.3), Some(16.7), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 45, 105, 0, 45, 4.3, 0.0, 12.0, 6.8, Some(0.0), Some(5.3), Some(16.7), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 95, 0, 45, 4.3, 0.0, 11.2, 1.0, Some(0.0), Some(5.3), Some(12.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 95, 0, 45, 4.3, 0.0, 12.9, 1.3, Some(0.0), Some(5.3), Some(12.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 95, 0, 45, 4.3, 0.0, 13.0, -1.0, Some(0.0), Some(5.7), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 95, 0, 45, 4.3, 0.0, 14.5, -0.4, Some(0.0), Some(5.7), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 95, 0, 45, 4.3, 0.0, 15.5, -5.0, Some(0.0), Some(6.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 45, 95, 0, 45, 4.3, 0.0, 16.7, -4.2, Some(0.0), Some(6.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 45, 85, 0, 45, 4.3, 0.0, 16.5, -7.0, Some(0.0), Some(8.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 85, 0, 45, 4.3, 0.0, 17.7, -6.0, Some(0.0), Some(8.0), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 45, 85, 0, 45, 4.2, 0.0, 18.0, -7.5, Some(0.0), Some(9.3), Some(3.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 85, 0, 45, 4.2, 0.0, 19.2, -6.7, Some(0.0), Some(9.3), Some(3.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 45, 85, 0, 45, 4.2, 0.0, 20.5, -8.5, Some(0.0), Some(11.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 85, 0, 45, 4.2, 0.0, 21.8, -7.8, Some(0.0), Some(11.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 19.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 45, 85, 0, 45, 4.2, 0.0, 21.0, -10.9, Some(0.0), Some(11.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 85, 0, 45, 4.2, 0.0, 22.4, -10.3, Some(0.0), Some(11.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 20.0); if is_excute(agent) { @@ -63,12 +63,12 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("richter_attack100_end"), Hash40::new("top"), 0, 12, 8.1, 0, -32, 110, 1.2, true); + EFFECT_FOLLOW(agent, Hash40::new("richter_attack100_end"), Hash40::new("top"), 0, 14.5, 6.7, 0, -32, 110, 1.2, true); LAST_EFFECT_SET_ALPHA(agent, 0.4); } frame(lua_state, 17.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("richter_attack100_end"), Hash40::new("top"), 0, 16.6, -3.3, 0, 213.7, -95, 0.9, true); + EFFECT_FOLLOW(agent, Hash40::new("richter_attack100_end"), Hash40::new("top"), 0, 17.8, -2.5, 0, 213.7, -95, 0.9, true); LAST_EFFECT_SET_ALPHA(agent, 0.3); } frame(lua_state, 20.0); @@ -115,12 +115,14 @@ unsafe extern "C" fn game_attackairfhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 15.0, 13.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 145, 30, 0, 80, 3.8, 0.0, 21.0, 34.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 125, 30, 0, 80, 3.8, 0.0, 21.0, 34.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 50, 0, 50, 5.5, 0.0, 10.0, 5.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 361, 40, 0, 55, 2.3, 0.0, 10.0, 7.0, Some(0.0), Some(20.0), Some(32.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } @@ -158,12 +160,14 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 15.0, 13.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 120, 40, 0, 80, 3.8, 0.0, 8.0, 36.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 108, 30, 0, 80, 3.8, 0.0, 8.0, 36.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 50, 0, 50, 5.5, 0.0, 8.0, 5.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 361, 40, 0, 55, 2.3, 0.0, 8.0, 7.0, Some(0.0), Some(8.0), Some(34.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } @@ -201,12 +205,14 @@ unsafe extern "C" fn game_attackairflw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 15.0, 13.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 113, 40, 0, 80, 3.8, 0.0, -5.4, 34.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 101, 40, 0, 80, 3.8, 0.0, -5.4, 34.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 50, 0, 50, 5.5, 0.0, 6.0, 5.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 361, 40, 0, 55, 2.3, 0.0, 6.0, 7.0, Some(0.0), Some(-5.0), Some(32.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } @@ -288,7 +294,7 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 2.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, true); + // EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 14.0); if is_excute(agent) { @@ -308,7 +314,7 @@ unsafe extern "C" fn sound_attackairb(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 13.0); if is_excute(agent) { - PLAY_SE(agent, Hash40::new("vc_richter_attack05")); + PLAY_SEQUENCE(agent, Hash40::new("seq_richter_rnd_attack")); } frame(lua_state, 14.0); if is_excute(agent) { @@ -357,11 +363,11 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 11.5, 1.5, 0, 60, 90, 0.85, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 14.5, 1.5, 0, 80, 90, 0.85, true); LAST_EFFECT_SET_COLOR(agent, 0.902, 0.784, 0.333); - LAST_EFFECT_SET_RATE(agent, 1.0); + LAST_EFFECT_SET_RATE(agent, 0.85); } - frame(lua_state, 14.0); + frame(lua_state, 16.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("sys_attack_arc_d"), false, true); } @@ -409,12 +415,12 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 80, 46, 0, 88, 5.5, 0.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 80, 46, 0, 88, 5.5, 0.0, 1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 72, 46, 0, 88, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 72, 46, 0, 88, 5.5, 0.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 40.0); if is_excute(agent) { diff --git a/fighters/richter/src/acmd/ground.rs b/fighters/richter/src/acmd/ground.rs index de976064f2..f7f4895317 100644 --- a/fighters/richter/src/acmd/ground.rs +++ b/fighters/richter/src/acmd/ground.rs @@ -5,12 +5,20 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 3.0, 73, 40, 0, 25, 3.0, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 3.0, 73, 40, 0, 25, 3.0, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 3.0, 73, 40, 0, 25, 3.5, 4.3, -0.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 3.0, 73, 40, 0, 25, 3.0, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 3.0, 73, 40, 0, 25, 3.0, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 3.0, 73, 40, 0, 25, 3.5, 4.3, -0.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("kneel"), 3.0, 320, 25, 0, 25, 3.0, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("kneel"), 3.0, 320, 25, 0, 25, 3.5, 4.3, -0.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 2.0, 0.0, 4.5, 3.0, Some(0.0), Some(4.5), Some(10.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_down_only(boma, 3, false); } + frame(lua_state, 6.0); + if is_excute(agent) { + ATTACK(agent, 1, 0, Hash40::new("kneel"), 3.0, 73, 40, 0, 25, 3.0, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 3.0, 73, 40, 0, 25, 3.5, 4.3, -0.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } frame(lua_state, 8.0); if is_excute(agent) { AttackModule::clear_all(boma); @@ -54,12 +62,12 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 73, 30, 0, 25, 3.0, 0.0, 5.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 73, 30, 0, 25, 3.25, 0.0, 4.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 73, 30, 0, 25, 3.5, 0.0, 3.0, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 3.0, 0.0, 5.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 3.25, 0.0, 4.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 3.5, 0.0, 3.0, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 73, 30, 0, 25, 3.0, 0.0, 5.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 73, 30, 0, 25, 3.25, 0.0, 4.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 73, 30, 0, 25, 3.5, 0.0, 3.0, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 3.0, 0.0, 5.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 3.25, 0.0, 4.0, 5.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("top"), 3.0, 361, 25, 0, 25, 3.5, 0.0, 3.0, 10.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_down_only(boma, 3, false); AttackModule::set_down_only(boma, 4, false); AttackModule::set_down_only(boma, 5, false); diff --git a/fighters/richter/src/acmd/other.rs b/fighters/richter/src/acmd/other.rs index 75baed4d9f..7c3d213483 100644 --- a/fighters/richter/src/acmd/other.rs +++ b/fighters/richter/src/acmd/other.rs @@ -74,29 +74,21 @@ unsafe extern "C" fn game_turndash(fighter: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(fighter: &mut L2CAgentBase) { let lua_state = fighter.lua_state_agent; let boma = fighter.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(fighter) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(fighter) { - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } } unsafe extern "C" fn game_escapeairslide(fighter: &mut L2CAgentBase) { let lua_state = fighter.lua_state_agent; let boma = fighter.boma(); + frame(lua_state, 29.0); if is_excute(fighter) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(fighter) { - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } } unsafe extern "C" fn sound_appeallw(fighter: &mut L2CAgentBase) { @@ -116,6 +108,14 @@ unsafe extern "C" fn sound_appeallw(fighter: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + PostureModule::add_pos(boma, &Vector3f::new(0.0, -1.0, 0.0)); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_cliffescape", acmd_stub, Priority::Low); @@ -134,4 +134,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("sound_appeallwr", sound_appeallw, Priority::Low); agent.acmd("sound_appeallwl", sound_appeallw, Priority::Low); -} + + agent.acmd("game_cliffjump2", game_cliffjump2, Priority::Low); +} \ No newline at end of file diff --git a/fighters/richter/src/acmd/specials.rs b/fighters/richter/src/acmd/specials.rs index ab64a73cb6..2e396f7040 100644 --- a/fighters/richter/src/acmd/specials.rs +++ b/fighters/richter/src/acmd/specials.rs @@ -71,18 +71,20 @@ unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { app::sv_kinetic_energy::reset_energy(agent.lua_state_agent); boma.select_cliff_hangdata_from_name("special_s1"); } + sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.9); } frame(lua_state, 13.0); + let offset = if agent.is_situation(*SITUATION_KIND_AIR) { 4.2 } else { 0.0 }; if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 62, 65, 0, 60, 4.0, 0.0, 8.5, 1.0, Some(0.0), Some(8.5), Some(8.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); - ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 62, 65, 0, 60, 4.0, 0.0, 12.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); - ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 62, 65, 0, 60, 4.0, 0.0, 5.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 62, 65, 0, 60, 4.0, 0.0, 8.5 + offset, 1.0, Some(0.0), Some(8.5 + offset), Some(8.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 7.0, 62, 65, 0, 60, 4.0, 0.0, 12.0 + offset, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 62, 65, 0, 60, 4.0, 0.0, 5.0 + offset, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 65, 60, 0, 55, 4.0, 0.0, 8.5, 1.0, Some(0.0), Some(8.5), Some(8.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 65, 60, 0, 55, 4.0, 0.0, 12.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); - ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 65, 60, 0, 55, 4.0, 0.0, 5.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 65, 60, 0, 55, 4.0, 0.0, 8.5 + offset, 1.0, Some(0.0), Some(8.5 + offset), Some(8.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 65, 60, 0, 55, 4.0, 0.0, 12.0 + offset, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 65, 60, 0, 55, 4.0, 0.0, 5.0 + offset, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 23.0); if is_excute(agent) { @@ -114,7 +116,12 @@ unsafe extern "C" fn effect_specials1(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - EFFECT_FLW_POS(agent, Hash40::new("richter_whip_dash"), Hash40::new("top"), -2.4, 9, 1, 0, 0, 0, 0.86, true); + if agent.is_situation(*SITUATION_KIND_GROUND) { + EFFECT_FLW_POS(agent, Hash40::new("richter_whip_dash"), Hash40::new("top"), -2.4, 9, 1, 0, 0, 0, 0.86, true); + } + else { + EFFECT_FLW_POS(agent, Hash40::new("richter_whip_dash"), Hash40::new("top"), -2.4, 13.2, 1, 0, 0, 0, 0.86, true); + } FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 8, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 15.0); @@ -186,12 +193,9 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); } - frame(lua_state, 5.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_REVERSE_LR); - } frame(lua_state, 6.0); if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_REVERSE_LR); boma.select_cliff_hangdata_from_name("special_hi"); notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 71, 80, 0, 67, 5.9, 0.0, 9.8, 10.7, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); @@ -203,35 +207,35 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 90, 0, 65, 3.8, 0.0, 23.3, 11.2, Some(0.0), Some(11.5), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 82, 0, 70, 3.8, 0.0, 23.3, 11.2, Some(0.0), Some(11.5), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 90, 0, 65, 3.6, 0.0, 26.0, 9.6, Some(0.0), Some(12.8), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 82, 0, 70, 3.6, 0.0, 26.0, 9.6, Some(0.0), Some(12.8), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 90, 0, 65, 3.5, 0.0, 28.5, 9.9, Some(0.0), Some(13.8), Some(7.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 82, 0, 70, 3.5, 0.0, 28.5, 9.9, Some(0.0), Some(13.8), Some(7.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 90, 0, 65, 3.5, 0.0, 30.0, 9.7, Some(0.0), Some(14.8), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 82, 0, 70, 3.5, 0.0, 30.0, 9.7, Some(0.0), Some(14.8), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); } frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 90, 0, 65, 3.3, 0.0, 31.5, 9.6, Some(0.0), Some(15.8), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 82, 0, 70, 3.3, 0.0, 31.5, 9.6, Some(0.0), Some(15.8), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 90, 0, 65, 3.3, 0.0, 30.0, 9.5, Some(0.0), Some(15.5), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 82, 0, 70, 3.3, 0.0, 30.0, 9.5, Some(0.0), Some(15.5), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 90, 0, 65, 3.5, 0.0, 29.0, 9.3, Some(0.0), Some(14.5), Some(7.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 82, 0, 70, 3.5, 0.0, 29.0, 9.3, Some(0.0), Some(14.5), Some(7.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 80, 90, 0, 65, 3.0, 0.0, 28.0, 9.3, Some(0.0), Some(14.5), Some(7.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 80, 82, 0, 70, 3.0, 0.0, 28.0, 9.3, Some(0.0), Some(14.5), Some(7.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP); } frame(lua_state, 23.0); if is_excute(agent) { @@ -260,7 +264,7 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 3.0); if is_excute(agent) { @@ -282,7 +286,9 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + if boma.is_situation(*SITUATION_KIND_GROUND) { + LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } } frame(lua_state, 24.0); if is_excute(agent) { diff --git a/fighters/richter/src/acmd/throws.rs b/fighters/richter/src/acmd/throws.rs index ed9c6b556c..bd0fc0431e 100644 --- a/fighters/richter/src/acmd/throws.rs +++ b/fighters/richter/src/acmd/throws.rs @@ -6,16 +6,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.7); if is_excute(agent) { + GrabModule::set_rebound(boma, true); FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.0, 6.0); } frame(lua_state, 9.0); - if is_excute(agent) { - GrabModule::set_rebound(boma, true); - } frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(8.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(8.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -61,7 +59,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-13.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -6.5, Some(0.0), Some(6.6), Some(-13.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -79,6 +77,10 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 43, 83, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 2.0); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 4.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 23.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 24, 7); @@ -111,7 +113,7 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 9.0); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 89, 70, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 103, 70, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 6.0); @@ -176,7 +178,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 58, 50, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 65, 64, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 23.0); diff --git a/fighters/richter/src/acmd/tilts.rs b/fighters/richter/src/acmd/tilts.rs index 40c7cd5e66..aedacd1567 100644 --- a/fighters/richter/src/acmd/tilts.rs +++ b/fighters/richter/src/acmd/tilts.rs @@ -5,9 +5,9 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 110, 45, 0, 75, 3.8, 0.0, 11.0, 32.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 361, 63, 0, 40, 4.6, 0.0, 11.0, 7.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 361, 63, 0, 40, 2.3, 0.0, 11.0, 7.0, Some(0.0), Some(11.0), Some(32.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 103, 49, 0, 75, 3.8, 0.0, 11.0, 32.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 45, 63, 0, 40, 4.6, 0.0, 11.0, 7.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 45, 63, 0, 40, 2.3, 0.0, 11.0, 7.0, Some(0.0), Some(11.0), Some(32.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } wait(lua_state, 3.0); if is_excute(agent) { @@ -84,9 +84,9 @@ unsafe extern "C" fn game_attacksquats3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 120, 45, 0, 75, 3.8, 0.0, 7.0, 30.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); - ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 361, 63, 0, 40, 4.6, 0.0, 7.0, 7.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 361, 63, 0, 40, 2.3, 0.0, 7.0, 7.0, Some(0.0), Some(7.0), Some(29.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 111, 43, 0, 75, 3.8, 0.0, 7.0, 30.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 45, 63, 0, 40, 4.6, 0.0, 7.0, 7.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 45, 63, 0, 40, 2.3, 0.0, 7.0, 7.0, Some(0.0), Some(7.0), Some(29.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } wait(lua_state, 3.0); if is_excute(agent) { @@ -277,9 +277,9 @@ unsafe extern "C" fn game_attackhi3l(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 280, 37, 0, 45, 3.8, 0.0, 44.5, -9.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 280, 37, 0, 45, 3.8, 0.0, 43.5, -11.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 100, 75, 0, 60, 5.5, 0.0, 18.0, 1.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); - ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 100, 75, 0, 60, 2.5, 0.0, 17.0, 1.0, Some(0.0), Some(42.5), Some(-9.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 100, 75, 0, 60, 2.5, 0.0, 17.0, 1.0, Some(0.0), Some(41.5), Some(-11.5), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 17.0); if is_excute(agent) { @@ -304,9 +304,9 @@ unsafe extern "C" fn game_attackhi3r(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 260, 37, 0, 45, 3.8, 0.0, 45.0, 12.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 260, 37, 0, 45, 3.8, 0.0, 44.0, 15.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 100, 75, 0, 60, 5.5, 0.0, 18.0, 1.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); - ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 100, 75, 0, 60, 2.5, 0.0, 17.0, 1.0, Some(0.0), Some(43.0), Some(12.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); + ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 100, 75, 0, 60, 2.5, 0.0, 17.0, 1.0, Some(0.0), Some(42.0), Some(15.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP); } frame(lua_state, 17.0); if is_excute(agent) { diff --git a/fighters/richter/src/axe/mod.rs b/fighters/richter/src/axe/mod.rs index 7f0a9f88e1..e8e3e1b098 100644 --- a/fighters/richter/src/axe/mod.rs +++ b/fighters/richter/src/axe/mod.rs @@ -2,10 +2,12 @@ use super::*; mod acmd; mod opff; +mod status; pub fn install() { let agent = &mut Agent::new("richter_axe"); acmd::install(agent); opff::install(agent); + status::install(agent); agent.install(); } diff --git a/fighters/richter/src/axe/status.rs b/fighters/richter/src/axe/status.rs new file mode 100644 index 0000000000..477801a976 --- /dev/null +++ b/fighters/richter/src/axe/status.rs @@ -0,0 +1,18 @@ +use super::*; + +pub unsafe extern "C" fn fly_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + let ret = smashline::original_status(Main, weapon, *WEAPON_SIMON_AXE_STATUS_KIND_FLY)(weapon); + + let owner_boma = weapon.get_owner_boma(); + if owner_boma.is_situation(*SITUATION_KIND_AIR) { + // change to -42 degrees + let lr = PostureModule::lr(owner_boma); + KineticModule::reflect_speed(weapon.module_accessor, &Vector3f::new(0.3584, lr * 0.9336, 0.0), *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + } + + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *WEAPON_SIMON_AXE_STATUS_KIND_FLY, fly_main); +} \ No newline at end of file diff --git a/fighters/richter/src/lib.rs b/fighters/richter/src/lib.rs index 6e555172d0..a27134d7c9 100644 --- a/fighters/richter/src/lib.rs +++ b/fighters/richter/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/richter/src/opff.rs b/fighters/richter/src/opff.rs index 7aae7baf63..02ff7b8335 100644 --- a/fighters/richter/src/opff.rs +++ b/fighters/richter/src/opff.rs @@ -7,7 +7,7 @@ use skyline_smash::app::lua_bind::ControlModule::clear_command_one; // allow fair to transition into their angled variants when the stick is angled up/down unsafe fn whip_angling(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, frame: f32, stick_y: f32) { if fighter.is_motion_one_of(&[Hash40::new("attack_air_f"), Hash40::new("attack_air_f_hi"), Hash40::new("attack_air_f_lw")]) - && (11.0..12.0).contains(&frame) { + && (5.0..6.0).contains(&frame) { let stick_y = if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_CSTICK_ON) { ControlModule::get_sub_stick_y(fighter.module_accessor) } diff --git a/fighters/richter/src/status/special_s.rs b/fighters/richter/src/status/special_s.rs index f08d8c9edc..18b8792c53 100644 --- a/fighters/richter/src/status/special_s.rs +++ b/fighters/richter/src/status/special_s.rs @@ -28,6 +28,13 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } + + // Reduce speed on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + let shield_hit_speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_speed_x_mul"); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, shield_hit_speed_x_mul); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { if fighter.is_situation(*SITUATION_KIND_GROUND) { GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); @@ -42,7 +49,7 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV else { GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); if VarModule::is_flag(fighter.battle_object, vars::richter::status::SPECIAL_S_ENABLE_GRAVITY) { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); } else { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR); @@ -56,12 +63,8 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV } if VarModule::is_flag(fighter.battle_object, vars::richter::status::SPECIAL_S_CHANGE_KINETIC) { VarModule::off_flag(fighter.battle_object, vars::richter::status::SPECIAL_S_CHANGE_KINETIC); - if fighter.is_situation(*SITUATION_KIND_GROUND) { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); - } - else { - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + if fighter.is_situation(*SITUATION_KIND_AIR) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); } } diff --git a/fighters/richter/src/whip/acmd.rs b/fighters/richter/src/whip/acmd.rs index 31862171c7..6ab67758ce 100644 --- a/fighters/richter/src/whip/acmd.rs +++ b/fighters/richter/src/whip/acmd.rs @@ -162,6 +162,18 @@ unsafe extern "C" fn effect_landingairn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + MotionModule::set_rate(boma, (15.0 - 1.0)/13.0); + if is_excute(agent) { + PhysicsModule::set_2nd_status(boma, *PH2NDARY_CRAW_NONE); + } + frame(lua_state, 15.0); + MotionModule::set_rate(boma, 1.0); +} + unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -254,11 +266,11 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_landingairn", disable_physics, Priority::Low); agent.acmd("effect_landingairn", effect_landingairn, Priority::Low); - agent.acmd("game_attackairfhi", disable_physics, Priority::Low); + agent.acmd("game_attackairfhi", game_attackairf, Priority::Low); agent.acmd("effect_attackairfhi", effect_attackairf, Priority::Low); - agent.acmd("game_attackairf", disable_physics, Priority::Low); + agent.acmd("game_attackairf", game_attackairf, Priority::Low); agent.acmd("effect_attackairf", effect_attackairf, Priority::Low); - agent.acmd("game_attackairflw", disable_physics, Priority::Low); + agent.acmd("game_attackairflw", game_attackairf, Priority::Low); agent.acmd("effect_attackairflw", effect_attackairf, Priority::Low); agent.acmd("game_landingairf", disable_physics, Priority::Low); diff --git a/fighters/ridley/Cargo.toml b/fighters/ridley/Cargo.toml index 592bc1a3f1..be239ca557 100644 --- a/fighters/ridley/Cargo.toml +++ b/fighters/ridley/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/ridley/src/acmd/ground.rs b/fighters/ridley/src/acmd/ground.rs index 3c8b17b2f9..3c97e8c74c 100644 --- a/fighters/ridley/src/acmd/ground.rs +++ b/fighters/ridley/src/acmd/ground.rs @@ -12,6 +12,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { AttackModule::clear_all(boma); + } + frame(lua_state, 8.0); + if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } @@ -38,12 +41,12 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 9.0); + frame(lua_state, 11.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } - frame(lua_state, 12.0); + frame(lua_state, 14.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); } diff --git a/fighters/ridley/src/acmd/other.rs b/fighters/ridley/src/acmd/other.rs index 84235837d9..4c0ce68976 100644 --- a/fighters/ridley/src/acmd/other.rs +++ b/fighters/ridley/src/acmd/other.rs @@ -44,7 +44,7 @@ unsafe extern "C" fn expression_landingheavy(agent: &mut L2CAgentBase) { if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_landl"), 0, false, 0x50000000 /* default value */); slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); - if !agent.is_prev_status(*FIGHTER_STATUS_KIND_ESCAPE_AIR) { + if !agent.is_prev_status_one_of(&[*FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_STATUS_KIND_DAMAGE_AIR]) { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } } @@ -89,15 +89,11 @@ unsafe extern "C" fn game_dashturn(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -107,10 +103,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { diff --git a/fighters/ridley/src/acmd/specials.rs b/fighters/ridley/src/acmd/specials.rs index dfc416c756..4a73f5abe1 100644 --- a/fighters/ridley/src/acmd/specials.rs +++ b/fighters/ridley/src/acmd/specials.rs @@ -159,9 +159,9 @@ unsafe extern "C" fn game_specialsstart(agent: &mut L2CAgentBase) { frame(lua_state, 24.0); if is_excute(agent) { notify_event_msc_cmd!(agent, 0x2127e37c07u64, *GROUND_CLIFF_CHECK_KIND_NONE); - CATCH(agent, 0, Hash40::new("top"), 7.0, 0.0, 10.0, 11.5, None, None, None, *FIGHTER_STATUS_KIND_CATCHED_RIDLEY, *COLLISION_SITUATION_MASK_G); + CATCH(agent, 0, Hash40::new("top"), 6.0, 0.0, 8.5, 12.5, None, None, None, *FIGHTER_STATUS_KIND_CATCHED_RIDLEY, *COLLISION_SITUATION_MASK_G); CATCH(agent, 1, Hash40::new("top"), 4.5, 0.0, 10.0, 14.0, None, None, None, *FIGHTER_STATUS_KIND_CATCHED_RIDLEY, *COLLISION_SITUATION_MASK_A); - CATCH(agent, 2, Hash40::new("top"), 5.0, 0.0, 8.0, 6.5, None, None, None, *FIGHTER_STATUS_KIND_CATCHED_RIDLEY, *COLLISION_SITUATION_MASK_G); + CATCH(agent, 2, Hash40::new("top"), 5.0, 0.0, 7.0, 6.5, None, None, None, *FIGHTER_STATUS_KIND_CATCHED_RIDLEY, *COLLISION_SITUATION_MASK_G); GrabModule::set_constraint(boma, 0, true); GrabModule::set_constraint(boma, 1, true); GrabModule::set_constraint(boma, 2, true); @@ -201,7 +201,7 @@ unsafe extern "C" fn game_specialsdragcliff(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 42, 92, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 7.0, 42, 107, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 50, 90, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 6.0); diff --git a/fighters/ridley/src/acmd/throws.rs b/fighters/ridley/src/acmd/throws.rs index fd4a393679..c3554d5c2b 100644 --- a/fighters/ridley/src/acmd/throws.rs +++ b/fighters/ridley/src/acmd/throws.rs @@ -3,14 +3,14 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 7.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 7.5, 0.0, Some(0.0), Some(7.5), Some(12.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 7.5, 5.0, Some(0.0), Some(7.5), Some(12.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -30,7 +30,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 7.5, 7.0, Some(0.0), Some(7.5), Some(11.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 5.0, 0.0, 7.5, 5.0, Some(0.0), Some(7.5), Some(11.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); @@ -65,7 +65,7 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 38, 65, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 41, 75, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 12.0); @@ -98,7 +98,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 40, 60, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 40, 67, 0, 58, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 17.0); @@ -120,13 +120,13 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 87, 144, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 87, 112, 0, 48, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("tail8"), 8.0, 87, 100, 0, 55, 4.5, 5.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_TAIL); - ATTACK(agent, 1, 0, Hash40::new("tail8"), 8.0, 87, 100, 0, 55, 4.5, -2.0, 1.0, 1.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_TAIL); + ATTACK(agent, 0, 0, Hash40::new("tail8"), 9.0, 87, 100, 0, 55, 4.5, 5.0, 0.0, 0.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_TAIL); + ATTACK(agent, 1, 0, Hash40::new("tail8"), 9.0, 87, 100, 0, 55, 4.5, -2.0, 1.0, 1.0, None, None, None, 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_TAIL); AttackModule::set_catch_only_all(boma, true, false); } wait(lua_state, 2.0); diff --git a/fighters/ridley/src/lib.rs b/fighters/ridley/src/lib.rs index 37ecf3c486..0304bb92fc 100644 --- a/fighters/ridley/src/lib.rs +++ b/fighters/ridley/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/robot/Cargo.toml b/fighters/robot/Cargo.toml index ead324012a..dc6e2075f3 100644 --- a/fighters/robot/Cargo.toml +++ b/fighters/robot/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/robot/src/acmd/aerials.rs b/fighters/robot/src/acmd/aerials.rs index f9dd1276a7..5f38645e2c 100644 --- a/fighters/robot/src/acmd/aerials.rs +++ b/fighters/robot/src/acmd/aerials.rs @@ -114,18 +114,7 @@ unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 9, 8, 180, -130, 90, 1.0, true, *EF_FLIP_ZX); - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - let color_vec = match color { - 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, - 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, - 2 => Vector3f::new(0.176, 0.137, 0.059), - 3 => Vector3f::new(0.235, 0.196, 0.255), - 4 => Vector3f::new(0.098, 0.157, 0.196), - 5 => Vector3f::new(0.098, 0.059, 0.0), - 6 => Vector3f::new(0.098, 0.098, 0.157), - 7 => Vector3f::new(0.118, 0.039, 0.051), - _ => Vector3f::new(0.196, 0.196, 0.216) - }; + let color_vec = GET_COLOR_VEC(boma); LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); LAST_EFFECT_SET_RATE(agent, 2.0); LAST_EFFECT_SET_SCALE_W(agent, 0.8, 1.4, 1.4); @@ -218,15 +207,16 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 18.0); if is_excute(agent) { + let attr = if VarModule::is_flag(agent.battle_object, vars::robot::status::ATTACK_AIR_B_MAX_CHARGE) {"collision_attr_aura"} else {"collision_attr_fire"}; if VarModule::is_flag(agent.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { let charge_attack_damage_mul = 1.0 + (VarModule::get_float(agent.battle_object, vars::robot::status::ATTACK_AIR_B_CHARGE_LEVEL) * 0.07); - ATTACK(agent, 0, 0, Hash40::new("knee"), 12.0 * charge_attack_damage_mul, 35, 85, 0, 30, 7.5, 3.0, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("hip"), 12.0 * charge_attack_damage_mul, 35, 85, 0, 30, 4.0, 7.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("knee"), 12.0 * charge_attack_damage_mul, 35, 85, 0, 30, 4.0, 0.0, 0.0, 0.0, Some(16.0), Some(0.0), Some(0.0), 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("knee"), 12.0 * charge_attack_damage_mul, 35, 85, 0, 30, 7.5, 3.0, 0.0, 0.0, Some(5.0), Some(0.0), Some(0.0), 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("hip"), 12.0 * charge_attack_damage_mul, 35, 85, 0, 30, 4.0, 7.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("knee"), 12.0 * charge_attack_damage_mul, 35, 85, 0, 30, 4.0, 0.0, 0.0, 0.0, Some(16.0), Some(0.0), Some(0.0), 1.2, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } else { - ATTACK(agent, 0, 0, Hash40::new("knee"), 12.0, 35, 70, 0, 35, 6.0, 0.0, 0.0, 0.0, Some(4.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("hip"), 12.0, 35, 70, 0, 35, 4.0, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("knee"), 12.0, 35, 70, 0, 35, 4.0, 0.0, 0.0, 0.0, Some(12.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("knee"), 12.0, 35, 70, 0, 35, 6.0, 0.0, 0.0, 0.0, Some(4.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("hip"), 12.0, 35, 70, 0, 35, 4.0, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("knee"), 12.0, 35, 70, 0, 35, 4.0, 0.0, 0.0, 0.0, Some(12.0), Some(0.0), Some(0.0), 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } FT_MOTION_RATE(agent, 0.7); WorkModule::off_flag(boma, vars::robot::instance::ATTACK_AIR_B_USED); @@ -234,10 +224,11 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 24.0); if is_excute(agent) { + let attr = if VarModule::is_flag(agent.battle_object, vars::robot::status::ATTACK_AIR_B_MAX_CHARGE) {"collision_attr_aura"} else {"collision_attr_fire"}; let charge_attack_damage_mul = 1.0 + (VarModule::get_float(agent.battle_object, vars::robot::status::ATTACK_AIR_B_CHARGE_LEVEL) * 0.07); - ATTACK(agent, 0, 0, Hash40::new("knee"), 8.0 * charge_attack_damage_mul, 361, 80, 0, 35, 6.0, 0.0, 0.0, 0.0, Some(4.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("hip"), 8.0 * charge_attack_damage_mul, 361, 80, 0, 35, 4.0, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("knee"), 8.0 * charge_attack_damage_mul, 361, 80, 0, 35, 4.0, 0.0, 0.0, 0.0, Some(12.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("knee"), 8.0 * charge_attack_damage_mul, 361, 80, 0, 35, 6.0, 0.0, 0.0, 0.0, Some(4.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("hip"), 8.0 * charge_attack_damage_mul, 361, 80, 0, 35, 4.0, 7.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("knee"), 8.0 * charge_attack_damage_mul, 361, 80, 0, 35, 4.0, 0.0, 0.0, 0.0, Some(12.0), Some(0.0), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } frame(lua_state, 34.0); if is_excute(agent) { @@ -383,10 +374,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 85, 80, 0, 35, 7.5, 0.0, 15.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 85, 80, 0, 35, 9.5, 0.0, 24.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 367, 80, 0, 45, 7.5, 0.0, 15.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.5, 367, 80, 0, 45, 9.5, 0.0, 24.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 107, 35, 0, 47, 7.5, 0.0, 14.5, -0.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 117, 35, 0, 35, 7.5, 0.0, 14.5, -0.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 217, 35, 0, 35, 8.75, 0.0, 23.25, -1.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 1.0); if is_excute(agent) { @@ -394,10 +384,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 85, 80, 0, 35, 7.5, 0.0, 15.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 85, 80, 0, 35, 9.5, 0.0, 24.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 367, 80, 0, 45, 7.5, 0.0, 15.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.5, 367, 80, 0, 45, 9.5, 0.0, 24.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 107, 33, 0, 47, 7.5, 0.0, 14.5, -0.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 117, 33, 0, 33, 7.5, 0.0, 14.5, -0.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 217, 33, 0, 33, 8.75, 0.0, 23.25, -1.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 1.0); if is_excute(agent) { @@ -405,10 +394,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 85, 80, 0, 35, 7.5, 0.0, 15.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 85, 80, 0, 35, 9.5, 0.0, 24.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 367, 80, 0, 45, 7.5, 0.0, 15.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.5, 367, 80, 0, 45, 9.5, 0.0, 24.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 107, 33, 0, 47, 7.5, 0.0, 14.5, -0.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 117, 33, 0, 33, 7.5, 0.0, 14.5, -0.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 217, 33, 0, 33, 8.75, 0.0, 23.25, -1.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 1.0); if is_excute(agent) { @@ -416,10 +404,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 85, 80, 0, 35, 7.5, 0.0, 15.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 85, 80, 0, 35, 9.5, 0.0, 24.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 367, 80, 0, 45, 7.5, 0.0, 15.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.5, 367, 80, 0, 45, 9.5, 0.0, 24.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 107, 33, 0, 47, 7.5, 0.0, 14.5, -0.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 117, 33, 0, 33, 7.5, 0.0, 14.5, -0.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 217, 33, 0, 33, 8.75, 0.0, 23.25, -1.75, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 1.0); if is_excute(agent) { @@ -427,8 +414,12 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 23.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 70, 105, 0, 65, 8.0, 0.0, 16.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 70, 105, 0, 65, 10.0, 0.0, 24.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 106, 123, 0, 60, 8.0, 0.0, 16.0, -0.5, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 106, 123, 0, 60, 9.25, 0.0, 23.5, -1.25, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 24.0); + if is_excute(agent) { + AttackModule::set_offset(boma, 1, &Vector3f{ x: 0.0, y: 22.0, z: -2.75}); } wait(lua_state, 4.0); if is_excute(agent) { @@ -440,6 +431,71 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + let color_vec = GET_COLOR_VEC(boma); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("robot_nozzle_flare"), Hash40::new("knee"), 0, 0, 0, 90, -90, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("robot_jump_jet"), Hash40::new("knee"), 0, 0, 0, 90, -90, 0, 1, true); + } + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4, 17, 4.5, -90, 10, 30, 1.11, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + } + frame(lua_state, 8.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4, 17, -7.5, -90, 10, 30, 1.11, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4, 17, 4.5, -90, -10, 210, 1.11, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + } + frame(lua_state, 11.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4, 17, -7.5, -90, -10, 210, 1.11, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + } + frame(lua_state, 12.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4, 17, 4.5, -90, 10, 30, 1.11, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + } + frame(lua_state, 16.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4, 17, -7.5, -90, 10, 30, 1.11, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + } + frame(lua_state, 17.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4, 17, 4.5, -90, 10, 30, 1.11, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + } + frame(lua_state, 22.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 9, 16, 4.5, -90, 10, 30, 1.175, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 4, 13, -7.5, -90, 10, 20, 1.175, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); + LAST_EFFECT_SET_RATE(agent, 3.0); + } + frame(lua_state, 23.0); + if is_excute(agent) { + EFFECT_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 25.5, -2.75, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, true, 0.7); + } +} + unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -480,18 +536,7 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); let mut effectX = 48.0; frame(lua_state, 6.0); - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - let color_vec = match color { - 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, - 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, - 2 => Vector3f::new(0.176, 0.137, 0.059), - 3 => Vector3f::new(0.235, 0.196, 0.255), - 4 => Vector3f::new(0.098, 0.157, 0.196), - 5 => Vector3f::new(0.098, 0.059, 0.0), - 6 => Vector3f::new(0.098, 0.098, 0.157), - 7 => Vector3f::new(0.118, 0.039, 0.051), - _ => Vector3f::new(0.196, 0.196, 0.216) - }; + let color_vec = GET_COLOR_VEC(boma); for _ in 0..6 { if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 3, 10, 1.5, effectX, 30, 0, 1.2, true, *EF_FLIP_NONE); @@ -575,6 +620,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_landingairb", game_landingairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); + agent.acmd("effect_attackairhi", effect_attackairhi, Priority::Low); agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); agent.acmd("effect_attackairlw", effect_attackairlw, Priority::Low); diff --git a/fighters/robot/src/acmd/ground.rs b/fighters/robot/src/acmd/ground.rs index 34c89f3788..99f6a0f088 100644 --- a/fighters/robot/src/acmd/ground.rs +++ b/fighters/robot/src/acmd/ground.rs @@ -9,8 +9,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 361, 70, 0, 20, 2.5, 0.0, 9.0, 10.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 100, 70, 0, 20, 2.8, 0.0, 8.4, 14.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 100, 70, 0, 20, 2.8, 0.0, 8.4, 14.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - // Locking hitbox + // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 2.8, 0.0, 3.5, 6.5, Some(0.0), Some(3.5), Some(14.2), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); } frame(lua_state, 5.0); if is_excute(agent) { diff --git a/fighters/robot/src/acmd/mod.rs b/fighters/robot/src/acmd/mod.rs index d8a22387b4..cfa29d711c 100644 --- a/fighters/robot/src/acmd/mod.rs +++ b/fighters/robot/src/acmd/mod.rs @@ -8,6 +8,20 @@ mod specials; mod throws; mod other; +pub unsafe fn GET_COLOR_VEC(boma: &mut BattleObjectModuleAccessor) -> Vector3f { + return match boma.get_int(*FIGHTER_INSTANCE_WORK_ID_INT_COLOR) { + 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, + 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, + 2 => Vector3f::new(0.176, 0.137, 0.059), + 3 => Vector3f::new(0.235, 0.196, 0.255), + 4 => Vector3f::new(0.098, 0.157, 0.196), + 5 => Vector3f::new(0.098, 0.059, 0.0), + 6 => Vector3f::new(0.098, 0.098, 0.157), + 7 => Vector3f::new(0.118, 0.039, 0.051), + _ => Vector3f::new(0.196, 0.196, 0.216) + }; +} + pub fn install(agent: &mut Agent) { ground::install(agent); tilts::install(agent); diff --git a/fighters/robot/src/acmd/other.rs b/fighters/robot/src/acmd/other.rs index e71ad2c8f5..903b4b10d6 100644 --- a/fighters/robot/src/acmd/other.rs +++ b/fighters/robot/src/acmd/other.rs @@ -77,15 +77,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -95,10 +91,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_itemlightthrowdash(agent: &mut L2CAgentBase) { diff --git a/fighters/robot/src/acmd/specials.rs b/fighters/robot/src/acmd/specials.rs index a98eaacd59..cf5bcfd150 100644 --- a/fighters/robot/src/acmd/specials.rs +++ b/fighters/robot/src/acmd/specials.rs @@ -30,18 +30,7 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("robot_armspin_wind"), Hash40::new("body"), 1, 0, 0, 0, -100, -90, 1, true); EFFECT_FOLLOW(agent, Hash40::new("robot_armspin"), Hash40::new("body"), 1, 0, 0, 0, 60, 90, 1, true); - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - let color_vec = match color { - 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, - 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, - 2 => Vector3f::new(0.176, 0.137, 0.059), - 3 => Vector3f::new(0.235, 0.196, 0.255), - 4 => Vector3f::new(0.098, 0.157, 0.196), - 5 => Vector3f::new(0.098, 0.059, 0.0), - 6 => Vector3f::new(0.098, 0.098, 0.157), - 7 => Vector3f::new(0.118, 0.039, 0.051), - _ => Vector3f::new(0.196, 0.196, 0.216) - }; + let color_vec = GET_COLOR_VEC(boma); LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); if agent.is_situation(*SITUATION_KIND_GROUND) { LANDING_EFFECT_FLIP(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false, *EF_FLIP_NONE); @@ -62,18 +51,7 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { frame(lua_state, 19.0); if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 11.5, 3, 0, -15, 0, 1.5, true, *EF_FLIP_YZ); - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - let color_vec = match color { - 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, - 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, - 2 => Vector3f::new(0.176, 0.137, 0.059), - 3 => Vector3f::new(0.235, 0.196, 0.255), - 4 => Vector3f::new(0.098, 0.157, 0.196), - 5 => Vector3f::new(0.098, 0.059, 0.0), - 6 => Vector3f::new(0.098, 0.098, 0.157), - 7 => Vector3f::new(0.118, 0.039, 0.051), - _ => Vector3f::new(0.196, 0.196, 0.216) - }; + let color_vec = GET_COLOR_VEC(boma); LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); } } @@ -157,17 +135,7 @@ unsafe extern "C" fn effect_specialshi(agent: &mut L2CAgentBase) { EFFECT_FOLLOW(agent, Hash40::new("robot_armspin_wind"), Hash40::new("body"), 1, 0, 0, 0, -100, -90, 1, true); EFFECT_FOLLOW(agent, Hash40::new("robot_armspin"), Hash40::new("body"), 1, 0, 0, 0, 60, 90, 1, true); let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - let color_vec = match color { - 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, - 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, - 2 => Vector3f::new(0.176, 0.137, 0.059), - 3 => Vector3f::new(0.235, 0.196, 0.255), - 4 => Vector3f::new(0.098, 0.157, 0.196), - 5 => Vector3f::new(0.098, 0.059, 0.0), - 6 => Vector3f::new(0.098, 0.098, 0.157), - 7 => Vector3f::new(0.118, 0.039, 0.051), - _ => Vector3f::new(0.196, 0.196, 0.216) - }; + let color_vec = GET_COLOR_VEC(boma); LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); if agent.is_situation(*SITUATION_KIND_GROUND) { LANDING_EFFECT_FLIP(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false, *EF_FLIP_NONE); @@ -190,18 +158,7 @@ unsafe extern "C" fn effect_specialshi(agent: &mut L2CAgentBase) { else { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 15.5, 4, -45, 0, 45, 1.5, true, *EF_FLIP_NONE); } - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - let color_vec = match color { - 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, - 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, - 2 => Vector3f::new(0.176, 0.137, 0.059), - 3 => Vector3f::new(0.235, 0.196, 0.255), - 4 => Vector3f::new(0.098, 0.157, 0.196), - 5 => Vector3f::new(0.098, 0.059, 0.0), - 6 => Vector3f::new(0.098, 0.098, 0.157), - 7 => Vector3f::new(0.118, 0.039, 0.051), - _ => Vector3f::new(0.196, 0.196, 0.216) - }; + let color_vec = GET_COLOR_VEC(boma); LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); LAST_EFFECT_SET_SCALE_W(agent, 0.8, 1.5, 1.5); } @@ -237,18 +194,7 @@ unsafe extern "C" fn effect_specialslw(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("robot_armspin_wind"), Hash40::new("body"), 1, 0, 0, 0, -100, -90, 1, true); EFFECT_FOLLOW(agent, Hash40::new("robot_armspin"), Hash40::new("body"), 1, 0, 0, 0, 60, 90, 1, true); - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - let color_vec = match color { - 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, - 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, - 2 => Vector3f::new(0.176, 0.137, 0.059), - 3 => Vector3f::new(0.235, 0.196, 0.255), - 4 => Vector3f::new(0.098, 0.157, 0.196), - 5 => Vector3f::new(0.098, 0.059, 0.0), - 6 => Vector3f::new(0.098, 0.098, 0.157), - 7 => Vector3f::new(0.118, 0.039, 0.051), - _ => Vector3f::new(0.196, 0.196, 0.216) - }; + let color_vec = GET_COLOR_VEC(boma); LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); if agent.is_situation(*SITUATION_KIND_GROUND) { LANDING_EFFECT_FLIP(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false, *EF_FLIP_NONE); @@ -263,18 +209,7 @@ unsafe extern "C" fn effect_specialslw(agent: &mut L2CAgentBase) { frame(lua_state, 20.0); if is_excute(agent) { EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 0, 10.5, 5, 30, -15, -20, 1.5, true, *EF_FLIP_YZ); - let color = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_COLOR); - let color_vec = match color { - 0 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.1, 0.01, 0.0) } else { Vector3f::new(0.196, 0.196, 0.216) }, - 1 => if WorkModule::is_flag(boma, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLAG_REGION_JP) { Vector3f::new(0.196, 0.196, 0.216) } else { Vector3f::new(0.22, 0.059, 0.039) }, - 2 => Vector3f::new(0.176, 0.137, 0.059), - 3 => Vector3f::new(0.235, 0.196, 0.255), - 4 => Vector3f::new(0.098, 0.157, 0.196), - 5 => Vector3f::new(0.098, 0.059, 0.0), - 6 => Vector3f::new(0.098, 0.098, 0.157), - 7 => Vector3f::new(0.118, 0.039, 0.051), - _ => Vector3f::new(0.196, 0.196, 0.216) - }; + let color_vec = GET_COLOR_VEC(boma); LAST_EFFECT_SET_COLOR(agent, color_vec.x, color_vec.y, color_vec.z); } frame(lua_state, 23.0); @@ -289,14 +224,10 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - if agent.is_situation(*SITUATION_KIND_GROUND) { - FT_MOTION_RATE_RANGE(agent, 1.0, 14.0, 4.0); - } - frame(lua_state, 14.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - } + FT_MOTION_RATE_RANGE(agent, 1.0, 11.0, 8.0); + frame(lua_state, 11.0); + let charge_frame_max = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_max") - 8.0; + FT_MOTION_RATE_RANGE(agent, 11.0, 58.0, charge_frame_max); } unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { @@ -305,38 +236,18 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("robot_nozzle_flare"), Hash40::new("knee1"), 1.5, 0, 0, 90, -90, 0, 1, true); } - frame(lua_state, 4.0); if agent.is_situation(*SITUATION_KIND_GROUND) { - let turbo_indicator = EffectModule::req_follow( - boma, - Hash40::new("robot_lamp_l"), - Hash40::new("knee"), - &Vector3f::new(6.0, 0.0, 0.0), - &Vector3f::zero(), - 4.0, - true, - 0, - 0, - 0, - 0, - 0, - true, - true - ) as u32; + EffectModule::req_time_follow(boma, Hash40::new("robot_lamp_l"), Hash40::new("knee"), 60, &Vector3f::new(6.0, 0.0, 0.0), &Vector3f::zero(), 4.0, true, 0); LAST_EFFECT_SET_RATE(agent, 1.25); } - frame(lua_state, 15.0); + frame(lua_state, 11.0); for _ in 0..20 { if is_excute(agent) { - if agent.is_situation(*SITUATION_KIND_AIR) { - LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 2, 2, 0, 160, 0, 0, 1.0, 10, 0, 4, 0, 0, 0, true); - } else { - LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.1, 10, 0, 4, 0, 0, 0, true); - } + LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, -0.5, 0, 0, 0, 0, 1.1, 10, 0, 4, 0, 0, 0, true); LAST_EFFECT_SET_RATE(agent, 0.75); } - wait(lua_state, 10.0); + wait(lua_state, 15.36); } } @@ -360,82 +271,113 @@ unsafe extern "C" fn expression_specialhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialhirise(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let charge_frame = VarModule::get_int(agent.battle_object, vars::robot::instance::SPECIAL_HI_CHARGE_FRAME) as f32; - frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 8.0, 4.0); + frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - - let damage = if boma.is_prev_situation(*SITUATION_KIND_GROUND) { - charge_frame / 1.5 - } else { - charge_frame / 3.0 - }; - - if charge_frame <= 10.0 { - MeterModule::drain_direct(agent.object(), 20.0); - } else if boma.is_prev_situation(*SITUATION_KIND_GROUND) { - MeterModule::drain_direct(agent.object(), charge_frame * 4.0); - } else { - MeterModule::drain_direct(agent.object(), charge_frame * 2.0); - } - if charge_frame >= 10.0 { + // charge stage + let charge_frame = VarModule::get_int(agent.battle_object, vars::robot::instance::SPECIAL_HI_CHARGE_FRAME) as f32; + let charge_frame_stage_1 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_1"); + let charge_frame_stage_2 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_2"); + let charge_frame_stage_3 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_3"); + let charge_stage = + if charge_frame >= charge_frame_stage_3 {4.0} + else if charge_frame >= charge_frame_stage_2 {3.0} + else if charge_frame >= charge_frame_stage_1 {2.0} + else {1.0}; + // drain + let launch_fuel_min = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.launch_fuel_min"); + MeterModule::drain_direct(agent.object(), (charge_frame * 2.0).max(launch_fuel_min)); + if charge_stage > 1.0 { + // launch angle let rot = VarModule::get_float(boma.object(), vars::robot::instance::SPECIAL_HI_ROT_X); - let angle = (270.0 - (rot * agent.lr() * 0.5)) as u64; - //println!("{}", angle); - ATTACK(agent, 0, 0, Hash40::new("knee"), damage, angle, 50, 0, 15, 5.0, -4.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("knee"), damage, angle, 50, 0, 15, 7.5, 5.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("knee"), damage, angle, 50, 0, 15, 5.0, 12.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + let angle_ground = (90.0 - (rot * agent.lr() * 0.5)) as u64; + let angle_air = (270.0 - (rot * agent.lr() * 0.5)) as u64; + let offset_x = 9.5 + 0.5*charge_stage; // tip range extends with charge + let size_mul = 0.65 + 0.075*charge_stage; // less disjoint on lower charges + // fire color + let attr = if charge_stage > 3.0 {"collision_attr_aura"} else {"collision_attr_fire"}; + // damage + let damage = (charge_frame / 3.0).min(20.0); // make sure gr and air matches + // air version spikes and has a tip hitbox, gr ver is shorter but thicker and pops up with ground only take-off hitboxes + if !VarModule::is_flag(agent.battle_object, vars::robot::instance::SPECIAL_HI_GROUND_START) { + ATTACK(agent, 0, 0, Hash40::new("knee"), damage, angle_air, 50, 0, 15, 5.0, -4.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("knee"), damage, angle_air, 50, 0, 15, 8.0 * size_mul, 4.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("knee"), damage, angle_air, 50, 0, 15, 5.0 * size_mul, offset_x, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + } else { + ATTACK(agent, 0, 0, Hash40::new("knee"), damage, angle_ground, 50, 0, 45, 6.0, -4.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("knee"), damage, angle_ground, 50, 0, 45, 9.0 * size_mul, 3.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 2, 0, Hash40::new("knee"), damage, angle_ground, 50, 0, 45, 5.5 * size_mul, -1.0, 6.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 3, 0, Hash40::new("knee"), damage, angle_ground, 50, 0, 45, 5.5 * size_mul, -1.0, -6.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new(attr), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + } // doesnt spike on ground, larger hitboxes but doesnt have tip of burner } } - - frame(lua_state, 4.0); - FT_MOTION_RATE(agent, - if VarModule::is_flag(agent.battle_object, vars::robot::instance::SPECIAL_HI_GROUND_START) { 0.17 } - else { 0.34 } - ); + frame(lua_state, 11.0); // 8 + let lag = if VarModule::is_flag(agent.battle_object, vars::robot::instance::SPECIAL_HI_GROUND_START) {14.0} else {24.0}; + FT_MOTION_RATE_RANGE(agent, 11.0, 47.0, lag); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 47.0); // cancel frame, 20/30 faf + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_specialhirise(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let charge_frame = VarModule::get_int(agent.battle_object, vars::robot::instance::SPECIAL_HI_CHARGE_FRAME); + let charge_frame = VarModule::get_int(agent.battle_object, vars::robot::instance::SPECIAL_HI_CHARGE_FRAME) as f32; + let charge_frame_stage_1 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_1"); + let charge_frame_stage_2 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_2"); + let charge_frame_stage_3 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_3"); + let charge_stage = + if charge_frame >= charge_frame_stage_3 {4.0} + else if charge_frame >= charge_frame_stage_2 {3.0} + else if charge_frame >= charge_frame_stage_1 {2.0} + else {1.0}; + let color: [f32;3] = [ // fades from red to blue as the charge increases + /* R */ (1.0 - ((charge_frame - 10.0) * 0.02)).clamp(0.15, 1.0), + /* G */ 0.55, + /* B */ (0.0 + ((charge_frame - 10.0) * 0.25)).clamp(0.0, 10.0) + ]; if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("robot_nozzle_flare"), Hash40::new("knee1"), 1.5, 0, 0, 90, -90, 0, 1, true); - LAST_EFFECT_SET_COLOR(agent, 0.55, 0.55, 2.25); - } - if charge_frame >= 10 { - frame(lua_state, 1.0); - let color: [f32;3] = [ // fades from red to blue as the charge increases - /* R */ (1.0 - ((charge_frame - 10) as f32 * 0.02)).clamp(0.15, 1.0), - /* G */ 0.55, - /* B */ (0.0 + ((charge_frame - 10) as f32 * 0.25)).clamp(0.0, 10.0) - ]; + if charge_stage > 3.0 { LAST_EFFECT_SET_COLOR(agent, color[0], color[1], color[2]); } + } + if charge_stage > 1.0 { + frame(lua_state, 5.0); if is_excute(agent) { + let fire = if charge_stage > 3.0 {"sys_hit_aura_s"} else {"sys_hit_fire_s"}; + let mut scale_side = 0.5 + 0.075*charge_stage; + let mut scale_y = 0.4 + 0.08*charge_stage; + if VarModule::is_flag(agent.battle_object, vars::robot::instance::SPECIAL_HI_GROUND_START) { + scale_side = 0.6 + 0.075*charge_stage; + scale_y = 0.35 + 0.08*charge_stage; + EFFECT(agent, Hash40::new(fire), Hash40::new("knee"), -1.25, 6.5, 0, -90, -90, 0, 0.35, 0, 0, 0, 0, 0, 0, false); + EFFECT(agent, Hash40::new(fire), Hash40::new("knee"), -1.25, -6.5, 0, -90, -90, 0, 0.35, 0, 0, 0, 0, 0, 0, false); + } EFFECT_FOLLOW(agent, Hash40::new("robot_atk_lw_jet"), Hash40::new("knee"), 0, 0, 0, -90, -90, 0, 0.8, true); LAST_EFFECT_SET_RATE(agent, 0.8); - if charge_frame >= 30 { LAST_EFFECT_SET_COLOR(agent, color[0], color[1], color[2]); } - EffectModule::set_scale_last(boma, &Vector3f::new(1.0, 0.75, 1.0)); + if charge_stage > 3.0 { LAST_EFFECT_SET_COLOR(agent, color[0], color[1], color[2]); } + EffectModule::set_scale_last(boma, &Vector3f::new(scale_side, scale_y, scale_side)); EFFECT_FOLLOW(agent, Hash40::new("robot_atk_lw_jet"), Hash40::new("knee1"), 0, 0, 0, -90, -90, 0, 0.8, true); LAST_EFFECT_SET_RATE(agent, 1.5); LAST_EFFECT_SET_ALPHA(agent, 0.75); - if charge_frame >= 30 { LAST_EFFECT_SET_COLOR(agent, color[0], color[1], color[2]); } - EffectModule::set_scale_last(boma, &Vector3f::new(1.0, 0.75, 1.0)); + if charge_stage > 3.0 { LAST_EFFECT_SET_COLOR(agent, color[0], color[1], color[2]); } + EffectModule::set_scale_last(boma, &Vector3f::new(scale_side, scale_y, scale_side)); } - frame(lua_state, 2.0); + frame(lua_state, 10.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("robot_nozzle_flare"), Hash40::new("knee1"), 1.5, 0, 0, 90, -90, 0, 1, true); - if charge_frame >= 30 { LAST_EFFECT_SET_COLOR(agent, color[0], color[1], color[2]); } + if charge_stage > 3.0 { LAST_EFFECT_SET_COLOR(agent, color[0], color[1], color[2]); } } - frame(lua_state, 11.0); + frame(lua_state, 22.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("robot_nozzle_flare"), false, false); } } else { - frame(lua_state, 1.0); + frame(lua_state, 7.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("sys_spin_wind"), Hash40::new("knee"), 0, 0, 0, -90, -90, 0, 0.8, true); LAST_EFFECT_SET_RATE(agent, 0.8); @@ -453,14 +395,17 @@ unsafe extern "C" fn effect_specialhirise(agent: &mut L2CAgentBase) { unsafe extern "C" fn expression_specialhirise(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let charge_frame = VarModule::get_int(agent.battle_object, vars::robot::instance::SPECIAL_HI_CHARGE_FRAME); frame(lua_state, 1.0); if is_excute(agent) { - if charge_frame >= 48 { + let charge_frame = VarModule::get_int(agent.battle_object, vars::robot::instance::SPECIAL_HI_CHARGE_FRAME) as f32; + let charge_frame_stage_1 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_1"); + let charge_frame_stage_2 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_2"); + let charge_frame_stage_3 = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_3"); + if charge_frame >= charge_frame_stage_3 { QUAKE(agent, *CAMERA_QUAKE_KIND_L); - } else if charge_frame >= 32{ + } else if charge_frame >= charge_frame_stage_2 { QUAKE(agent, *CAMERA_QUAKE_KIND_M); - } else if charge_frame >= 16 { + } else if charge_frame >= charge_frame_stage_1 { QUAKE(agent, *CAMERA_QUAKE_KIND_S); } RUMBLE_HIT(agent, Hash40::new("rbkind_explosion"), 0); diff --git a/fighters/robot/src/acmd/throws.rs b/fighters/robot/src/acmd/throws.rs index 90f79c1df2..451bb7d326 100644 --- a/fighters/robot/src/acmd/throws.rs +++ b/fighters/robot/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(12.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 4.5, Some(0.0), Some(8.0), Some(12.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -33,7 +32,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(12.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 4.5, Some(0.0), Some(8.0), Some(12.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -54,7 +53,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, -2.0, Some(0.0), Some(8.0), Some(-15.65), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, -4.5, Some(0.0), Some(8.0), Some(-15.65), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/robot/src/acmd/tilts.rs b/fighters/robot/src/acmd/tilts.rs index 38cc22b298..ea5a1ceb9b 100644 --- a/fighters/robot/src/acmd/tilts.rs +++ b/fighters/robot/src/acmd/tilts.rs @@ -3,13 +3,11 @@ use super::*; unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 7.0); + frame(lua_state, 6.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 7.0, 361, 77, 0, 54, 4.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 7.0, 361, 77, 0, 54, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml1"), 8.0, 361, 77, 0, 54, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("arml1"), 8.0, 361, 77, 0, 54, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("handl1"), 10.0, 361, 77, 0, 54, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml1"), 8.0, 361, 77, 0, 54, 4.25, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("handl1"), 10.0, 361, 77, 0, 54, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 10.0); if is_excute(agent) { @@ -17,39 +15,29 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_attacks3hi(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 7.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 7.0, 361, 77, 0, 54, 4.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 7.0, 361, 77, 0, 54, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml1"), 8.0, 361, 77, 0, 54, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("arml1"), 8.0, 361, 77, 0, 54, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("handl1"), 10.0, 361, 77, 0, 54, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); - } - frame(lua_state, 10.0); + frame(lua_state, 5.0); if is_excute(agent) { - AttackModule::clear_all(boma); + PLAY_SEQUENCE(agent, Hash40::new("seq_robot_rnd_attack")); + PLAY_SE(agent, Hash40::new("se_robot_swing_m")); } } -unsafe extern "C" fn game_attacks3lw(agent: &mut L2CAgentBase) { +unsafe extern "C" fn expression_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 7.0, 361, 77, 0, 54, 4.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 7.0, 361, 77, 0, 54, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml1"), 8.0, 361, 77, 0, 54, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("arml1"), 8.0, 361, 77, 0, 54, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("handl1"), 10.0, 361, 77, 0, 54, 4.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_TPART); } - frame(lua_state, 10.0); + frame(lua_state, 5.0); if is_excute(agent) { - AttackModule::clear_all(boma); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 6.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); } } @@ -97,8 +85,16 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attacks3", game_attacks3, Priority::Low); - agent.acmd("game_attacks3hi", game_attacks3hi, Priority::Low); - agent.acmd("game_attacks3lw", game_attacks3lw, Priority::Low); + agent.acmd("sound_attacks3", sound_attacks3, Priority::Low); + agent.acmd("expression_attacks3", expression_attacks3, Priority::Low); + + agent.acmd("game_attacks3hi", game_attacks3, Priority::Low); + agent.acmd("sound_attacks3hi", sound_attacks3, Priority::Low); + agent.acmd("expression_attacks3hi", expression_attacks3, Priority::Low); + + agent.acmd("game_attacks3lw", game_attacks3, Priority::Low); + agent.acmd("sound_attacks3lw", sound_attacks3, Priority::Low); + agent.acmd("expression_attacks3lw", expression_attacks3, Priority::Low); agent.acmd("game_attackhi3", game_attackhi3, Priority::Low); diff --git a/fighters/robot/src/lib.rs b/fighters/robot/src/lib.rs index cbcf485cb0..6e28a036c6 100644 --- a/fighters/robot/src/lib.rs +++ b/fighters/robot/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/robot/src/opff.rs b/fighters/robot/src/opff.rs index acd15f9cee..417b0fafe5 100644 --- a/fighters/robot/src/opff.rs +++ b/fighters/robot/src/opff.rs @@ -36,14 +36,6 @@ unsafe fn special_hi_handling(fighter: &mut smash::lua2cpp::L2CFighterCommon, bo if WorkModule::get_float(fighter.module_accessor, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLOAT_BURNER_ENERGY_VALUE) <= 0.0 { WorkModule::set_float(fighter.module_accessor, 10.0, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLOAT_BURNER_ENERGY_VALUE); } - - if StatusModule::prev_status_kind(boma, 0) == *FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP { - VarModule::set_int(fighter.battle_object, vars::robot::instance::SPECIAL_HI_CHARGE_FRAME, 0); - } - - if StatusModule::prev_status_kind(boma, 1) == *FIGHTER_STATUS_KIND_SPECIAL_HI { - PostureModule::set_rot(fighter.module_accessor, &Vector3f::zero(), 0); - } } // PM-like down-b canceling diff --git a/fighters/robot/src/status/attack_air.rs b/fighters/robot/src/status/attack_air.rs new file mode 100644 index 0000000000..f616473c07 --- /dev/null +++ b/fighters/robot/src/status/attack_air.rs @@ -0,0 +1,11 @@ +use super::*; + +// FIGHTER_STATUS_KIND_ATTACK_AIR + +unsafe extern "C" fn attack_air_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.status_pre_AttackAir() +} // remove vanilla rob up b -> attack mechanics + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_ATTACK_AIR, attack_air_pre); +} diff --git a/fighters/robot/src/status/mod.rs b/fighters/robot/src/status/mod.rs index bd3c2188e3..1fe7456a35 100644 --- a/fighters/robot/src/status/mod.rs +++ b/fighters/robot/src/status/mod.rs @@ -2,10 +2,12 @@ use super::*; use globals::*; // status script import +mod attack_air; mod special_s; mod special_hi; pub fn install(agent: &mut Agent) { + attack_air::install(agent); special_s::install(agent); special_hi::install(agent); } diff --git a/fighters/robot/src/status/special_hi.rs b/fighters/robot/src/status/special_hi.rs index fea3d665dc..70aba00ac4 100644 --- a/fighters/robot/src/status/special_hi.rs +++ b/fighters/robot/src/status/special_hi.rs @@ -37,18 +37,24 @@ unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue } unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue { + // reset variables once + VarModule::off_flag(fighter.battle_object, SPECIAL_HI_GROUND_START); VarModule::set_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME, 0); VarModule::set_float(fighter.battle_object, SPECIAL_HI_ROT_X, 0.0); if fighter.is_situation(*SITUATION_KIND_AIR) { - VarModule::off_flag(fighter.battle_object, SPECIAL_HI_GROUND_START); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi"), 0.0, 1.0, false, 0.0, false, false); } else { - VarModule::on_flag(fighter.battle_object, SPECIAL_HI_GROUND_START); MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi"), 0.0, 1.0, false, 0.0, false, false); } - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + let start_mul_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_mul_y"); + let start_stable_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_stable_y"); + let start_mul_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_mul_x"); + let start_fly_stable_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_fly_stable_x"); + let x_speed = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let y_speed = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); let prev_damage = fighter.is_prev_status_one_of(&[ *FIGHTER_STATUS_KIND_DAMAGE, @@ -62,199 +68,122 @@ unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue *FIGHTER_STATUS_KIND_DAMAGE_FALL ]); + // limit horizontal speed if !prev_damage { - KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); - KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); - KineticModule::clear_speed_all(fighter.module_accessor); + sv_kinetic_energy!(set_accel_x_add, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0); + sv_kinetic_energy!(set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0); } else { - KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_fly_stable_x, 0.0); } - - sv_kinetic_energy!(reset_energy, fighter, ENERGY_GRAVITY_RESET_TYPE_GRAVITY, 0.0, 0.0, 0.0, 0.0, 0.0); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - - sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.0, 0.0, 0.0, 0.0, 0.0); - sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.0, 0.0); - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.0, 0.0); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 8.0, 8.0); - sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.0, 1.0); + // reset speed + KineticModule::clear_speed_all(fighter.module_accessor); + KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL, x_speed * start_mul_x, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, y_speed * start_mul_y); + // limit gravity + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); fighter.main_shift(special_hi_main_loop) } unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - let charge_frame = VarModule::get_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME) as f32; - VarModule::inc_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME); - - if fighter.is_situation(*SITUATION_KIND_AIR) { - let start_stop_y_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_hi.start_stop_y_frame"); - if fighter.global_table[CURRENT_FRAME].get_i32() < start_stop_y_frame { - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); - } - else { - let start_accel_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_accel_y"); - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -start_accel_y); - } + // charge double speed on ground + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + VarModule::add_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME, 2); + } else { + VarModule::inc_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME); } + let charge_frame = VarModule::get_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME) as f32; + let charge_frame_max = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.charge_frame_max"); + // defines fuel consumption throughout the move let start_fuel = fighter.get_float(*FIGHTER_ROBOT_INSTANCE_WORK_ID_FLOAT_BURNER_ENERGY_VALUE); let max_fuel = fighter.get_param_float("param_special_hi", "energy_max_frame"); - let fuel_increment = if fighter.is_situation(*SITUATION_KIND_AIR) {2.0} else {4.0}; // how much fuel is consumed by the charge per frame - let min_cost = 20.0; // minimum amount of fuel consumed on use - let required_fuel = (fuel_increment * charge_frame).clamp(min_cost, max_fuel); + let launch_fuel_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.launch_fuel_mul"); // fuel per frame of charge + let launch_fuel_min = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.launch_fuel_min"); // min fuel to launch + let required_fuel = (launch_fuel_mul * charge_frame).clamp(launch_fuel_min, max_fuel); let remaining_fuel = (start_fuel - required_fuel).clamp(0.0, max_fuel); - // handles rob's rotation during the charge - let rot_x = VarModule::get_float(fighter.battle_object, SPECIAL_HI_ROT_X); - let rot_amount = if fighter.is_situation(*SITUATION_KIND_AIR) { 2.5 } else {3.75}; // how much rob rotates each frame - if fighter.left_stick_x().abs() > 0.1 { - let reverse = if fighter.is_stick_backward() { -1.0 } else { 1.0 }; - let direction = fighter.lr() * reverse; // determines the direction to rotate - let angle = (rot_x + (rot_amount * direction)).clamp(-60.0, 60.0); - PostureModule::set_rot(fighter.module_accessor, &Vector3f::new(angle * 0.3 * fighter.lr(), 0.0, 0.0), 0); - VarModule::set_float(fighter.battle_object, SPECIAL_HI_ROT_X, angle); - - // changes direction if rotation crosses center threshold - if rot_x == 0.0 && fighter.is_stick_backward() { - PostureModule::reverse_lr(fighter.module_accessor); - PostureModule::update_rot_y_lr(fighter.module_accessor); - } - } - - // summon guide effect - if rot_x != 0.0 { special_hi_guide_handler(fighter) }; - - // default parameters for launch speed - let mut launch_speed = Vector3f{x: 0.0, y: 0.0, z: 0.0}; - - let airX = 0.15 * rot_x.abs() * (((charge_frame) - 18.0).clamp(0.0, 32.0) / 32.0); - let airY = ((1.65 + (0.05 * charge_frame)) - (0.025 * rot_x.abs())).min(3.75); - let groundX = 0.30 * rot_x.abs() * (((charge_frame * 2.0) - 18.0).clamp(0.0, 32.0) / 32.0); - let groundY = ((1.65 + (0.10 * charge_frame)) - (0.035 * rot_x.abs())).min(3.75); - - // force the full launch ahead of time for grounded since it charges 2x fast - if fighter.is_situation(*SITUATION_KIND_GROUND) && charge_frame > 28.0 { - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - - KineticModule::resume_energy_all(fighter.module_accessor); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); - - PLAY_SE(fighter, Hash40::new("se_common_bomb_l")); - - launch_speed.x = groundX; - launch_speed.y = groundY; - - KineticModule::add_speed(fighter.module_accessor, &launch_speed); - fighter.set_float(remaining_fuel, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLOAT_BURNER_ENERGY_VALUE); - - //println!("{}", launch_speed.x); - fighter.change_status(FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP.into(), true.into()); - - return 1.into(); + // no charge launchless variant if fuel below min thresh + if launch_fuel_min > start_fuel { + VarModule::set_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME, 0); } - // force the full launch when the motion completes - if MotionModule::is_end(fighter.module_accessor) { - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - - KineticModule::resume_energy_all(fighter.module_accessor); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); - - PLAY_SE(fighter, Hash40::new("se_common_bomb_ll")); - - if fighter.is_situation(*SITUATION_KIND_GROUND) { - launch_speed.x = groundX; - launch_speed.y = groundY; - } else { - launch_speed.x = airX; - launch_speed.y = airY; + // end stall at frame x of charge + if fighter.is_situation(*SITUATION_KIND_AIR) { + let start_stop_y_frame = ParamModule::get_int(fighter.battle_object, ParamType::Agent, "param_special_hi.start_stop_y_frame"); + if fighter.global_table[CURRENT_FRAME].get_i32() == start_stop_y_frame { + let start_accel_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_accel_y"); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -start_accel_y); // 1/4 base accel + let start_stable_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_stable_y"); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, start_stable_y); } - - KineticModule::add_speed(fighter.module_accessor, &launch_speed); - fighter.set_float(remaining_fuel, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLOAT_BURNER_ENERGY_VALUE); - - //println!("{}", launch_speed.x); - fighter.change_status(FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP.into(), true.into()); - - return 1.into(); - } - - let fuel_depleted = required_fuel >= start_fuel; - if !fuel_depleted && fighter.is_button_on(Buttons::Special) { - // continue charge as long as button is held and rob has fuel - return 0.into(); } - // if we got to this point, we can assume the conditions have been met for commencing launch in some form - sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.0); - KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); - - KineticModule::resume_energy_all(fighter.module_accessor); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION); - - let sfx = - if charge_frame >= 40.0 { "se_common_bomb_ll" } - else if charge_frame >= 25.0 { "se_common_bomb_l" } - else if charge_frame >= 10.0 { "se_common_bomb_m" } - else { "se_common_bomb_s" }; - - if charge_frame >= 10.0 { - if fighter.is_situation(*SITUATION_KIND_GROUND) { - launch_speed.x = groundX; - launch_speed.y = groundY; - } else { - launch_speed.x = airX; - launch_speed.y = airY; + // calculates angle of move + let mut rot = VarModule::get_float(fighter.battle_object, SPECIAL_HI_ROT_X); + let charge_angle_air = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.charge_angle_air"); + let charge_angle_ground = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.charge_angle_ground"); + let max_launch_angle = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.max_launch_angle"); + let rot_amount = if fighter.is_situation(*SITUATION_KIND_AIR) {charge_angle_air} else {charge_angle_ground}; // how much rob rotates each frame + let mut stick_x = fighter.left_stick_x(); + let mut stick_y = fighter.left_stick_y(); + let mut length = sv_math::vec2_length(stick_x, stick_y); + let wrap_stick = 0.5; + // don't change angle if stick is in teleport angling deadzone + let mut angle = rot * -1.0 + 90.0; + if length >= wrap_stick { + // if holding down, convert to max horizontal angle + if stick_y < 0.0 { + stick_x = (stick_x * 100.0).clamp(-1.0, 1.0); + stick_y = 0.0; } + angle = stick_y.atan2(stick_x).to_degrees().clamp(90.0 - max_launch_angle, 90.0 + max_launch_angle); } - - // launches/exits if rob ran out of fuel - if fuel_depleted { - if start_fuel > 0.0 { - // println!("launch speed: {}", launch_speed.y); - KineticModule::add_speed(fighter.module_accessor, &launch_speed); - } - fighter.set_float(0.0, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLOAT_BURNER_ENERGY_VALUE); - PLAY_SE(fighter, Hash40::new(sfx)); - - //println!("{}", launch_speed.x); - fighter.change_status(FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP.into(), true.into()); - - return 1.into(); + // calc new rot based on old rot and new angle + let new_rot = (angle - 90.0) * -1.0; // convert to offset from 90 deg + rot = new_rot.clamp(rot - rot_amount, rot + rot_amount); + + // flips if rotation crosses center threshold + let old_lr = fighter.lr(); + let lr_rot = if rot.abs() > 0.0 { + (rot * 100.0).clamp(-1.0, 1.0) + } else { + old_lr + }; + if (lr_rot + old_lr) < 1.0 { + PostureModule::set_lr(fighter.module_accessor, lr_rot); + PostureModule::update_rot_y_lr(fighter.module_accessor); } + // angle body ody + PostureModule::set_rot(fighter.module_accessor, &Vector3f::new(rot * 0.3 * lr_rot, 0.0, 0.0), 0); + VarModule::set_float(fighter.battle_object, SPECIAL_HI_ROT_X, rot); - // otherwise, launch with the amount of consumed fuel at the time of releasing the button - if charge_frame >= 10.0 { // 10 frame minimum before launching - // println!("launch speed: {}", launch_speed.y); - KineticModule::add_speed(fighter.module_accessor, &launch_speed); - fighter.set_float(remaining_fuel, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLOAT_BURNER_ENERGY_VALUE); - PLAY_SE(fighter, Hash40::new(sfx)); + // summon guide effect + special_hi_guide_handler(fighter); - //println!("{}", launch_speed.x); + // launch if full charge, or past minimum change and ineligible to continue charging + let fuel_depleted = required_fuel >= start_fuel; + if charge_frame >= charge_frame_max + || ((fighter.status_frame() + 1) >= 8 // -2 + && (fuel_depleted || fighter.is_button_off(Buttons::Special))) + { + fighter.set_float(remaining_fuel, *FIGHTER_ROBOT_INSTANCE_WORK_ID_FLOAT_BURNER_ENERGY_VALUE); + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + VarModule::on_flag(fighter.battle_object, SPECIAL_HI_GROUND_START); + } fighter.change_status(FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP.into(), true.into()); - return 1.into(); } - return 0.into(); } - unsafe extern "C" fn special_hi_end(fighter: &mut L2CFighterCommon) -> L2CValue { fighter.off_flag(*FIGHTER_ROBOT_STATUS_BURNER_FLAG_TRANSFORM_COMP); - - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - KineticModule::resume_energy_all(fighter.module_accessor); - + PostureModule::set_rot(fighter.module_accessor, &Vector3f::zero(), 0); EffectModule::kill_kind(fighter.module_accessor, Hash40::new("robot_lamp_l"), true, true); - let eff_handle = VarModule::get_int(fighter.battle_object, SPECIAL_HI_MARKER_EFFECT_HANDLE) as u32; if EffectModule::is_exist_effect(fighter.module_accessor, eff_handle) { EffectModule::kill(fighter.module_accessor, eff_handle, true, true); @@ -274,10 +203,14 @@ unsafe extern "C" fn arrow_guide_pos(fighter: &mut L2CFighterCommon, angle: L2CV let y_pos = rad.sin() * dist_scaled + (*pos).y; let y_offset = 6.0; let y_pos = y_offset * scale + y_pos; - Vector2f{x: x_pos, y: y_pos} + Vector2f { + x: x_pos, + y: y_pos, + } } -pub unsafe fn special_hi_guide_handler(fighter: &mut L2CFighterCommon) { // thanks wuboy <3 +pub unsafe fn special_hi_guide_handler(fighter: &mut L2CFighterCommon) { + // thanks wuboy <3 let mut angle = (VarModule::get_float(fighter.battle_object, SPECIAL_HI_ROT_X) - 90.0) * -1.0; //println!("angle: {}", angle); @@ -287,19 +220,43 @@ pub unsafe fn special_hi_guide_handler(fighter: &mut L2CFighterCommon) { // than eff_handle = EffectModule::req( fighter.module_accessor, Hash40::new("sys_direction2"), - &Vector3f{x: guide_pos.x, y: guide_pos.y, z: 0.0}, - &Vector3f{x: 0.0, y: 0.0, z: 0.0}, + &Vector3f { + x: guide_pos.x, + y: guide_pos.y, + z: 0.0, + }, + &Vector3f { + x: 0.0, + y: 0.0, + z: 0.0, + }, 1.0, 0, -1, false, - 0 + 0, ) as u32; VarModule::set_int(fighter.battle_object, SPECIAL_HI_MARKER_EFFECT_HANDLE, eff_handle as i32); } else { - EffectModule::set_pos(fighter.module_accessor, eff_handle, &Vector3f{x: guide_pos.x, y: guide_pos.y, z: 0.0}); + EffectModule::set_pos( + fighter.module_accessor, + eff_handle, + &Vector3f { + x: guide_pos.x, + y: guide_pos.y, + z: 0.0, + }, + ); } - EffectModule::set_rot(fighter.module_accessor, eff_handle, &Vector3f{x: 0.0, y: 0.0, z: angle - 90.0}); + EffectModule::set_rot( + fighter.module_accessor, + eff_handle, + &Vector3f { + x: 0.0, + y: 0.0, + z: angle - 90.0, + }, + ); let team_color = FighterUtil::get_team_color(fighter.module_accessor); let effect_team_color = FighterUtil::get_effect_team_color(EColorKind(team_color as i32), Hash40::new("direction_effect_color")); @@ -308,49 +265,169 @@ pub unsafe fn special_hi_guide_handler(fighter: &mut L2CFighterCommon) { // than // FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP +unsafe extern "C" fn special_hi_keep_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_AIR as u32, + GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_HI | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + *FIGHTER_STATUS_ATTR_INTO_DOOR as u32, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_HI as u32, + 0 + ); + + return 0.into(); +} + unsafe extern "C" fn special_hi_keep_main(fighter: &mut L2CFighterCommon) -> L2CValue { MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi_rise"), 0.0, 1.0, false, 0.0, false, false); + // set rot f0 let rot_x = VarModule::get_float(fighter.battle_object, SPECIAL_HI_ROT_X) * fighter.lr() * 0.8; PostureModule::set_rot(fighter.module_accessor, &Vector3f::new(rot_x, 0.0, 0.0), 0); + // fall during startup without landing + fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_NONE.into()); + fighter.set_situation(SITUATION_KIND_AIR.into()); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); + + // sfx + let charge_frame = VarModule::get_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME) as f32; + let charge_frame_stage_1 = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_1"); + let charge_frame_stage_2 = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_2"); + let charge_frame_stage_3 = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.charge_frame_stage_3"); + let sfx = if charge_frame >= charge_frame_stage_1 { + "se_common_bomb_ll" + } else if charge_frame >= charge_frame_stage_2 { + "se_common_bomb_l" + } else if charge_frame >= charge_frame_stage_1 { + "se_common_bomb_m" + } else { + "se_common_bomb_s" + }; + PLAY_STATUS(fighter, Hash40::new(sfx)); + fighter.main_shift(special_hi_keep_main_loop) } unsafe extern "C" fn special_hi_keep_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.motion_frame() >= 12.0 { - if !WorkModule::is_enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_AIR) { - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_AIR); - } + // handle movement / rot + if !StopModule::is_stop(fighter.module_accessor) { + //&& !AttackModule::is_infliction(fighter.module_accessor, *COLLISION_KIND_MASK_ALL) { // is_stop didnt work? + special_hi_keep_movement_handling(fighter); } - if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), true.into()); + // lc if landing (bypass soft landing) + if fighter.check_land_cancel(None) { + return 1.into(); + } + // run ledge check + if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into(); } + // act out + fighter.sub_transition_group_check_air_attack(); + + if CancelModule::is_enable_cancel(fighter.module_accessor) { + // enable fastfall on cancel frame + fighter.sub_air_check_dive(); + // enable acting on cancel frame + if fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); - return 1.into(); } - // // rotates rob to the stored rotation value over the course of a few frames - // if (1..=4).contains(&fighter.status_frame()){ - // let rot_x = VarModule::get_float(fighter.battle_object, SPECIAL_HI_ROT_X); - // let new_rot = 0.0 + (rot_x - ((rot_x / 4.0) * (5.0 - fighter.status_frame() as f32))); - // PostureModule::set_rot(fighter.module_accessor, &Vector3f::new(new_rot * fighter.lr(), 0.0, 0.0), 0); - // } + return 0.into(); +} +unsafe extern "C" fn special_hi_keep_movement_handling(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::inc_int(fighter.battle_object, SPECIAL_HI_KEEP_FRAME); + let frame = VarModule::get_int(fighter.battle_object, SPECIAL_HI_KEEP_FRAME); + let charge_frame = VarModule::get_int(fighter.battle_object, SPECIAL_HI_CHARGE_FRAME) as f32; + let rot = VarModule::get_float(fighter.battle_object, SPECIAL_HI_ROT_X); + // init movement on frame 5 + if frame == 5 { + if charge_frame > 0.0 { + // launch speed + let launch_speed = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.launch_speed"); + let launch_speed_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.launch_speed_mul"); + let speed = launch_speed + (charge_frame * launch_speed_mul); + let stick_x = (rot * -1.0 + 90.0).to_radians().cos(); + let stick_y = (rot * -1.0 + 90.0).to_radians().sin(); + let speed_x = speed * stick_x * fighter.lr(); + let speed_y = (speed * stick_y); + let lr = fighter.lr(); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_UNIQ); + KineticModule::unable_energy_all(fighter.module_accessor); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_FREE, speed_x * lr, speed_y, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, -1.0, -1.0); + sv_kinetic_energy!(enable, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP); + } else { + // give 0 stall empty use better frames + VarModule::on_flag(fighter.battle_object, SPECIAL_HI_GROUND_START); + sv_kinetic_energy!(add_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.75); + } + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + } + // slowly decel before converting to drift/gravity (could try stable speed so it decels by a flat value every frame?) + if frame >= 9 && frame <= 14 { + if charge_frame > 0.0 { + let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed = Vector2f { + x: lua_bind::KineticEnergy::get_speed_x(stop_energy), + y: lua_bind::KineticEnergy::get_speed_y(stop_energy), + }; + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x * 0.95, speed.y * 0.95); + } + } + // end movement frame 16 + if frame == 16 { + if charge_frame > 0.0 { + let x_speed = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let y_speed = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL, x_speed * 0.60, 0.0); + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, y_speed * 0.60); + } + // air attack cancel + fighter.enable_transition_term(*FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_ATTACK_AIR); + } // interpolate back to upright position let current_rot = PostureModule::rot_x(fighter.module_accessor, 0); - if (fighter.motion_frame() >= 42.0) && current_rot != 0.0 { - let rot_mul = if VarModule::is_flag(fighter.object(), vars::robot::instance::SPECIAL_HI_GROUND_START) { 2.0 } else { 1.0 }; - let rot_amount = 0.15 * rot_mul; // percent of remaining distance rotated each frame. will decrease exponentially + if (fighter.motion_frame() >= 39.0) && current_rot != 0.0 { + let rot_mul = 1.0; + let rot_amount = 0.07 * rot_mul; // percent of remaining distance rotated each frame. will decrease exponentially let mut new_rot = current_rot - (current_rot * rot_amount); - if (-1.0..1.0).contains(&new_rot) { new_rot = 0.0 }; // snap to 0 when close enough - // println!("{new_rot}"); + if (-1.0..1.0).contains(&new_rot) { + new_rot = 0.0 + }; // snap to 0 when close enough + // println!("{new_rot}"); PostureModule::set_rot(fighter.module_accessor, &Vector3f::new(new_rot, 0.0, 0.0), 0); } @@ -359,10 +436,6 @@ unsafe extern "C" fn special_hi_keep_main_loop(fighter: &mut L2CFighterCommon) - unsafe extern "C" fn special_hi_keep_end(fighter: &mut L2CFighterCommon) -> L2CValue { PostureModule::set_rot(fighter.module_accessor, &Vector3f::zero(), 0); - VarModule::set_float(fighter.battle_object, SPECIAL_HI_ROT_X, 0.0); - KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - KineticModule::resume_energy_all(fighter.module_accessor); - 0.into() } @@ -374,6 +447,8 @@ pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_main); agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_end); + + agent.status(Pre, *FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP, special_hi_keep_pre); agent.status(Main, *FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP, special_hi_keep_main); agent.status(End, *FIGHTER_ROBOT_STATUS_KIND_SPECIAL_HI_KEEP, special_hi_keep_end); diff --git a/fighters/rockman/Cargo.toml b/fighters/rockman/Cargo.toml index 295dd5b97d..e5994b356a 100644 --- a/fighters/rockman/Cargo.toml +++ b/fighters/rockman/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -smash_rs = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } \ No newline at end of file +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/rockman/src/acmd/ground.rs b/fighters/rockman/src/acmd/ground.rs index f6961d2ac2..4d07cb8d06 100644 --- a/fighters/rockman/src/acmd/ground.rs +++ b/fighters/rockman/src/acmd/ground.rs @@ -8,8 +8,6 @@ unsafe extern "C" fn game_attack11melee(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 90, 15, 0, 30, 3.0, 0.0, 8.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 100, 15, 0, 30, 3.0, 0.0, 8.0, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 30, 0, 20, 2.5, 0.0, 3.3, 4.5, Some(0.0), Some(3.3), Some(8.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame_revised(boma, 0, 2.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 2.0, false); } frame(lua_state, 10.0); if is_excute(agent) { @@ -64,12 +62,14 @@ unsafe extern "C" fn expression_attack11melee(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 7.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 100, 15, 0, 30, 4.0, 0.0, 7.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 80, 15, 0, 30, 3.0, 0.0, 7.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame_revised(boma, 0, 2.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 2.0, false); } frame(lua_state, 10.0); if is_excute(agent) { @@ -127,9 +127,13 @@ unsafe extern "C" fn expression_attack12(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 74, 70, 0, 70, 4.0, 0.0, 6.0, 4.0, Some(0.0), Some(13.0), Some(4.0), 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 74, 70, 0, 70, 4.0, 0.0, 6.0, 4.0, Some(0.0), Some(13.0), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 13.0); if is_excute(agent) { diff --git a/fighters/rockman/src/acmd/other.rs b/fighters/rockman/src/acmd/other.rs index 1ce8a1360f..bb9ca864e8 100644 --- a/fighters/rockman/src/acmd/other.rs +++ b/fighters/rockman/src/acmd/other.rs @@ -62,16 +62,12 @@ unsafe fn game_regular(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -82,10 +78,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { diff --git a/fighters/rockman/src/acmd/throws.rs b/fighters/rockman/src/acmd/throws.rs index 8c2dbdcf8b..d3202a3a06 100644 --- a/fighters/rockman/src/acmd/throws.rs +++ b/fighters/rockman/src/acmd/throws.rs @@ -5,7 +5,6 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 6.0); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } @@ -74,6 +73,26 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 55, 47, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 9.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, 20, 10); + } + frame(lua_state, 10.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -144,6 +163,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); diff --git a/fighters/rockman/src/acmd/tilts.rs b/fighters/rockman/src/acmd/tilts.rs index a1233bbceb..2d66bb7ff4 100644 --- a/fighters/rockman/src/acmd/tilts.rs +++ b/fighters/rockman/src/acmd/tilts.rs @@ -11,8 +11,8 @@ unsafe extern "C" fn game_attacks3melee(agent: &mut L2CAgentBase) { frame(lua_state, 15.0); FT_MOTION_RATE(agent, 0.5); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handl"), 14.0, 270, 10, 0, 70, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handl"), 10.0, 65, 94, 0, 54, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 24, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handl"), 14.0, 270, 10, 0, 70, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handl"), 10.0, 65, 94, 0, 54, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 1.75); ATK_SET_SHIELD_SETOFF_MUL(agent, 1, 1.75); } @@ -114,6 +114,15 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { sv_kinetic_energy!(reset_energy, agent, FIGHTER_KINETIC_ENERGY_ID_CONTROL, ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, 0.0, 0.0, 0.0, 0.0, 0.0); KineticModule::enable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); KineticModule::unable_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_MOTION); + let air_speed_x_stable = agent.get_param_float("air_speed_x_stable", ""); + let jump_stable_speed_x_mul = ParamModule::get_float(agent.battle_object, ParamType::Agent, "param_attack_hi3.jump_stable_speed_x_mul"); + sv_kinetic_energy!( + set_stable_speed, + agent, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + air_speed_x_stable * jump_stable_speed_x_mul, + 0.0 + ); } } @@ -160,7 +169,7 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { FT_MOTION_RATE(agent, 12.0 / (22.0 - 5.0)); - ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 67, 60, 0, 70, 3.25, 0.0, 3.2, 3.5, Some(0.0), Some(3.2), Some(4.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 67, 60, 0, 70, 3.5, 0.0, 3.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 22.0); diff --git a/fighters/rockman/src/chargeshot/acmd.rs b/fighters/rockman/src/chargeshot/acmd.rs index d0e2f34ec0..5757ad6993 100644 --- a/fighters/rockman/src/chargeshot/acmd.rs +++ b/fighters/rockman/src/chargeshot/acmd.rs @@ -2,27 +2,33 @@ use super::*; unsafe extern "C" fn game_regular(agent: &mut L2CAgentBase) { let boma = agent.boma(); + let scale = PostureModule::scale(boma); + let is_charge_max = 1.0 <= WorkModule::get_float(boma, *WEAPON_ROCKMAN_CHARGESHOT_INSTANCE_WORK_ID_FLOAT_HOLD_RATE); + let (dmg, kbg, bkb, shield_dmg) = if is_charge_max { + (20.0, 69, 41, 7) + } else { + (9.0, 78, 50, 6) + }; + let early_power_mul = 0.8; + let mid_power_mul = 0.9; + let late_power_mul = 1.0; if is_excute(agent) { - let is_charge_max = 1.0 <= WorkModule::get_float(boma, *WEAPON_ROCKMAN_CHARGESHOT_INSTANCE_WORK_ID_FLOAT_HOLD_RATE); - let damage; - let bkb; - let kbg; - let shield_damage; - if is_charge_max { - damage = 18.0; - bkb = 42; - kbg = 76; - shield_damage = 7; - } - else { - damage = 9.0; - bkb = 50; - kbg = 85; - shield_damage = 6; - } - ATTACK(agent, 0, 0, Hash40::new("top"), damage, 361, kbg, 0, bkb, 2.6, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, shield_damage, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("top"), dmg * early_power_mul, 361, kbg, 0, bkb, 2.6, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, shield_dmg, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.32); AttackModule::enable_safe_pos(boma); + PostureModule::set_scale(boma, scale * early_power_mul, false); + } + wait(agent.lua_state_agent, 8.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), dmg * mid_power_mul, 361, kbg, 0, bkb, 2.6, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, shield_dmg, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.32); + PostureModule::set_scale(boma, scale * mid_power_mul, false); + } + wait(agent.lua_state_agent, 8.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), dmg * late_power_mul, 361, kbg, 0, bkb, 2.6, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_SPEED, false, shield_dmg, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_ENERGY); + ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 0.32); + PostureModule::set_scale(boma, scale * late_power_mul, false); } } diff --git a/fighters/rockman/src/lib.rs b/fighters/rockman/src/lib.rs index df90f11811..c3bdea0e12 100644 --- a/fighters/rockman/src/lib.rs +++ b/fighters/rockman/src/lib.rs @@ -39,6 +39,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/rockman/src/status/landing.rs b/fighters/rockman/src/status/landing.rs new file mode 100644 index 0000000000..9ef00b6a6d --- /dev/null +++ b/fighters/rockman/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_hi"), hash40("landing_frame")); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_hi"), hash40("landing_frame")); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/rockman/src/status/mod.rs b/fighters/rockman/src/status/mod.rs index 6da33ce19d..3423510a57 100644 --- a/fighters/rockman/src/status/mod.rs +++ b/fighters/rockman/src/status/mod.rs @@ -11,6 +11,7 @@ mod attack_s3; mod attack_s4; mod attack_air; mod ladder_attack; +mod landing; mod special_n; mod rockbuster; @@ -79,4 +80,5 @@ pub fn install(agent: &mut Agent) { special_s::install(agent); special_lw::install(agent); special_hi::install(agent); + landing::install(agent); } \ No newline at end of file diff --git a/fighters/rockman/src/status/special_hi.rs b/fighters/rockman/src/status/special_hi.rs index e60af13652..0713e1d14c 100644 --- a/fighters/rockman/src/status/special_hi.rs +++ b/fighters/rockman/src/status/special_hi.rs @@ -5,6 +5,7 @@ use super::*; pub unsafe extern "C" fn special_hi_jump_end(fighter: &mut L2CFighterCommon) -> L2CValue { VarModule::on_flag(fighter.battle_object, vars::rockman::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); 0.into() } diff --git a/fighters/rockman/src/status/special_s.rs b/fighters/rockman/src/status/special_s.rs index 70f3229939..4d9d7f8125 100644 --- a/fighters/rockman/src/status/special_s.rs +++ b/fighters/rockman/src/status/special_s.rs @@ -122,9 +122,6 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV return 0.into(); } } - if fighter.status_frame() > 16 { - fighter.check_airdodge_cancel(); - } if MotionModule::is_end(fighter.module_accessor) { let status = if sit == *SITUATION_KIND_GROUND { FIGHTER_STATUS_KIND_WAIT diff --git a/fighters/rom_watch.txt b/fighters/rom_watch.txt index b9d0eb6887..2ce5f122cf 100644 --- a/fighters/rom_watch.txt +++ b/fighters/rom_watch.txt @@ -57,5 +57,13 @@ fighter/zelda/param/hdr.xml fighter/pikachu/param/hdr.xml fighter/ridley/param/hdr.xml fighter/robot/param/hdr.xml +fighter/rockman/param/hdr.xml fighter/shulk/param/hdr.xml -fighter/metaknight/param/hdr.xml \ No newline at end of file +fighter/metaknight/param/hdr.xml +fighter/brave/param/hdr.xml +fighter/elight/param/hdr.xml +fighter/murabito/param/hdr.xml +fighter/shizue/param/hdr.xml +fighter/buddy/param/hdr.xml +fighter/trail/param/hdr.xml +fighter/roy/param/hdr.xml \ No newline at end of file diff --git a/fighters/rosetta/Cargo.toml b/fighters/rosetta/Cargo.toml index 56885cb7f3..e4dbd17073 100644 --- a/fighters/rosetta/Cargo.toml +++ b/fighters/rosetta/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/rosetta/src/acmd/aerials.rs b/fighters/rosetta/src/acmd/aerials.rs index a783a5f7a6..a963c7c273 100644 --- a/fighters/rosetta/src/acmd/aerials.rs +++ b/fighters/rosetta/src/acmd/aerials.rs @@ -26,6 +26,7 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("footl"), 1.0, 70, 10, 0, 90, 5.5, 1.0, -1.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); + AttackModule::set_no_finish_camera(boma, 0, true, false); } frame(lua_state, 11.0); if is_excute(agent) { @@ -36,11 +37,19 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { ATTACK(agent, 5, 0, Hash40::new("footl"), 1.0, 86, 10, 0, 90, 4.5, 3.0, 6.5, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); ATTACK(agent, 6, 0, Hash40::new("hip"), 1.0, 25, 10, 0, 65, 4.0, 0.0, 0.0, 0.0, None, None, None, 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); AttackModule::clear(boma, 0, false); + AttackModule::set_no_finish_camera(boma, 1, true, false); + AttackModule::set_no_finish_camera(boma, 2, true, false); + AttackModule::set_no_finish_camera(boma, 3, true, false); + AttackModule::set_no_finish_camera(boma, 4, true, false); + AttackModule::set_no_finish_camera(boma, 5, true, false); + AttackModule::set_no_finish_camera(boma, 6, true, false); } frame(lua_state, 19.0); if is_excute(agent) { ATTACK(agent, 2, 0, Hash40::new("footl"), 1.0, 36, 10, 0, 60, 1.5, 1.7, -3.8, -2.0, Some(8.0), Some(-6.2), Some(-2.0), 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); ATTACK(agent, 3, 0, Hash40::new("footl"), 1.0, 36, 10, 0, 60, 1.5, 1.7, -3.8, 2.0, Some(8.0), Some(-6.2), Some(2.0), 0.75, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_KICK); + AttackModule::set_no_finish_camera(boma, 2, true, false); + AttackModule::set_no_finish_camera(boma, 3, true, false); } frame(lua_state, 21.0); if is_excute(agent) { diff --git a/fighters/rosetta/src/acmd/ground.rs b/fighters/rosetta/src/acmd/ground.rs index 56725e79fe..79c48a09ab 100644 --- a/fighters/rosetta/src/acmd/ground.rs +++ b/fighters/rosetta/src/acmd/ground.rs @@ -1,5 +1,55 @@ use super::*; +unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.65); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 70, 100, 40, 0, 3.2, 0.0, 11.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 82, 100, 30, 0, 3.2, 0.0, 11.0, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 82, 100, 30, 0, 3.2, 0.0, 11.0, 11.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 3.2, 0.0, 3.5, 6.0, Some(0.0), Some(3.5), Some(11.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + AttackModule::set_down_only(boma, 3, true); + } + wait(lua_state, 1.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 13.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } +} + +unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 74, 100, 40, 0, 4.2, 0.0, 10.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 82, 100, 30, 0, 4.2, 0.0, 10.0, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + // Jab lock hitbox + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 361, 15, 0, 30, 4.2, 0.0, 5.0, 7.0, Some(0.0), Some(5.0), Some(12.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + AttackModule::set_down_only(boma, 2, true); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 9.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_100); + } + frame(lua_state, 14.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + } +} + unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -27,5 +77,8 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } pub fn install(agent: &mut Agent) { + agent.acmd("game_attack11", game_attack11, Priority::Low); + agent.acmd("game_attack12", game_attack12, Priority::Low); + agent.acmd("game_attackdash", game_attackdash, Priority::Low); } \ No newline at end of file diff --git a/fighters/rosetta/src/acmd/other.rs b/fighters/rosetta/src/acmd/other.rs index a67c5e9992..efc706f175 100644 --- a/fighters/rosetta/src/acmd/other.rs +++ b/fighters/rosetta/src/acmd/other.rs @@ -66,15 +66,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -84,10 +80,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/rosetta/src/acmd/smashes.rs b/fighters/rosetta/src/acmd/smashes.rs index 2224c9edb5..e8996d397d 100644 --- a/fighters/rosetta/src/acmd/smashes.rs +++ b/fighters/rosetta/src/acmd/smashes.rs @@ -64,8 +64,8 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("neck"), 12.0, 86, 100, 0, 45, 6.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); - ATTACK(agent, 1, 0, Hash40::new("neck"), 12.0, 86, 100, 0, 45, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 0, 0, Hash40::new("neck"), 12.0, 86, 109, 0, 45, 6.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); + ATTACK(agent, 1, 0, Hash40::new("neck"), 12.0, 86, 109, 0, 45, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); } wait(lua_state, 9.0); if is_excute(agent) { diff --git a/fighters/rosetta/src/acmd/specials.rs b/fighters/rosetta/src/acmd/specials.rs index 57b085dbd2..49c9386e0d 100644 --- a/fighters/rosetta/src/acmd/specials.rs +++ b/fighters/rosetta/src/acmd/specials.rs @@ -4,6 +4,62 @@ use vars::common::instance::GIMMICK_TIMER; use vars::rosetta::instance::*; use vars::rosetta::status::*; +unsafe extern "C" fn effect_specialnchargestart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + //EFFECT_FOLLOW(agent, Hash40::new("rosetta_wand_light"), Hash40::new("havel"), 0, 7.5, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("rosetta_wand_stardust"), Hash40::new("havel"), 0, 7.5, 0, 0, 0, 0, 1, true); + EffectModule::enable_sync_init_pos_last(boma); + EFFECT_FOLLOW(agent, Hash40::new("rosetta_ticoshot_hold_end"), Hash40::new("havel"), 0, 7.5, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 55.0 / 65.0); + } + frame(lua_state, 7.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, -3, 0, 0, 0, 1, 2, 0, 4, 0, 0, 0, true); + } + wait(lua_state, 6.0); +} + +unsafe extern "C" fn sound_specialnchargestart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + let sound = SoundModule::play_status_se(boma, Hash40::new("se_rosetta_special_n01"), true, false, false); + SoundModule::set_se_vol(boma, sound as i32, 0.45, 0); + //PLAY_STATUS(agent, Hash40::new("se_rosetta_special_n01")); + } +} + +unsafe extern "C" fn game_specialnreturn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE(agent, 0.6); + if is_excute(agent) { + if ArticleModule::is_exist(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO) { + let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); + let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; + let tico_battle_object: *mut BattleObject = utils::util::get_battle_object_from_id(tico_id); + let tico_boma: &mut BattleObjectModuleAccessor = &mut *(*tico_battle_object).module_accessor; + if !VarModule::is_flag(agent.battle_object, vars::rosetta::instance::SPECIAL_LW_TICO_UNAVAILABLE) {//if lima is just floating around + StatusModule::change_status_force(tico_boma, statuses::rosetta_tico::STANDBY, true); //sit still for me deer + } + } + } + frame(lua_state, 8.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 361, 100, 30, 0, 6.0, 0.0, 12.0, 14.0, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); + } + frame(lua_state, 16.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 31.0); + FT_MOTION_RATE(agent, 0.75); +} + unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -31,9 +87,13 @@ unsafe extern "C" fn game_specialhiend(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); + let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; + let tico_boma = sv_battle_object::module_accessor(tico_id); let is_teleport = ( !VarModule::is_flag(boma.object(), SPECIAL_LW_TICO_UNAVAILABLE) && VarModule::get_int(boma.object(), GIMMICK_TIMER) == 0 + && WorkModule::is_flag(tico_boma, *WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_FREE) ); if is_teleport { frame(lua_state, 17.0); @@ -47,9 +107,6 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { VisibilityModule::set_whole(boma, false); JostleModule::set_status(boma, false); if ArticleModule::is_exist(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO) { - let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); - let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; - let tico_boma = sv_battle_object::module_accessor(tico_id); HitModule::set_whole(tico_boma, HitStatus(*HIT_STATUS_XLU), 0); VisibilityModule::set_whole(tico_boma, false); JostleModule::set_status(tico_boma, false); @@ -58,9 +115,6 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { frame(lua_state, 25.0); if is_excute(agent) { if ArticleModule::is_exist(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO) { - let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); - let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; - let tico_boma = sv_battle_object::module_accessor(tico_id); // store luma's position for rosalina to use VarModule::set_int(boma.object(), TICO_X, PostureModule::pos_x(tico_boma) as i32); VarModule::set_int(boma.object(), TICO_Y, PostureModule::pos_y(tico_boma) as i32); @@ -80,9 +134,6 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { PostureModule::set_pos(boma, &pos); PostureModule::init_pos(boma, &pos, true, true); if ArticleModule::is_exist(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO) { - let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); - let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; - let tico_boma = sv_battle_object::module_accessor(tico_id); let tico_pos = Vector3f { x: VarModule::get_int(boma.object(), ROSA_X) as f32, y: VarModule::get_int(boma.object(), ROSA_Y) as f32, @@ -99,9 +150,6 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { JostleModule::set_status(boma, true); HitModule::set_whole(boma, smash::app::HitStatus(*HIT_STATUS_NORMAL), 0); if ArticleModule::is_exist(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO) { - let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); - let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; - let tico_boma = sv_battle_object::module_accessor(tico_id); JostleModule::set_status(tico_boma, true); VisibilityModule::set_whole(tico_boma, true); HitModule::set_whole(tico_boma, HitStatus(*HIT_STATUS_NORMAL), 0); @@ -117,7 +165,10 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { } } else { // gravitational pull - frame(lua_state, 3.0); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 7.0); + frame(lua_state, 5.0);//3->8 + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_ROSETTA_STATUS_SPECIAL_LW_FLAG_ENABLE_SEARCH); } @@ -128,7 +179,8 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { } wait(lua_state, 1.0); } - wait(lua_state, 1.0); + wait(lua_state, 1.0);//30?->32 mot frame + FT_MOTION_RATE_RANGE(agent, 32.0, 40.0, 10.0); //faf 40->45 if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_ROSETTA_STATUS_SPECIAL_LW_FLAG_ENABLE_SEARCH); } @@ -138,18 +190,19 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_speciallw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); + let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); + let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; + let tico_boma: *mut BattleObjectModuleAccessor = sv_battle_object::module_accessor(tico_id); let is_teleport = ( !VarModule::is_flag(boma.object(), SPECIAL_LW_TICO_UNAVAILABLE) && VarModule::get_int(boma.object(), GIMMICK_TIMER) == 0 + && WorkModule::is_flag(tico_boma, *WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_FREE) ); if is_teleport { frame(lua_state, 13.0); if is_excute(agent) { EFFECT(agent, Hash40::new("rosetta_escape"), Hash40::new("top"), 0, 0, -3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); if ArticleModule::is_exist(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO) { - let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); - let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; - let tico_boma = sv_battle_object::module_accessor(tico_id); let handle = EffectModule::req_on_joint(tico_boma, Hash40::new("rosetta_escape"), Hash40::new("top"), &Vector3f::zero(), &Vector3f::zero(), 0.5, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0); EffectModule::set_alpha(tico_boma, handle as u32, 1.0); } @@ -159,9 +212,6 @@ unsafe extern "C" fn effect_speciallw(agent: &mut L2CAgentBase) { if !VarModule::is_flag(boma.object(), SPECIAL_LW_INVALID_WARP) { EFFECT(agent, Hash40::new("rosetta_escape_end"), Hash40::new("top"), 0, 0, -1.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); if ArticleModule::is_exist(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO) { - let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); - let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; - let tico_boma = sv_battle_object::module_accessor(tico_id); let handle = EffectModule::req_on_joint(tico_boma, Hash40::new("rosetta_escape_end"), Hash40::new("top"), &Vector3f::zero(), &Vector3f::zero(), 1.0, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0); EffectModule::set_alpha(tico_boma, handle as u32, 1.0); } @@ -224,6 +274,14 @@ unsafe extern "C" fn expression_speciallw(agent: &mut L2CAgentBase) { } pub fn install(agent: &mut Agent) { + agent.acmd("effect_specialnchargestart", effect_specialnchargestart, Priority::Low); + agent.acmd("sound_specialnchargestart", sound_specialnchargestart, Priority::Low); + agent.acmd("effect_specialairnchargestart", effect_specialnchargestart, Priority::Low); + agent.acmd("sound_specialairnchargestart", sound_specialnchargestart, Priority::Low); + + agent.acmd("game_specialnreturn", game_specialnreturn, Priority::Low); + agent.acmd("game_specialairnreturn", game_specialnreturn, Priority::Low); + agent.acmd("game_specialhi", game_specialhi, Priority::Low); agent.acmd("game_specialhiend", game_specialhiend, Priority::Low); diff --git a/fighters/rosetta/src/acmd/throws.rs b/fighters/rosetta/src/acmd/throws.rs index c20e195529..898d258728 100644 --- a/fighters/rosetta/src/acmd/throws.rs +++ b/fighters/rosetta/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 6.5, Some(0.0), Some(8.0), Some(10.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -37,7 +37,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(10.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, 4.5, Some(0.0), Some(8.0), Some(10.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -65,7 +65,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-15.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 8.0, -4.5, Some(0.0), Some(8.0), Some(-15.9), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/rosetta/src/lib.rs b/fighters/rosetta/src/lib.rs index 8e9412018f..89ae0a3953 100644 --- a/fighters/rosetta/src/lib.rs +++ b/fighters/rosetta/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/rosetta/src/opff.rs b/fighters/rosetta/src/opff.rs index 6b42fe2863..547c3894dc 100644 --- a/fighters/rosetta/src/opff.rs +++ b/fighters/rosetta/src/opff.rs @@ -23,47 +23,53 @@ use vars::rosetta::status::*; // down special teleport unsafe fn teleport(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - // handle the cooldown timer - let cooldown_frame = VarModule::get_int(boma.object(), GIMMICK_TIMER); - if cooldown_frame > 0 { VarModule::dec_int(boma.object(), GIMMICK_TIMER); } - if cooldown_frame == 1 { - gimmick_flash(boma); - } + if ArticleModule::is_exist(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO) { + // handle the cooldown timer + let cooldown_frame = VarModule::get_int(boma.object(), GIMMICK_TIMER); + if cooldown_frame > 0 { VarModule::dec_int(boma.object(), GIMMICK_TIMER); } + if cooldown_frame == 1 { + gimmick_flash(boma); + } + + // set the conditions for a successful teleport + let warp_effect = VarModule::get_int(boma.object(), SPECIAL_LW_WARP_EFFECT_HANDLE); + let tico = ArticleModule::get_article(boma, *FIGHTER_ROSETTA_GENERATE_ARTICLE_TICO); + let tico_id = smash::app::lua_bind::Article::get_battle_object_id(tico) as u32; + let tico_boma = sv_battle_object::module_accessor(tico_id); + let can_teleport = !VarModule::is_flag(boma.object(), SPECIAL_LW_TICO_UNAVAILABLE) && cooldown_frame == 0 && WorkModule::is_flag(tico_boma, *WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_FREE); + let warp_effect = VarModule::get_int(boma.object(), SPECIAL_LW_WARP_EFFECT_HANDLE); + + // makes rosalina's wand glow if teleport is available + if can_teleport + && !EffectModule::is_exist_effect(boma, warp_effect as u32) { + let eff_offset = &Vector3f::new(0.0, 8.0, 0.0); + let handle = EffectModule::req_follow(boma, Hash40::new("sys_status_all_up"), Hash40::new("havel"), eff_offset, &Vector3f::zero(), 0.28, false, 0, 0, 0, 0, 0, false, false) as u32; + EffectModule::set_rate(boma, handle, 0.5); + VarModule::set_int(boma.object(), SPECIAL_LW_WARP_EFFECT_HANDLE, handle as i32); + } else { + if EffectModule::is_exist_effect(boma, warp_effect as u32) + & !can_teleport { + EffectModule::kill(boma, warp_effect as u32, false, false); + } + } - // set the conditions for a successful teleport - let can_teleport = !VarModule::is_flag(boma.object(), SPECIAL_LW_TICO_UNAVAILABLE) && cooldown_frame == 0; - let warp_effect = VarModule::get_int(boma.object(), SPECIAL_LW_WARP_EFFECT_HANDLE); + if !fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_LW) { return; } - // makes rosalina's wand glow if teleport is available - if can_teleport - && !EffectModule::is_exist_effect(boma, warp_effect as u32) { - let eff_offset = &Vector3f::new(0.0, 8.0, 0.0); - let handle = EffectModule::req_follow(boma, Hash40::new("sys_status_all_up"), Hash40::new("havel"), eff_offset, &Vector3f::zero(), 0.28, false, 0, 0, 0, 0, 0, false, false) as u32; - EffectModule::set_rate(boma, handle, 0.5); - VarModule::set_int(boma.object(), SPECIAL_LW_WARP_EFFECT_HANDLE, handle as i32); - } else { - if EffectModule::is_exist_effect(boma, warp_effect as u32) - & !can_teleport { - EffectModule::kill(boma, warp_effect as u32, false, false); + if !can_teleport { + // prevent the successful teleport logic if Luma is put into hitstun or killed during startup + if (13.0..17.0).contains(&fighter.motion_frame()) { + VarModule::on_flag(boma.object(), SPECIAL_LW_INVALID_WARP); + } } - } - - if !fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_LW) { return; } - if !can_teleport { - // prevent the successful teleport logic if Luma is put into hitstun or killed during startup - if (13.0..17.0).contains(&fighter.motion_frame()) { - VarModule::on_flag(boma.object(), SPECIAL_LW_INVALID_WARP); + // transition rosalina to special fall after a successful aerial teleport + if fighter.motion_frame() > 38.0 + && !VarModule::is_flag(boma.object(), SPECIAL_LW_INVALID_WARP) + && !VarModule::is_flag(boma.object(), SPECIAL_LW_WARP_GROUND_START) { + //println!("successful aerial teleport. entering special fall"); + StatusModule::change_status_request(boma, *FIGHTER_STATUS_KIND_FALL_SPECIAL, false); } } - - // transition rosalina to special fall after a successful aerial teleport - if fighter.motion_frame() > 38.0 - && !VarModule::is_flag(boma.object(), SPECIAL_LW_INVALID_WARP) - && !VarModule::is_flag(boma.object(), SPECIAL_LW_WARP_GROUND_START) { - //println!("successful aerial teleport. entering special fall"); - StatusModule::change_status_request(boma, *FIGHTER_STATUS_KIND_FALL_SPECIAL, false); - } } unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { diff --git a/fighters/rosetta/src/status/mod.rs b/fighters/rosetta/src/status/mod.rs index ac4bba8046..e5d075a2a5 100644 --- a/fighters/rosetta/src/status/mod.rs +++ b/fighters/rosetta/src/status/mod.rs @@ -15,7 +15,7 @@ unsafe extern "C" fn should_use_special_lw_callback(fighter: &mut L2CFighterComm unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { // set the callbacks on fighter init - fighter.global_table[globals::USE_SPECIAL_LW_CALLBACK].assign(&L2CValue::Ptr(should_use_special_lw_callback as *const () as _)); + //fighter.global_table[globals::USE_SPECIAL_LW_CALLBACK].assign(&L2CValue::Ptr(should_use_special_lw_callback as *const () as _)); VarModule::set_int(fighter.battle_object, vars::common::instance::GIMMICK_TIMER, 0); VarModule::off_flag(fighter.battle_object, vars::rosetta::instance::SPECIAL_LW_TICO_UNAVAILABLE); VarModule::off_flag(fighter.battle_object, vars::rosetta::status::SPECIAL_LW_INVALID_WARP); diff --git a/fighters/rosetta/src/tico/acmd.rs b/fighters/rosetta/src/tico/acmd.rs index 6db384b5ec..2f5769ed8e 100644 --- a/fighters/rosetta/src/tico/acmd.rs +++ b/fighters/rosetta/src/tico/acmd.rs @@ -157,6 +157,200 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { } } + +unsafe extern "C" fn effect_specialncharge(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + VarModule::set_int(agent.battle_object, vars::rosetta::instance::TICO_CHARGE_LEVEL, 0); + wait(lua_state, 5.0); + for _ in 0..3 { + if is_excute(agent) { + VarModule::inc_int(agent.battle_object, vars::rosetta::instance::TICO_CHARGE_LEVEL); + EFFECT_FOLLOW(agent, Hash40::new("rosetta_attack_flash1"), Hash40::new("top"), 15.0 * boma.lr(), 3.5, 0, 0, 0, 0, 0.45, true); + LAST_EFFECT_SET_RATE(agent, 0.75); + } + wait(lua_state, 20.0); + } + if is_excute(agent) { + VarModule::inc_int(agent.battle_object, vars::rosetta::instance::TICO_CHARGE_LEVEL); + EFFECT_FOLLOW(agent, Hash40::new("rosetta_attack_flash3"), Hash40::new("top"), 15.0 * boma.lr(), 3.5, 0, 0, 0, 0, 0.48, true); + LAST_EFFECT_SET_RATE(agent, 0.5); + } +} + +unsafe extern "C" fn sound_specialncharge(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + wait(lua_state, 5.0); + for _ in 0..3 { + if is_excute(agent) { + let sound = SoundModule::play_status_se(boma, Hash40::new("se_tico_swing_m"), true, false, false); + SoundModule::set_se_vol(boma, sound as i32, 0.75, 0); + } + wait(lua_state, 20.0); + } + if is_excute(agent) { + let sound = SoundModule::play_status_se(boma, Hash40::new("se_tico_swing_l"), true, false, false); + SoundModule::set_se_vol(boma, sound as i32, 0.75, 0); + } +} + +unsafe extern "C" fn game_specialnfly(agent: &mut L2CAgentBase) { +} + +unsafe extern "C" fn effect_specialnfly(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_TOGGLE_TWINKLE_EFFECT); + QUAKE(agent, *CAMERA_QUAKE_KIND_S); + } + frame(lua_state, 17.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_S); + } +} + +unsafe extern "C" fn sound_specialnfly(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_rosetta_special_n02_s")); + } //always play weak sfx +} + +unsafe extern "C" fn game_specialnend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + MotionModule::set_rate(boma, (10.0-2.0)/5.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("waist"), 3.34, 75, 100, 0, 25, 4.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, -2.5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + } + frame(lua_state, 10.0); + MotionModule::set_rate(boma, (38.0-10.0)/24.0);//30 faf + if is_excute(agent) { + sv_kinetic_energy!(set_speed, agent, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.05 * boma.lr(), 0.0); + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_specialnend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("rosetta_attack_flash1"), Hash40::new("top"), 15.0 * boma.lr(), 3.5, 0, 0, 0, 0, 0.5, false); + } +} + +unsafe extern "C" fn sound_specialnend(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_tico_swing_s")); + } +} + +unsafe extern "C" fn game_freerecall(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0);//standby + frame(lua_state, 20.0); + frame(lua_state, 40.0);//burst + if is_excute(agent) { + HitModule::set_whole(boma, HitStatus(*HIT_STATUS_OFF), 0); + } + frame(lua_state, 50.0); + MotionModule::set_rate(boma, 1.0); + frame(lua_state, 60.0); + MotionModule::set_rate(boma, (65.0-60.0)/8.0);//7f activity + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_explosionl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + ATTACK(agent, 0, 0, Hash40::new("waist"), 20.0, 55, 75, 0, 65, 10.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 30.0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_BOMB); + } +} + +unsafe extern "C" fn effect_freerecall(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("rosetta_ticoshot_tico_hold"), Hash40::new("waist"), 0, 0.0, 0, 0, 0, 0, 1.15, true); + LAST_EFFECT_SET_ALPHA(agent, 0.3); + } + frame(lua_state, 25.0); + for _ in 0..3 { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("rosetta_tico_worry"), Hash40::new("top"), 1, 5, 1, 40, 0, 0, 1, true); + } + wait(lua_state, 1.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("rosetta_tico_worry"), Hash40::new("top"), 1, 5, -1, 40, 180, 0, 1, true); + } + wait(lua_state, 3.0); + } + frame(lua_state, 40.1); + if is_excute(agent) { + EFFECT(agent, Hash40::new("rosetta_attack_flash3"), Hash40::new("top"), 0.2, 6.0, -15.0, 0, 0, 0, 0.75, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_COLOR(agent, 0.7, 0.02, 0.005); + LAST_EFFECT_SET_RATE(agent, 0.65); + } + frame(lua_state, 55.5); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_L); + EFFECT(agent, Hash40::new("rosetta_final_bomb"), Hash40::new("top"), 0.0, 6.0, 0.0, 0, 0, 0, 0.52, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 2.0); + EFFECT(agent, Hash40::new("rosetta_final_smoke"), Hash40::new("top"), 0.0, 6.0, 0.0, 0, 90, 0, 0.71, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 2.0); + } + frame(lua_state, 59.0); + if is_excute(agent) { + VisibilityModule::set_whole(boma, false); + } +} + +unsafe extern "C" fn sound_freerecall(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 40.1); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("vc_tico_sad")); + } + frame(lua_state, 59.0); + if is_excute(agent) { + PLAY_SE_REMAIN(agent, Hash40::new("se_common_bomb_ll")); + PLAY_SE(agent, Hash40::new("se_tico_dead")); + } +} + +unsafe extern "C" fn effect_death(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if !agent.is_prev_status(statuses::rosetta_tico::POP) { + if is_excute(agent) { + EFFECT(agent, Hash40::new("rosetta_tico_dead"), Hash40::new("hip"), 1, 0, 0, 0, 0, -90, 1.1, 0, 0, 0, 0, 0, 0, true); + QUAKE(agent, *CAMERA_QUAKE_KIND_S); + } + } + frame(lua_state, 60.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_CAMERA_OFF); + } +} + +unsafe extern "C" fn sound_death(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if !agent.is_prev_status(statuses::rosetta_tico::POP) { + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_tico_dead")); + } + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attacks4", game_attacks4, Priority::Low); agent.acmd("game_attacks4hi", game_attacks4, Priority::Low); @@ -173,4 +367,22 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); agent.acmd("effect_attackairlw", effect_attackairlw, Priority::Low); + + agent.acmd("effect_specialncharge", effect_specialncharge, Priority::Low); + agent.acmd("sound_specialncharge", sound_specialncharge, Priority::Low); + + agent.acmd("game_specialnfly", game_specialnfly, Priority::Low); + agent.acmd("effect_specialnfly", effect_specialnfly, Priority::Low); + agent.acmd("sound_specialnfly", sound_specialnfly, Priority::Low); + + agent.acmd("game_specialnend", game_specialnend, Priority::Low); + agent.acmd("effect_specialnend", effect_specialnend, Priority::Low); + agent.acmd("sound_specialnend", sound_specialnend, Priority::Low); + + agent.acmd("game_freerecall", game_freerecall, Priority::Low); + agent.acmd("effect_freerecall", effect_freerecall, Priority::Low); + agent.acmd("sound_freerecall", sound_freerecall, Priority::Low); + + agent.acmd("effect_death", effect_death, Priority::Low); + agent.acmd("sound_death", sound_death, Priority::Low); } \ No newline at end of file diff --git a/fighters/rosetta/src/tico/mod.rs b/fighters/rosetta/src/tico/mod.rs index 7fe7f58a98..b42dcea37f 100644 --- a/fighters/rosetta/src/tico/mod.rs +++ b/fighters/rosetta/src/tico/mod.rs @@ -2,10 +2,12 @@ use super::*; mod acmd; mod opff; +mod status; pub fn install() { let agent = &mut Agent::new("rosetta_tico"); acmd::install(agent); opff::install(agent); + status::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/rosetta/src/tico/opff.rs b/fighters/rosetta/src/tico/opff.rs index 5f00aeadc5..deae6edce8 100644 --- a/fighters/rosetta/src/tico/opff.rs +++ b/fighters/rosetta/src/tico/opff.rs @@ -24,9 +24,26 @@ unsafe extern "C" fn tico_frame(weapon: &mut L2CWeaponCommon) { *WEAPON_ROSETTA_TICO_STATUS_KIND_DAMAGE_FALL, *WEAPON_ROSETTA_TICO_STATUS_KIND_DAMAGE_FLY, *WEAPON_ROSETTA_TICO_STATUS_KIND_DAMAGE_FLY_REFLECT_LR, - *WEAPON_ROSETTA_TICO_STATUS_KIND_DAMAGE_FLY_REFLECT_U]) { + *WEAPON_ROSETTA_TICO_STATUS_KIND_DAMAGE_FLY_REFLECT_U, + statuses::rosetta_tico::STANDBY, + statuses::rosetta_tico::POP]) { VarModule::on_flag(rosetta, SPECIAL_LW_TICO_UNAVAILABLE); } + //check if luma has synced to rosa after spawning + if weapon.is_status_one_of(&[ + *WEAPON_ROSETTA_TICO_STATUS_KIND_DEAD, + *WEAPON_ROSETTA_TICO_STATUS_KIND_DOWN, + *WEAPON_ROSETTA_TICO_STATUS_KIND_STANDBY, + *WEAPON_ROSETTA_TICO_STATUS_KIND_NONE, + *WEAPON_ROSETTA_TICO_STATUS_KIND_REBIRTH]) { + //reset first-sync flag + VarModule::off_flag(weapon.battle_object, TICO_SPAWN_HAS_SYNCED); + } + if !VarModule::is_flag(weapon.battle_object, TICO_SPAWN_HAS_SYNCED) + && weapon.is_status(*WEAPON_ROSETTA_TICO_STATUS_KIND_FOLLOW) + && !weapon.is_flag(*WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_FREE) { + VarModule::on_flag(weapon.battle_object, TICO_SPAWN_HAS_SYNCED); + } } pub fn install(agent: &mut Agent) { diff --git a/fighters/rosetta/src/tico/status.rs b/fighters/rosetta/src/tico/status.rs new file mode 100644 index 0000000000..9454d0774c --- /dev/null +++ b/fighters/rosetta/src/tico/status.rs @@ -0,0 +1,220 @@ +use super::*; +use crate::globals::*; +use vars::rosetta::instance::*; + +// WEAPON_ROSETTA_TICO_STATUS_KIND_SPECIAL_N_SHOOT + +pub unsafe extern "C" fn special_n_shoot_main(weapon: &mut L2CFighterCommon) -> L2CValue { + //pop forward + let lr= weapon.lr(); + PostureModule::add_pos_2d(weapon.module_accessor, &Vector2f::new(3.8 * lr, 0.0)); + //vars + let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; + let rosetta: *mut BattleObject = utils::util::get_battle_object_from_id(owner_id); + let rosetta_boma: &mut BattleObjectModuleAccessor = &mut *(*rosetta).module_accessor; + let agent: &mut L2CFighterCommon = util::get_fighter_common_from_accessor(rosetta_boma); + let rosa_pos = *PostureModule::pos(agent.module_accessor); + let loma_pos = *PostureModule::pos(weapon.module_accessor); + let mut rosa_lr= agent.lr(); + let pos_diff = Vector2f::new(loma_pos.x - rosa_pos.x, loma_pos.y - rosa_pos.y); + //disappear fx + EFFECT(agent, Hash40::new("rosetta_escape"), Hash40::new("top"), 15.0 * rosa_lr, -1.0 + pos_diff.y, ( 3.8 * rosa_lr + pos_diff.x) * rosa_lr, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.25); + //delete annoying blue glow + weapon.clear_lua_stack(); + lua_args!(weapon, MA_MSC_CMD_EFFECT_EFFECT_OFF_KIND, Hash40::new("rosetta_tico_warp_line"), true, true); + sv_module_access::effect(weapon.lua_state_agent); + weapon.clear_lua_stack(); + lua_args!(weapon, MA_MSC_CMD_EFFECT_EFFECT_OFF_KIND, Hash40::new("rosetta_tico_warp"), true, true); + sv_module_access::effect(weapon.lua_state_agent); + //anim + MotionModule::change_motion(weapon.module_accessor, Hash40::new("special_n_fly"), 0.0, 0.0, false, 0.0, false, false); + //startup movement + KineticModule::change_kinetic(weapon.module_accessor, *WEAPON_KINETIC_TYPE_NORMAL); + KineticModule::enable_energy(weapon.module_accessor, *WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL); + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.5 *lr, 0.0); + sv_kinetic_energy!(set_accel, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, -1.0, -1.0); + //luma logic flags + weapon.on_flag(*WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_FREE); + weapon.on_flag(*WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_TARGET_MOVE); + weapon.set_int(0, *WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_INT_JUMP_COUNT); + weapon.off_flag(*WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_FREE_DISABLE_JUMP); + weapon.off_flag(*WEAPON_ROSETTA_TICO_INSTANCE_WORK_ID_FLAG_TARGET_SAME_FLOOR); + weapon.fastshift(L2CValue::Ptr(special_n_shoot_main_loop as *const () as _)) +} + +pub unsafe extern "C" fn special_n_shoot_main_loop(weapon: &mut L2CFighterCommon) -> L2CValue { + let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; + let rosetta = utils::util::get_battle_object_from_id(owner_id); + let rosetta_boma: &mut BattleObjectModuleAccessor = &mut *(*rosetta).module_accessor; + let agent: &mut L2CFighterCommon = util::get_fighter_common_from_accessor(rosetta_boma); + if weapon.status_frame() == 5 {//f5 + //invis + JostleModule::set_status(weapon.module_accessor, false); + VisibilityModule::set_whole(weapon.module_accessor, false); + HitModule::set_status_all(weapon.module_accessor, app::HitStatus(*HIT_STATUS_OFF), 0); + //distance and tp + let lr = weapon.lr(); + let charge_level = VarModule::get_int(weapon.battle_object, vars::rosetta::instance::TICO_CHARGE_LEVEL) as f32; + let distance_min = 10.0; //base distance 3 big squares + let distance_add = 20.0; //20 units per 20f frames charged, max 9 big squares + let distance = distance_min + (distance_add * charge_level); //5 charge tiers + let speed = distance / 6.0 * lr; //6 frames then disable movement + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, speed, 0.0); + sv_kinetic_energy!(set_accel, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); + sv_kinetic_energy!(set_brake, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, -1.0, -1.0); + } else if weapon.status_frame() == 11 {//11, 7f before reappear + //get pos for fx to spawn ig + let rosa_pos = *PostureModule::pos(agent.module_accessor); + let loma_pos = *PostureModule::pos(weapon.module_accessor); + let mut rosa_lr= agent.lr(); + let pos_diff = Vector2f::new(loma_pos.x - rosa_pos.x, loma_pos.y - rosa_pos.y); + EFFECT(agent, Hash40::new("rosetta_escape"), Hash40::new("top"), 15.0 * rosa_lr, -2.95 + pos_diff.y, ( 1.35 * rosa_lr + pos_diff.x) * rosa_lr, 0, 0, 0, 0.69, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 0.95); + //stop it + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); + KineticModule::unable_energy_all(weapon.module_accessor); + PLAY_SE(weapon, Hash40::new("vc_tico_angry"));//luma yell when re-appearing? + } else if weapon.status_frame() == 18 { //18f + weapon.change_status(WEAPON_ROSETTA_TICO_STATUS_KIND_SPECIAL_N_END.into(), true.into()); + } + 0.into() +} + +// WEAPON_ROSETTA_TICO_STATUS_KIND_SPECIAL_N_END + +pub unsafe extern "C" fn special_n_end_main(weapon: &mut L2CFighterCommon) -> L2CValue { + //make visible + JostleModule::set_status(weapon.module_accessor, true); + VisibilityModule::set_whole(weapon.module_accessor, true); + HitModule::set_status_all(weapon.module_accessor, app::HitStatus(*HIT_STATUS_NORMAL), 0); + //anim frame + MotionModule::change_motion(weapon.module_accessor, Hash40::new("special_n_end"), 1.0, 1.0, false, 0.0, false, false); //skips to it popping up + //slight movement on reappearance + let lr: f32 = weapon.lr(); + KineticModule::change_kinetic(weapon.module_accessor, *WEAPON_KINETIC_TYPE_NORMAL); + //KineticModule::enable_energy(weapon.module_accessor, *WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL); + sv_kinetic_energy!(set_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.15 *lr, 0.0); + sv_kinetic_energy!(set_accel, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, weapon, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, -1.0, -1.0); + weapon.fastshift(L2CValue::Ptr(special_n_end_main_loop as *const () as _)) +} + +pub unsafe extern "C" fn special_n_end_main_loop(weapon: &mut L2CFighterCommon) -> L2CValue { + if MotionModule::is_end(weapon.module_accessor) { + weapon.change_status(WEAPON_ROSETTA_TICO_STATUS_KIND_FREE_WAIT.into(), true.into()); + } + 0.into() +} + +unsafe extern "C" fn standby_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { + StatusModule::init_settings( + weapon.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *WEAPON_KINETIC_TYPE_RESET, + 0, + app::GroundCliffCheckKind(*GROUND_CORRECT_KIND_AIR), + false, + 0, + 0, + 0, + 0 + ); + return 0.into(); +} + +unsafe extern "C" fn standby_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + + let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; + let rosetta = utils::util::get_battle_object_from_id(owner_id); + let rosetta_boma: &mut BattleObjectModuleAccessor = &mut *(*rosetta).module_accessor; + let rosa_lr = rosetta_boma.lr(); + KineticModule::unable_energy_all(weapon.module_accessor); + MotionModule::change_motion(weapon.module_accessor, Hash40::new("free_recall"), 0.0, 1.0, false, 0.0, false, false); + weapon.shift(L2CValue::Ptr(standby_main_loop as *const () as _)) +}//make lumi stop when recalled, waits to either die or be sent back + +unsafe extern "C" fn standby_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { + let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; + let rosetta = utils::util::get_battle_object_from_id(owner_id); + let rosetta_boma: &mut BattleObjectModuleAccessor = &mut *(*rosetta).module_accessor; + if rosetta_boma.is_button_off(Buttons::Special) && !rosetta_boma.is_button_release(Buttons::Special) + || StopModule::is_damage(rosetta_boma) + || !VarModule::is_flag(weapon.battle_object, TICO_SPAWN_HAS_SYNCED) + {//if rosaliner is not holding special, she gets hit, or luma isn't ready do something + weapon.change_status_req(*WEAPON_ROSETTA_TICO_STATUS_KIND_FREE_WAIT, false); + return 1.into() + }//hopefully the right status + if HitModule::get_whole(weapon.module_accessor, 0) != *HIT_STATUS_NORMAL { + weapon.change_status_req(statuses::rosetta_tico::POP, true); + } + //size scaling + let frame = MotionModule::frame(weapon.module_accessor); + let scale = 1.0 + (0.75 / 50.0 * frame.min(50.0)); + ModelModule::set_scale(weapon.module_accessor, scale); + return 0.into(); +} + +unsafe extern "C" fn standby_end(weapon: &mut L2CWeaponCommon) -> L2CValue { + if weapon.global_table[STATUS_KIND].get_i32() != statuses::rosetta_tico::POP { + ModelModule::set_scale(weapon.module_accessor, 1.0); + HitModule::set_whole(weapon.module_accessor, HitStatus(*HIT_STATUS_NORMAL), 0); + } + return 0.into(); +} + +unsafe extern "C" fn pop_pre(weapon: &mut L2CWeaponCommon) -> L2CValue { + StatusModule::init_settings( + weapon.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *WEAPON_KINETIC_TYPE_RESET, + 0, + app::GroundCliffCheckKind(*GROUND_CORRECT_KIND_AIR), + false, + 0, + 0, + 0, + 0 + ); + return 0.into(); +} + +unsafe extern "C" fn pop_main(weapon: &mut L2CWeaponCommon) -> L2CValue { + JostleModule::set_status(weapon.module_accessor, false); + HitModule::set_whole(weapon.module_accessor, HitStatus(*HIT_STATUS_XLU), 0); + KineticModule::unable_energy_all(weapon.module_accessor); + weapon.shift(L2CValue::Ptr(pop_main_loop as *const () as _)) +} + +unsafe extern "C" fn pop_main_loop(weapon: &mut L2CWeaponCommon) -> L2CValue { + let agent: &mut L2CFighterCommon = util::get_fighter_common_from_accessor(&mut *weapon.module_accessor); + let frame = MotionModule::frame(weapon.module_accessor); + let scale = 1.05 + (0.75 / 50.0 * frame.min(50.0)); + ModelModule::set_scale(weapon.module_accessor, scale); + if MotionModule::is_end(weapon.module_accessor) { + weapon.change_status_req(*WEAPON_ROSETTA_TICO_STATUS_KIND_DEAD, false); + } + + return 0.into(); +} + +unsafe extern "C" fn pop_end(weapon: &mut L2CWeaponCommon) -> L2CValue { + ModelModule::set_scale(weapon.module_accessor, 1.0); + JostleModule::set_status(weapon.module_accessor, true); + return 0.into(); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *WEAPON_ROSETTA_TICO_STATUS_KIND_SPECIAL_N_SHOOT, special_n_shoot_main); + agent.status(Main, *WEAPON_ROSETTA_TICO_STATUS_KIND_SPECIAL_N_END, special_n_end_main); + + agent.status(Pre, statuses::rosetta_tico::STANDBY, standby_pre); + agent.status(Main, statuses::rosetta_tico::STANDBY, standby_main); + agent.status(End, statuses::rosetta_tico::STANDBY, standby_end); + + agent.status(Pre, statuses::rosetta_tico::POP, pop_pre); + agent.status(Main, statuses::rosetta_tico::POP, pop_main); + agent.status(End, statuses::rosetta_tico::POP, pop_end); +} \ No newline at end of file diff --git a/fighters/roy/Cargo.toml b/fighters/roy/Cargo.toml index 89c44b6867..b9da2eaf16 100644 --- a/fighters/roy/Cargo.toml +++ b/fighters/roy/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/roy/src/acmd/aerials.rs b/fighters/roy/src/acmd/aerials.rs index 53a545e39f..f86aa2e18c 100644 --- a/fighters/roy/src/acmd/aerials.rs +++ b/fighters/roy/src/acmd/aerials.rs @@ -28,6 +28,12 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 10.0, 361, 80, 0, 50, 3.75, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("sword1"), 10.0, 361, 80, 0, 50, 3.5, 0.0, 0.0, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); } + frame(lua_state, 22.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("sword1"), 8.0, 361, 80, 0, 50, 4.0, 0.0, 0.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 8.0, 361, 80, 0, 50, 3.75, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 8.0, 361, 80, 0, 50, 3.5, 0.0, 0.0, 8.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + } frame(lua_state, 27.0); if is_excute(agent) { AttackModule::clear_all(boma); @@ -161,19 +167,19 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); if is_excute(agent) { PostureModule::reverse_lr(boma); - ATTACK(agent, 0, 0, Hash40::new("sword1"), 14.0, 50, 113, 0, 20, 4.0, 2.0, 0.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 14.0, 50, 113, 0, 20, 3.75, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 11.0, 40, 70, 0, 20, 3.5, 2.0, 0.0, 9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword1"), 14.0, 50, 109, 0, 20, 3.75, 2.0, 0.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 14.0, 50, 109, 0, 20, 3.5, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 11.0, 40, 70, 0, 20, 3.25, 2.0, 0.0, 9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 2, 0, Hash40::new("top"), 11.0, 40, 70, 0, 20, 3.5, 5.0, 18.5, -9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 11.0, 40, 70, 0, 20, 3.25, 5.0, 18.5, -9.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword1"), 11.0, 40, 70, 0, 20, 4.0, 2.0, 0.0, 2.2, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 11.0, 40, 70, 0, 20, 3.75, 0.75, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 11.0, 40, 70, 0, 20, 3.5, 5.0, 19.5, -1.25, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword1"), 11.0, 40, 70, 0, 20, 3.75, 2.0, 0.0, 2.2, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 11.0, 40, 70, 0, 20, 3.5, 0.75, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("top"), 11.0, 40, 70, 0, 20, 3.25, 5.0, 19.5, -1.25, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); } frame(lua_state, 11.0); if is_excute(agent) { @@ -190,13 +196,12 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_roy_sword_hdr"), Hash40::new("tex_roy_sword2"), 7, Hash40::new("sword1"), 0.0, 0.0, -0.8, Hash40::new("sword1"), -0.0, -0.0, 14.5, true, Hash40::new("roy_sword"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); EFFECT_FOLLOW(agent, Hash40::new("roy_fire"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 0.8, true); LAST_EFFECT_SET_RATE(agent, 1.3); } frame(lua_state, 7.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_roy_sword_hdr"), Hash40::new("tex_roy_sword2"), 7, Hash40::new("sword1"), 0.0, 0.0, -0.8, Hash40::new("sword1"), -0.0, -0.0, 14.5, true, Hash40::new("roy_sword"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); - EFFECT_FOLLOW(agent, Hash40::new("roy_attack_fire"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 0.9, true); LAST_EFFECT_SET_RATE(agent, 1.1); } @@ -235,9 +240,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 10.0, 74, 66, 0, 45, 3.75, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword1"), 7.0, 77, 66, 0, 30, 3.5, 2.0, 0.0, 8.75, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 10.0, 74, 66, 0, 45, 4.0, 2.0, 0.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 10.0, 77, 66, 0, 45, 3.75, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword1"), 7.0, 80, 66, 0, 30, 3.5, 2.0, 0.0, 8.75, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 10.0, 77, 66, 0, 45, 4.0, 2.0, 0.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 12.0); FT_MOTION_RATE_RANGE(agent, 12.0, 42.0, 33.0); @@ -266,13 +271,17 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 6.5, 2.0); + frame(lua_state, 6.5); + FT_MOTION_RATE_RANGE(agent, 6.5, 7.0, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword1"), 11.0, 90, 60, 0, 50, 4.0, 2.0, 0.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword1"), 11.0, 85, 78, 0, 30, 4.0, 2.0, 0.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword1"), 9.0, 37, 60, 0, 37, 3.5, 2.0, 0.0, 8.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("claviclec"), 15.0, 288, 50, 0, 30, 4.2, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); } @@ -291,7 +300,7 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 12.5, 12.0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); + // EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 12.5, 12.0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 5.0); if is_excute(agent) { diff --git a/fighters/roy/src/acmd/other.rs b/fighters/roy/src/acmd/other.rs index 679feeb8b6..0ef70a53f3 100644 --- a/fighters/roy/src/acmd/other.rs +++ b/fighters/roy/src/acmd/other.rs @@ -111,15 +111,11 @@ unsafe extern "C" fn game_appeallwl(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -129,10 +125,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/roy/src/acmd/smashes.rs b/fighters/roy/src/acmd/smashes.rs index 598b8be310..7d419838f4 100644 --- a/fighters/roy/src/acmd/smashes.rs +++ b/fighters/roy/src/acmd/smashes.rs @@ -114,8 +114,8 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } wait(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 90, 96, 0, 70, 5.2, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword1"), 10.0, 90, 96, 0, 70, 6.9, 0.0, 0.0, 7.2, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 90, 102, 0, 70, 5.2, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword1"), 10.0, 90, 102, 0, 70, 6.9, 0.0, 0.0, 7.2, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -133,10 +133,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword1"), 18.0, 75, 86, 0, 42, 4.3, 0.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 18.0, 75, 86, 0, 42, 3.1, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("colonells"), 18.0, 75, 86, 0, 42, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword1"), 11.0, 361, 87, 0, 25, 3.5, 0.0, 0.0, 8.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword1"), 18.0, 75, 81, 0, 42, 4.3, 0.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 18.0, 75, 81, 0, 42, 3.1, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("colonells"), 18.0, 75, 81, 0, 42, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword1"), 11.0, 63, 80, 0, 20, 3.5, 0.0, 0.0, 8.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 10.0); @@ -144,7 +144,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("sword1"), 14.0, 75, 80, 0, 42, 3.9, 0.0, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("armr"), 14.0, 75, 80, 0, 42, 3.1, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("colonells"), 14.0, 75, 80, 0, 42, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword1"), 10.0, 361, 80, 0, 20, 3.5, 0.0, 0.0, 8.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword1"), 10.0, 63, 70, 0, 20, 3.5, 0.0, 0.0, 8.5, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 18.0); diff --git a/fighters/roy/src/acmd/specials/mod.rs b/fighters/roy/src/acmd/specials/mod.rs index bfb9476c45..95de72fe2b 100644 --- a/fighters/roy/src/acmd/specials/mod.rs +++ b/fighters/roy/src/acmd/specials/mod.rs @@ -9,7 +9,7 @@ unsafe extern "C" fn game_specialnend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.625); + FT_MOTION_RATE(agent, 0.5); frame(lua_state, 9.0); FT_MOTION_RATE(agent, 2.5); if is_excute(agent) { diff --git a/fighters/roy/src/acmd/specials/special_s3.rs b/fighters/roy/src/acmd/specials/special_s3.rs index 6947cd1f4c..f22d22b36f 100644 --- a/fighters/roy/src/acmd/specials/special_s3.rs +++ b/fighters/roy/src/acmd/specials/special_s3.rs @@ -9,9 +9,9 @@ unsafe extern "C" fn game_specials3hi(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 290, 69, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("armr"), 8.0, 290, 69, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 8.0, 290, 69, 0, 50, 4.0, 2.0, 0.0, 2.2, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 280, 69, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("armr"), 8.0, 280, 69, 0, 45, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 8.0, 280, 69, 0, 45, 4.0, 2.0, 0.0, 2.2, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("sword1"), 6.0, 280, 47, 0, 36, 4.5, 2.0, 0.0, 8.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); } frame(lua_state, 16.0); diff --git a/fighters/roy/src/acmd/throws.rs b/fighters/roy/src/acmd/throws.rs index 87f61b277e..4ca4275a00 100644 --- a/fighters/roy/src/acmd/throws.rs +++ b/fighters/roy/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 0.0, Some(0.0), Some(8.0), Some(12.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 7.0, Some(0.0), Some(8.0), Some(12.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -53,7 +53,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -4.0, Some(0.0), Some(7.0), Some(-12.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -5.0, Some(0.0), Some(7.0), Some(-12.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -87,19 +87,50 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 135, 70, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 5.0, 125, 45, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 7.0); + frame(lua_state, 15.0); if is_excute(agent) { - CHECK_FINISH_CAMERA(agent, 1, 5); + CHECK_FINISH_CAMERA(agent, -6, 3); } - frame(lua_state, 8.0); + frame(lua_state, 16.0); if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); } } +unsafe extern "C" fn sound_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + frame(lua_state, 16.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_roy_rnd_attack")); + PLAY_SE(agent, Hash40::new("se_common_throw_02")); + } +} + +unsafe extern "C" fn expression_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_R); + } + frame(lua_state, 16.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_M); + ControlModule::set_rumble(boma, Hash40::new("rbkind_attackm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 36.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 4); + } +} + unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -124,7 +155,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 69, 85, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 69, 92, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 15.0); @@ -142,7 +173,11 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("sound_throwb", sound_throwb, Priority::Low); + agent.acmd("expression_throwb", expression_throwb, Priority::Low); + agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); } \ No newline at end of file diff --git a/fighters/roy/src/acmd/tilts.rs b/fighters/roy/src/acmd/tilts.rs index b8c037a5a8..51edca9463 100644 --- a/fighters/roy/src/acmd/tilts.rs +++ b/fighters/roy/src/acmd/tilts.rs @@ -118,9 +118,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword1"), 10.0, 80, 40, 0, 90, 4.0, 0.0, 0.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 10.0, 80, 40, 0, 90, 3.75, 0.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword1"), 6.0, 80, 40, 0, 70, 3.5, 0.0, 0.0, 8.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword1"), 10.0, 80, 40, 0, 90, 4.0, 0.0, -1.0, 2.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 10.0, 80, 40, 0, 90, 3.5, 0.0, -2.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ROY_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword1"), 6.0, 73, 40, 0, 63, 3.25, 0.0, 0.0, 8.5, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 3.0); diff --git a/fighters/roy/src/lib.rs b/fighters/roy/src/lib.rs index fa24d112b4..6757c06eb0 100644 --- a/fighters/roy/src/lib.rs +++ b/fighters/roy/src/lib.rs @@ -30,6 +30,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/roy/src/status/special_hi.rs b/fighters/roy/src/status/special_hi.rs index bde163e725..fd6b6fbf99 100644 --- a/fighters/roy/src/status/special_hi.rs +++ b/fighters/roy/src/status/special_hi.rs @@ -28,6 +28,50 @@ unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } +unsafe extern "C" fn special_hi_init(fighter: &mut L2CFighterCommon) -> L2CValue { + let prev_speed = KineticModule::get_sum_speed3f(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let mut stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let mut gravity_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) as *mut app::KineticEnergy; + let mut motion_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION) as *mut app::KineticEnergy; + + if !fighter.is_situation(*SITUATION_KIND_AIR) { + let reset_speed_2f = Vector2f { x: 0.0, y: 0.0 }; + let reset_speed_3f = Vector3f { x: 0.0, y: 0.0, z: 0.0 }; + lua_bind::KineticEnergy::reset_energy(motion_energy, *ENERGY_MOTION_RESET_TYPE_GROUND_TRANS_IGNORE_NORMAL, &reset_speed_2f, &reset_speed_3f, fighter.module_accessor); + lua_bind::KineticEnergy::enable(motion_energy); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + else { + let air_hi_start_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_hi"), hash40("air_hi_start_x_mul")); + let reset_speed_2f = Vector2f { x: prev_speed.x * air_hi_start_x_mul, y: 0.0 }; + let reset_speed_3f = Vector3f { x: 0.0, y: 0.0, z: 0.0 }; + lua_bind::KineticEnergy::reset_energy(stop_energy, *ENERGY_STOP_RESET_TYPE_AIR, &reset_speed_2f, &reset_speed_3f, fighter.module_accessor); + lua_bind::KineticEnergy::enable(stop_energy); + + // let reset_speed_2f = Vector2f { x: 0.0, y: prev_speed.y }; + // let reset_speed_3f = Vector3f { x: 0.0, y: 0.0, z: 0.0 }; + // lua_bind::KineticEnergy::reset_energy(gravity_energy, *ENERGY_GRAVITY_RESET_TYPE_GRAVITY, &reset_speed_2f, &reset_speed_3f, fighter.module_accessor); + // lua_bind::KineticEnergy::enable(gravity_energy); + + let mut gravity_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) as *mut app::FighterKineticEnergyGravity; + let start_air_accel_y = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_air_accel_y"); + smash::app::lua_bind::FighterKineticEnergyGravity::set_accel(gravity_energy, -start_air_accel_y); + + let reset_speed_2f = Vector2f { x: 0.0, y: 0.0 }; + let reset_speed_3f = Vector3f { x: 0.0, y: 0.0, z: 0.0 }; + lua_bind::KineticEnergy::reset_energy(motion_energy, *ENERGY_MOTION_RESET_TYPE_AIR_TRANS_ANGLE, &reset_speed_2f, &reset_speed_3f, fighter.module_accessor); + lua_bind::KineticEnergy::enable(motion_energy); + + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } + + 0.into() +} + + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); + agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_init); } \ No newline at end of file diff --git a/fighters/roy/src/status/special_s.rs b/fighters/roy/src/status/special_s.rs index 6442373db4..82bc50743c 100644 --- a/fighters/roy/src/status/special_s.rs +++ b/fighters/roy/src/status/special_s.rs @@ -77,6 +77,22 @@ pub unsafe extern "C" fn special_s_init(fighter: &mut L2CFighterCommon) -> L2CVa 0.into() } +unsafe extern "C" fn special_s3_check_attack(fighter: &mut L2CFighterCommon, param_2: &L2CValue, param_3: &L2CValue) -> L2CValue { + if fighter.is_motion_one_of(&[Hash40::new("special_s3_hi"), Hash40::new("special_air_s3_hi")]) + && (¶m_3["object_category_"]).get_i32() == *BATTLE_OBJECT_CATEGORY_FIGHTER { + if (¶m_3["kind_"]).get_i32() == *COLLISION_KIND_HIT { + let object_id = (¶m_3["object_id_"]).get_u32(); + let opponent_boma = sv_battle_object::module_accessor(object_id); + if StatusModule::situation_kind(opponent_boma) == *SITUATION_KIND_AIR { + let opponent_object = utils::util::get_battle_object_from_accessor(opponent_boma); + VarModule::on_flag(opponent_object, vars::common::instance::FORCE_TUMBLE_NO_BOUNCE); + } + } + } + + return 0.into(); +} + // FIGHTER_ROY_STATUS_KIND_SPECIAL_S4 pub unsafe extern "C" fn special_s4_main(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -176,6 +192,8 @@ pub fn set_gravity_delay_resume_frame(energy: *mut app::FighterKineticEnergyGrav pub fn install(agent: &mut Agent) { agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_init); + + agent.status(CheckAttack, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S3, special_s3_check_attack); agent.status(Main, *FIGHTER_ROY_STATUS_KIND_SPECIAL_S4, special_s4_main); } diff --git a/fighters/ryu/Cargo.toml b/fighters/ryu/Cargo.toml index 4034f55068..6fedd23365 100644 --- a/fighters/ryu/Cargo.toml +++ b/fighters/ryu/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/ryu/src/acmd/other.rs b/fighters/ryu/src/acmd/other.rs index 0c9b155017..ec532aac6b 100644 --- a/fighters/ryu/src/acmd/other.rs +++ b/fighters/ryu/src/acmd/other.rs @@ -64,15 +64,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -82,10 +78,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { agent.on_flag(*FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_guarddamage(agent: &mut L2CAgentBase) { diff --git a/fighters/ryu/src/acmd/specials/special_lw.rs b/fighters/ryu/src/acmd/specials/special_lw.rs index f4a957f262..acd6b940e7 100644 --- a/fighters/ryu/src/acmd/specials/special_lw.rs +++ b/fighters/ryu/src/acmd/specials/special_lw.rs @@ -5,6 +5,45 @@ unsafe extern "C" fn game_speciallwstart(agent: &mut L2CAgentBase) { let boma = agent.boma(); } +unsafe extern "C" fn effect_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("ryu_savingattack_aura"), Hash40::new("hip"), -2, 0, 0, 0, 0, 0, 1.4, true); + EFFECT_FOLLOW(agent, Hash40::new("ryu_savingattack_aura"), Hash40::new("neck"), 0, 0, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("ryu_savingattack_aura"), Hash40::new("handl"), 0, 0, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("ryu_savingattack_aura"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("ryu_savingattack_aura"), Hash40::new("kneel"), 4, 0, 0, 0, 0, 0, 1.1, true); + EFFECT_FOLLOW(agent, Hash40::new("ryu_savingattack_aura"), Hash40::new("kneer"), 4, 0, 0, 0, 0, 0, 1.1, true); + } + frame(lua_state, 10.0); + if is_excute(agent) { + if agent.is_situation(*SITUATION_KIND_GROUND) { + FOOT_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, false); + } + } + frame(lua_state, 30.0); + if is_excute(agent) { + FLASH(agent, 1, 1, 0.392, 0.392); + } + wait(lua_state, 2.0); + if is_excute(agent) { + FLASH(agent, 0.706, 0.706, 0.706, 0.294); + } + wait(lua_state, 1.0); + if is_excute(agent) { + FLASH(agent, 1, 1, 0, 0.157); + } + wait(lua_state, 2.0); + if is_excute(agent) { + COL_NORMAL(agent); + } + frame(lua_state, 59.0); + if is_excute(agent) { + EFFECT_FLIP(agent, Hash40::new("sys_unblockable_flash"), Hash40::new("sys_unblockable_flash"), Hash40::new("top"), 3, 13, -1, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, true, *EF_FLIP_YZ); + } +} + unsafe extern "C" fn game_speciallwinstall(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -85,11 +124,11 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { if is_excute(agent) { agent.on_flag(*FIGHTER_RYU_STATUS_WORK_ID_SPECIAL_LW_FLAG_DISABLE_SUPER_ARMOR); if lv == *FIGHTER_RYU_SAVING_LV_1 { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 60, 10, 0, 100, 3.5, 0.0, 10.5, 11.5, Some(0.0), Some(10.5), Some(2.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 31, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 60, 10, 0, 100, 3.5, 0.0, 10.5, 11.5, Some(0.0), Some(10.5), Some(2.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 31, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 60, 10, 0, 100, 3.5, 0.0, 10.5, 11.5, Some(0.0), Some(10.5), Some(2.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 30, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 60, 10, 0, 100, 3.5, 0.0, 10.5, 11.5, Some(0.0), Some(10.5), Some(2.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 30, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); } else if lv == *FIGHTER_RYU_SAVING_LV_2 { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 60, 100, 0, 0, 4.3, 0.0, 10.5, 11.5, Some(0.0), Some(10.5), Some(2.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 42, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 60, 100, 0, 0, 4.3, 0.0, 10.5, 11.5, Some(0.0), Some(10.5), Some(2.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 42, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 60, 100, 0, 0, 4.3, 0.0, 10.5, 11.5, Some(0.0), Some(10.5), Some(2.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 60, 100, 0, 0, 4.3, 0.0, 10.5, 11.5, Some(0.0), Some(10.5), Some(2.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); AttackModule::set_no_finish_camera(boma, 0, true, false); AttackModule::set_no_finish_camera(boma, 1, true, false); } else { @@ -125,11 +164,11 @@ unsafe extern "C" fn game_speciallwturn(agent: &mut L2CAgentBase) { agent.on_flag(*FIGHTER_RYU_STATUS_WORK_ID_SPECIAL_LW_FLAG_DISABLE_SUPER_ARMOR); MeterModule::watch_damage(agent.battle_object, true); if lv == *FIGHTER_RYU_SAVING_LV_1 { - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 60, 10, 0, 100, 3.5, 0.0, 10.5, -13.5, Some(0.0), Some(10.5), Some(-2.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 31, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 60, 10, 0, 100, 3.5, 0.0, 10.5, -13.5, Some(0.0), Some(10.5), Some(-2.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 31, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 60, 10, 0, 100, 3.5, 0.0, 10.5, -13.5, Some(0.0), Some(10.5), Some(-2.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 30, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 60, 10, 0, 100, 3.5, 0.0, 10.5, -13.5, Some(0.0), Some(10.5), Some(-2.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 30, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); } else if lv == *FIGHTER_RYU_SAVING_LV_2 { - ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 60, 100, 0, 0, 4.3, 0.0, 10.5, -13.5, Some(0.0), Some(10.5), Some(-2.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 42, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 60, 100, 0, 0, 4.3, 0.0, 10.5, -13.5, Some(0.0), Some(10.5), Some(-2.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 42, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 60, 100, 0, 0, 4.3, 0.0, 10.5, -13.5, Some(0.0), Some(10.5), Some(-2.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 60, 100, 0, 0, 4.3, 0.0, 10.5, -13.5, Some(0.0), Some(10.5), Some(-2.0), 2.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_saving"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_RYU_KICK, *ATTACK_REGION_PUNCH); AttackModule::set_no_finish_camera(boma, 0, true, false); AttackModule::set_no_finish_camera(boma, 1, true, false); } else { @@ -155,6 +194,9 @@ unsafe extern "C" fn game_speciallwturn(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_speciallwstart", game_speciallwstart, Priority::Low); agent.acmd("game_specialairlwstart", game_speciallwstart, Priority::Low); + agent.acmd("effect_speciallwstart", effect_speciallwstart, Priority::Low); + agent.acmd("effect_specialairlwstart", effect_speciallwstart, Priority::Low); + agent.acmd("game_speciallwinstall", game_speciallwinstall, Priority::Low); agent.acmd("effect_speciallwinstall", effect_speciallwinstall, Priority::Low); agent.acmd("sound_speciallwinstall", sound_speciallwinstall, Priority::Low); diff --git a/fighters/ryu/src/acmd/throws.rs b/fighters/ryu/src/acmd/throws.rs index 3af8bc3069..86a311fd9c 100644 --- a/fighters/ryu/src/acmd/throws.rs +++ b/fighters/ryu/src/acmd/throws.rs @@ -20,17 +20,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.200); - } - frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.2); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.000); - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 9.0, 0.0, Some(0.0), Some(9.0), Some(9.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 9.0, 4.2, Some(0.0), Some(9.0), Some(9.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -70,7 +67,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-13.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.2, 0.0, 8.0, -6.0, Some(0.0), Some(8.0), Some(-13.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/ryu/src/acmd/tilts.rs b/fighters/ryu/src/acmd/tilts.rs index 97ed7785fd..3dc2ec5761 100644 --- a/fighters/ryu/src/acmd/tilts.rs +++ b/fighters/ryu/src/acmd/tilts.rs @@ -86,9 +86,9 @@ unsafe extern "C" fn game_attacks3s(agent: &mut L2CAgentBase) { } else { Hash40::new("collision_attr_normal") }; - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 3.0, 270, 100, 15, 0, 3.0, 1.2, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("bust"), 3.0, 270, 100, 15, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 270, 100, 15, 0, 4.2, 0.0, 11.0, 10.8, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 14, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 3.0, 270, 100, 15, 0, 3.0, 1.2, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("bust"), 3.0, 270, 100, 15, 0, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 270, 100, 15, 0, 4.2, 0.0, 11.0, 10.8, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 1.0); if is_excute(agent) { @@ -104,9 +104,9 @@ unsafe extern "C" fn game_attacks3s(agent: &mut L2CAgentBase) { Hash40::new("collision_attr_normal") }; VarModule::set_int(agent.battle_object, vars::shotos::status::HIT_CANCEL_TIMER, 12); - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 6.0, 46, 90, 0, 60, 3.0, 1.2, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("bust"), 6.0, 46, 90, 0, 60, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 46, 90, 0, 60, 4.2, 0.0, 7.0, 8.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 36, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 6.0, 46, 90, 0, 60, 3.0, 1.2, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 32, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("bust"), 6.0, 46, 90, 0, 60, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 32, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 46, 90, 0, 60, 4.2, 0.0, 7.0, 8.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 32, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RYU_PUNCH, *ATTACK_REGION_PUNCH); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/ryu/src/lib.rs b/fighters/ryu/src/lib.rs index 70d424d287..63b690e5fc 100644 --- a/fighters/ryu/src/lib.rs +++ b/fighters/ryu/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/ryu/src/opff.rs b/fighters/ryu/src/opff.rs index b9eed61f8d..3e13a58895 100644 --- a/fighters/ryu/src/opff.rs +++ b/fighters/ryu/src/opff.rs @@ -421,7 +421,7 @@ unsafe fn magic_series(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectMo *FIGHTER_STATUS_KIND_ATTACK_HI4, ].contains(&status_kind) && AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) - && boma.check_jump_cancel(false, true) { + && boma.check_jump_cancel(false, true, false) { return; } diff --git a/fighters/ryu/src/status/special_s.rs b/fighters/ryu/src/status/special_s.rs index 85a6078dd8..87bbdbf443 100644 --- a/fighters/ryu/src/status/special_s.rs +++ b/fighters/ryu/src/status/special_s.rs @@ -158,7 +158,8 @@ pub unsafe extern "C" fn special_s_loop_init(fighter: &mut L2CFighterCommon) -> } // use hashes to get loop num and speed_x - let loop_num = fighter.get_param_int("param_special_s", loop_count_hash); + let mut loop_num = fighter.get_param_int("param_special_s", loop_count_hash); + if VarModule::is_flag(fighter.battle_object, vars::shotos::instance::EX_SPECIAL_USED) { loop_num = 3; } fighter.set_int(loop_num, *FIGHTER_RYU_STATUS_WORK_ID_SPECIAL_S_INT_LOOP_COUNT); let speed_x = if VarModule::is_flag(fighter.battle_object, vars::shotos::instance::EX_SPECIAL_USED) { if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { 1.8 } else { 1.5 } @@ -287,7 +288,7 @@ unsafe extern "C" fn special_s_loop_main_loop(fighter: &mut L2CFighterCommon) -> pub unsafe extern "C" fn special_s_loop_exec(fighter: &mut L2CFighterCommon) -> L2CValue { // reduce speed on hitting shield - if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) { + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { let strength = fighter.get_int(*FIGHTER_RYU_STATUS_WORK_ID_SPECIAL_COMMON_INT_STRENGTH); let speed_x = if fighter.is_situation(*SITUATION_KIND_GROUND) { if VarModule::is_flag(fighter.battle_object, vars::shotos::instance::EX_SPECIAL_USED) { diff --git a/fighters/samus/Cargo.toml b/fighters/samus/Cargo.toml index ceff7929d0..2b4ae417ea 100644 --- a/fighters/samus/Cargo.toml +++ b/fighters/samus/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/samus/src/acmd/aerials.rs b/fighters/samus/src/acmd/aerials.rs index 531eef34df..a1b08a6f54 100644 --- a/fighters/samus/src/acmd/aerials.rs +++ b/fighters/samus/src/acmd/aerials.rs @@ -29,10 +29,9 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 3.0); + frame(lua_state, 4.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("top"), -2, 9.5, 1, -10, -70, 20, 1.15, true); - LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line_b"), Hash40::new("top"), 0, 6.5, -8, -10, 0, 0, 1.1, false); } frame(lua_state, 5.0); if is_excute(agent) { @@ -70,41 +69,52 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 6.0); + frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 3.0, 365, 100, 49, 0, 6.5, 10.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 3.0, 18, 100, 49, 0, 4.0, 3.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 18, 100, 49, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 85, 100, 0, 20, 6.5, 8.5, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 85, 100, 0, 20, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } - wait(lua_state, 2.0); - FT_MOTION_RATE(agent, 0.8); + frame(lua_state, 7.0); if is_excute(agent) { AttackModule::clear_all(boma); } - for _ in 0..3 { - wait(lua_state, 4.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 1.8, 365, 100, 49, 0, 6.5, 10.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 1.8, 18, 100, 49, 0, 4.0, 3.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("armr"), 1.8, 18, 100, 49, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - } - wait(lua_state, 2.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - } - wait(lua_state, 4.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 6.0, 361, 150, 0, 40, 7.0, 10.0, 0.0, 2.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 1, 0, Hash40::new("armr"), 6.0, 361, 150, 0, 40, 4.5, 3.0, 0.0, 2.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - ATTACK(agent, 2, 0, Hash40::new("armr"), 6.0, 361, 150, 0, 40, 3.5, 0.0, 0.0, 2.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); - } - wait(lua_state, 2.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 11.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 80, 100, 0, 20, 6.5, 8.5, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 80, 100, 0, 20, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + } + frame(lua_state, 13.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 17.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 80, 100, 0, 20, 6.5, 8.5, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 80, 100, 0, 20, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + } + frame(lua_state, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 42.0); + frame(lua_state, 23.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 80, 100, 0, 20, 6.5, 8.5, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 80, 100, 0, 20, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + } + frame(lua_state, 25.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 28.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("armr"), 5.0, 361, 100, 0, 20, 6.5, 8.5, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 1, 0, Hash40::new("armr"), 5.0, 361, 100, 0, 20, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + } + frame(lua_state, 31.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 47.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -115,23 +125,78 @@ unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 15.5, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 14.5, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.15); } frame(lua_state, 10.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 12.5, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 13.5, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.15); } frame(lua_state, 16.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 15.5, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 14.5, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.15); } frame(lua_state, 22.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 15.0, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 14.5, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.15); } frame(lua_state, 28.0); if is_excute(agent) { EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("armr"), 15.5, -0.341, -0.169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 1.15); + } +} + +unsafe extern "C" fn sound_attackairf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_samus_smash_h01")); + } + frame(lua_state, 12.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_samus_smash_h01")); + } + frame(lua_state, 18.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_samus_smash_h01")); + } + frame(lua_state, 24.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_samus_smash_h01")); + } + frame(lua_state, 29.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_samus_smash_h02")); + } +} + +unsafe extern "C" fn expression_attackairf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 4.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 5, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 10.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 5, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 16.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 5, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 22.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 5, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 27.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attacks"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } } @@ -183,15 +248,15 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("toer"), 2.0, 366, 40, 0, 34, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.0, 84, 40, 0, 34, 6.0, -2.0, 1.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("toer"), 3.0, 366, 33, 0, 35, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 84, 33, 0, 35, 6.0, -2.0, 1.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 7.0); FT_MOTION_RATE(agent, 1.25); if is_excute(agent) { AttackModule::clear_all(boma); - ATTACK(agent, 0, 0, Hash40::new("toer"), 2.0, 366, 40, 0, 34, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.0, 84, 40, 0, 34, 6.0, -2.0, 1.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("toer"), 1.0, 366, 53, 0, 32, 4.0, -1.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 1.0, 84, 53, 0, 32, 6.0, -2.0, 1.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 15.0); if is_excute(agent) { @@ -200,8 +265,8 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("toer"), 4.0, 76, 200, 0, 40, 4.5, -1.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 4.0, 76, 200, 0, 40, 6.5, -2.0, 1.0, 2.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("toer"), 4.0, 50, 120, 0, 40, 4.5, -1.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 4.0, 50, 120, 0, 40, 6.5, -2.0, 1.0, 2.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 5.0); if is_excute(agent) { @@ -271,6 +336,8 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairf", game_attackairf, Priority::Low); agent.acmd("effect_attackairf", effect_attackairf, Priority::Low); + agent.acmd("sound_attackairf", sound_attackairf, Priority::Low); + agent.acmd("expression_attackairf", expression_attackairf, Priority::Low); agent.acmd("game_attackairb", game_attackairb, Priority::Low); agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); diff --git a/fighters/samus/src/acmd/other.rs b/fighters/samus/src/acmd/other.rs index ad50377466..1891e55a8a 100644 --- a/fighters/samus/src/acmd/other.rs +++ b/fighters/samus/src/acmd/other.rs @@ -34,15 +34,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -52,10 +48,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_squat(agent: &mut L2CAgentBase) { diff --git a/fighters/samus/src/acmd/smashes.rs b/fighters/samus/src/acmd/smashes.rs index 4a7059068c..6df57a6c67 100644 --- a/fighters/samus/src/acmd/smashes.rs +++ b/fighters/samus/src/acmd/smashes.rs @@ -1,3 +1,5 @@ +use smash::app::lua_bind::MotionModule::end_frame; + use super::*; unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { @@ -13,13 +15,7 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("armr"), 13.0, 361, 102, 0, 30, 3.3, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("armr"), 15.0, 361, 106, 0, 40, 5.0, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } - wait(lua_state, 2.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 102, 0, 30, 3.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 102, 0, 30, 3.3, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 12.0, 361, 106, 0, 40, 5.0, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 6.0); + frame(lua_state, 14.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -34,13 +30,7 @@ unsafe extern "C" fn game_attacks4hi(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("armr"), 13.5, 361, 102, 0, 30, 3.3, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("armr"), 15.5, 361, 106, 0, 40, 5.0, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } - wait(lua_state, 2.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 102, 0, 30, 3.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 102, 0, 30, 3.3, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 12.0, 361, 106, 0, 40, 5.0, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 6.0); + frame(lua_state, 14.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -55,13 +45,7 @@ unsafe extern "C" fn game_attacks4lw(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("armr"), 12.5, 361, 102, 0, 30, 3.3, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("armr"), 14.5, 361, 106, 0, 40, 5.0, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); } - wait(lua_state, 2.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 361, 102, 0, 30, 3.3, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 10.0, 361, 102, 0, 30, 3.3, -4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 12.0, 361, 106, 0, 40, 5.0, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); - } - wait(lua_state, 6.0); + frame(lua_state, 14.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -70,32 +54,32 @@ unsafe extern "C" fn game_attacks4lw(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 7.0); + frame(lua_state, 9.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } - frame(lua_state, 13.0); + frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 368, 70, 100, 0, 4.0, 0.0, 3.5, 8.0, None, None, None, 1.0, 1.2, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 368, 70, 100, 0, 4.0, 0.0, 3.5, -5.5, None, None, None, 1.0, 1.2, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 368, 70, 100, 0, 3.5, 0.0, 3.5, 3.5, Some(0.0), Some(3.5), Some(-6.0), 1.0, 1.2, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 90, 100, 60, 0, 4.0, 0.0, 10.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); AttackModule::set_no_finish_camera(boma, 0, true, false); AttackModule::set_no_finish_camera(boma, 1, true, false); - let hit1 = Vector2f { x: 0.0, y: 19.0 }; - AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &hit1, 10, false); - AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &hit1, 10, false); + AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f { x: 0.0, y: 19.0 }, 10, false); } - wait(lua_state, 2.0); + frame(lua_state, 14.0); + if is_excute(agent) { + AttackModule::clear(boma, 0, false); + ATTACK(agent, 1, 0, Hash40::new("armr"), 3.0, 97, 100, 50, 0, 4.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + } + frame(lua_state, 18.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 15.0); - FT_MOTION_RATE_RANGE(agent, 15.0, 25.0, 8.0); - frame(lua_state, 25.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 24.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 90, 115, 0, 50, 8.0, 0.0, 28.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 90, 102, 0, 50, 8.0, 0.0, 28.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_BOMB); } - frame(lua_state, 28.0); + frame(lua_state, 27.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -104,18 +88,22 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { pub unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 14.0); + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("armr"), 4.289, -0.272, -0.135, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 12.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), 0, 0, 3, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, false); EFFECT(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 8, 0, -90, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, true); } - wait(lua_state, 1.0); + frame(lua_state, 16.0); if is_excute(agent) { EFFECT_FOLLOW_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("armr"), 7.5, -0.341439992, -0.169369996, 0, 0, 0, 1.25, true, 0.9); LAST_EFFECT_SET_RATE(agent, 2); } - frame(lua_state, 25.0); - if is_excute(agent){ + frame(lua_state, 24.0); + if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_action_smoke_v"), Hash40::new("top"), 0, 0, 3, 0, 0, 0, 1.20000005, 0, 0, 0, 0, 0, 0, true); EFFECT(agent, Hash40::new("samus_atk_bomb"), Hash40::new("top"), 0.0, 28.0, 1.0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, true); } @@ -124,13 +112,12 @@ pub unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { pub unsafe extern "C" fn sound_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 13.0); - if is_excute(agent){ - STOP_SE(agent, Hash40::new("se_common_smash_start")); + frame(lua_state, 12.0); + if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_samus_swing_l")); } - frame(lua_state, 28.0); - if is_excute(agent){ + frame(lua_state, 24.0); + if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_samus_smash_h02")); } } diff --git a/fighters/samus/src/acmd/throws.rs b/fighters/samus/src/acmd/throws.rs index 3da99b0a73..bf63fb2df7 100644 --- a/fighters/samus/src/acmd/throws.rs +++ b/fighters/samus/src/acmd/throws.rs @@ -95,6 +95,10 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 10.0, 50, 100, 0, 45, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_elec_whip"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_elec_whip"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 7.0, 11.0); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); diff --git a/fighters/samus/src/gbeam/acmd.rs b/fighters/samus/src/gbeam/acmd.rs index 9fa489d262..34ee2a4e3f 100644 --- a/fighters/samus/src/gbeam/acmd.rs +++ b/fighters/samus/src/gbeam/acmd.rs @@ -18,7 +18,18 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); } +unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 8.0, 12.0); + frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.0); +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + + agent.acmd("game_throwb", game_throwb, Priority::Low); } \ No newline at end of file diff --git a/fighters/samus/src/lib.rs b/fighters/samus/src/lib.rs index 5ed77a750b..683f998b58 100644 --- a/fighters/samus/src/lib.rs +++ b/fighters/samus/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/samus/src/supermissile/opff.rs b/fighters/samus/src/supermissile/opff.rs index b60afd5bbb..eb86f66da9 100644 --- a/fighters/samus/src/supermissile/opff.rs +++ b/fighters/samus/src/supermissile/opff.rs @@ -4,9 +4,10 @@ use super::*; use globals::*; unsafe extern "C" fn supermissile_frame(weapon: &mut L2CFighterBase) { + let h = weapon.get_int(*WEAPON_SAMUS_SUPERMISSILE_STATUS_STRAIGHT_WORK_ID_INT_FRAME); if AttackModule::is_infliction(weapon.module_accessor, *COLLISION_KIND_MASK_REFLECTOR | *COLLISION_KIND_MASK_PARRY) { let life = weapon.get_param_int("param_supermissile", "s_life"); - weapon.set_int(life, *WEAPON_SAMUS_MISSILE_INSTANCE_WORK_ID_INT_LIFE); + weapon.set_int(life, *WEAPON_SAMUS_SUPERMISSILE_STATUS_STRAIGHT_WORK_ID_INT_FRAME); } } diff --git a/fighters/samusd/Cargo.toml b/fighters/samusd/Cargo.toml index 015fbde122..dd044a31ed 100644 --- a/fighters/samusd/Cargo.toml +++ b/fighters/samusd/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -interpolation = "0.2.0" \ No newline at end of file +interpolation = "0.2.0" +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/samusd/src/acmd/aerials.rs b/fighters/samusd/src/acmd/aerials.rs index c76ebc08f4..8c0138c751 100644 --- a/fighters/samusd/src/acmd/aerials.rs +++ b/fighters/samusd/src/acmd/aerials.rs @@ -373,9 +373,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); FT_MOTION_RATE_RANGE(agent, 6.0, 18.0, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handr"), 9.0, 71, 110, 0, 43, 4.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 71, 110, 0, 43, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 9.0, 71, 110, 0, 43, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handr"), 9.0, 74, 110, 0, 43, 4.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("armr"), 9.0, 74, 110, 0, 43, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderr"), 9.0, 74, 110, 0, 43, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); } frame(lua_state, 18.0); FT_MOTION_RATE(agent, 1.0); @@ -432,7 +432,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 16.0, 10.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 16.0, 12.0); frame(lua_state, 4.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); diff --git a/fighters/samusd/src/acmd/other.rs b/fighters/samusd/src/acmd/other.rs index 4261a6d330..f8ae9f2eca 100644 --- a/fighters/samusd/src/acmd/other.rs +++ b/fighters/samusd/src/acmd/other.rs @@ -37,15 +37,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -55,10 +51,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_slipattack(agent: &mut L2CAgentBase) { @@ -169,6 +162,24 @@ unsafe extern "C" fn effect_downattacku(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn sound_fuwafuwa(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + let sfx_handle = SoundModule::play_status_se(boma, Hash40::new("se_common_spirits_floor_fire_loop"), true, false, false); + SoundModule::set_se_vol(boma, sfx_handle as i32, 1.075, 0); + } +} + +unsafe extern "C" fn expression_fuwafuwa(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_13_floating"), 0, true, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_cliffescape", acmd_stub, Priority::Low); @@ -187,10 +198,10 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_fuwafuwastart", acmd_stub, Priority::Low); agent.acmd("effect_fuwafuwastart", acmd_stub, Priority::Low); - agent.acmd("sound_fuwafuwastart", acmd_stub, Priority::Low); - agent.acmd("expression_fuwafuwastart", acmd_stub, Priority::Low); + agent.acmd("sound_fuwafuwastart", sound_fuwafuwa, Priority::Low); + agent.acmd("expression_fuwafuwastart", expression_fuwafuwa, Priority::Low); agent.acmd("game_fuwafuwa", acmd_stub, Priority::Low); agent.acmd("effect_fuwafuwa", acmd_stub, Priority::Low); - agent.acmd("sound_fuwafuwa", acmd_stub, Priority::Low); - agent.acmd("expression_fuwafuwa", acmd_stub, Priority::Low); + agent.acmd("sound_fuwafuwa", sound_fuwafuwa, Priority::Low); + agent.acmd("expression_fuwafuwa", expression_fuwafuwa, Priority::Low); } \ No newline at end of file diff --git a/fighters/samusd/src/acmd/smashes.rs b/fighters/samusd/src/acmd/smashes.rs index 7f95b965ad..d0491e757e 100644 --- a/fighters/samusd/src/acmd/smashes.rs +++ b/fighters/samusd/src/acmd/smashes.rs @@ -130,20 +130,18 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 9.0); + frame(lua_state, 11.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } - frame(lua_state, 10.0); - FT_MOTION_RATE_RANGE(agent, 10.0, 12.0, 4.0); - frame(lua_state, 12.0); + frame(lua_state, 14.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 17.0, 70, 96, 0, 42, 4.5, 0.0, 3.5, 0.0, Some(0.0), Some(3.5), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_BODY); ATTACK(agent, 1, 0, Hash40::new("top"), 17.0, 70, 96, 0, 42, 4.5, 0.0, 4.75, -9.0, Some(0.0), Some(6.0), Some(-9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_BODY); ATTACK(agent, 2, 0, Hash40::new("top"), 17.0, 70, 96, 0, 42, 4.5, 0.0, 4.75, 14.0, Some(0.0), Some(6.0), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_BODY); } - frame(lua_state, 15.0); + frame(lua_state, 17.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 70, 101, 0, 40, 4.5, 0.0, 3.5, 0.0, Some(0.0), Some(3.5), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_BODY); ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 70, 101, 0, 40, 4.5, 0.0, 4.75, -9.0, Some(0.0), Some(6.0), Some(-9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_BODY); @@ -151,13 +149,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { ATTACK(agent, 3, 0, Hash40::new("top"), 13.0, 70, 101, 0, 40, 2.5, 0.0, 10.0, -9.0, Some(0.0), Some(15.0), Some(-9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_BODY); ATTACK(agent, 4, 0, Hash40::new("top"), 13.0, 70, 101, 0, 40, 2.5, 0.0, 10.0, 14.0, Some(0.0), Some(15.0), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_BODY); } - frame(lua_state, 19.0); - FT_MOTION_RATE_RANGE(agent, 19.0, 33.0, 22.0); + frame(lua_state, 21.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 33.0); - FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { @@ -167,7 +162,11 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_AURA(agent); } - frame(lua_state, 12.0); + frame(lua_state, 10.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("armr"), 4.289, -0.272, -0.135, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); + } + frame(lua_state, 14.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 3, 0, -1, 0, 0, 0, 1.2, true); EFFECT_FOLLOW(agent, Hash40::new("samusd_throw_hi"), Hash40::new("top"), 0, 0, -9, 0, 0, 0, 0.8, true); @@ -180,7 +179,7 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { EFFECT_FOLLOW(agent, Hash40::new("samusd_win3_aura"), Hash40::new("armr"), 0.0, 0.0, 0.0, 0, 0, 0, 1.89999998, true); EFFECT_FOLLOW(agent, Hash40::new("samusd_win3_aura"), Hash40::new("handr"), 0.0, 0.0, 0.0, 0, 0, 0, 2.0, true); } - frame(lua_state, 30.0); + frame(lua_state, 32.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("samusd_win3_aura"), false, false); } @@ -189,7 +188,7 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { unsafe extern "C" fn sound_attacklw4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 12.0); + frame(lua_state, 14.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_samusd_special_n04")); } @@ -213,16 +212,16 @@ unsafe extern "C" fn expression_attacklw4(agent: &mut L2CAgentBase) { if is_excute(agent) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 3, true); } - frame(lua_state, 11.0); + frame(lua_state, 13.0); if is_excute(agent) { QUAKE(agent, *CAMERA_QUAKE_KIND_M); ControlModule::set_rumble(boma, Hash40::new("rbkind_nohit_beamm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 12.0); + frame(lua_state, 14.0); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_beamm"), 0); } - frame(lua_state, 20.0); + frame(lua_state, 22.0); if is_excute(agent) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 20); } diff --git a/fighters/samusd/src/acmd/throws.rs b/fighters/samusd/src/acmd/throws.rs index dd6fea2794..a6b5bef215 100644 --- a/fighters/samusd/src/acmd/throws.rs +++ b/fighters/samusd/src/acmd/throws.rs @@ -110,6 +110,32 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 10.0, 40, 55, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_elec_whip"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_elec_whip"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 7.0, 11.0); + frame(lua_state, 7.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 11.0); + if is_excute(agent) { + WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_REVERSE_LR_FINISH_CAMERA_THROW_ORBIT); + CHECK_FINISH_CAMERA(agent, 25, 15); + } + frame(lua_state, 12.0); + if is_excute(agent) { + REVERSE_LR(agent); + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -164,8 +190,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catchturn", game_catchturn, Priority::Low); agent.acmd("game_throwf", game_throwf, Priority::Low); - + agent.acmd("game_throwb", game_throwb, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); - agent.acmd("game_throwlw", game_throwlw, Priority::Low); } diff --git a/fighters/samusd/src/acmd/tilts.rs b/fighters/samusd/src/acmd/tilts.rs index 481595e5bd..f737a849d9 100644 --- a/fighters/samusd/src/acmd/tilts.rs +++ b/fighters/samusd/src/acmd/tilts.rs @@ -146,31 +146,27 @@ unsafe extern "C" fn effect_attacks3lw(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 9.5, 6.0); - //first kick f7-10 - frame(lua_state, 9.5); - FT_MOTION_RATE_RANGE(agent, 9.5, 10.0, 1.0); + frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 12.0, 92, 92, 0, 49, 3.9, 6.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 92, 92, 0, 49, 3.5, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legl"), 12.0, 92, 92, 0, 49, 3.2, 0.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 13.0, 92, 90, 0, 57, 3.9, 6.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 13.0, 92, 90, 0, 57, 3.5, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legl"), 13.0, 92, 90, 0, 57, 3.2, 0.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 9.0, 100, 90, 0, 33, 0.0, 5.7, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("kneer"), 9.0, 100, 90, 0, 33, 0.0, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("legr"), 9.0, 100, 90, 0, 33, 0.0, 0.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NONE, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 13.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 9.0, 108, 100, 0, 33, 0.0, 5.7, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 108, 100, 0, 33, 0.0, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 9.0, 108, 100, 0, 33, 0.0, 0.8, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - //second kick f12-17 frame(lua_state, 14.0); FT_MOTION_RATE_RANGE(agent, 14.0, 24.0, 6.0); if is_excute(agent) { - AttackModule::set_size(boma, 0, 4.1); - AttackModule::set_size(boma, 1, 3.5); - AttackModule::set_size(boma, 2, 3.2); + AttackModule::clear(boma, 0, false); + AttackModule::clear(boma, 1, false); + AttackModule::clear(boma, 2, false); + AttackModule::set_target_category(boma, 3, *COLLISION_CATEGORY_MASK_ALL as u32); + AttackModule::set_target_category(boma, 4, *COLLISION_CATEGORY_MASK_ALL as u32); + AttackModule::set_target_category(boma, 5, *COLLISION_CATEGORY_MASK_ALL as u32); + AttackModule::set_size(boma, 3, 4.1); + AttackModule::set_size(boma, 4, 3.5); + AttackModule::set_size(boma, 5, 3.2); } frame(lua_state, 24.0); FT_MOTION_RATE_RANGE(agent, 24.0, 41.0, 14.0); @@ -178,8 +174,6 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } frame(lua_state, 41.0); - FT_MOTION_RATE_RANGE(agent, 41.0, 48.0, 5.0); - frame(lua_state, 48.0); FT_MOTION_RATE(agent, 1.0); } @@ -191,7 +185,7 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false) } - frame(lua_state, 9.5); + frame(lua_state, 9.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 0, 16.8, -2, 10, 35, 90, 1.28, true); LAST_EFFECT_SET_SCALE_W(agent, 1.15, 1.28, 1.28); @@ -257,11 +251,6 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { HIT_NODE(agent, Hash40::new("arml"), *HIT_STATUS_XLU); - ATTACK(agent, 1, 1, Hash40::new("top"), 1.0, 274, 100, 55, 0, 2.5, 0.0, 14.5, 9.5, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); - } - frame(lua_state, 7.0); - if is_excute(agent) { - ATTACK(agent, 1, 1, Hash40::new("top"), 1.0, 274, 100, 55, 0, 2.5, 0.0, 9.0, 14.0, None, None, None, 0.7, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_ELBOW); } frame(lua_state, 8.0); if is_excute(agent) { @@ -325,11 +314,11 @@ unsafe extern "C" fn expression_attacklw3(agent: &mut L2CAgentBase) { if is_excute(agent) { slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); } - frame(lua_state, 6.0); + frame(lua_state, 7.0); if is_excute(agent) { ControlModule::set_rumble(boma, Hash40::new("rbkind_nohit_explosion"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 8.0); + frame(lua_state, 9.0); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_explosion"), 0); //QUAKE(agent, *CAMERA_QUAKE_KIND_S); diff --git a/fighters/samusd/src/gbeam/acmd.rs b/fighters/samusd/src/gbeam/acmd.rs index 4cfdfd46ee..1d1bef901a 100644 --- a/fighters/samusd/src/gbeam/acmd.rs +++ b/fighters/samusd/src/gbeam/acmd.rs @@ -39,8 +39,19 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); } +unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + FT_MOTION_RATE_RANGE(agent, 2.0, 8.0, 12.0); + frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.0); +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + + agent.acmd("game_throwb", game_throwb, Priority::Low); } \ No newline at end of file diff --git a/fighters/samusd/src/lib.rs b/fighters/samusd/src/lib.rs index a1ad2dce12..16e3536be5 100644 --- a/fighters/samusd/src/lib.rs +++ b/fighters/samusd/src/lib.rs @@ -38,6 +38,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/samusd/src/status/float.rs b/fighters/samusd/src/status/float.rs index baccc2e41b..641844516e 100644 --- a/fighters/samusd/src/status/float.rs +++ b/fighters/samusd/src/status/float.rs @@ -36,6 +36,7 @@ unsafe extern "C" fn float_main(fighter: &mut L2CFighterCommon) -> L2CValue { } unsafe extern "C" fn float_end(fighter: &mut L2CFighterCommon) -> L2CValue { + STOP_SE(fighter, Hash40::new("se_common_spirits_floor_fire_loop")); EffectModule::kill_kind(fighter.module_accessor, Hash40::new("samusd_win3_aura"), false, true); float_end_common(fighter) } diff --git a/fighters/samusd/src/status/special_hi.rs b/fighters/samusd/src/status/special_hi.rs index 813f92cd70..39f77f3356 100644 --- a/fighters/samusd/src/status/special_hi.rs +++ b/fighters/samusd/src/status/special_hi.rs @@ -121,11 +121,7 @@ unsafe extern "C" fn special_hi_exec(fighter: &mut L2CFighterCommon) -> L2CValue } unsafe extern "C" fn special_hi_set_direction(fighter: &mut L2CFighterCommon) { - let isGrounded = special_hi_ray_check(fighter); - let sit = if isGrounded { *SITUATION_KIND_GROUND } else { *SITUATION_KIND_AIR }; - let kinetic = if isGrounded { *FIGHTER_KINETIC_TYPE_GROUND_STOP } else { *FIGHTER_KINETIC_TYPE_AIR_STOP }; - StatusModule::set_situation_kind(fighter.module_accessor, app::SituationKind(sit), false); - VarModule::set_flag(fighter.battle_object, vars::samusd::instance::SPECIAL_HI_RUSH_AIR, !isGrounded); + VarModule::set_flag(fighter.battle_object, vars::samusd::instance::SPECIAL_HI_RUSH_AIR, fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR); // Get angle let mut lr: f32 = PostureModule::lr(fighter.module_accessor); @@ -141,11 +137,11 @@ unsafe extern "C" fn special_hi_set_direction(fighter: &mut L2CFighterCommon) { // If in deadzone, go up if (stick_x.abs() < 0.1 && stick_y.abs() < 0.1) { - stick_x = 0.0; //if isGrounded {lr} else {0.0}; + stick_x = 0.0; stick_y = 1.0; } // If on ground, and aiming the stick towards the ground, limit y to 0 - if (isGrounded && stick_y < 0.0) { + if (fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND && stick_y < 0.0) { stick_y = 0.0; if (stick_x.abs() < 0.1) { stick_x = lr; } stick_x = sv_math::vec2_normalize(stick_x, stick_y).x; @@ -194,7 +190,7 @@ unsafe extern "C" fn special_hi_rush_pre(fighter: &mut L2CFighterCommon) -> L2CV unsafe extern "C" fn special_hi_rush_init(fighter: &mut L2CFighterCommon) -> L2CValue { let mut angle = VarModule::get_float(fighter.battle_object, vars::samusd::instance::SPECIAL_HI_RUSH_ANGLE); - let isGrounded = fighter.is_situation(*SITUATION_KIND_GROUND) && angle.abs() < 10.0; //special_hi_ray_check(fighter); + let isGrounded = fighter.is_situation(*SITUATION_KIND_GROUND) && angle.abs() < 10.0; if isGrounded { if angle.abs() < 10.0 { @@ -202,9 +198,6 @@ unsafe extern "C" fn special_hi_rush_init(fighter: &mut L2CFighterCommon) -> L2C } VarModule::set_float(fighter.battle_object, vars::samusd::instance::SPECIAL_HI_RUSH_ANGLE, 0.0); } - if special_hi_ray_check(fighter) { - special_hi_snap_to_ground(fighter); - } // Set speed let angle_radians = angle.to_radians(); @@ -373,7 +366,6 @@ unsafe extern "C" fn special_hi_end_init(fighter: &mut L2CFighterCommon) -> L2CV sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, brake_speed_x, 0.0); sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); } - special_hi_snap_to_ground(fighter); VarModule::set_float(fighter.battle_object, vars::samusd::instance::SPECIAL_HI_RUSH_ANGLE, 0.0); VarModule::off_flag(fighter.battle_object, vars::samusd::instance::SPECIAL_HI_RUSH_AIR); } @@ -493,12 +485,6 @@ unsafe extern "C" fn special_hi_set_joint_rotation(fighter: &mut L2CFighterCommo ModelModule::set_joint_rotate(fighter.module_accessor, Hash40::new("rot"), &Vector3f::new(-angle, 0.0, 0.0), MotionNodeRotateCompose{_address: *MOTION_NODE_ROTATE_COMPOSE_AFTER as u8}, MotionNodeRotateOrder{_address: *MOTION_NODE_ROTATE_ORDER_XYZ as u8}); } -unsafe fn special_hi_ray_check(fighter: &mut L2CFighterCommon) -> bool { - return GroundModule::ray_check(fighter.module_accessor, - &Vector2f{ x: PostureModule::pos_x(fighter.module_accessor), y: PostureModule::pos_y(fighter.module_accessor) }, - &Vector2f{ x: 0.0, y: -5.5 }, true) == 1; -} - unsafe extern "C" fn special_hi_rush_handle_bound(fighter: &mut L2CFighterCommon) -> i32 { // Check for landing let rush_frame = VarModule::get_int(fighter.battle_object, vars::samusd::status::SPECIAL_HI_RUSH_FRAME); @@ -531,28 +517,9 @@ unsafe extern "C" fn special_hi_rush_handle_bound(fighter: &mut L2CFighterCommon return 0.into(); } -unsafe fn special_hi_snap_to_ground(fighter: &mut L2CFighterCommon) { - let pos_x = PostureModule::pos_x(fighter.module_accessor); - let pos_y = PostureModule::pos_y(fighter.module_accessor); - let pos_z = PostureModule::pos_z(fighter.module_accessor); - let hit_pos = &mut Vector2f::zero(); - let ray_check = GroundModule::ray_check_hit_pos( - fighter.module_accessor, - &Vector2f{x: pos_x, y: pos_y}, - &Vector2f{x: 0.0, y: -6.0}, - hit_pos, - true - ); - PostureModule::set_pos(fighter.module_accessor, &Vector3f::new(pos_x, hit_pos.y, pos_z)); - let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - let lr = PostureModule::lr(fighter.module_accessor); - SET_SPEED_EX(fighter, speed_x * lr, -0.01, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); -} - unsafe fn special_hi_find_end_type(fighter: &mut L2CFighterCommon) { let angle = VarModule::get_float(fighter.battle_object, vars::samusd::instance::SPECIAL_HI_RUSH_ANGLE); - let ground_correct_force = special_hi_ray_check(fighter); - if fighter.is_situation(*SITUATION_KIND_AIR) && !ground_correct_force { + if fighter.is_situation(*SITUATION_KIND_AIR) { VarModule::set_int(fighter.battle_object, vars::samusd::instance::SPECIAL_HI_END_TYPE, END_TYPE_AIR); } else if angle.abs() < 20.0 { diff --git a/fighters/sheik/Cargo.toml b/fighters/sheik/Cargo.toml index 4d3607ff63..94ff80bb8d 100644 --- a/fighters/sheik/Cargo.toml +++ b/fighters/sheik/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/sheik/src/acmd/ground.rs b/fighters/sheik/src/acmd/ground.rs index e3ab6ebe5e..3b1b4ddee0 100644 --- a/fighters/sheik/src/acmd/ground.rs +++ b/fighters/sheik/src/acmd/ground.rs @@ -8,8 +8,9 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 4.0, 70, 100, 0, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 4.0, 70, 100, 0, 0, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("armr"), 4.0, 70, 100, 0, 0, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - // Locking hitbox - ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 361, 30, 0, 15, 3.0, 0.0, 4.0, 7.0, Some(0.0), Some(4.0), Some(11.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 4.0, 361, 20, 0, 20, 2.5, 0.0, 4.0, 3.5, Some(0.0), Some(4.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 3.0); if is_excute(agent) { @@ -27,7 +28,7 @@ unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - EFFECT_FOLLOW(agent, Hash40::new("sheik_attack_cut"), Hash40::new("top"), 2, 10.0, 5.0, 0, -20, -18, 0.7, true); + EFFECT_FOLLOW(agent, Hash40::new("sheik_attack_cut"), Hash40::new("top"), 2, 10.0, 1.5, 0, -20, -18, 0.7, true); LAST_EFFECT_SET_RATE(agent, 1.3); } frame(lua_state, 3.0); @@ -44,8 +45,9 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 3.0, 70, 100, 0, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 3.0, 70, 100, 0, 0, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 70, 100, 0, 0, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - // Locking hitbox - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 30, 0, 15, 3.0, 0.0, 4.0, 3.0, Some(0.0), Some(4.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 20, 2.5, 0.0, 4.0, 5.0, Some(0.0), Some(4.0), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 3.0); if is_excute(agent) { @@ -174,6 +176,22 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sheik_attack_cut"), Hash40::new("top"), 1, 8, 6.5, 0, 20, 45, 0.72, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + EFFECT_FOLLOW(agent, Hash40::new("sheik_attack_cut"), Hash40::new("top"), -1, 8, 6.5, 0, 20, -130, 0.72, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + frame(lua_state, 6.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_a"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); agent.acmd("effect_attack11", effect_attack11, Priority::Low); @@ -189,4 +207,5 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attack100end", game_attack100end, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); + agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); } \ No newline at end of file diff --git a/fighters/sheik/src/acmd/other.rs b/fighters/sheik/src/acmd/other.rs index b6a56e1e51..b640c3e142 100644 --- a/fighters/sheik/src/acmd/other.rs +++ b/fighters/sheik/src/acmd/other.rs @@ -81,15 +81,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -99,10 +95,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { diff --git a/fighters/sheik/src/acmd/specials.rs b/fighters/sheik/src/acmd/specials.rs index b2eee1e473..ad9d279732 100644 --- a/fighters/sheik/src/acmd/specials.rs +++ b/fighters/sheik/src/acmd/specials.rs @@ -111,6 +111,14 @@ unsafe extern "C" fn game_speciallwattack(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn effect_speciallwattack(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sheik_chougyo_arc"), Hash40::new("top"), 0, 2, -0.5, 180, -45, 90, 1.05, true); + } +} + unsafe extern "C" fn game_speciallwreturn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -130,6 +138,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_specialairhistart", effect_specialhistart, Priority::Low); agent.acmd("game_speciallwattack", game_speciallwattack, Priority::Low); + agent.acmd("effect_speciallwattack", effect_speciallwattack, Priority::Low); agent.acmd("game_speciallwreturn", game_speciallwreturn, Priority::Low); } \ No newline at end of file diff --git a/fighters/sheik/src/acmd/throws.rs b/fighters/sheik/src/acmd/throws.rs index 7fa701076a..0b1ce75799 100644 --- a/fighters/sheik/src/acmd/throws.rs +++ b/fighters/sheik/src/acmd/throws.rs @@ -3,13 +3,13 @@ use super::*; unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 7.0, 4.5, Some(0.0), Some(7.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +32,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 4.0, Some(0.0), Some(6.0), Some(8.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 6.0, 3.5, Some(0.0), Some(6.0), Some(8.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -55,7 +55,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { frame(lua_state, 12.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-13.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 6.0, -3.5, Some(0.0), Some(6.0), Some(-12.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -114,6 +114,29 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 86, 25, 0, 82, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 19.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("footr"), 3.0, 361, 0, 90, 10, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, 4, 19); + } + frame(lua_state, 21.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + AttackModule::clear_all(boma); + } +} + unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -146,7 +169,9 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); + agent.acmd("game_throwhi", game_throwhi, Priority::Low); agent.acmd("game_throwlw", game_throwlw, Priority::Low); } \ No newline at end of file diff --git a/fighters/sheik/src/acmd/tilts.rs b/fighters/sheik/src/acmd/tilts.rs index 8ee150f863..5c54cda2c1 100644 --- a/fighters/sheik/src/acmd/tilts.rs +++ b/fighters/sheik/src/acmd/tilts.rs @@ -9,7 +9,7 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 72, 120, 0, 40, 4.0, -0.7, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 72, 120, 0, 40, 3.5, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 75, 120, 0, 40, 3.5, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.0, 80, 120, 0, 40, 4.0, 4.3, -0.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } @@ -39,8 +39,8 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { frame(lua_state, 5.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("legr"), 3.0, 0, 80, 30, 0, 3.5, 4.0, -0.3, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 330, 80, 28, 0, 4.5, 2.5, -0.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("legr"), 3.0, 75, 80, 40, 0, 4.0, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 330, 80, 28, 0, 4.0, 2.5, -0.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 3.0, 75, 80, 40, 0, 3.5, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 4.0); if is_excute(agent) { @@ -48,9 +48,9 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 5.0, 60, 130, 0, 30, 4.0, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 5.0, 60, 130, 0, 30, 4.0, 4.5, -0.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.5, 100, 80, 0, 60, 5.0, 5.0, -0.2, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 5.0, 60, 130, 0, 30, 3.5, 0.4, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 5.0, 60, 130, 0, 30, 3.5, 4.5, -0.4, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.5, 100, 80, 0, 60, 4.0, 4.5, -0.2, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } wait(lua_state, 7.0); @@ -58,9 +58,7 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } wait(lua_state, 1.0); - if is_excute(agent) { - FT_MOTION_RATE(agent, 0.700); - } + FT_MOTION_RATE(agent, 0.7); } unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { @@ -76,7 +74,7 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 11.0, 7.0, 0, -45, -90, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 11.0, 6.0, 0, -45, -90, 1, true); LAST_EFFECT_SET_SCALE_W(agent, 1.0, 1.0, 0.8); LAST_EFFECT_SET_RATE(agent, 1.75); } @@ -97,9 +95,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 70, 80, 0, 35, 3.7, 0.0, 0.0, -0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legr"), 6.0, 80, 80, 0, 35, 3.7, 3.5, -0.6, -0.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 7.0, 90, 80, 0, 35, 4.3, 5.0, -0.2, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 70, 80, 0, 35, 3.0, 0.0, 0.0, -0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legr"), 6.0, 80, 80, 0, 35, 3.5, 3.0, -0.6, -0.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 7.0, 90, 80, 0, 35, 4.0, 4.5, -0.2, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.4, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 3.0); @@ -113,7 +111,7 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 1.5, 4, 6.0, 0, 15, 20, 0.925, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 1.5, 4, 5, 0, 15, 20, 0.925, true); LAST_EFFECT_SET_RATE(agent, 1.75); LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 1, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); LAST_EFFECT_SET_ALPHA(agent, 0.8); diff --git a/fighters/sheik/src/lib.rs b/fighters/sheik/src/lib.rs index 74277af528..7ea0c0271c 100644 --- a/fighters/sheik/src/lib.rs +++ b/fighters/sheik/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/sheik/src/opff.rs b/fighters/sheik/src/opff.rs index 6d6a7efb56..add5dec52b 100644 --- a/fighters/sheik/src/opff.rs +++ b/fighters/sheik/src/opff.rs @@ -17,7 +17,7 @@ unsafe fn bouncing_fish_transitions(fighter: &mut L2CFighterCommon) { WorkModule::on_flag(fighter.module_accessor, *FIGHTER_SHEIK_INSTANCE_WORK_ID_FLAG_DISABLE_AIR_SPECIAL_LW); VarModule::on_flag(fighter.object(), vars::sheik::instance::SPECIAL_LW_HIT); if fighter.status_frame() > 14 { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, false); fighter.check_airdodge_cancel(); } } @@ -63,40 +63,6 @@ extern "Rust" { // } // } -pub unsafe fn vanish_wall_ride(fighter: &mut smash::lua2cpp::L2CFighterCommon) { - // Wall Ride momentum fixes - if fighter.is_status(*FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_MOVE) { - let init_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_X); - let init_speed_y = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_Y); - if GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_SIDE as u32) - || (!GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_ID_NONE as u32) && init_speed_x.abs() <= 0.01) - { //now only bypasses floor-ride if angle is vertical - if !VarModule::is_flag(fighter.battle_object, vars::common::status::IS_TELEPORT_WALL_RIDE) { - VarModule::on_flag(fighter.battle_object, vars::common::status::IS_TELEPORT_WALL_RIDE); - } - } - if GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_SIDE as u32) { - if init_speed_y > 0.0 { - fighter.clear_lua_stack(); - lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, init_speed_y); - app::sv_kinetic_energy::set_speed(fighter.lua_state_agent); - } - } else if VarModule::is_flag(fighter.battle_object, vars::common::status::IS_TELEPORT_WALL_RIDE) { - fighter.clear_lua_stack(); - lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, init_speed_x, init_speed_y); - app::sv_kinetic_energy::set_speed(fighter.lua_state_agent); - } - } - else if fighter.is_status(*FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_END) { - if GroundModule::is_wall_touch_line(fighter.module_accessor, *GROUND_TOUCH_FLAG_SIDE as u32) { - if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) > 0.0 { - let wall_ride = Vector3f{x: 0.0, y: 1.0, z: 1.0}; - KineticModule::mul_speed(fighter.module_accessor, &wall_ride, *FIGHTER_KINETIC_ENERGY_ID_STOP); - } - } - } -} - unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) @@ -121,7 +87,6 @@ pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectMod nspecial_cancels(fighter, boma, status_kind, situation_kind); vanish_landing_lag(fighter); fastfall_specials(fighter); - vanish_wall_ride(fighter); } pub extern "C" fn sheik_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterCommon) { diff --git a/fighters/sheik/src/status/mod.rs b/fighters/sheik/src/status/mod.rs index e11598df01..42e7095f09 100644 --- a/fighters/sheik/src/status/mod.rs +++ b/fighters/sheik/src/status/mod.rs @@ -4,6 +4,7 @@ use globals::*; mod special_hi; mod special_lw; +mod special_s; unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { if [*SITUATION_KIND_GROUND, *SITUATION_KIND_CLIFF].contains(&fighter.global_table[SITUATION_KIND].get_i32()) @@ -22,4 +23,5 @@ pub fn install(agent: &mut Agent) { special_hi::install(agent); special_lw::install(agent); + special_s::install(agent); } \ No newline at end of file diff --git a/fighters/sheik/src/status/special_hi.rs b/fighters/sheik/src/status/special_hi.rs index a541de53f4..30544ab1c6 100644 --- a/fighters/sheik/src/status/special_hi.rs +++ b/fighters/sheik/src/status/special_hi.rs @@ -1,3 +1,5 @@ +use core::f32; + use super::*; unsafe extern "C" fn special_hi_init(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -51,7 +53,174 @@ unsafe extern "C" fn special_hi_move_pre(fighter: &mut L2CFighterCommon) -> L2CV return 0.into(); } +// Wuboy translated this at WuBoytH/vanilla_status +unsafe extern "C" fn angler(fighter: &mut L2CFighterCommon) -> L2CValue { + let stick_x = fighter.left_stick_x(); + let stick_y = fighter.left_stick_y(); + let mut length = sv_math::vec2_length(stick_x, stick_y); + let wrap_stick = fighter.get_param_float("param_special_hi", "warp_stick"); + + PostureModule::set_stick_lr(fighter.module_accessor, 0.0); + PostureModule::update_rot_y_lr(fighter.module_accessor); + let lr = fighter.lr(); + let mut angle = if length >= wrap_stick { + stick_y.atan2(stick_x * lr) + } else { + 90.0_f32.to_radians() + }; + let test_angle = if angle < f32::consts::PI {angle} else {angle - f32::consts::PI}; + let mut detach = false; + if test_angle < f32::consts::PI && test_angle > 0.0 { + detach = true; + } + let wrap_speed_multi = fighter.get_param_float("param_special_hi", "warp_speed_mul"); + let wrap_speed_add = fighter.get_param_float("param_special_hi", "warp_speed_add"); + let mut speed_x = 0.0; + let mut speed_y = wrap_speed_multi + wrap_speed_add; + // if angled w/ stick + if length > wrap_stick { + let length_mul = wrap_speed_multi * length; + let speed = length_mul + wrap_speed_add; + let cos = angle.cos(); + speed_x = speed * cos; + speed_x *= lr; + + let sin = angle.sin(); + speed_y = speed * sin; + } + // If teleport angle is upwards or you are already in air + // force airborne state + if detach || fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::set_attach_ground(fighter.module_accessor, false); + GroundModule::set_correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + KineticModule::unable_energy_all(fighter.module_accessor); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_FREE, speed_x, speed_y, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, -1.0, -1.0); + sv_kinetic_energy!(enable, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP); + HitModule::set_whole(fighter.module_accessor, HitStatus(*HIT_STATUS_XLU), 0); + GroundModule::clear_cliff_point(fighter.module_accessor); + 0.into() +} + +unsafe extern "C" fn special_hi_move_main(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::generate_article(fighter.module_accessor, *FIGHTER_SHEIK_GENERATE_ARTICLE_FUSIN, false, -1); + HitModule::set_whole(fighter.module_accessor, smash::app::HitStatus(*HIT_STATUS_XLU), 0); + VisibilityModule::set_whole(fighter.module_accessor, false); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x1f20a9d549), false); + fighter.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NAME_CURSOR); + GroundModule::set_passable_check(fighter.module_accessor, true); + fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_NONE.into()); + fighter.set_int(0, *FT_SHEIK_STATUS_SPECIAL_HI_WORK_INT_FRAME); + angler(fighter); + fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_move_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_hi_move_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + let frame = fighter.get_int(*FIGHTER_MEWTWO_STATUS_SPECIAL_HI_WORK_INT_FRAME); + let move_time = fighter.get_param_int("param_special_hi", "move_time"); + if frame >= move_time { + fighter.change_status(FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_END.into(), true.into()) + } + // substatus + if !StatusModule::is_changing(fighter.module_accessor) + & !StopModule::is_stop(fighter.module_accessor) { + fighter.inc_int(*FT_SHEIK_STATUS_SPECIAL_HI_WORK_INT_FRAME); + let move_xlu = fighter.get_param_int("param_special_hi", "move_xlu"); // time ignoring platforms + let cliff_check_frame = 1; // doesn't have a param like other tps? matched to m2 + if frame == move_xlu { + GroundModule::set_passable_check(fighter.module_accessor, false); + } + if frame == cliff_check_frame { + fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES.into()); + } + } + // floor ride + special_hi_move_check_ground(fighter); + 0.into() +} + +// Copies nasty vanilla math +// with adjusted logic to control wall-ride/floor-ride behavior +unsafe extern "C" fn special_hi_move_check_ground(fighter: &mut L2CFighterCommon) { + let init_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_X); + let init_speed_y = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_Y); + let floor_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_FLOOR_SPEED_X); + if floor_speed_x.abs() > 0.0 && init_speed_y < 0.0 && init_speed_x.abs() > 0.0 + && (GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) && !GroundModule::is_passable_ground(fighter.module_accessor)) { + // Travel speed for diagonally-down floor-rides + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, floor_speed_x, 0.0, 0.0); + } else { + // Travel speed for all other scenarios + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, init_speed_x, init_speed_y, 0.0); + } + // If on a platform, + // skip floor-ride speed redirection + if GroundModule::is_passable_check(fighter.module_accessor) && GroundModule::is_passable_ground(fighter.module_accessor) { + return; + } + let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; + let speed = Vector2f {x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; + // If not a diagonally-down teleport, + // or if already grounded, + // skip floor-ride speed redirection + if !GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) + || (speed.x.abs() < 0.001 || speed.y > -0.001) + || fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_AIR { + return; + } + // Compute a new ground-aligned velocity vector + // for intended floor-ride speed redirection + // + // Only intended to run on the first frame you land during the travel + let mut length = sv_math::vec3_length(speed.x, speed.y, 0.0); + if length > 0.0 { + let touch_x = GroundModule::get_touch_normal_x(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); + let touch_y = GroundModule::get_touch_normal_y(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); + + let touch = fighter.Vector3__create(touch_x.into(), touch_y.into(), 0.0_f32.into()); + let something = fighter.Vector3__create(0.0_f32.into(), 0.0_f32.into(), 1.0_f32.into()); + let mut cross = fighter.Vector3__cross(touch.clone(), something); + + let math = 1.0 / length; + let speed_mul = Vector3f { + x: speed.x * math, + y: speed.y * math, + z: 0.0, + }; + let mut final_dot = sv_math::vec3_dot(cross["x"].get_f32(), cross["y"].get_f32(), cross["z"].get_f32(), speed_mul.x, speed_mul.y, speed_mul.z); + if -0.00001 <= final_dot && final_dot <= 0.00001 { + final_dot = sv_math::vec3_dot(cross["x"].get_f32(), cross["y"].get_f32(), cross["z"].get_f32(), fighter.lr(), 0.0, 0.0); + } + + if final_dot < 0.0 { + let x = cross["x"].get_f32(); + let y = cross["y"].get_f32(); + let z = cross["z"].get_f32(); + cross["x"].assign(&L2CValue::F32(x * -1.0)); + cross["y"].assign(&L2CValue::F32(y * -1.0)); + cross["z"].assign(&L2CValue::F32(z * -1.0)); + } + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, cross["x"].get_f32() * length, cross["y"].get_f32() * length, cross["z"].get_f32() * length); + // set new speed to be reapplied each frame + VarModule::set_float(fighter.battle_object, vars::common::status::TELEPORT_FLOOR_SPEED_X, cross["x"].get_f32() * length); + } +} + +unsafe extern "C" fn special_hi_null(fighter: &mut L2CFighterCommon) -> L2CValue { + 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_init); agent.status(Pre, *FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_MOVE, special_hi_move_pre); + agent.status(Init, *FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_MOVE, special_hi_null); + agent.status(Main, *FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_MOVE, special_hi_move_main); + agent.status(Exec, *FIGHTER_SHEIK_STATUS_KIND_SPECIAL_HI_MOVE, special_hi_null); } \ No newline at end of file diff --git a/fighters/sheik/src/status/special_s.rs b/fighters/sheik/src/status/special_s.rs new file mode 100644 index 0000000000..fb9eb15514 --- /dev/null +++ b/fighters/sheik/src/status/special_s.rs @@ -0,0 +1,97 @@ +use super::*; + +unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue { + if ArticleModule::is_generatable(fighter.module_accessor, *FIGHTER_SHEIK_GENERATE_ARTICLE_EXPLOSIONBOMB) { + ArticleModule::generate_article_have_item(fighter.module_accessor, *FIGHTER_SHEIK_GENERATE_ARTICLE_EXPLOSIONBOMB, *FIGHTER_HAVE_ITEM_WORK_EXTRA, Hash40::new("havel")); + } + else { + fighter.on_flag(*FIGHTER_SHEIK_STATUS_SPECIAL_S_FLAG_FAIL); + } + + fighter.main_shift(special_s_main_loop) +} + +unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.is_flag(*FIGHTER_SHEIK_STATUS_SPECIAL_S_FLAG_THROW) { + if !fighter.is_flag(*FIGHTER_SHEIK_STATUS_SPECIAL_S_FLAG_FAIL) { + let mut throw_angle = fighter.get_param_float("param_special_s", "throw_angle"); + let angle_stick_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.throw_angle_stick_y_mul"); + throw_angle += ControlModule::get_stick_y(fighter.module_accessor) * angle_stick_y_mul; + let mut throw_speed = fighter.get_param_float("param_special_s", "throw_speed"); + let speed_stick_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.throw_speed_stick_y_mul"); + throw_speed -= ControlModule::get_stick_y(fighter.module_accessor) * speed_stick_y_mul; + fighter.clear_lua_stack(); + fighter.push_lua_stack(&mut L2CValue::I32(*MA_MSC_CMD_ITEM_THROW_ITEM)); + fighter.push_lua_stack(&mut L2CValue::F32(throw_angle)); + fighter.push_lua_stack(&mut L2CValue::F32(throw_speed)); + fighter.push_lua_stack(&mut L2CValue::F32(1.0)); + fighter.push_lua_stack(&mut L2CValue::I32(*FIGHTER_HAVE_ITEM_WORK_EXTRA)); + fighter.push_lua_stack(&mut L2CValue::Bool(true)); + sv_module_access::item(fighter.lua_state_agent); + fighter.pop_lua_stack(1); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_SHOOT_NUM); + } + fighter.off_flag(*FIGHTER_SHEIK_STATUS_SPECIAL_S_FLAG_THROW); + } + if StatusModule::is_changing(fighter.module_accessor) { + special_s_change_motion(fighter, false); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + special_s_change_motion(fighter, true); + } + if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + fighter.on_flag(*FIGHTER_SHEIK_STATUS_SPECIAL_S_FLAG_SKIP_HOLD); + } + if fighter.is_flag(*FIGHTER_SHEIK_STATUS_SPECIAL_S_FLAG_FAIL) { + let mut throw_frame = 16.0; + if MotionModule::is_flag_start_1_frame(fighter.module_accessor) { + throw_frame -= 1.0; + } + if fighter.motion_frame() >= throw_frame { + fighter.change_status(FIGHTER_SHEIK_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + return 1.into(); + } + } + else { + if MotionModule::is_end(fighter.module_accessor) { + let mut next_status; + if fighter.is_flag(*FIGHTER_SHEIK_STATUS_SPECIAL_S_FLAG_SKIP_HOLD) { + next_status = FIGHTER_SHEIK_STATUS_KIND_SPECIAL_S_FIRE; + } + else { + next_status = FIGHTER_SHEIK_STATUS_KIND_SPECIAL_S_HOLD; + } + fighter.change_status(next_status.into(), false.into()); + return 1.into(); + } + } + if !fighter.is_flag(*FIGHTER_SHEIK_STATUS_SPECIAL_S_FLAG_FAIL) { + let effect_handle = fighter.get_int(*FIGHTER_SHEIK_STATUS_SPECIAL_S_WORK_INT_EFFECT_HANDLE); + if effect_handle == 0 { + let effect = EffectModule::req(fighter.module_accessor, Hash40::new("sheik_sakuretu_line_t"), &Vector3f::zero(), &Vector3f::zero(), 1.0, (*EFFECT_SUB_ATTRIBUTE_SYNC_INIT_POS | *EFFECT_SUB_ATTRIBUTE_SYNC_STOP) as u32, 0, false, 0); + fighter.set_int(effect as i32, *FIGHTER_SHEIK_STATUS_SPECIAL_S_WORK_INT_EFFECT_HANDLE); + } + fighter.clear_lua_stack(); + fighter.push_lua_stack(&mut L2CValue::new_int(0x270a162471)); + fighter.push_lua_stack(&mut L2CValue::new_int(0x5e008fd84)); + sv_battle_object::notify_event_msc_cmd(fighter.lua_state_agent); + fighter.pop_lua_stack(1); + } + + return 0.into(); +} + +unsafe fn special_s_change_motion(fighter: &mut L2CFighterCommon, inherit: bool) { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_SHEIK_SPECIAL_S, *FIGHTER_KINETIC_TYPE_SHEIK_SPECIAL_AIR_S); + if inherit { + fighter.change_motion_inherit_frame_by_situation("special_s", "special_air_s", -1.0, 1.0, 0.0, false, false); + } + else { + fighter.change_motion_by_situation("special_s", "special_air_s", 0.0, 1.0, false, 0.0, false, false); + } +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); +} \ No newline at end of file diff --git a/fighters/shizue/Cargo.toml b/fighters/shizue/Cargo.toml index 4477a530b2..190dbc0595 100644 --- a/fighters/shizue/Cargo.toml +++ b/fighters/shizue/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/shizue/src/acmd/ground.rs b/fighters/shizue/src/acmd/ground.rs index e1ac077de7..b75c815512 100644 --- a/fighters/shizue/src/acmd/ground.rs +++ b/fighters/shizue/src/acmd/ground.rs @@ -8,21 +8,13 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { } frame(lua_state, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 30, 0, 14, 2.5, 0.0, 5.5, 5.0, None, None, None, 0.8, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SHIZUE_HAMMER, *ATTACK_REGION_OBJECT); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 361, 30, 0, 14, 2.5, 0.0, 5.5, 8.0, None, None, None, 0.8, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SHIZUE_HAMMER, *ATTACK_REGION_OBJECT); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 30, 0, 14, 2.5, 0.0, 5.5, 11.0, None, None, None, 0.8, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SHIZUE_HAMMER, *ATTACK_REGION_OBJECT); - AttackModule::set_add_reaction_frame(boma, 0, 12.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 12.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 12.0, false); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 80, 71, 0, 20, 2.5, 0.0, 5.5, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SHIZUE_HAMMER, *ATTACK_REGION_OBJECT); + ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 80, 71, 0, 20, 4.0, 0.0, 7.0, 9.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_SHIZUE_HAMMER, *ATTACK_REGION_OBJECT); } wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 13.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_RESTART); - } frame(lua_state, 30.0); if is_excute(agent) { ArticleModule::remove_exist(boma, *FIGHTER_SHIZUE_GENERATE_ARTICLE_PICOPICOHAMMER, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); diff --git a/fighters/shizue/src/acmd/other.rs b/fighters/shizue/src/acmd/other.rs index d5f51160ff..e4716f50f1 100644 --- a/fighters/shizue/src/acmd/other.rs +++ b/fighters/shizue/src/acmd/other.rs @@ -41,15 +41,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -59,10 +55,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_cliffcatch(agent: &mut L2CAgentBase) { diff --git a/fighters/shizue/src/acmd/specials.rs b/fighters/shizue/src/acmd/specials.rs index 07bd5a9f6d..8f65a93b45 100644 --- a/fighters/shizue/src/acmd/specials.rs +++ b/fighters/shizue/src/acmd/specials.rs @@ -107,6 +107,7 @@ unsafe extern "C" fn game_specialairsstart(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); FT_MOTION_RATE(agent, 13.0/(21.0 - 1.0)); } if is_excute(agent) { @@ -357,6 +358,7 @@ unsafe extern "C" fn game_specialairhidetach(agent: &mut L2CAgentBase) { frame(lua_state, 3.0); if is_excute(agent) { VarModule::on_flag(agent.object(), vars::common::instance::UP_SPECIAL_CANCEL); + VarModule::on_flag(agent.object(), vars::common::instance::UP_SPECIAL_LAG); StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_FALL, true); if VarModule::is_flag(agent.object(), vars::shizue::status::SPECIAL_HI_LATE_RELEASE) { VarModule::off_flag(agent.object(), vars::shizue::status::SPECIAL_HI_LATE_RELEASE); diff --git a/fighters/shizue/src/fishingrod/opff.rs b/fighters/shizue/src/fishingrod/opff.rs index d6eb8f3411..bb8d8be861 100644 --- a/fighters/shizue/src/fishingrod/opff.rs +++ b/fighters/shizue/src/fishingrod/opff.rs @@ -4,20 +4,13 @@ use super::*; use globals::*; //Disable grab on fishingrod when pullingback -unsafe extern "C" fn fishingrod_callback(weapon : &mut L2CFighterBase) { - let object_id = (*weapon.battle_object).battle_object_id; - let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER); - let activate_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID); - let serial_id = WorkModule::get_int(weapon.module_accessor, 0x10000002); - let kind = utility::get_kind(&mut (*weapon.module_accessor)); - if kind == *WEAPON_KIND_SHIZUE_FISHINGROD { - let status = StatusModule::status_kind(weapon.module_accessor); - if status == *WEAPON_SHIZUE_FISHINGROD_STATUS_KIND_REEL { - WeaponSpecializer_ShizueFishingrod::enable_search(weapon.module_accessor, false); - } +unsafe extern "C" fn fishingrod_frame(weapon : &mut L2CFighterBase) { + if weapon.is_status(*WEAPON_SHIZUE_FISHINGROD_STATUS_KIND_REEL) { + WeaponSpecializer_ShizueFishingrod::enable_search(weapon.module_accessor, false); } + } pub fn install(agent: &mut Agent) { - agent.on_line(Main, fishingrod_callback); + agent.on_line(Main, fishingrod_frame); } diff --git a/fighters/shizue/src/lib.rs b/fighters/shizue/src/lib.rs index 84bb5cba89..ecc34ecd28 100644 --- a/fighters/shizue/src/lib.rs +++ b/fighters/shizue/src/lib.rs @@ -38,6 +38,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/shizue/src/opff.rs b/fighters/shizue/src/opff.rs index d6756eb73e..4a3455bd38 100644 --- a/fighters/shizue/src/opff.rs +++ b/fighters/shizue/src/opff.rs @@ -40,20 +40,20 @@ unsafe fn reel_in(boma: &mut BattleObjectModuleAccessor) { } // disable the opponent's collision with platforms when reeling them in - if boma.is_status(*FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_HIT) { - let caught_id = boma.get_int(*FIGHTER_SHIZUE_STATUS_WORK_ID_SPECIAL_S_INT_TARGET_OBJECT_ID); - if sv_battle_object::category(caught_id as u32) == *BATTLE_OBJECT_CATEGORY_FIGHTER { - let caught_boma = sv_battle_object::module_accessor(caught_id as u32); - GroundModule::set_passable_check(caught_boma, true); - } - } + // if boma.is_status(*FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_HIT) { + // let caught_id = boma.get_int(*FIGHTER_SHIZUE_STATUS_WORK_ID_SPECIAL_S_INT_TARGET_OBJECT_ID); + // if sv_battle_object::category(caught_id as u32) == *BATTLE_OBJECT_CATEGORY_FIGHTER { + // let caught_boma = sv_battle_object::module_accessor(caught_id as u32); + // GroundModule::set_passable_check(caught_boma, true); + // } + // } } //Lloid Trap Fire Jump Cancel unsafe fn lloid_trap_fire_jc(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat1: i32, stick_x: f32, facing: f32, frame: f32) { if status_kind == *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_LW_FIRE { if boma.status_frame() > 5 && !boma.is_in_hitlag() { - boma.check_jump_cancel(false, false); + boma.check_jump_cancel(false, false, false); } } } diff --git a/fighters/shizue/src/status/landing.rs b/fighters/shizue/src/status/landing.rs new file mode 100644 index 0000000000..bd6ddef0aa --- /dev/null +++ b/fighters/shizue/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/shizue/src/status/mod.rs b/fighters/shizue/src/status/mod.rs index cc19e25e88..1df326735f 100644 --- a/fighters/shizue/src/status/mod.rs +++ b/fighters/shizue/src/status/mod.rs @@ -6,6 +6,7 @@ mod dead; mod special_hi; mod special_lw; mod special_s; +mod landing; unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { VarModule::off_flag(fighter.object(), vars::shizue::instance::SPECIAL_LW_LLOID_ASYNC); @@ -19,4 +20,5 @@ pub fn install(agent: &mut Agent) { special_hi::install(agent); special_lw::install(agent); special_s::install(agent); + landing::install(agent); } \ No newline at end of file diff --git a/fighters/shizue/src/status/special_s.rs b/fighters/shizue/src/status/special_s.rs index 3ed3398f04..5cb03b8c8d 100644 --- a/fighters/shizue/src/status/special_s.rs +++ b/fighters/shizue/src/status/special_s.rs @@ -231,6 +231,18 @@ unsafe extern "C" fn special_s_reel_main_loop(fighter: &mut L2CFighterCommon) -> // FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_HIT +unsafe extern "C" fn special_s_hit_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_HIT)(fighter); + + let caught_id = fighter.get_int(*FIGHTER_SHIZUE_STATUS_WORK_ID_SPECIAL_S_INT_TARGET_OBJECT_ID); + if sv_battle_object::category(caught_id as u32) == *BATTLE_OBJECT_CATEGORY_FIGHTER { + let caught_boma = sv_battle_object::module_accessor(caught_id as u32); + GroundModule::set_passable_check(caught_boma, true); + } + + return ret; +} + unsafe extern "C" fn special_s_hit_end(fighter: &mut L2CFighterCommon) -> L2CValue { let caught_id = fighter.get_int(*FIGHTER_SHIZUE_STATUS_WORK_ID_SPECIAL_S_INT_TARGET_OBJECT_ID); @@ -242,8 +254,19 @@ unsafe extern "C" fn special_s_hit_end(fighter: &mut L2CFighterCommon) -> L2CVal smashline::original_status(End, fighter, *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_HIT)(fighter) } +// FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_THROW + +unsafe extern "C" fn special_s_throw_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::off_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); + + smashline::original_status(Main, fighter, *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_THROW)(fighter) +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); agent.status(Main, *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_REEL, special_s_reel_main); + + agent.status(Main, *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_HIT, special_s_hit_main); agent.status(End, *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_HIT, special_s_hit_end); + agent.status(Main, *FIGHTER_SHIZUE_STATUS_KIND_SPECIAL_S_THROW, special_s_throw_main); } \ No newline at end of file diff --git a/fighters/shulk/Cargo.toml b/fighters/shulk/Cargo.toml index 4470a59696..00efe56bc9 100644 --- a/fighters/shulk/Cargo.toml +++ b/fighters/shulk/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/shulk/src/acmd/aerials.rs b/fighters/shulk/src/acmd/aerials.rs index bc20113a63..20bc30ec32 100644 --- a/fighters/shulk/src/acmd/aerials.rs +++ b/fighters/shulk/src/acmd/aerials.rs @@ -40,7 +40,8 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 34.0); if is_excute(agent) { @@ -70,8 +71,8 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("swordr"), 10.0, 361, 99, 0, 46, 4.0, -1.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("swordr"), 10.0, 361, 99, 0, 46, 4.0, 5.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("swordr"), 8.5, 58, 70, 0, 70, 4.0, 12.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("swordr"), 10.0, 361, 99, 0, 46, 4.0, 6.5, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("swordr"), 8.5, 58, 70, 0, 70, 4.0, 13.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 5.0); if is_excute(agent) { @@ -86,15 +87,12 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 12.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 0.98, 0, 0, 0, 0, 0, 0, true); - } frame(lua_state, 13.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword2"), Hash40::new("haver"), 0, 3, 0, 0, 0, 0, 0.95, true); EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_circle"), Hash40::new("swordr"), 0, 0, 0, 0, 0, 0, 1, true); - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword2"), 7, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 18, 0.9, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 19.0); if is_excute(agent) { diff --git a/fighters/shulk/src/acmd/ground.rs b/fighters/shulk/src/acmd/ground.rs index b0b00befdc..97316da33e 100644 --- a/fighters/shulk/src/acmd/ground.rs +++ b/fighters/shulk/src/acmd/ground.rs @@ -8,14 +8,12 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handl"), 2.0, 361, 10, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 2.0, 361, 10, 0, 35, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 2.0, 361, 10, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 10, 0, 25, 2.0, 0.0, 4.5, 7.5, Some(0.0), Some(4.5), Some(5.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_add_reaction_frame(boma, 0, 3.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 3.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 3.0, false); - AttackModule::set_down_only(boma, 3, false); + ATTACK(agent, 0, 0, Hash40::new("handl"), 2.0, 88, 100, 40, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 2.0, 70, 100, 40, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("shoulderl"), 2.0, 60, 100, 40, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 10, 0, 25, 2.0, 0.0, 4.5, 7.5, Some(0.0), Some(4.5), Some(5.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 2.0); if is_excute(agent) { @@ -36,12 +34,9 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 2.5, 361, 10, 0, 40, 3.0, 0.0, 0.0, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.5, 361, 10, 0, 40, 3.5, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 2.5, 361, 10, 0, 35, 3.8, 4.5, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_KICK); - AttackModule::set_add_reaction_frame(boma, 0, 5.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 5.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 5.0, false); + ATTACK(agent, 0, 0, Hash40::new("legr"), 2.5, 66, 100, 52, 0, 3.0, 0.0, 0.0, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.5, 70, 100, 52, 0, 3.5, 0.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 2.5, 80, 100, 52, 0, 3.8, 4.5, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); if is_excute(agent) { @@ -79,7 +74,8 @@ unsafe extern "C" fn effect_attack13(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_jab"), Hash40::new("tex_shulk_sword2"), 10, Hash40::new("haver"), 0, 2.8, 0.9, Hash40::new("haver"), 0, 14, 0.9, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.1, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 10.0); if is_excute(agent) { @@ -125,8 +121,9 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { LANDING_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 13.0); - if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword4"), 4, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19.3, 0.9, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); + if is_excute(agent) { + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 14.0); if is_excute(agent) { diff --git a/fighters/shulk/src/acmd/mod.rs b/fighters/shulk/src/acmd/mod.rs index d8a22387b4..815bc59203 100644 --- a/fighters/shulk/src/acmd/mod.rs +++ b/fighters/shulk/src/acmd/mod.rs @@ -8,6 +8,25 @@ mod specials; mod throws; mod other; +pub unsafe fn shulk_get_trail(agent: &mut L2CAgentBase) -> String { + let original_trail = "tex_shulk_sword_hdr"; + let boma = agent.boma(); + if !WorkModule::is_flag(boma, *FIGHTER_SHULK_INSTANCE_WORK_ID_FLAG_SPECIAL_N_ACTIVE) { + return original_trail.to_string(); + } + let active_art = WorkModule::get_int(boma, *FIGHTER_SHULK_INSTANCE_WORK_ID_INT_SPECIAL_N_TYPE); + let trail = match active_art { + 0 => format!("{}{}", original_trail, "_jump"), + 1 => format!("{}{}", original_trail, "_speed"), + 2 => format!("{}{}", original_trail, "_shield"), + 3 => format!("{}{}", original_trail, "_buster"), + 4 => format!("{}{}", original_trail, "_smash"), + _ => original_trail.to_string() + }; + + return trail; +} + pub fn install(agent: &mut Agent) { ground::install(agent); tilts::install(agent); diff --git a/fighters/shulk/src/acmd/other.rs b/fighters/shulk/src/acmd/other.rs index 3d21df3565..32f3fbcf6a 100644 --- a/fighters/shulk/src/acmd/other.rs +++ b/fighters/shulk/src/acmd/other.rs @@ -90,16 +90,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -110,10 +106,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_landingfallspecial(agent: &mut L2CAgentBase) { @@ -188,7 +181,8 @@ unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { } frame(lua_state, 21.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword2"), 7, Hash40::new("haver"), 0, 3, 1.1, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 26.0); if is_excute(agent) { @@ -222,7 +216,8 @@ unsafe extern "C" fn effect_downattackd(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword2"), 7, Hash40::new("haver"), 0, 3, 1.1, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 18.0); if is_excute(agent) { @@ -256,7 +251,8 @@ unsafe extern "C" fn effect_downattacku(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword2"), 7, Hash40::new("haver"), 0, 3, 1.1, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 18.0); if is_excute(agent) { @@ -290,7 +286,8 @@ unsafe extern "C" fn effect_slipattack(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword4"), 7, Hash40::new("haver"), 0, 3, 1.1, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 18.0); if is_excute(agent) { diff --git a/fighters/shulk/src/acmd/smashes.rs b/fighters/shulk/src/acmd/smashes.rs index 772e7e6f00..96066b1b87 100644 --- a/fighters/shulk/src/acmd/smashes.rs +++ b/fighters/shulk/src/acmd/smashes.rs @@ -115,7 +115,7 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword2"), 10, Hash40::new("haver"), 0.0, 2.0, 1.1, Hash40::new("haver"), 0.0, 27.0, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.05); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 18.0); if is_excute(agent) { diff --git a/fighters/shulk/src/acmd/specials.rs b/fighters/shulk/src/acmd/specials.rs index 0a40b50029..80646ba938 100644 --- a/fighters/shulk/src/acmd/specials.rs +++ b/fighters/shulk/src/acmd/specials.rs @@ -131,15 +131,17 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_circle_red"), Hash40::new("swordr"), 0, 0, 0, 0, 0, 0, 1, true); EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword3_red"), Hash40::new("haver"), 0, 2.5, 0.3, 0, 0, 0, 0.4, true); - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_rush"), Hash40::new("tex_shulk_swordred2"), 15, Hash40::new("haver"), 0.0, 4.0, 0.65, Hash40::new("haver"), 0.0, 20.0, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); + } + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword3_red"), Hash40::new("haver"), 0, 1.8, 0, 0, 0, 0, 0.6, true); } frame(lua_state, 19.0); if is_excute(agent) { if agent.is_situation(*SITUATION_KIND_GROUND) { LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } - EFFECT_OFF_KIND(agent, Hash40::new("shulk_monad_sword3_red"), false, false); - EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword3_red"), Hash40::new("haver"), 0, 1.8, 0, 0, 0, 0, 0.8, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_rush"), Hash40::new("tex_shulk_swordred2"), 15, Hash40::new("haver"), 0.0, 4.0, 0.65, Hash40::new("haver"), 0.0, 20.0, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.3, 0.2); } frame(lua_state, 21.0); if is_excute(agent) { @@ -199,7 +201,7 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("shulk_monad_sword3_red"), false, false); EFFECT_OFF_KIND(agent, Hash40::new("shulk_monad_circle_red"), false, false); - EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword3_red_end"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.87, true); + EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword3_red_end"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 0.67, true); LAST_EFFECT_SET_COLOR(agent, 1.0, 0.549, 0.549) } } @@ -266,10 +268,10 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); WorkModule::on_flag(boma,*FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); WorkModule::on_flag(boma,*FIGHTER_SHULK_STATUS_SPECIAL_HI_FLAG_IS_ADD_SHIFT_RESERVE_INPUT); - ATTACK(agent, 0, 0, Hash40::new("haver"), 6.0, 76, 100, 135, 0, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 6.0, 78, 100, 135, 0, 4.0, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 6.0, 76, 100, 135, 0, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 6.0, 78, 100, 135, 0, 4.0, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 6.0, 76, 100, 135, 0, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 6.0, 78, 100, 135, 0, 4.0, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 6.0, 76, 100, 145, 0, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 6.0, 78, 100, 155, 0, 4.0, 0.0, 7.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 11.0); if is_excute(agent) { diff --git a/fighters/shulk/src/acmd/throws.rs b/fighters/shulk/src/acmd/throws.rs index c197b65ab0..d5e171fa79 100644 --- a/fighters/shulk/src/acmd/throws.rs +++ b/fighters/shulk/src/acmd/throws.rs @@ -7,13 +7,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 2.0); frame(lua_state, 2.0); FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 6.0); + frame(lua_state, 1.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 7.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 9.0, 0.0, Some(0.0), Some(9.0), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 9.0, 5.5, Some(0.0), Some(9.0), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -33,7 +33,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 4.0, Some(0.0), Some(8.0), Some(10.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, 5.5, Some(0.0), Some(8.0), Some(10.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -53,7 +53,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, -4.0, Some(0.0), Some(8.0), Some(-15.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.0, -5.5, Some(0.0), Some(8.0), Some(-15.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -102,8 +102,9 @@ unsafe extern "C" fn effect_throwf(agent: &mut L2CAgentBase) { EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_circle"), Hash40::new("swordr"), 0, 0, 0, 0, 0, 0, 1, true); } frame(lua_state, 14.0); - if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_jab"), Hash40::new("tex_shulk_sword2"), 3, Hash40::new("haver"), 0, 3, 1.1, Hash40::new("haver"), 0, 19.3, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + if is_excute(agent) { + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 15.0); if is_excute(agent) { diff --git a/fighters/shulk/src/acmd/tilts.rs b/fighters/shulk/src/acmd/tilts.rs index 1b04bd32e0..797dbcad82 100644 --- a/fighters/shulk/src/acmd/tilts.rs +++ b/fighters/shulk/src/acmd/tilts.rs @@ -30,21 +30,14 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword2"), Hash40::new("haver"), 0, 2.4, 0, 0, 0, 0, 1, true); } - frame(lua_state, 11.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("shulk_vision_attack"), Hash40::new("haver"), 0.5, 3, 1, 0, -85, 0, 0.5, true); - } frame(lua_state, 12.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("shulk_vision_attack"), true, true); - EFFECT_FOLLOW(agent, Hash40::new("shulk_vision_attack"), Hash40::new("haver"), 0.5, 3, 1, 0, -70, 0, 0.5, true); - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword4"), 5, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19.3, 0.9, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); - EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword2_lightning"), Hash40::new("haver"), 0, 2.4, 0, 0, 0, 0, 0.7, true); FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 13.0); + frame(lua_state, 12.0); if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("shulk_vision_attack"), true, true); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 16.0); if is_excute(agent) { @@ -69,17 +62,19 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 10.0, 85, 80, 0, 70, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, 5.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, 7.5, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, 7.5, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, -1.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, 6.5, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, 10.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + frame(lua_state, 17.0); + if is_excute(agent) { + AttackModule::set_offset(boma, 2, &Vector3f::new(0.0, 13.0, -1.0)); } frame(lua_state, 18.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, 5.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 107, 75, 0, 65, 4.0, 0.0, 10.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 9.0, 107, 75, 0, 65, 4.0, 0.0, 15.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 10.0, 85, 80, 0, 70, 4.0, 0.0, -1.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 107, 75, 0, 65, 4.0, 0.0, 6.5, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 107, 75, 0, 65, 4.0, 0.0, 13.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 28.0); FT_MOTION_RATE(agent, 0.8); @@ -99,22 +94,17 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_circle"), Hash40::new("swordr"), 0, 0, 0, 0, 0, 0, 1, true); EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword4"), 3, Hash40::new("haver"), 0, 2.8, 0.9, Hash40::new("haver"), 0, 14, 0.9, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 17.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword2"), Hash40::new("haver"), 0, 3, 0, 0, 0, 0, 1.12, true); - } - frame(lua_state, 18.0); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword2_arc"), Hash40::new("haver"), 0, 3, 0, 0, 0, 0, 1.12, true); - EFFECT_OFF_KIND(agent, Hash40::new("shulk_monad_sword"), false, false); - AFTER_IMAGE_OFF(agent, 0); - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword4"), 13, Hash40::new("haver"), 0, 3, 1, Hash40::new("haver"), 0, 20.8, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword2"), Hash40::new("haver"), 0, 3, 0, 0, 0, 0, 1.0, true); } frame(lua_state, 27.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword2_end"), Hash40::new("haver"), 0, 3, 0, 0, 0, 0, 1.12, true); + AFTER_IMAGE_OFF(agent, 0); + EFFECT_FOLLOW(agent, Hash40::new("shulk_monad_sword2_end"), Hash40::new("haver"), 0, 3, 0, 0, 0, 0, 1.0, true); } frame(lua_state, 28.0); if is_excute(agent) { @@ -160,7 +150,8 @@ unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_shulk_sword_hdr"), Hash40::new("tex_shulk_sword2"), 10, Hash40::new("haver"), 0, 3, 1.1, Hash40::new("haver"), 0, 19.3, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + let trail_hash = shulk_get_trail(agent).to_hash(); + AFTER_IMAGE4_ON_arg29(agent, trail_hash, Hash40::new("tex_shulk_sword2"), 8, Hash40::new("haver"), 0, 3, 0.9, Hash40::new("haver"), 0, 19, 1.1, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 10.0); if is_excute(agent) { diff --git a/fighters/shulk/src/lib.rs b/fighters/shulk/src/lib.rs index a4753c1fe1..47e79c82d5 100644 --- a/fighters/shulk/src/lib.rs +++ b/fighters/shulk/src/lib.rs @@ -32,6 +32,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -46,6 +47,5 @@ pub fn install() { acmd::install(agent); opff::install(agent); status::install(agent); - vtable_hook::install(agent); agent.install(); } diff --git a/fighters/shulk/src/status/special_s.rs b/fighters/shulk/src/status/special_s.rs index c66cf94b45..a89c8063b9 100644 --- a/fighters/shulk/src/status/special_s.rs +++ b/fighters/shulk/src/status/special_s.rs @@ -53,6 +53,13 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV return 1.into(); } } + + // Reduce speed on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) { + let shield_hit_speed_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_speed_x_mul"); + sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, shield_hit_speed_x_mul); + } + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { // checks for current step if VarModule::get_int(fighter.battle_object, vars::shulk::instance::SPECIAL_S_STEP) == 0 { diff --git a/fighters/shulk/src/vtable_hook.rs b/fighters/shulk/src/vtable_hook.rs index 55544bb08d..fc5145f47a 100644 --- a/fighters/shulk/src/vtable_hook.rs +++ b/fighters/shulk/src/vtable_hook.rs @@ -2,13 +2,14 @@ use super::*; // disables art wheel during hitstun, and enables it during jab, tilts and aerials -#[skyline::hook(offset = 0x116a3d0)] -pub unsafe extern "C" fn shulk_check_valid_arts_statuses(fighter: &mut Fighter) -> u64 { +#[no_mangle] +pub unsafe extern "C" fn shulk_check_valid_arts_statuses_inner(fighter: &mut Fighter) -> bool { let module_accessor = (fighter.battle_object).module_accessor; let status = StatusModule::status_kind(module_accessor); let object = &mut fighter.battle_object; - if VarModule::is_flag(object, vars::shulk::status::MONADO_BEAT) { - u64::from([ + if WorkModule::is_flag(module_accessor, *FIGHTER_SHULK_INSTANCE_WORK_ID_FLAG_SPECIAL_N_ACTIVE) + && VarModule::is_flag(object, vars::shulk::status::MONADO_BEAT) { + [ *FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_WALK, *FIGHTER_STATUS_KIND_DASH, @@ -40,10 +41,10 @@ pub unsafe extern "C" fn shulk_check_valid_arts_statuses(fighter: &mut Fighter) *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP, *FIGHTER_STATUS_KIND_ITEM_ROCKETBELT_HOVER_KEEP, *FIGHTER_STATUS_KIND_KILLER_JUMP, - ].contains(&status)) + ].contains(&status) } - else { - u64::from([ + else { + [ *FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_WALK, *FIGHTER_STATUS_KIND_DASH, @@ -69,12 +70,6 @@ pub unsafe extern "C" fn shulk_check_valid_arts_statuses(fighter: &mut Fighter) *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP, *FIGHTER_STATUS_KIND_ITEM_ROCKETBELT_HOVER_KEEP, *FIGHTER_STATUS_KIND_KILLER_JUMP, - ].contains(&status)) + ].contains(&status) } } - -pub fn install(agent: &mut Agent) { - skyline::install_hooks!( - shulk_check_valid_arts_statuses, - ); -} \ No newline at end of file diff --git a/fighters/simon/Cargo.toml b/fighters/simon/Cargo.toml index 8b389d80ec..2e7b9123d9 100644 --- a/fighters/simon/Cargo.toml +++ b/fighters/simon/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/simon/src/acmd/aerials.rs b/fighters/simon/src/acmd/aerials.rs index 4869ed104d..849b43d5dd 100644 --- a/fighters/simon/src/acmd/aerials.rs +++ b/fighters/simon/src/acmd/aerials.rs @@ -327,14 +327,14 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); if is_excute(agent) { /* Ground-only */ - ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 280, 68, 0, 30, 6.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 280, 68, 0, 30, 5.5, 0.0, 1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); /* Air-only */ - ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 280, 53, 0, 30, 6.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 280, 53, 0, 30, 5.5, 0.0, 1.5, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear(boma, 1, false); - ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 72, 55, 0, 88, 6.5, 0.0, 0.5, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 72, 55, 0, 88, 5.5, 0.0, 1.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 40.0); if is_excute(agent) { diff --git a/fighters/simon/src/acmd/ground.rs b/fighters/simon/src/acmd/ground.rs index 88bec88727..7d49e92ffa 100644 --- a/fighters/simon/src/acmd/ground.rs +++ b/fighters/simon/src/acmd/ground.rs @@ -147,7 +147,7 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 12.0, -3.0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); + // EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 12.0, -3.0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 8.0); if is_excute(agent) { diff --git a/fighters/simon/src/acmd/other.rs b/fighters/simon/src/acmd/other.rs index 078509ec60..0ea73f3bc8 100644 --- a/fighters/simon/src/acmd/other.rs +++ b/fighters/simon/src/acmd/other.rs @@ -65,16 +65,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -85,9 +81,14 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); + +} + +unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + PostureModule::add_pos(boma, &Vector3f::new(0.0, -1.0, 0.0)); } } @@ -105,4 +106,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_escapeair", game_escapeair, Priority::Low); agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); -} + + agent.acmd("game_cliffjump2", game_cliffjump2, Priority::Low); +} \ No newline at end of file diff --git a/fighters/simon/src/acmd/throws.rs b/fighters/simon/src/acmd/throws.rs index 42174a38ba..98bb128d05 100644 --- a/fighters/simon/src/acmd/throws.rs +++ b/fighters/simon/src/acmd/throws.rs @@ -5,17 +5,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.7); - if is_excute(agent) { - FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.0, 6.0); - } - frame(lua_state, 9.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); + FighterAreaModuleImpl::enable_fix_jostle_area(boma, 4.0, 6.0); } frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 0.0, Some(0.0), Some(6.6), Some(8.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, 4.0, Some(0.0), Some(6.6), Some(8.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -61,7 +58,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.0, Some(0.0), Some(6.6), Some(-13.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -6.5, Some(0.0), Some(6.6), Some(-13.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/simon/src/cross/mod.rs b/fighters/simon/src/cross/mod.rs new file mode 100644 index 0000000000..4d57636406 --- /dev/null +++ b/fighters/simon/src/cross/mod.rs @@ -0,0 +1,9 @@ +use super::*; + +mod opff; + +pub fn install() { + let agent = &mut Agent::new("simon_cross"); + opff::install(agent); + agent.install(); +} \ No newline at end of file diff --git a/fighters/simon/src/cross/opff.rs b/fighters/simon/src/cross/opff.rs new file mode 100644 index 0000000000..2f1e576556 --- /dev/null +++ b/fighters/simon/src/cross/opff.rs @@ -0,0 +1,48 @@ +// opff import +utils::import_noreturn!(common::opff::fighter_common_opff); +use super::*; +use globals::*; + +unsafe fn cross_reflect_fix(weapon: &mut smash::lua2cpp::L2CFighterBase) { + // this opff runs once after reflection + let boma = weapon.module_accessor; + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_REFLECTOR | *COLLISION_KIND_MASK_PARRY) { + return; + } + AttackModule::clear_inflict_kind_status(boma); + + // update position, accounting for boomerang-weirdness + let top_pos = *PostureModule::pos(boma); + let rot_pos = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + ModelModule::joint_global_position(boma, Hash40::new("rot"), rot_pos, false); + PostureModule::set_pos(boma, &Vector3f{ x: rot_pos.x, y: top_pos.y, z: top_pos.z }); + + // update facing direction depending on whether it is traveling forwards or backwards + let lr = PostureModule::lr(boma); + let speed_x = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + if weapon.is_status(*WEAPON_SIMON_CROSS_STATUS_KIND_TURN) { + PostureModule::reverse_lr(boma); + PostureModule::update_rot_y_lr(boma); + } + + // lifetime fix + let param_name = if weapon.is_flag(*WEAPON_SIMON_CROSS_INSTANCE_WORK_ID_FLAG_FLICK) { + "life_flick" + } else { + "life" + }; + let life = weapon.get_param_int("cross", param_name); + weapon.set_int(life, *WEAPON_INSTANCE_WORK_ID_INT_LIFE); + weapon.set_int(life, *WEAPON_INSTANCE_WORK_ID_INT_INIT_LIFE); + + // restart status + weapon.change_status(WEAPON_SIMON_CROSS_STATUS_KIND_TURN.into(), false.into()); +} + +pub unsafe extern "C" fn simon_cross_frame(weapon: &mut smash::lua2cpp::L2CFighterBase) { + cross_reflect_fix(weapon); +} + +pub fn install(agent: &mut Agent) { + agent.on_line(Main, simon_cross_frame); +} \ No newline at end of file diff --git a/fighters/simon/src/lib.rs b/fighters/simon/src/lib.rs index c0cd3e961c..f685511992 100644 --- a/fighters/simon/src/lib.rs +++ b/fighters/simon/src/lib.rs @@ -10,6 +10,7 @@ pub mod status; // articles mod axe; +mod cross; mod whip; use smash::{ @@ -35,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -52,5 +54,6 @@ pub fn install() { agent.install(); axe::install(); + cross::install(); whip::install(); } diff --git a/fighters/simon/src/opff.rs b/fighters/simon/src/opff.rs index 3c6e69af42..d4e547df61 100644 --- a/fighters/simon/src/opff.rs +++ b/fighters/simon/src/opff.rs @@ -3,15 +3,6 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; - -unsafe fn holy_water_ac(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, status_kind: i32, situation_kind: i32, cat1: i32, frame: f32) { - if status_kind == *FIGHTER_STATUS_KIND_SPECIAL_LW { - if frame > 20.0 { - boma.check_airdodge_cancel(); - } - } -} - unsafe fn axe_drift(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat2: i32, stick_y: f32) { if status_kind == *FIGHTER_STATUS_KIND_SPECIAL_N { if situation_kind == *SITUATION_KIND_AIR { @@ -47,7 +38,7 @@ unsafe fn cross_land_cancel(fighter: &mut L2CFighterCommon, boma: &mut BattleObj // allow fair and bair to transition into their angled variants when the stick is angled up/down unsafe fn whip_angling(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, frame: f32, stick_y: f32) { if fighter.is_motion_one_of(&[Hash40::new("attack_air_f"), Hash40::new("attack_air_f_hi"), Hash40::new("attack_air_f_lw")]) - && (11.0..12.0).contains(&frame) { + && (5.0..6.0).contains(&frame) { let stick_y = if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_CSTICK_ON) { ControlModule::get_sub_stick_y(fighter.module_accessor) } @@ -61,7 +52,7 @@ unsafe fn whip_angling(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectMo } } else if fighter.is_motion_one_of(&[Hash40::new("attack_air_b"), Hash40::new("attack_air_b_hi"), Hash40::new("attack_air_b_lw")]) - && (11.0..12.0).contains(&frame) { + && (5.0..6.0).contains(&frame) { let stick_y = if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_CSTICK_ON) { ControlModule::get_sub_stick_y(fighter.module_accessor) } @@ -89,7 +80,6 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { - holy_water_ac(fighter, boma, id, status_kind, situation_kind, cat[0], frame); axe_drift(boma, status_kind, situation_kind, cat[1], stick_y); cross_land_cancel(fighter, boma, cat[2], stick_y); whip_angling(fighter, boma, frame, stick_y); diff --git a/fighters/snake/Cargo.toml b/fighters/snake/Cargo.toml index 6474308dba..8d29c6bb14 100644 --- a/fighters/snake/Cargo.toml +++ b/fighters/snake/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/snake/src/acmd/ground.rs b/fighters/snake/src/acmd/ground.rs index 5fbf83d1ae..143312a16b 100644 --- a/fighters/snake/src/acmd/ground.rs +++ b/fighters/snake/src/acmd/ground.rs @@ -7,9 +7,10 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 4.0, 80, 60, 30, 5, 3.0, -1.0, 0.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("shoulderl"), 4.0, 80, 60, 30, 5, 3.25, 0.0, 0.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("arml"), 4.0, 80, 60, 30, 5, 4.0, 0.0, 2.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("arml"), 4.0, 88, 60, 30, 5, 4.0, 3.0, 0.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("arml"), 4.0, 80, 60, 30, 5, 4.0, 0.0, 2.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("arml"), 4.0, 88, 60, 30, 5, 4.0, 3.0, 0.0, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 4, 0, Hash40::new("top"), 4.0, 361, 20, 0, 20, 3.5, 0.0, 4.0, 11.5, Some(0.0), Some(4.0), Some(5.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); } wait(lua_state, 2.0); if is_excute(agent) { @@ -30,9 +31,10 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { KineticModule::add_speed(boma, &Vector3f::new(-1.0, 0.0, 0.0)); ATTACK(agent, 0, 0, Hash40::new("hip"), 3.0, 50, 60, 20, 0, 3.0, 1.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("shoulderr"), 3.0, 50, 60, 20, 0, 3.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 50, 60, 20, 0, 4.0, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 3, 0, Hash40::new("armr"), 3.0, 50, 60, 20, 0, 4.0, 3.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 3.0, 50, 60, 20, 0, 4.0, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 3, 0, Hash40::new("armr"), 3.0, 50, 60, 20, 0, 4.0, 3.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 20, 0, 20, 2.5, 0.0, 4.0, 10.0, Some(0.0), Some(4.0), Some(5.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); } wait(lua_state, 2.0); if is_excute(agent) { diff --git a/fighters/snake/src/acmd/other.rs b/fighters/snake/src/acmd/other.rs index 05c4443886..98e4c6a043 100644 --- a/fighters/snake/src/acmd/other.rs +++ b/fighters/snake/src/acmd/other.rs @@ -175,16 +175,12 @@ unsafe extern "C" fn effect_appealendexplode(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -195,10 +191,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/snake/src/acmd/specials.rs b/fighters/snake/src/acmd/specials.rs index 75b8933438..0683edea51 100644 --- a/fighters/snake/src/acmd/specials.rs +++ b/fighters/snake/src/acmd/specials.rs @@ -104,7 +104,7 @@ unsafe extern "C" fn effect_specialsstart(agent : &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), -3, 10, 0, 0, 0, 0, 0.4, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), -3, 10, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, false); } frame(lua_state, 16.0); if is_excute(agent) { diff --git a/fighters/snake/src/acmd/throws.rs b/fighters/snake/src/acmd/throws.rs index a45e42240f..f8b579d34e 100644 --- a/fighters/snake/src/acmd/throws.rs +++ b/fighters/snake/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.875); - frame(lua_state, 7.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 8.2, 0.0, Some(0.0), Some(8.2), Some(11.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 8.2, 7.0, Some(0.0), Some(8.2), Some(11.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/snake/src/lib.rs b/fighters/snake/src/lib.rs index 4bf54ab2ed..b63daccfd1 100644 --- a/fighters/snake/src/lib.rs +++ b/fighters/snake/src/lib.rs @@ -38,6 +38,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/sonic/Cargo.toml b/fighters/sonic/Cargo.toml index 02d12515ad..86969d7afc 100644 --- a/fighters/sonic/Cargo.toml +++ b/fighters/sonic/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/sonic/src/acmd/ground.rs b/fighters/sonic/src/acmd/ground.rs index 75fd4a0611..e8bc1895f5 100644 --- a/fighters/sonic/src/acmd/ground.rs +++ b/fighters/sonic/src/acmd/ground.rs @@ -96,18 +96,10 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.8); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 8.0/11.0); - frame(lua_state, 6.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.0, 361, 100, 20, 0, 3.0, 0.0, 6.0, 7.0, Some(0.0), Some(6.0), Some(3.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, true, true, false, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_NONE); - } - frame(lua_state, 10.5); - if is_excute(agent) { - AttackModule::clear_all(boma); - } frame(lua_state, 11.0); FT_MOTION_RATE_RANGE(agent, 11.0, 21.0, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 3.0, 361, 100, 30, 0, 4.5, 1.0, 3.0, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 100, 30, 0, 4.5, 0.0, 4.5, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 14.0); if is_excute(agent) { @@ -116,7 +108,7 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneel"), 6.0, 55, 130, 0, 40, 4.0, 3.5, 0.0, 2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("head"), 6.0, 55, 130, 0, 40, 3.5, 2.5, -2.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 55, 130, 0, 40, 3.5, 0.0, 3.5, -3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 18.0); if is_excute(agent) { diff --git a/fighters/sonic/src/acmd/other.rs b/fighters/sonic/src/acmd/other.rs index 761a60e883..1025ef3d26 100644 --- a/fighters/sonic/src/acmd/other.rs +++ b/fighters/sonic/src/acmd/other.rs @@ -76,16 +76,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -96,10 +92,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { diff --git a/fighters/sonic/src/acmd/smashes.rs b/fighters/sonic/src/acmd/smashes.rs index 34cbba5d7f..9d61d42058 100644 --- a/fighters/sonic/src/acmd/smashes.rs +++ b/fighters/sonic/src/acmd/smashes.rs @@ -94,11 +94,11 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_a"), Hash40::new("top"), 2, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); } - frame(lua_state, 10.0); + frame(lua_state, 9.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 13, 0, 0, 50, 90, 1.2, true); LAST_EFFECT_SET_COLOR(agent, 3.0, 0.15, 0.15); - LAST_EFFECT_SET_RATE(agent, 2.0); + LAST_EFFECT_SET_RATE(agent, 1.3); } frame(lua_state, 27.0); if is_excute(agent) { diff --git a/fighters/sonic/src/acmd/specials.rs b/fighters/sonic/src/acmd/specials.rs index 17e6a34f1d..7cc48f5861 100644 --- a/fighters/sonic/src/acmd/specials.rs +++ b/fighters/sonic/src/acmd/specials.rs @@ -140,12 +140,13 @@ unsafe extern "C" fn game_specialsboostend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 20.0); + FT_MOTION_RATE(agent, 0.75); } unsafe extern "C" fn effect_specialsboostend(agent: &mut L2CAgentBase) { @@ -184,16 +185,18 @@ unsafe extern "C" fn game_specialairsboostend(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); FT_MOTION_RATE(agent, 0.8); - frame(lua_state, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); - VarModule::on_flag(agent.battle_object, vars::sonic::status::SPECIAL_S_ENABLE_CONTROL); } frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 1.3); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - frame(lua_state, 8.0); - FT_MOTION_RATE(agent, 1.3); + } + frame(lua_state, 24.0); + FT_MOTION_RATE(agent, 0.5); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::sonic::status::SPECIAL_S_ENABLE_CONTROL); } } diff --git a/fighters/sonic/src/acmd/throws.rs b/fighters/sonic/src/acmd/throws.rs index 914595ca48..3b80e295d4 100644 --- a/fighters/sonic/src/acmd/throws.rs +++ b/fighters/sonic/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE_RANGE(agent, 1.0, 6.0, 6.0); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 0.0, Some(0.0), Some(6.0), Some(7.65), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 6.0, Some(0.0), Some(6.0), Some(7.65), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); frame(lua_state, 8.0); @@ -35,7 +34,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 4.0, Some(0.0), Some(6.0), Some(11.1), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, 6.0, Some(0.0), Some(6.0), Some(9.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); frame(lua_state, 12.0); @@ -58,7 +57,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-14.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.0, -4.0, Some(0.0), Some(6.0), Some(-13.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); frame(lua_state, 12.0); @@ -75,7 +74,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 120, 86, 0, 75, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 9.0, 135, 60, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 42.0); @@ -89,6 +88,10 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); } + frame(lua_state, 57.0); + FT_MOTION_RATE_RANGE(agent, 57.0, 67.0, 14.0); + frame(lua_state, 67.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { diff --git a/fighters/sonic/src/acmd/tilts.rs b/fighters/sonic/src/acmd/tilts.rs index 9e70e45a5f..b3d00483a1 100644 --- a/fighters/sonic/src/acmd/tilts.rs +++ b/fighters/sonic/src/acmd/tilts.rs @@ -8,8 +8,8 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { } frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 11.0, 361, 90, 0, 20, 4.5, 6.0, 0.0, -1.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 361, 90, 0, 20, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 11.0, 361, 90, 0, 20, 4.5, 6.0, 0.0, -1.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 361, 90, 0, 20, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("legl"), 9.0, 361, 90, 0, 20, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 12.0); @@ -126,14 +126,14 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - // ground only - ATTACK(agent, 1, 0, Hash40::new("legr"), 2.0, 80, 100, 35, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 2.0, 80, 100, 35, 0, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 2.0, 361, 100, 45, 0, 5.0, 7.0, 0.0, -1.5, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - //air only - ATTACK(agent, 4, 0, Hash40::new("legr"), 2.0, 366, 100, 35, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("kneer"), 2.0, 366, 100, 35, 0, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 6, 0, Hash40::new("kneer"), 2.0, 366, 100, 45, 0, 5.0, 7.0, 0.0, -1.5, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + // ground-only + ATTACK(agent, 0, 0, Hash40::new("legr"), 2.0, 80, 100, 35, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 2.0, 80, 100, 35, 0, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 2.0, 361, 100, 45, 0, 4.5, 7.0, 0.0, -1.5, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + // air-only + ATTACK(agent, 3, 0, Hash40::new("legr"), 2.0, 366, 100, 35, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("kneer"), 2.0, 366, 100, 35, 0, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("kneer"), 2.0, 366, 100, 45, 0, 4.5, 7.0, 0.0, -1.5, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 13.0); if is_excute(agent) { @@ -141,9 +141,9 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 6.0, 75, 120, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 6.0, 75, 120, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneel"), 6.0, 75, 120, 0, 40, 4.0, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 6.0, 75, 120, 0, 40, 4.2, 7.0, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 6.0, 75, 120, 0, 40, 4.5, 7.0, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 22.0); if is_excute(agent) { @@ -160,12 +160,12 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 2, 8, 4, 180, 325, 90, 1.2, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 2, 8, 4, 180, 325, 90, 1.4, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 0.55); } frame(lua_state, 14.0); if is_excute(agent) { - EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 2, 8, -0.2, 180, 260, 90, 1.1, true, *EF_FLIP_YZ); + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc"), Hash40::new("sys_attack_arc"), Hash40::new("top"), 2, 8.5, -0.2, 180, 260, 90, 1.15, true, *EF_FLIP_YZ); LAST_EFFECT_SET_RATE(agent, 0.7); } frame(lua_state, 16.0); diff --git a/fighters/sonic/src/lib.rs b/fighters/sonic/src/lib.rs index 31af2689fa..fcd180119b 100644 --- a/fighters/sonic/src/lib.rs +++ b/fighters/sonic/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/sonic/src/status/special_s.rs b/fighters/sonic/src/status/special_s.rs index a8a2e8bc22..fc925633db 100644 --- a/fighters/sonic/src/status/special_s.rs +++ b/fighters/sonic/src/status/special_s.rs @@ -84,7 +84,7 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV && !AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY) && !fighter.global_table[IS_STOPPING].get_bool() && !StatusModule::is_changing(fighter.module_accessor) { - fighter.check_jump_cancel(false, false); + fighter.check_jump_cancel(false, false, false); } if StatusModule::is_situation_changed(fighter.module_accessor) { let mut special_momentum_handle = false; @@ -112,11 +112,16 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); } + let dash_brake_x = if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_ground_brake_x") + } else { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_air_brake_x") + }; sv_kinetic_energy!( set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, - 0.1, + dash_brake_x, 0.0 ); if special_momentum_handle { @@ -159,11 +164,11 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV false ); let lr = PostureModule::lr(fighter.module_accessor); - let x_speed = 3.5; + let x_speed = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_speed_x"); let y_speed = if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { VarModule::on_flag(fighter.battle_object, vars::sonic::status::SPECIAL_S_HOP); - 1.85 + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_hop_speed_y") } else { KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) @@ -185,16 +190,17 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV 0.0 ); let air_speed_y_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_y_stable"), 0); + let dash_air_speed_y_stable_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_air_speed_y_stable_mul"); sv_kinetic_energy!( set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, - air_speed_y_stable * 0.7 + air_speed_y_stable * dash_air_speed_y_stable_mul ); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); VarModule::on_flag(fighter.battle_object, vars::sonic::status::SPECIAL_S_HOP); VarModule::on_flag(fighter.battle_object, vars::sonic::instance::SPECIAL_AIR_ACTION_USED); - 1.85 + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_hop_speed_y") } else { 0.0 @@ -214,11 +220,16 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV x_speed * lr, 0.0 ); + let dash_brake_x = if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_ground_brake_x") + } else { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_air_brake_x") + }; sv_kinetic_energy!( set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, - 0.1, + dash_brake_x, 0.0 ); sv_kinetic_energy!( @@ -230,24 +241,7 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV VarModule::set_int(fighter.battle_object, vars::sonic::status::SPECIAL_S_STEP, vars::sonic::SPECIAL_S_STEP_DASH); } else if step == vars::sonic::SPECIAL_S_STEP_DASH { - let mot = if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { - VarModule::off_flag(fighter.battle_object, vars::sonic::instance::SPECIAL_AIR_ACTION_USED); - hash40("special_s_boost_end") - } - else { - hash40("special_air_s_boost_end") - }; - MotionModule::change_motion( - fighter.module_accessor, - Hash40::new_raw(mot), - 0.0, - 1.0, - false, - 0.0, - false, - false - ); - VarModule::set_int(fighter.battle_object, vars::sonic::status::SPECIAL_S_STEP, vars::sonic::SPECIAL_S_STEP_END); + special_s_transition_to_end(fighter); } else { if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { @@ -258,6 +252,27 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV } } } + else { + if step == vars::sonic::SPECIAL_S_STEP_DASH { + // Reduce speed on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) + && !VarModule::is_flag(fighter.battle_object, vars::sonic::status::SPECIAL_S_HIT_SHIELD) { + VarModule::on_flag(fighter.battle_object, vars::sonic::status::SPECIAL_S_HIT_SHIELD); + + let shield_hit_end_speed_x = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_end_speed_x"); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + shield_hit_end_speed_x * lr, + 0.0 + ); + + special_s_transition_to_end(fighter); + } + } + } 0.into() } @@ -277,11 +292,12 @@ unsafe fn sonic_special_s_ledge_cancel_helper(fighter: &mut L2CFighterCommon) { ); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); let air_speed_y_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_y_stable"), 0); + let dash_air_speed_y_stable_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_air_speed_y_stable_mul"); sv_kinetic_energy!( set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, - air_speed_y_stable * 0.7 + air_speed_y_stable * dash_air_speed_y_stable_mul ); sv_kinetic_energy!( set_limit_speed, @@ -305,6 +321,41 @@ unsafe fn sonic_special_s_ledge_cancel_helper(fighter: &mut L2CFighterCommon) { VarModule::set_int(fighter.battle_object, vars::sonic::status::SPECIAL_S_STEP, vars::sonic::SPECIAL_S_STEP_END); } +unsafe fn special_s_transition_to_end(fighter: &mut L2CFighterCommon) { + let mot = if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + VarModule::off_flag(fighter.battle_object, vars::sonic::instance::SPECIAL_AIR_ACTION_USED); + hash40("special_s_boost_end") + } + else { + hash40("special_air_s_boost_end") + }; + MotionModule::change_motion( + fighter.module_accessor, + Hash40::new_raw(mot), + 0.0, + 1.0, + false, + 0.0, + false, + false + ); + VarModule::set_int(fighter.battle_object, vars::sonic::status::SPECIAL_S_STEP, vars::sonic::SPECIAL_S_STEP_END); + let dash_end_brake_x = if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_ground_end_brake_x") + } else { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.dash_air_end_brake_x") + }; + if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_GROUND { + sv_kinetic_energy!( + set_brake, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + dash_end_brake_x, + 0.0 + ); + } +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); diff --git a/fighters/szerosuit/Cargo.toml b/fighters/szerosuit/Cargo.toml index 79834a88d5..722ad2f5c1 100644 --- a/fighters/szerosuit/Cargo.toml +++ b/fighters/szerosuit/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/szerosuit/src/acmd/aerials.rs b/fighters/szerosuit/src/acmd/aerials.rs index 530add9b51..a61fe3a5bd 100644 --- a/fighters/szerosuit/src/acmd/aerials.rs +++ b/fighters/szerosuit/src/acmd/aerials.rs @@ -77,13 +77,13 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE_RANGE(agent, 6.0, 8.0, 4.0); if is_excute(agent) { // Air-only - ATTACK(agent, 0, 0, Hash40::new("legl"), 5.0, 365, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 5.0, 365, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footl"), 5.0, 365, 100, 30, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 5.0, 365, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 5.0, 365, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 5.0, 365, 100, 30, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); // Ground-only - ATTACK(agent, 5, 0, Hash40::new("legl"), 5.0, 70, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneel"), 5.0, 75, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("footl"), 5.0, 80, 100, 30, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 5, 0, Hash40::new("legl"), 5.0, 70, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("kneel"), 5.0, 75, 100, 30, 0, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("footl"), 5.0, 80, 100, 30, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); @@ -92,9 +92,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 40, 100, 0, 40, 3.7, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 40, 100, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footr"), 10.0, 40, 100, 0, 40, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 40, 100, 0, 40, 3.7, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 40, 100, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footr"), 10.0, 40, 100, 0, 40, 4.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 17.0); FT_MOTION_RATE_RANGE(agent, 17.0, 40.0, 21.0); @@ -120,8 +120,8 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 361, 110, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 361, 110, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 10.0, 361, 110, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 10.0, 361, 110, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("footr"), 13.0, 361, 100, 0, 33, 4.5, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 5.0); @@ -172,9 +172,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { frame(lua_state, 11.0); FT_MOTION_RATE_RANGE(agent, 11.0, 19.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legr"), 7.0, 30, 100, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 30, 100, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footr"), 7.0, 30, 100, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("footr"), 7.0, 30, 100, 0, 20, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 7.0, 30, 100, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("legr"), 7.0, 30, 100, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 19.0); FT_MOTION_RATE_RANGE(agent, 19.0, 29.0, 16.0); diff --git a/fighters/szerosuit/src/acmd/other.rs b/fighters/szerosuit/src/acmd/other.rs index 8548d09c7b..306216c0e1 100644 --- a/fighters/szerosuit/src/acmd/other.rs +++ b/fighters/szerosuit/src/acmd/other.rs @@ -81,15 +81,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -99,10 +95,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } pub fn install(agent: &mut Agent) { diff --git a/fighters/szerosuit/src/acmd/specials.rs b/fighters/szerosuit/src/acmd/specials.rs index 058238a80f..00c22d3273 100644 --- a/fighters/szerosuit/src/acmd/specials.rs +++ b/fighters/szerosuit/src/acmd/specials.rs @@ -33,83 +33,51 @@ unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { agent.on_flag(*FIGHTER_SZEROSUIT_STATUS_SPECIAL_S_FLAG_S2_CHECK); } frame(lua_state, 10.0); - FT_MOTION_RATE_RANGE(agent, 10.0, 28.0, 13.0); - if is_excute(agent) { - agent.off_flag(*FIGHTER_SZEROSUIT_STATUS_SPECIAL_S_FLAG_S2_CHECK); - } - frame(lua_state, 28.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 15, 100, 90, 0, 4.0, 0.0, 8.0, 9.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - ATTACK(agent, 1, 1, Hash40::new("top"), 4.0, 20, 100, 80, 0, 3.5, 0.0, 8.0, 19.0, Some(0.0), Some(8.0), Some(17.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - ATTACK(agent, 2, 1, Hash40::new("top"), 4.0, 25, 100, 50, 0, 4.0, 0.0, 8.0, 30.0, Some(0.0), Some(8.0), Some(26.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - AttackModule::set_no_damage_fly_smoke_all(boma, true, false); - } - frame(lua_state, 30.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_SZEROSUIT_STATUS_SPECIAL_S_FLAG_S2); - AttackModule::clear_all(boma); - } - frame(lua_state, 32.0); - if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 9.0, 50, 115, 0, 50, 6.0, 0.0, 8.5, 36.0, Some(0.0), Some(8.5), Some(30.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - -unsafe extern "C" fn game_specialairs(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - if is_excute(agent) { - agent.on_flag(*FIGHTER_SZEROSUIT_STATUS_SPECIAL_S_FLAG_S2_CHECK); - } - frame(lua_state, 10.0); + FT_MOTION_RATE_RANGE(agent, 10.0, 28.0, 14.0); if is_excute(agent) { agent.off_flag(*FIGHTER_SZEROSUIT_STATUS_SPECIAL_S_FLAG_S2_CHECK); } frame(lua_state, 20.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); + if agent.is_situation(*SITUATION_KIND_AIR) { + WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); + } } frame(lua_state, 21.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); } - frame(lua_state, 22.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.2, 365, 100, 85, 0, 3.5, 0.0, 8.0, 19.0, Some(0.0), Some(8.0), Some(17.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 0, 100, 95, 0, 3.0, 0.0, 8.0, 9.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - AttackModule::set_no_damage_fly_smoke_all(boma, true, false); - } - frame(lua_state, 24.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 0, 100, 100, 0, 3.0, 0.0, 8.0, 9.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 2, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - ATTACK(agent, 1, 1, Hash40::new("top"), 1.2, 345, 100, 85, 0, 3.5, 0.0, 8.0, 25.0, Some(0.0), Some(8.0), Some(17.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - AttackModule::set_no_damage_fly_smoke_all(boma, true, false); - } - frame(lua_state, 26.0); - if is_excute(agent) { - AttackModule::clear(boma, 0, false); - ATTACK(agent, 1, 2, Hash40::new("top"), 1.2, 10, 100, 85, 0, 3.7, 0.0, 8.0, 28.0, Some(0.0), Some(8.0), Some(25.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - AttackModule::set_no_damage_fly_smoke_all(boma, true, false); - } - frame(lua_state, 28.0); + frame(lua_state, 29.0); + FT_MOTION_RATE(agent, 4.0); if is_excute(agent) { - ATTACK(agent, 1, 3, Hash40::new("top"), 1.2, 345, 100, 85, 0, 4.0, 0.0, 8.0, 30.0, Some(0.0), Some(8.0), Some(28.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); + if agent.is_situation(*SITUATION_KIND_GROUND) { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 80, 0, 60, 4.0, 0.0, 8.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 15, 100, 65, 0, 3.5, 0.0, 8.0, 19.0, Some(0.0), Some(8.0), Some(17.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec_whip"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); + ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 25, 100, 35, 0, 4.0, 0.0, 8.0, 30.0, Some(0.0), Some(8.0), Some(26.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec_whip"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); + } + else { + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 361, 80, 0, 60, 4.0, 0.0, 8.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 15, 100, 70, 0, 3.5, 0.0, 8.0, 19.0, Some(0.0), Some(8.0), Some(17.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec_whip"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); + ATTACK(agent, 2, 0, Hash40::new("top"), 4.0, 25, 100, 40, 0, 4.0, 0.0, 8.0, 30.0, Some(0.0), Some(8.0), Some(26.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec_whip"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); + } AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } frame(lua_state, 30.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_SZEROSUIT_STATUS_SPECIAL_S_FLAG_S2); AttackModule::clear_all(boma); } frame(lua_state, 32.0); if is_excute(agent) { - ATTACK(agent, 0, 4, Hash40::new("top"), 9.0, 50, 115, 0, 50, 6.0, 0.0, 8.5, 36.0, Some(0.0), Some(8.5), Some(30.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + if agent.is_situation(*SITUATION_KIND_GROUND) { + ATTACK(agent, 0, 1, Hash40::new("top"), 9.0, 50, 115, 0, 50, 5.0, 0.0, 8.5, 30.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 1, Hash40::new("top"), 9.0, 50, 115, 0, 50, 6.0, 0.0, 8.5, 36.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + } + else { + ATTACK(agent, 0, 1, Hash40::new("top"), 9.0, 50, 115, 0, 50, 7.0, 0.0, 8.5, 28.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 1, Hash40::new("top"), 9.0, 50, 115, 0, 50, 8.0, 0.0, 8.5, 34.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP); + } } wait(lua_state, 4.0); if is_excute(agent) { @@ -144,27 +112,23 @@ unsafe extern "C" fn effect_specials(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn effect_specialairs(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 16.0); - if is_excute(agent) { - if !agent.is_flag(*FIGHTER_SZEROSUIT_STATUS_SPECIAL_S_FLAG_S2_UNABLE) { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 15, 10, 0, 0, 0, 0.75, true); - } - } - frame(lua_state, 24.0); + frame(lua_state, 32.0); if is_excute(agent) { - EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("szero_whip_c"), Hash40::new("top"), 0, 8.5, 25, 0, -90, 0, 1, true); + ATTACK(agent, 0, 5, Hash40::new("top"), 7.0, 98, 75, 0, 50, 6.0, 0.0, 8.0, 27.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); + ATTACK(agent, 1, 5, Hash40::new("top"), 7.0, 105, 75, 0, 50, 7.0, 0.0, 8.0, 33.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); } - frame(lua_state, 31.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("szero_pwhip_hit"), Hash40::new("top"), 0, 8.5, 36, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, true); - } - frame(lua_state, 43.0); + wait(lua_state, 4.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("szero_whip_vanish"), Hash40::new("haver"), 0, 0, 0, 0, 0, 90, 0.6, true); + AttackModule::clear_all(boma); } +} + +unsafe extern "C" fn effect_specialairs2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); frame(lua_state, 22.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_h_smoke_a"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); @@ -173,29 +137,12 @@ unsafe extern "C" fn effect_specialairs(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT_FOLLOW_NO_STOP(agent, Hash40::new("szero_whip_c"), Hash40::new("top"), 0, 8.5, 25, 0, -90, 0, 1, true); } - frame(lua_state, 31.0); - if is_excute(agent) { - EFFECT(agent, Hash40::new("szero_pwhip_hit"), Hash40::new("top"), 0, 8.5, 36, 0, 0, 0, 1.1, 0, 0, 0, 0, 0, 0, true); - } frame(lua_state, 43.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("szero_whip_vanish"), Hash40::new("haver"), 0, 0, 0, 0, 0, 90, 0.6, true); } } -unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 32.0); - if is_excute(agent) { - ATTACK(agent, 0, 5, Hash40::new("top"), 7.0, 90, 75, 0, 50, 6.0, 0.0, 8.0, 34.0, Some(0.0), Some(8.0), Some(30.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_elec"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_ELEC, *ATTACK_REGION_WHIP); - } - wait(lua_state, 4.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } -} - unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -218,7 +165,7 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 2.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 90, 100, 150, 0, 6.0, 0.0, 8.0, 5.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 90, 100, 80, 0, 6.0, 0.0, 8.0, 5.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 9.0); if is_excute(agent) { @@ -227,7 +174,7 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.3, 367, 100, 50, 0, 5.0, 0.0, 17.0, 5.5, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.3, 367, 100, 50, 0, 5.0, 0.0, 17.0, 5.5, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 23.0); if is_excute(agent) { @@ -235,7 +182,7 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 26.0); if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 1.3, 90, 100, 12, 0, 5.0, 0.0, 16.0, 5.5, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 1, Hash40::new("top"), 1.3, 86, 100, 12, 0, 5.0, 0.0, 16.0, 5.5, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 27.0); if is_excute(agent) { @@ -243,75 +190,7 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 32.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 48, 208, 0, 40, 7.0, 0.0, 12.5, 11.0, Some(0.0), Some(12.0), Some(9.0), 1.5, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - wait(lua_state, 3.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 42.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); - KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } - frame(lua_state, 46.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } - frame(lua_state, 51.0); - if is_excute(agent) { - KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); - } -} - -unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 5.0/(8.0-1.0)); - if is_excute(agent) { - boma.select_cliff_hangdata_from_name("special_hi"); - } - frame(lua_state, 3.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES); - } - frame(lua_state, 4.0); - if is_excute(agent) { - SA_SET(agent, *SITUATION_KIND_AIR); - WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_REVERSE_LR); - WorkModule::on_flag(boma, *FIGHTER_STATUS_SUPER_JUMP_PUNCH_FLAG_MOVE_TRANS); - } - frame(lua_state, 8.0); - FT_MOTION_RATE (agent, 2.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 90, 100, 150, 0, 6.0, 0.0, 8.0, 5.0, None, None, None, 1.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 9.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 1.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 1.3, 367, 100, 50, 0, 5.0, 0.0, 17.0, 5.5, None, None, None, 0.75, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 23.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 26.0); - if is_excute(agent) { - ATTACK(agent, 0, 1, Hash40::new("top"), 1.3, 90, 100, 12, 0, 5.0, 0.0, 16.0, 5.5, None, None, None, 0.0, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_rush"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - } - frame(lua_state, 27.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } - frame(lua_state, 32.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 48, 196, 0, 35, 7.0, 0.0, 12.5, 11.0, Some(0.0), Some(12.0), Some(9.0), 1.5, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 48, 196, 0, 35, 7.0, 0.0, 12.5, 11.0, Some(0.0), Some(12.0), Some(9.0), 1.5, 0.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 3.0); if is_excute(agent) { @@ -458,14 +337,16 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialnlanding", game_specialnlanding, Priority::Low); agent.acmd("game_specials", game_specials, Priority::Low); - agent.acmd("game_specialairs", game_specialairs, Priority::Low); + agent.acmd("game_specialairs", game_specials, Priority::Low); agent.acmd("effect_specials", effect_specials, Priority::Low); - agent.acmd("effect_specialairs", effect_specialairs, Priority::Low); + agent.acmd("effect_specialairs", effect_specials, Priority::Low); + agent.acmd("game_specials2", game_specials2, Priority::Low); agent.acmd("game_specialairs2", game_specials2, Priority::Low); + agent.acmd("effect_specialairs2", effect_specialairs2, Priority::Low); agent.acmd("game_specialhi", game_specialhi, Priority::Low); - agent.acmd("game_specialairhi", game_specialairhi, Priority::Low); + agent.acmd("game_specialairhi", game_specialhi, Priority::Low); agent.acmd("game_speciallwstart", game_speciallwstart, Priority::Low); agent.acmd("game_specialairlwstart", game_specialairlwstart, Priority::Low); diff --git a/fighters/szerosuit/src/acmd/throws.rs b/fighters/szerosuit/src/acmd/throws.rs index 625c0ea845..91ca082637 100644 --- a/fighters/szerosuit/src/acmd/throws.rs +++ b/fighters/szerosuit/src/acmd/throws.rs @@ -5,15 +5,14 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.0/(3.0-1.0)); - frame(lua_state, 3.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 7.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 8.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 9.0, 5.0, Some(0.0), Some(9.0), Some(7.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.3, 0.0, 9.0, 4.3, Some(0.0), Some(9.0), Some(7.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); frame(lua_state, 10.0); @@ -25,10 +24,6 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); FT_MOTION_RATE(agent, 1.25); - frame(lua_state, 28.0); - if is_excute(agent) { - //StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_WAIT, false); - } } unsafe extern "C" fn sound_catch(agent: &mut L2CAgentBase) { @@ -181,14 +176,15 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE_RANGE(agent, 1.0, 2.0, 6.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 2.25, 6.0); if is_excute(agent) { ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 105, 100, 0, 65, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 2.0); - FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 2.25); + FT_MOTION_RATE_RANGE(agent, 2.25, 3.0, 1.0); frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("kneer"), 2.0, 45, 130, 0, 30, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); @@ -196,9 +192,6 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { frame(lua_state, 4.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 15, 10); - } - frame(lua_state, 5.0); - if is_excute(agent) { ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); AttackModule::clear_all(boma); } diff --git a/fighters/szerosuit/src/acmd/tilts.rs b/fighters/szerosuit/src/acmd/tilts.rs index 3f5499fe52..5e4a0dea4b 100644 --- a/fighters/szerosuit/src/acmd/tilts.rs +++ b/fighters/szerosuit/src/acmd/tilts.rs @@ -6,9 +6,9 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 35, 100, 0, 18, 3.0, 1.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 3.8, -5.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 4.2, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 3.8, 7.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 3.8, -5.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 4.2, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 3.8, 7.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 9.0); if is_excute(agent) { @@ -44,9 +44,9 @@ unsafe extern "C" fn game_attacks3hi(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 35, 100, 0, 18, 3.0, 1.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 3.8, -5.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 4.2, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 3.8, 7.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 3.8, -5.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 4.2, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 9.0, 35, 100, 0, 18, 3.8, 7.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } frame(lua_state, 9.0); @@ -82,10 +82,10 @@ unsafe extern "C" fn game_attacks3lw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 12.0, 35, 90, 0, 18, 3.0, 1.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 12.0, 35, 90, 0, 18, 3.8, -5.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 12.0, 35, 90, 0, 18, 4.2, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneer"), 12.0, 35, 90, 0, 18, 3.8, 7.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 12.0, 35, 90, 0, 18, 3.0, 1.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 12.0, 35, 90, 0, 18, 3.8, -5.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 12.0, 35, 90, 0, 18, 4.2, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 12.0, 35, 90, 0, 18, 3.8, 7.5, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 9.0); @@ -155,7 +155,7 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("legl"), 7.0, 65, 110, 0, 30, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("kneel"), 7.0, 75, 110, 0, 30, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 7.0, 85, 110, 0, 30, 4.0, 5.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 7.0, 85, 110, 0, 30, 4.0, 5.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } frame(lua_state, 11.0); diff --git a/fighters/szerosuit/src/lib.rs b/fighters/szerosuit/src/lib.rs index 0bc993115d..8fccbf7425 100644 --- a/fighters/szerosuit/src/lib.rs +++ b/fighters/szerosuit/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/szerosuit/src/opff.rs b/fighters/szerosuit/src/opff.rs index 2fcd437f69..aa5f83585e 100644 --- a/fighters/szerosuit/src/opff.rs +++ b/fighters/szerosuit/src/opff.rs @@ -11,7 +11,7 @@ unsafe fn flip_jump_jc_flipstool(boma: &mut BattleObjectModuleAccessor) { if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_LW) || boma.is_motion_one_of(&[Hash40::new("special_lw_start"), Hash40::new("special_air_lw_start")]) { if boma.status_frame() > 21 && !boma.is_in_hitlag() { - boma.check_jump_cancel(false, false); + boma.check_jump_cancel(false, false, false); } // Turn on the vanilla flip jump footstool-enable flag if you're holding the special button and you're in the window to be able to flipstool manually if VarModule::is_flag(boma.object(), vars::szerosuit::status::SPECIAL_LW_ENABLE_MANUAL_FOOTSTOOL) { diff --git a/fighters/szerosuit/src/whip/acmd.rs b/fighters/szerosuit/src/whip/acmd.rs index a7c4b4fa95..d42753aa5a 100644 --- a/fighters/szerosuit/src/whip/acmd.rs +++ b/fighters/szerosuit/src/whip/acmd.rs @@ -21,24 +21,15 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specials(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); + frame(lua_state, 10.0); if is_excute(agent) { - MotionModule::set_rate(boma, (28.0-1.0)/23.0); + MotionModule::set_rate(boma, (28.0-10.0)/14.0); } - frame(lua_state, 28.0); + frame(lua_state, 29.0); if is_excute(agent) { - MotionModule::set_rate(boma, 1.0); + MotionModule::set_rate(boma, 0.25); } - frame(lua_state, 48.0); - if is_excute(agent) { - VisibilityModule::set_whole(boma, false); - } -} - -unsafe extern "C" fn game_specialairs(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 1.0); + frame(lua_state, 30.0); if is_excute(agent) { MotionModule::set_rate(boma, 1.0); } @@ -51,11 +42,15 @@ unsafe extern "C" fn game_specialairs(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 1.0); + frame(lua_state, 10.0); + if is_excute(agent) { + MotionModule::set_rate(boma, (28.0-10.0)/14.0); + } + frame(lua_state, 29.0); if is_excute(agent) { - MotionModule::set_rate(boma, (28.0-1.0)/23.0); + MotionModule::set_rate(boma, 0.25); } - frame(lua_state, 28.0); + frame(lua_state, 30.0); if is_excute(agent) { MotionModule::set_rate(boma, 1.0); } @@ -98,7 +93,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); agent.acmd("game_specials", game_specials, Priority::Low); - agent.acmd("game_specialairs", game_specialairs, Priority::Low); + agent.acmd("game_specialairs", game_specials, Priority::Low); agent.acmd("game_specials2", game_specials2, Priority::Low); agent.acmd("effect_specials2", effect_specials2, Priority::Low); } diff --git a/fighters/tantan/Cargo.toml b/fighters/tantan/Cargo.toml index aa60242d21..a3b95131d1 100644 --- a/fighters/tantan/Cargo.toml +++ b/fighters/tantan/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/tantan/src/acmd/aerials.rs b/fighters/tantan/src/acmd/aerials.rs index 62ce73abac..8426a5d06a 100644 --- a/fighters/tantan/src/acmd/aerials.rs +++ b/fighters/tantan/src/acmd/aerials.rs @@ -10,15 +10,15 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("kneel"), 10.0, 361, 64, 0, 33, 3.7, 5.0, -0.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 361, 64, 0, 33, 3.25, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 10.0, 361, 64, 0, 33, 3.25, -1.5, -1.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 10.0, 361, 99, 0, 22, 3.7, 5.0, -0.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 10.0, 361, 99, 0, 22, 3.25, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 10.0, 361, 99, 0, 22, 3.25, -1.5, -1.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneel"), 8.0, 361, 69, 0, 31, 3.4, 5.0, -0.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 361, 69, 0, 31, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("hip"), 8.0, 361, 69, 0, 31, 2.75, -1.5, -1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneel"), 8.0, 361, 99, 0, 22, 3.4, 5.0, -0.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 361, 99, 0, 22, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("hip"), 8.0, 361, 99, 0, 22, 2.75, -1.5, -1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 25.0); if is_excute(agent) { @@ -222,14 +222,14 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 13.0, 361, 98, 0, 42, 3.75, -1.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 13.0, 361, 98, 0, 42, 4.0, 5.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 13.0, 361, 117, 0, 12, 3.75, -1.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 13.0, 361, 117, 0, 12, 4.0, 5.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 11.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 31.0); + frame(lua_state, 28.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } @@ -239,7 +239,7 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; frame(lua_state, 7.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("top"), -1.5, 8.1, -6, -151, 47, 2.9, 0.9, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_b"), Hash40::new("top"), 2, 10, -6, -171, 57, 20, 0.9, true); } frame(lua_state, 8.0); if is_excute(agent) { @@ -306,9 +306,9 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 7.5, 70, 114, 0, 48, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 7.5, 70, 114, 0, 48, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footl"), 7.5, 70, 114, 0, 48, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 8.0, 64, 83, 0, 48, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 8.0, 64, 83, 0, 48, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 8.0, 64, 83, 0, 48, 4.0, 0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 13.0); if is_excute(agent) { diff --git a/fighters/tantan/src/acmd/ground.rs b/fighters/tantan/src/acmd/ground.rs index 4abcb88762..42279630a4 100644 --- a/fighters/tantan/src/acmd/ground.rs +++ b/fighters/tantan/src/acmd/ground.rs @@ -11,19 +11,13 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 2.7, 361, 35, 0, 10, 3.0, 0.25, 0.0, 0.0, None,None,None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("legl"), 2.7, 361, 35, 0, 10, 3.0, 3.25, 0.0, 0.0, None,None,None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 2.7, 361, 35, 0, 10, 3.0, 2.75, 0.0, 0.0, None,None,None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneel"), 2.7, 361, 35, 0, 10, 3.0, 6.5, 0.0, 0.0, None,None,None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - - // Locking hitbox - ATTACK(agent, 4, 0, Hash40::new("top"), 2.7, 361, 16, 0, 31, 3.0, 0.0, 5.0, 5.0, Some(0.0), Some(5.0), Some(10.5), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - - AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 3, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 4, 2.0, false); + ATTACK(agent, 0, 0, Hash40::new("legl"), 3.0, 361, 35, 0, 20, 3.0, 0.25, 0.0, 0.0, None,None,None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("legl"), 3.0, 361, 35, 0, 20, 3.0, 3.25, 0.0, 0.0, None,None,None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 3.0, 361, 35, 0, 20, 3.0, 2.75, 0.0, 0.0, None,None,None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneel"), 3.0, 361, 35, 0, 20, 3.0, 6.5, 0.0, 0.0, None,None,None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + // Jab lock hitbox + ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 16, 0, 31, 3.0, 0.0, 5.0, 5.0, Some(0.0), Some(5.0), Some(10.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 4, true); } wait(lua_state, 2.0); if is_excute(agent) { @@ -43,13 +37,10 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.4, 60, 40, 0, 15, 3.5, 0.0, 4.0, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.4, 80, 40, 0, 15, 4.0, 0.0, 4.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.4, 93, 40, 0, 15, 4.0, 0.0, 4.0, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 60, 40, 0, 20, 3.5, 0.0, 4.0, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 80, 40, 0, 20, 4.0, 0.0, 4.0, 9.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 2.5, 93, 40, 0, 20, 4.0, 0.0, 4.0, 14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, AttackHeight(*ATTACK_HEIGHT_LOW), false); - AttackModule::set_add_reaction_frame(boma, 0, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 1, 2.0, false); - AttackModule::set_add_reaction_frame(boma, 2, 2.0, false); } wait(lua_state, 3.0); if is_excute(agent) { @@ -87,6 +78,19 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_attack100end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + wait(lua_state, 6.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 45, 60, 0, 90, 7.5, 0.0, 8.0, 13.0, Some(0.0), Some(8.0), Some(15.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -178,6 +182,7 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); agent.acmd("game_attack12", game_attack12, Priority::Low); agent.acmd("game_attack13", game_attack13, Priority::Low); + agent.acmd("game_attack100end", game_attack100end, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); diff --git a/fighters/tantan/src/acmd/other.rs b/fighters/tantan/src/acmd/other.rs index 0a8914318d..4f860f5567 100644 --- a/fighters/tantan/src/acmd/other.rs +++ b/fighters/tantan/src/acmd/other.rs @@ -79,16 +79,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -99,10 +95,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } //Ram Ram attacks// @@ -110,11 +103,30 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackshortendr1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let armType = WorkModule::get_int(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_INT_PUNCH_KIND_R); frame(lua_state, 8.0); - if (armType == 2) && !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { - VarModule::on_flag(agent.battle_object, vars::tantan::status::ARMS_ATTACK_CANCEL); + if WorkModule::get_int(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_INT_PUNCH_KIND_R) == 2 + && !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { + VarModule::on_flag(agent.battle_object, vars::tantan::instance::ARMS_ATTACK_CANCEL); + } +} + +unsafe extern "C" fn effect_attacklegsjumpaerialfb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("tantan_jump_line_s"), false, true); + EFFECT_OFF_KIND(agent, Hash40::new("tantan_jump_line_l"), false, true); + } +} + +unsafe extern "C" fn effect_attacklegstwjumpaerialfb(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 2.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("tantan_jump_line_s"), false, true); + EFFECT_OFF_KIND(agent, Hash40::new("tantan_jump_line_l"), false, true); } } @@ -143,4 +155,9 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attacklongendr1", game_attackshortendr1, Priority::Low); agent.acmd("game_attacklongendrb1", game_attackshortendr1, Priority::Low); agent.acmd("game_attacklongendrb3", game_attackshortendr1, Priority::Low); + + agent.acmd("effect_attacklegsjumpaerialf", effect_attacklegsjumpaerialfb, Priority::Low); + agent.acmd("effect_attacklegsjumpaerialb", effect_attacklegsjumpaerialfb, Priority::Low); + agent.acmd("effect_attacklegstwjumpaerialf", effect_attacklegstwjumpaerialfb, Priority::Low); + agent.acmd("effect_attacklegstwjumpaerialb", effect_attacklegstwjumpaerialfb, Priority::Low); } diff --git a/fighters/tantan/src/acmd/smashes.rs b/fighters/tantan/src/acmd/smashes.rs index ff01e8fc29..ac88b534f5 100644 --- a/fighters/tantan/src/acmd/smashes.rs +++ b/fighters/tantan/src/acmd/smashes.rs @@ -29,11 +29,11 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { if is_doubledragon { if is_dragonized { // powered double dragon - ATTACK(agent, 1, 0, Hash40::new("throw"), 20.0, 361, 70, 0, 60, 6.0, 0.0, 0.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 0, Hash40::new("throw"), 25.0, 361, 57, 0, 57, 6.0, 0.0, 0.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_heavy_hit_l")); } } - ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 12.0, 361, 94, 0, 48, 3.0, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + ATTACK(agent, 3, 0, Hash40::new("arml2"), 12.0, 361, 94, 0, 48, 3.0, 2.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); ATTACK(agent, 4, 0, Hash40::new("arml2"), 12.0, 361, 94, 0, 48, 3.5, 5.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); } for i in 0..5 { @@ -41,7 +41,7 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { if is_dragonized { // powered double dragon let offsets = [11.0, 18.0, 24.0, 31.0, 36.0]; - ATTACK(agent, 0, 0, Hash40::new("throw"), 16.0, 361, 70, 0, 60, 5.0, 0.0, 0.0, -offsets[i], Some(0.0), Some(0.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 0, 0, Hash40::new("throw"), 20.0, 361, 57, 0, 57, 5.0, 0.0, 0.0, -offsets[i], Some(0.0), Some(0.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 15, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_heavy_hit_l")); } else { @@ -304,25 +304,25 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 7.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 16.0, 75, 95, 0, 48, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 16.0, 75, 95, 0, 48, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footl"), 16.0, 75, 95, 0, 48, 5.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 17.0, 82, 88, 0, 48, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 17.0, 82, 88, 0, 48, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 17.0, 82, 88, 0, 48, 5.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); HIT_NODE(agent, Hash40::new("kneel"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); } - frame(lua_state, 10.0); + frame(lua_state, 9.0); if is_excute(agent) { shield!(agent, *MA_MSC_CMD_SHIELD_OFF, *COLLISION_KIND_REFLECTOR, *FIGHTER_TANTAN_REFLECTOR_KIND_ATTACK_HI4_A, *FIGHTER_TANTAN_REFLECTOR_GROUP_ATTACK_HI4); HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_NORMAL); - ATTACK(agent, 0, 0, Hash40::new("legl"), 14.0, 82, 100, 0, 48, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 14.0, 82, 100, 0, 48, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footl"), 14.0, 82, 100, 0, 48, 5.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 14.0, 82, 100, 0, 48, 4.0, 0.0, 2.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 14.0, 82, 100, 0, 48, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 14.0, 82, 100, 0, 48, 5.0, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - frame(lua_state, 13.0); + frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("legl"), 12.0, 82, 103, 0, 48, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 82, 103, 0, 48, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("footl"), 12.0, 82, 103, 0, 48, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 11.0, 82, 111, 0, 48, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 11.0, 82, 111, 0, 48, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("footl"), 11.0, 82, 111, 0, 48, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } frame(lua_state, 16.0); if is_excute(agent) { @@ -348,10 +348,10 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { HIT_NODE(agent, Hash40::new("kneer"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("legl"), *HIT_STATUS_XLU); HIT_NODE(agent, Hash40::new("legr"), *HIT_STATUS_XLU); - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 40, 80, 0, 50, 4.5, 0.0, 2.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 40, 80, 0, 50, 4.5, 0.0, 2.5, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("top"), 16.0, 40, 77, 0, 50, 5.0, 0.0, 2.5, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 16.0, 40, 77, 0, 50, 5.0, 0.0, 2.5, -12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 40, 85, 0, 50, 4.5, 0.0, 2.5, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 40, 85, 0, 50, 4.5, 0.0, 2.5, -7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("top"), 15.0, 40, 82, 0, 50, 5.0, 0.0, 2.5, 12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("top"), 15.0, 40, 82, 0, 50, 5.0, 0.0, 2.5, -12.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 3.0); diff --git a/fighters/tantan/src/acmd/specials.rs b/fighters/tantan/src/acmd/specials.rs index 3816a564a3..30ab965d37 100644 --- a/fighters/tantan/src/acmd/specials.rs +++ b/fighters/tantan/src/acmd/specials.rs @@ -21,25 +21,28 @@ unsafe extern "C" fn game_specialairn(agent: &mut L2CAgentBase) { HIT_NODE(agent, Hash40::new("armr5"), *HIT_STATUS_XLU); if (armType == 1) { // Megawatt - ATTACK(agent, 0, 0, Hash40::new("armr5"), 13.0, 60, 95, 0, 50, 2.5, 1.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handr"), 13.0, 60, 95, 0, 50, 5.0, 3.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr5"), 14.0, 60, 89, 0, 50, 2.5, 1.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 14.0, 60, 89, 0, 50, 5.0, 3.5, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); } else if (armType == 2) { - ATTACK(agent, 0, 0, Hash40::new("armr5"), 8.5, 47, 68, 0, 45, 2.5, 1.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handr"), 8.5, 47, 68, 0, 45, 3.5, 3.5, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + // Ramram + ATTACK(agent, 0, 0, Hash40::new("armr5"), 8.0, 51, 66, 0, 45, 2.5, 1.0, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 8.0, 51, 66, 0, 45, 3.5, 3.5, 0.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } else { - let is_dragonized = WorkModule::is_flag(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_DRAGONIZE_L); - let bigScale = WorkModule::get_param_float(boma, hash40("param_private"), hash40("arm_l_big_scale")); - let sizeFactor = if is_dragonized { bigScale } else { 1.0 }; - let powerFactor = if is_dragonized { 1.15 } else { 1.0 }; - let sfx_level = if is_dragonized { *ATTACK_SOUND_LEVEL_L } else { *ATTACK_SOUND_LEVEL_M }; - ATTACK(agent, 0, 0, Hash40::new("armr5"), 10.5 * powerFactor, 45, 100, 0, 45, 2.5 * sizeFactor, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sfx_level, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("handr"), 10.5 * powerFactor, 45, 100, 0, 45, 4.5 * sizeFactor, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), sfx_level, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - if is_dragonized { + if WorkModule::is_flag(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_DRAGONIZE_L) { + // Power Dragon + let bigScale = WorkModule::get_param_float(boma, hash40("param_private"), hash40("arm_l_big_scale")); + ATTACK(agent, 0, 0, Hash40::new("armr5"), 13.5, 49, 91, 0, 45, 2.5 * bigScale, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 13.5, 49, 91, 0, 45, 4.5 * bigScale, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_fire_m")); AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); } + else { + // Dragon + ATTACK(agent, 0, 0, Hash40::new("armr5"), 9.0, 49, 108, 0, 45, 2.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("handr"), 9.0, 49, 108, 0, 45, 4.5, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + } } } frame(lua_state, 24.0); @@ -209,6 +212,41 @@ unsafe extern "C" fn effect_specialhistart(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_specialhilong(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + HIT_NODE(agent, Hash40::new("handr"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr5"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("armr4"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("handl"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml5"), *HIT_STATUS_XLU); + HIT_NODE(agent, Hash40::new("arml4"), *HIT_STATUS_XLU); + } + frame(lua_state, 4.0); + if is_excute(agent) { + HIT_NO(agent, 2, *HIT_STATUS_OFF); + HIT_NO(agent, 3, *HIT_STATUS_OFF); + HIT_NO(agent, 4, *HIT_STATUS_OFF); + HIT_NO(agent, 5, *HIT_STATUS_OFF); + HIT_NO(agent, 6, *HIT_STATUS_OFF); + HIT_NO(agent, 7, *HIT_STATUS_OFF); + HIT_NO(agent, 8, *HIT_STATUS_OFF); + HIT_NO(agent, 9, *HIT_STATUS_OFF); + HIT_NO(agent, 10, *HIT_STATUS_OFF); + HIT_NO(agent, 11, *HIT_STATUS_OFF); + HIT_NO(agent, 12, *HIT_STATUS_OFF); + HIT_NO(agent, 13, *HIT_STATUS_OFF); + HIT_NO(agent, 18, *HIT_STATUS_OFF); + HIT_NO(agent, 19, *HIT_STATUS_OFF); + } + frame(lua_state, 15.0); + if is_excute(agent) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); + } +} + unsafe extern "C" fn effect_specialhilong(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -380,19 +418,14 @@ unsafe extern "C" fn game_specialairhistart(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_TANTAN_STATUS_SPECIAL_HI_FLAG_REVERSE_LR); } frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 5.0/(8.0-5.0)); - frame(lua_state, 7.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); - WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_HANG_IMMIDIATE); - } + FT_MOTION_RATE_RANGE(agent, 5.0, 8.0, 5.0); frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 9.0); if is_excute(agent) { - GroundModule::select_cliff_hangdata(boma, *FIGHTER_TANTAN_CLIFF_HANG_DATA_AIR_LASSO as u32); WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_HANG_IMMIDIATE); } - frame(lua_state, 10.0); + frame(lua_state, 11.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); } @@ -457,6 +490,9 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_specialhistart", effect_specialhistart, Priority::Low); + agent.acmd("game_specialhishort", game_specialhilong, Priority::Low); + agent.acmd("game_specialhilong", game_specialhilong, Priority::Low); + agent.acmd("effect_specialhilong", effect_specialhilong, Priority::Low); agent.acmd("sound_specialhilong", sound_specialhilong, Priority::Low); agent.acmd("expression_specialhilong", expression_specialhilong, Priority::Low); diff --git a/fighters/tantan/src/acmd/throws.rs b/fighters/tantan/src/acmd/throws.rs index c999624e72..7606e06800 100644 --- a/fighters/tantan/src/acmd/throws.rs +++ b/fighters/tantan/src/acmd/throws.rs @@ -4,7 +4,7 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 6.0/(15.0-1.0)); + FT_MOTION_RATE_RANGE(agent, 1.0, 15.0, 6.0); if is_excute(agent) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 3.5, 3.5); } @@ -16,7 +16,7 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { } wait(lua_state, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.5, 8.0, Some(0.0), Some(7.5), Some(10.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.5, 3.0, Some(0.0), Some(7.5), Some(10.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -57,13 +57,12 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 0.0, 47, 340, 0, 32, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 53, 41, 0, 78, 0.0, 1.0, *ATTACK_LR_CHECK_B, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 27.0); if is_excute(agent) { - ATTACK(agent, 1, 0, Hash40::new("top"), 14.0, 32, 60, 0, 40, 7.0, 0.0, 2.7, -7.0, Some(0.0), Some(2.7), Some(-13.0), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - AttackModule::set_catch_only_all(boma, true, false); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 45, 45, 0, 62, 7.0, 0.0, 5.7, -7.0, Some(0.0), Some(5.7), Some(-13.0), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); CHECK_FINISH_CAMERA(agent, -4, 5); } frame(lua_state, 28.0); @@ -106,6 +105,33 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 75, 68, 0, 90, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 0, 130, 0, 30, 4.0, 0.0, 4.0, 0.0, Some(0.0), Some(4.0), Some(3.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + AttackModule::set_catch_only_all(boma, true, false); + CHECK_FINISH_CAMERA(agent, 3, 0); + } + frame(lua_state, 16.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + AttackModule::clear_all(boma); + } + frame(lua_state, 17.0); + FT_MOTION_RATE(agent, 0.85); + frame(lua_state, 50.0); + FT_MOTION_RATE(agent, 1.0); +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("sound_catch", sound_catch, Priority::Low); @@ -113,4 +139,5 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_throwb", game_throwb, Priority::Low); agent.acmd("game_throwhi", game_throwhi, Priority::Low); + agent.acmd("game_throwlw", game_throwlw, Priority::Low); } \ No newline at end of file diff --git a/fighters/tantan/src/acmd/tilts.rs b/fighters/tantan/src/acmd/tilts.rs index 0c0b4e423d..9e52e636bc 100644 --- a/fighters/tantan/src/acmd/tilts.rs +++ b/fighters/tantan/src/acmd/tilts.rs @@ -147,12 +147,15 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - let damage_mul = if WorkModule::is_flag(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_DRAGONIZE_L) { 1.15 } else { 1.0 }; - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0 * damage_mul, 361, 85, 0, 40, 2.5, 0.0, 5.0, 5.5, Some(0.0), Some(1.75), Some(17.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0 * damage_mul, 90, 80, 0, 40, 2.5, 0.0, 1.5, 22.5, Some(0.0), Some(1.5), Some(26.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); if WorkModule::is_flag(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_DRAGONIZE_L) { + ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 361, 61, 0, 42, 2.5, 0.0, 5.0, 5.5, Some(0.0), Some(2.0), Some(15.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 90, 57, 0, 40, 2.5, 0.0, 1.5, 20.5, Some(0.0), Some(1.5), Some(26.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); } + else { + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 361, 85, 0, 40, 2.5, 0.0, 5.0, 5.5, Some(0.0), Some(2.0), Some(15.25), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 90, 80, 0, 40, 2.5, 0.0, 1.5, 20.5, Some(0.0), Some(1.5), Some(26.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH); + } } frame(lua_state, 16.0); if is_excute(agent) { diff --git a/fighters/tantan/src/lib.rs b/fighters/tantan/src/lib.rs index 570841d9f4..23097efcbb 100644 --- a/fighters/tantan/src/lib.rs +++ b/fighters/tantan/src/lib.rs @@ -38,6 +38,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/tantan/src/opff.rs b/fighters/tantan/src/opff.rs index bf554fa32d..99c8c1e615 100644 --- a/fighters/tantan/src/opff.rs +++ b/fighters/tantan/src/opff.rs @@ -3,34 +3,12 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -//TODO: Figure out how to cancel arm recoil with a tilt/aerial, and if it's worth implementing -unsafe fn recoil_cancel(boma: &mut BattleObjectModuleAccessor) { - if !VarModule::is_flag(boma.object(), vars::tantan::status::ARMS_ATTACK_CANCEL) { return; } - - let mut new_status = 0; - if boma.is_cat_flag(Cat1::AttackS4) { - new_status = *FIGHTER_STATUS_KIND_ATTACK_S3; - } else if boma.is_cat_flag(Cat1::AttackHi4) { - new_status = *FIGHTER_STATUS_KIND_ATTACK_HI3; - } else if boma.is_cat_flag(Cat1::AttackLw4) { - new_status = *FIGHTER_STATUS_KIND_ATTACK_LW3; - } else if boma.is_cat_flag(Cat1::AttackS3) { - new_status = *FIGHTER_STATUS_KIND_ATTACK_S3; - } else if boma.is_cat_flag(Cat1::AttackHi3) { - new_status = *FIGHTER_STATUS_KIND_ATTACK_HI3; - } else if boma.is_cat_flag(Cat1::AttackLw3) { - new_status = *FIGHTER_STATUS_KIND_ATTACK_LW3; - } else if boma.is_cat_flag(Cat1::AttackN) { - new_status = *FIGHTER_STATUS_KIND_ATTACK; - } - if (new_status > 0) { - if !boma.is_situation(*SITUATION_KIND_AIR) { - StatusModule::change_status_request_from_script(boma, new_status, false); - } - else { - StatusModule::change_status_request_from_script(boma, *FIGHTER_STATUS_KIND_ATTACK_AIR, false); - } - VarModule::off_flag(boma.object(), vars::tantan::status::ARMS_ATTACK_CANCEL); +unsafe fn recoil_cancel(fighter: &mut L2CFighterCommon) { + // Since we check for the recoil cancel in exec, we need to transition in main or our acmd lags a frame behind + if VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { + VarModule::off_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + let new_status = VarModule::get_int(fighter.battle_object, vars::tantan::status::RECOIL_CANCEL_STATUS); + StatusModule::change_status_force(fighter.module_accessor, new_status, false); } } @@ -45,8 +23,8 @@ unsafe fn arms_switch_during_normals(boma: &mut BattleObjectModuleAccessor) { *FIGHTER_STATUS_KIND_ATTACK_HI4, *FIGHTER_STATUS_KIND_ATTACK_LW4]) || (boma.is_motion(Hash40::new("attack_13"))) { - if !boma.is_in_hitlag() { - if boma.is_cat_flag(Cat1::SpecialLw) { + if boma.is_cat_flag(Cat1::SpecialLw) { + if !boma.is_in_hitlag() { WorkModule::on_flag(boma,*FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_SPECIAL_LW_CHANGE_PUNCH_R); boma.clear_commands(Cat1::SpecialLw); } @@ -75,10 +53,10 @@ unsafe fn double_dragon(boma: &mut BattleObjectModuleAccessor) { } else { let dragonEffect = VarModule::get_int(boma.object(),vars::tantan::instance::ARMR_DRAGONIZE_EFFECT_HANDLE) as u32; - ModelModule::set_joint_scale(boma, Hash40::new("pr1_main"), &Vector3f::new(1.0, 1.0, 1.0)); if dragonEffect > 0 { - EffectModule::kill(boma, dragonEffect, false,false); - VarModule::set_int(boma.object(),vars::tantan::instance::ARMR_DRAGONIZE_EFFECT_HANDLE,0); + ModelModule::set_joint_scale(boma, Hash40::new("pr1_main"), &Vector3f::new(1.0, 1.0, 1.0)); + EffectModule::kill(boma, dragonEffect, false, false); + VarModule::set_int(boma.object(), vars::tantan::instance::ARMR_DRAGONIZE_EFFECT_HANDLE, 0); } } } @@ -94,7 +72,7 @@ unsafe fn fsmash_effect_translation(boma: &mut BattleObjectModuleAccessor) { } pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - recoil_cancel(boma); + recoil_cancel(fighter); arms_switch_during_normals(boma); double_dragon(boma); fsmash_effect_translation(boma); diff --git a/fighters/tantan/src/punch1/acmd.rs b/fighters/tantan/src/punch1/acmd.rs index 17fc2b3f49..81e2fb6420 100644 --- a/fighters/tantan/src/punch1/acmd.rs +++ b/fighters/tantan/src/punch1/acmd.rs @@ -3,19 +3,26 @@ use super::*; unsafe extern "C" fn game_attackshort(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - + let is_dragonize = WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_DRAGONIZE); + let (bkb, collision_attr) = if is_dragonize { (15, Hash40::new("collision_attr_fire")) } else { (0, Hash40::new("collision_attr_normal")) }; if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 8.0, 45, 87, 0, 50, 0.7, 3.1, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -2.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("have"), 8.0, 52, 87, 0, 30 + bkb, 0.7, 3.1, 0.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); + } AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); } frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 8.0, 45, 87, 0, 50, 2.9, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -2.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_megabolt"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); + ATTACK(agent, 0, 0, Hash40::new("have"), 8.0, 52, 87, 0, 30 + bkb, 2.9, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); + } } - let clearFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {12.0} else {9.0}; + let clearFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) { 12.0 } else { 9.0 }; frame(lua_state, clearFrame); if is_excute(agent) { AttackModule::clear_all(boma); @@ -25,46 +32,58 @@ unsafe extern "C" fn game_attackshort(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklong(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - + let is_dragonize = WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_DRAGONIZE); + let (bkb, collision_attr) = if is_dragonize { (15, Hash40::new("collision_attr_fire")) } else { (0, Hash40::new("collision_attr_normal")) }; if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 12.0, 45, 78, 0, 40, 0.7, 3.1, 0.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -3.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("have"), 9.0, 52, 78, 0, 30 + bkb, 0.7, 3.1, 0.5, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); + } AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); } frame(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 12.0, 45, 78, 0, 40, 2.9, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -3.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_megabolt"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); + ATTACK(agent, 0, 0, Hash40::new("have"), 9.0, 52, 78, 0, 30 + bkb, 2.9, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); + } } frame(lua_state, 4.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else{ - ATTACK(agent, 0, 0, Hash40::new("have"), 16.0, 45, 78, 0, 40, 2.9, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -3.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + else { WorkModule::on_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_CHANGE_HIT_EFFECT); + ATTACK(agent, 0, 0, Hash40::new("have"), 10.0, 52, 78, 0, 30 + bkb, 2.9, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); + } } } frame(lua_state, 7.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } } frame(lua_state, 9.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else - { - ATTACK(agent, 0, 0, Hash40::new("have"), 13.0, 45, 78, 0, 40, 2.9, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -3.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + else { WorkModule::off_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_CHANGE_HIT_EFFECT); + ATTACK(agent, 0, 0, Hash40::new("have"), 9.0, 52, 78, 0, 30 + bkb, 2.9, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); + } } } - let clearFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {15.0} else {11.0}; + let clearFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) { 15.0 } else { 11.0 }; frame(lua_state, clearFrame); if is_excute(agent) { AttackModule::clear_all(boma); @@ -74,52 +93,62 @@ unsafe extern "C" fn game_attacklong(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackdragonshootlong(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - + let is_dragonize = WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_DRAGONIZE); + let (bkb, collision_attr) = if is_dragonize { (15, Hash40::new("collision_attr_fire")) } else { (0, Hash40::new("collision_attr_normal")) }; if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 13.8, 45, 78, 0, 40, 0.7, 5.4, 0.5, 0.3, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("have"), 12.0, 52, 78, 0, 30 + bkb, 0.7, 5.4, 0.5, 0.3, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_l")); + } AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 13.8, 45, 78, 0, 40, 3.2, 5.4, 0.5, 0.3, Some(1.0), Some(0.5), Some(0.3), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_megabolt"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); + ATTACK(agent, 0, 0, Hash40::new("have"), 12.0, 52, 78, 0, 30 + bkb, 3.2, 5.4, 0.5, 0.3, Some(1.0), Some(0.5), Some(0.3), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_l")); + } } frame(lua_state, 4.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else{ - ATTACK(agent, 0, 0, Hash40::new("have"), 16.75, 45, 78, 0, 40, 3.2, 5.4, 0.5, 0.3, Some(1.0), Some(0.5), Some(0.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -3.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + else { WorkModule::on_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_CHANGE_HIT_EFFECT); + ATTACK(agent, 0, 0, Hash40::new("have"), 15.0, 52, 78, 0, 30 + bkb, 3.2, 5.4, 0.5, 0.3, Some(1.0), Some(0.5), Some(0.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_LL, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + if is_dragonize { + AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_l")); + } } } - //Dragon Beam linker + // Dragon Beam linker frame(lua_state, 6.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else{ - let angle: u64 = if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) {45} else {361}; - let kbg = if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) {70} else {0}; - let fkb = if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) {0} else {10}; - let bkb = if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) {40} else {60}; - ATTACK(agent, 0, 0, Hash40::new("have"), 16.75, angle, kbg, fkb, bkb, 3.2, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -3.5, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + else { + let (angle, link_bkb, fkb, kbg) = if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) + { (52, 78, 0, 30 + bkb) } else { (361, 0, 10, 60) }; + ATTACK(agent, 0, 0, Hash40::new("have"), 15.0, angle, kbg, fkb, link_bkb, 3.2, 3.1, 0.5, 0.0, Some(1.0), Some(0.5), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, collision_attr, *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + // if is_dragonize { + // AttackModule::set_optional_hit_sound(boma, 1, Hash40::new("se_common_fire_m")); + // } WorkModule::off_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_CHANGE_HIT_EFFECT); AttackModule::set_add_reaction_frame_revised(boma, 0, 5.0, false); } } frame(lua_state, 9.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else - { - AttackModule::set_power(boma, 0,16.0, false); + else { + AttackModule::set_power(boma, 0, 14.0, false); } } frame(lua_state, 15.0); @@ -152,18 +181,24 @@ unsafe extern "C" fn effect_attackdragonshootlong(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_specialairhiattack(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let angle = (75.0 + WorkModule::get_float(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_FLOAT_ATTACK_SHIFT_ANGLE_L)) as u64; + let is_dragonized = WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_DRAGONIZE); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 12.75, angle, 73, 0, 56, 4.5, 3.0, 0.0, 0.3, Some(-6.0), Some(0.0), Some(0.3), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); - if WorkModule::is_flag(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_DRAGONIZE_L) { - AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_fire_m")); + if is_dragonized { + ATTACK(agent, 0, 0, Hash40::new("have"), 19.5, 75, 51, 0, 56, 4.5, 3.0, 0.0, 0.3, Some(-6.0), Some(0.0), Some(0.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_fire_l")); + } + else { + ATTACK(agent, 0, 0, Hash40::new("have"), 13.0, 75, 72, 0, 56, 4.5, 3.0, 0.0, 0.3, Some(-6.0), Some(0.0), Some(0.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); } } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("have"), 12.75, angle, 73, 0, 56, 4.5, 3.0, 0.0, 0.3, Some(0.0), Some(0.0), Some(0.3), 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); - if WorkModule::is_flag(boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_DRAGONIZE_L) { - AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_fire_m")); + if is_dragonized { + ATTACK(agent, 0, 0, Hash40::new("have"), 19.5, 75, 51, 0, 56, 4.5, 3.0, 0.0, 0.3, Some(0.0), Some(0.0), Some(0.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_fire_l")); + } + else { + ATTACK(agent, 0, 0, Hash40::new("have"), 13.0, 75, 72, 0, 56, 4.5, 3.0, 0.0, 0.3, Some(0.0), Some(0.0), Some(0.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, true, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TANTAN_PUNCH01, *ATTACK_REGION_PUNCH); } } frame(lua_state, 9.0); @@ -197,4 +232,4 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_specialairhiattackdragon", game_specialairhiattack, Priority::Low); agent.acmd("sound_attackbeamloop", sound_attackbeamloop, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/tantan/src/punch1/opff.rs b/fighters/tantan/src/punch1/opff.rs index 50b1c93f29..bc379acdcc 100644 --- a/fighters/tantan/src/punch1/opff.rs +++ b/fighters/tantan/src/punch1/opff.rs @@ -3,37 +3,32 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -/// prevents rocket from despawning in the blastzone unsafe extern "C" fn dragon_frame(weapon: &mut L2CFighterBase) { - let boma = weapon.module_accessor; - let mut is_dragonized = WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_DRAGONIZE); - if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_LEFT) - && !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_KIRBY) { - let minmin_id = WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; + if !WorkModule::is_flag(weapon.module_accessor, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_LEFT) + && !WorkModule::is_flag(weapon.module_accessor, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_KIRBY) { + let minmin_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_ACTIVATE_FOUNDER_ID) as u32; if sv_battle_object::is_active(minmin_id) { let minmin = utils::util::get_battle_object_from_id(minmin_id); let minmin_boma = &mut *(*minmin).module_accessor; let bigScale = WorkModule::get_param_float(minmin_boma,hash40("param_private"),hash40("arm_l_big_scale")); - //Only update if previously was not dragonized + // Only update if previously was not dragonized + let mut is_dragonized = WorkModule::is_flag(weapon.module_accessor, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_DRAGONIZE); if !is_dragonized { is_dragonized = WorkModule::get_int(minmin_boma, *FIGHTER_TANTAN_INSTANCE_WORK_ID_INT_ARM_L_BIG_FRAME) > 0; - WorkModule::set_flag(boma, is_dragonized,*WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_DRAGONIZE); - + WorkModule::set_flag(weapon.module_accessor, is_dragonized, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_IS_DRAGONIZE); if is_dragonized { - let handle = EffectModule::req_follow(boma, Hash40::new("tantan_dragon_attack_fire"), Hash40::new("gimmickc"), &Vector3f{x: 0.0, y: 0.0, z: 0.0}, &Vector3f{x: 0.0, y: 0.0, z: 0.0}, bigScale, true, 0, 0, 0, 0, 0, false, false); + let handle = EffectModule::req_follow(weapon.module_accessor, Hash40::new("tantan_dragon_attack_fire"), Hash40::new("gimmickc"), &Vector3f{x: 0.0, y: 0.0, z: 0.0}, &Vector3f{x: 0.0, y: 0.0, z: 0.0}, bigScale, true, 0, 0, 0, 0, 0, false, false); } } if is_dragonized { - PostureModule::set_scale(boma, bigScale, false); + PostureModule::set_scale(weapon.module_accessor, bigScale, false); + AttackModule::set_power_mul_5th(weapon.module_accessor, 1.5); } } } - if is_dragonized { - AttackModule::set_power_mul(boma, 1.15); - } - if StatusModule::status_kind(boma) == *WEAPON_TANTAN_PUNCH1_STATUS_KIND_BACK { + if StatusModule::status_kind(weapon.module_accessor) == *WEAPON_TANTAN_PUNCH1_STATUS_KIND_BACK { let owner_boma = weapon.get_owner_boma(); if owner_boma.is_status(*FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_AIR_REACH) { VarModule::off_flag(owner_boma.object(), vars::tantan::instance::SPECIAL_HI_ENABLE_FREEFALL); diff --git a/fighters/tantan/src/punch2/acmd.rs b/fighters/tantan/src/punch2/acmd.rs index 75e15b3c1f..47418dc025 100644 --- a/fighters/tantan/src/punch2/acmd.rs +++ b/fighters/tantan/src/punch2/acmd.rs @@ -4,18 +4,18 @@ unsafe extern "C" fn game_attackshort(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("center"), 13.0, 55, 92, 0, 50, 0.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("center"), 13.0, 55, 92, 0, 50, 0.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("center"), 13.0, 55, 92, 0, 50, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("center"), 13.0, 55, 92, 0, 50, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 7, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_megabolt"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); } - let clearFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {19.0} else {17.0}; - frame(lua_state, clearFrame-2.0); + let clearFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) {17.0} else {15.0}; + frame(lua_state, clearFrame); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -24,38 +24,37 @@ unsafe extern "C" fn game_attackshort(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklong(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("center"), 17.0, 55, 75, 0, 60, 0.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("center"), 17.0, 55, 75, 0, 60, 0.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("center"), 17.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("center"), 17.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_megabolt"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); } frame(lua_state, 4.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else{ - ATTACK(agent, 0, 0, Hash40::new("center"), 19.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + else { + ATTACK(agent, 0, 0, Hash40::new("center"), 19.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); } } frame(lua_state, 14.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else{ - ATTACK(agent, 0, 0, Hash40::new("center"), 17.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + else { + ATTACK(agent, 0, 0, Hash40::new("center"), 17.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); } } - let clearFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {23.0} else {21.0}; - frame(lua_state, clearFrame-2.0); + let clearFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) { 21.0 } else { 19.0 }; + frame(lua_state, clearFrame); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -64,38 +63,37 @@ unsafe extern "C" fn game_attacklong(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklonghold(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("center"), 20.0, 55, 75, 0, 60, 0.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("center"), 20.0, 55, 75, 0, 60, 0.7, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("center"), 20.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("center"), 20.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_megabolt"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); } frame(lua_state, 4.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else{ - ATTACK(agent, 0, 0, Hash40::new("center"), 22.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + else { + ATTACK(agent, 0, 0, Hash40::new("center"), 22.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); } } frame(lua_state, 14.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else{ - ATTACK(agent, 0, 0, Hash40::new("center"), 20.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -6, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); + else { + ATTACK(agent, 0, 0, Hash40::new("center"), 20.0, 55, 75, 0, 60, 3.7, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH02, *ATTACK_REGION_PUNCH); } } - let clearFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {23.0} else {20.0}; - frame(lua_state, clearFrame-2.0); + let clearFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) { 21.0 } else { 18.0 }; + frame(lua_state, clearFrame); if is_excute(agent) { AttackModule::clear_all(boma); } diff --git a/fighters/tantan/src/punch3/acmd.rs b/fighters/tantan/src/punch3/acmd.rs index d8d7b2cc46..bb199da2c1 100644 --- a/fighters/tantan/src/punch3/acmd.rs +++ b/fighters/tantan/src/punch3/acmd.rs @@ -4,25 +4,24 @@ unsafe extern "C" fn game_attackshort(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 5.0, 70, 95, 0, 40, 0.7, 0.0, 2.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -2.5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); + VarModule::off_flag(agent.get_owner_boma().object(), vars::tantan::instance::ARMS_ATTACK_CANCEL); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 5.0, 70, 95, 0, 40, 0.7, 0.0, 2.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 5.0, 70, 95, 0, 40, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -2.5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 5.0, 70, 95, 0, 40, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); } - let clearFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {8.0} else {6.0}; - let reboundFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {5.0} else {4.0}; + let clearFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) { 8.0 } else { 6.0 }; + let reboundFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR) { 5.0 } else { 4.0 }; frame(lua_state, reboundFrame); - //Rebound hitbox if is_excute(agent) { - if (!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if !WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { + // Rebound hitbox ControlModule::set_rumble(boma, Hash40::new("rbkind_76_hotling"), 20, false, *BATTLE_OBJECT_ID_INVALID as u32); - - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 6.0, 90, 0, 10, 60, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); - //AttackModule::set_add_reaction_frame_revised(boma, 0, 4.0, false); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 5.0, 90, 100, 10, 0, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); } } frame(lua_state, clearFrame); @@ -34,29 +33,26 @@ unsafe extern "C" fn game_attackshort(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacklong(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 10.0, 70, 69, 0, 30, 0.7, 0.0, 2.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 7.0, 70, 93, 0, 27, 0.7, 0.0, 2.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 10.0, 70, 69, 0, 30, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 7.0, 70, 93, 0, 27, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_hotling"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); } frame(lua_state, 4.0); if is_excute(agent) { - if(WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND)){ + if WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_BOUND) { AttackModule::clear_all(boma); } - else{ - //Rebound hitbox + else { + // Rebound hitbox ControlModule::set_rumble(boma, Hash40::new("rbkind_76_hotling"), 20, false, *BATTLE_OBJECT_ID_INVALID as u32); - - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 12.0, 90, 0, 10, 60, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); - //AttackModule::set_add_reaction_frame_revised(boma, 0, 4.0, false); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 7.0, 90, 100, 10, 0, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); } } let clearFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {10.0} else {9.0}; @@ -70,7 +66,7 @@ unsafe extern "C" fn game_attacklonghold(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 12.0, 368, 0, 10, 90, 0.7, 0.0, 2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 8.0, 368, 0, 10, 90, 0.7, 0.0, 2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); AttackModule::enable_safe_pos(boma); AttackModule::disable_tip(boma); AttackModule::set_damage_shake_scale(boma, 0.5); @@ -79,7 +75,7 @@ unsafe extern "C" fn game_attacklonghold(agent: &mut L2CAgentBase) { } frame(lua_state, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 12.0, 368, 0, 10, 90, 4.0, 0.0, 2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 8.0, 368, 0, 10, 90, 4.0, 0.0, 2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_hotling"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); AttackModule::set_vec_target_pos(boma, 0, Hash40::new("cakram1"), &Vector2f{x: 14.0, y: 1.0}, 6, false); AttackModule::set_add_reaction_frame_revised(boma, 0, 7.0, false); @@ -90,7 +86,7 @@ unsafe extern "C" fn game_attacklonghold(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } else { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 13.8, 368, 0, 10, 60, 4.0, 0.0, 2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 8.0, 368, 0, 10, 60, 4.0, 0.0, 2.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); ControlModule::set_rumble(boma, Hash40::new("rbkind_76_hotling"), 24, false, *BATTLE_OBJECT_ID_INVALID as u32); AttackModule::set_vec_target_pos(boma, 0, Hash40::new("cakram1"), &Vector2f{x: 14.0, y: 1.0}, 6, false); AttackModule::set_add_reaction_frame_revised(boma, 0, 4.0, false); @@ -102,10 +98,9 @@ unsafe extern "C" fn game_attacklonghold(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } else{ - //Rebound hitbox + // Rebound hitbox ControlModule::set_rumble(boma, Hash40::new("rbkind_76_hotling"), 20, false, *BATTLE_OBJECT_ID_INVALID as u32); - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 13.8, 90, 0, 10, 60, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, -4, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); - //AttackModule::set_add_reaction_frame_revised(boma, 0, 4.0, false); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 8.0, 90, 0, 10, 60, 3.0, 0.0, 2.0, 0.0, None, None, None, 0.4, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_PUNCH); } } let clearFrame = if(!WorkModule::is_flag(boma, *WEAPON_TANTAN_PUNCH1_INSTANCE_WORK_ID_FLAG_AIR)) {10.0} else {9.0}; @@ -115,7 +110,7 @@ unsafe extern "C" fn game_attacklonghold(agent: &mut L2CAgentBase) { } } -//Fly controls when RamRam gets sent outwards +// Fly controls when RamRam gets sent outwards pub fn install(agent: &mut Agent) { agent.acmd("game_attackshort", game_attackshort, Priority::Low); agent.acmd("game_attacklong", game_attacklong, Priority::Low); diff --git a/fighters/tantan/src/ring/acmd.rs b/fighters/tantan/src/ring/acmd.rs index 633d2c454b..a1f0ace094 100644 --- a/fighters/tantan/src/ring/acmd.rs +++ b/fighters/tantan/src/ring/acmd.rs @@ -6,19 +6,15 @@ unsafe extern "C" fn game_attackfly(agent: &mut L2CAgentBase) { frame(lua_state, 1.0); if is_excute(agent) { //Rebound hitbox - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 2.5, 50, 40, 0, 60, 1.75, 0.0, 2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 3.0, 50, 15, 0, 67, 1.75, 0.0, 2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_OBJECT); AttackModule::enable_safe_pos(boma); } wait(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 2.5, 35, 40, 0, 60, 3.0, 0.0, 2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 3.0, 35, 15, 0, 67, 3.0, 0.0, 2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TANTAN_PUNCH03, *ATTACK_REGION_OBJECT); AttackModule::enable_safe_pos(boma); - AttackModule::clear(boma,1,false); } - let clearFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_RING_INSTANCE_WORK_ID_FLAG_IS_AIR) - && WorkModule::is_flag(boma, *WEAPON_TANTAN_RING_INSTANCE_WORK_ID_FLAG_IS_LONG) - {7.0} else {6.0}; - frame(lua_state, clearFrame); + frame(lua_state, 7.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -28,22 +24,17 @@ unsafe extern "C" fn game_attackfly(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attacks4fly(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - //Scoop for the first few frames, then send back and down frame(lua_state, 1.0); if is_excute(agent) { - //Rebound hitbox - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 4.0, 50, 0, 10, 90, 2.0, 0.0, 2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); + // Rebound hitbox + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 4.0, 50, 45, 0, 90, 2.0, 0.0, 2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); AttackModule::enable_safe_pos(boma); } wait(lua_state, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("cakram1"), 4.0, 35, 0, 10, 90, 4.0, 0.0, 2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); - AttackModule::clear(boma,1,false); + ATTACK(agent, 0, 0, Hash40::new("cakram1"), 4.0, 62, 45, 0, 90, 4.0, 0.0, 2.0, 0.0, Some(0.0), Some(-2.0), Some(0.0), 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_OBJECT); } - let clearFrame = if !WorkModule::is_flag(boma, *WEAPON_TANTAN_RING_INSTANCE_WORK_ID_FLAG_IS_AIR) - && WorkModule::is_flag(boma, *WEAPON_TANTAN_RING_INSTANCE_WORK_ID_FLAG_IS_LONG) - {7.0} else {6.0}; - frame(lua_state, clearFrame); + frame(lua_state, 7.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -52,4 +43,4 @@ unsafe extern "C" fn game_attacks4fly(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attackfly", game_attackfly, Priority::Low); agent.acmd("game_attacks4fly", game_attacks4fly, Priority::Low); -} +} \ No newline at end of file diff --git a/fighters/tantan/src/status/attack_ext.rs b/fighters/tantan/src/status/attack_ext.rs new file mode 100644 index 0000000000..325b65193d --- /dev/null +++ b/fighters/tantan/src/status/attack_ext.rs @@ -0,0 +1,150 @@ +use super::*; + +// 71000186b0 +unsafe extern "C" fn attack_ext_exec_inner(fighter: &mut L2CFighterCommon) -> L2CValue { + if let Some(func_ptr) = smashline::api::get_target_function("lua2cpp_tantan.nrs", 0x186b0) { + let exec_inner: fn(&mut L2CValue, &mut L2CFighterCommon) -> L2CValue = std::mem::transmute(func_ptr); + exec_inner(&mut L2CValue::U64(0), fighter); + } + + return 0.into(); +} + +unsafe fn set_transition_terms(fighter: &mut L2CFighterCommon, some_bool: bool) { + if some_bool { + WorkModule::enable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_WALK); + WorkModule::enable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SQUAT); + WorkModule::enable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT); + WorkModule::enable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT_BUTTON); + WorkModule::enable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL); + WorkModule::enable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON); + } + else { + WorkModule::unable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_WALK); + WorkModule::unable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SQUAT); + WorkModule::unable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT); + WorkModule::unable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_SQUAT_BUTTON); + WorkModule::unable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL); + WorkModule::unable_transition_term_forbid_indivi(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_JUMP_AERIAL_BUTTON); + } +} + +unsafe fn check_recoil_cancel(fighter: &mut L2CFighterCommon) { + if !VarModule::is_flag(fighter.battle_object, vars::tantan::instance::ARMS_ATTACK_CANCEL) { return; } + if fighter.is_flag(*FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_ATTACK_IS_CANCEL) { + VarModule::off_flag(fighter.battle_object, vars::tantan::instance::ARMS_ATTACK_CANCEL); + return; + } + + let mut new_status = 0; + if fighter.is_cat_flag(Cat1::AttackS4) { + new_status = *FIGHTER_STATUS_KIND_ATTACK_S3; + } else if fighter.is_cat_flag(Cat1::AttackHi4) { + new_status = *FIGHTER_STATUS_KIND_ATTACK_HI3; + } else if fighter.is_cat_flag(Cat1::AttackLw4) { + new_status = *FIGHTER_STATUS_KIND_ATTACK_LW3; + } else if fighter.is_cat_flag(Cat1::AttackS3) { + new_status = *FIGHTER_STATUS_KIND_ATTACK_S3; + } else if fighter.is_cat_flag(Cat1::AttackHi3) { + new_status = *FIGHTER_STATUS_KIND_ATTACK_HI3; + } else if fighter.is_cat_flag(Cat1::AttackLw3) { + new_status = *FIGHTER_STATUS_KIND_ATTACK_LW3; + } else if fighter.is_cat_flag(Cat1::AttackN) { + new_status = *FIGHTER_STATUS_KIND_ATTACK; + } + + if (new_status > 0) { + //DamageModule::add_damage(fighter.module_accessor, new_status as f32, 0); + VarModule::off_flag(fighter.battle_object, vars::tantan::instance::ARMS_ATTACK_CANCEL); + if fighter.is_situation(*SITUATION_KIND_GROUND) { + if fighter.is_pad_flag(PadFlag::JumpTrigger) { + new_status = *FIGHTER_STATUS_KIND_JUMP_SQUAT; + } + } + else { + new_status = *FIGHTER_STATUS_KIND_ATTACK_AIR; + } + VarModule::set_int(fighter.battle_object, vars::tantan::status::RECOIL_CANCEL_STATUS, new_status); + VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); + } +} + +unsafe extern "C" fn attack_ext_default_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + attack_ext_exec_inner(fighter); + check_recoil_cancel(fighter); + + return 0.into(); +} + +unsafe extern "C" fn attackfall_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + attack_ext_exec_inner(fighter); + fighter.sub_fall_uniq_process_exec(); + check_recoil_cancel(fighter); + + return 0.into(); +} + +unsafe extern "C" fn attackjumpsquat_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Exec, fighter, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_JUMP_SQUAT)(fighter); + check_recoil_cancel(fighter); + + return ret; +} + +unsafe extern "C" fn attackwalk_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Exec, fighter, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_WALK)(fighter); + check_recoil_cancel(fighter); + + return ret; +} + +unsafe extern "C" fn attackwalkback_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Exec, fighter, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_WALK_BACK)(fighter); + check_recoil_cancel(fighter); + + return ret; +} + +unsafe extern "C" fn attacklanding_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Exec, fighter, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_LANDING)(fighter); + check_recoil_cancel(fighter); + + return ret; +} + +unsafe extern "C" fn attacklandinglight_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Exec, fighter, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_LANDING_LIGHT)(fighter); + check_recoil_cancel(fighter); + + return ret; +} + +unsafe extern "C" fn attacksquat_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + check_recoil_cancel(fighter); + + return 0.into(); +} + +unsafe extern "C" fn attacksquatwait_exec(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Exec, fighter, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_SQUAT_WAIT)(fighter); + check_recoil_cancel(fighter); + + return ret; +} + +pub fn install(agent: &mut Agent) { + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_FALL, attackfall_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_FALL_AERIAL, attackfall_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_JUMP_SQUAT, attackjumpsquat_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_JUMP, attack_ext_default_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_JUMP_AERIAL, attack_ext_default_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_LANDING, attacklanding_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_LANDING_LIGHT, attacklandinglight_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_SQUAT, attacksquat_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_SQUAT_RV, attack_ext_default_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_SQUAT_WAIT, attacksquatwait_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_WAIT, attack_ext_default_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_WALK, attackwalk_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_WALK_BACK, attackwalkback_exec); + agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_WALK_BRAKE, attack_ext_default_exec); +} \ No newline at end of file diff --git a/fighters/tantan/src/status/attack_jump_aerial.rs b/fighters/tantan/src/status/attack_jump_aerial.rs index 16bb7ba786..aec87788bc 100644 --- a/fighters/tantan/src/status/attack_jump_aerial.rs +++ b/fighters/tantan/src/status/attack_jump_aerial.rs @@ -5,9 +5,15 @@ use super::*; unsafe extern "C" fn attack_jump_aerial_main(fighter: &mut L2CFighterCommon) -> L2CValue { EFFECT_OFF_KIND(fighter, Hash40::new("tantan_jump_line_s"), false, true); EFFECT_OFF_KIND(fighter, Hash40::new("tantan_jump_line_l"), false, true); - EFFECT(fighter, Hash40::new("sys_jump_aerial"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EffectModule::kill_kind(fighter.module_accessor, Hash40::new("sys_jump_aerial"), true, true); + + let ret = smashline::original_status(Main, fighter, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_JUMP_AERIAL)(fighter); + + if StatusModule::is_changing(fighter.module_accessor) { + EFFECT(fighter, Hash40::new("sys_jump_aerial"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } - return smashline::original_status(Main, fighter, *FIGHTER_TANTAN_STATUS_KIND_ATTACK_JUMP_AERIAL)(fighter); + return ret; } pub fn install(agent: &mut Agent) { diff --git a/fighters/tantan/src/status/landing.rs b/fighters/tantan/src/status/landing.rs new file mode 100644 index 0000000000..bd6ddef0aa --- /dev/null +++ b/fighters/tantan/src/status/landing.rs @@ -0,0 +1,30 @@ +use super::*; + +// FIGHTER_STATUS_KIND_LANDING_LIGHT + +unsafe extern "C" fn landing_light_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING_LIGHT)(fighter) +} + +// FIGHTER_STATUS_KIND_LANDING + +unsafe extern "C" fn landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + if VarModule::is_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG) { + let lag = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.actionable_landing_frame"); + fighter.set_float(lag, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.set_status_kind_interrupt(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL); + return 1.into(); + } + smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_LANDING)(fighter) +} + +pub fn install(agent: &mut Agent) { + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING_LIGHT, landing_light_pre); + agent.status(Pre, *FIGHTER_STATUS_KIND_LANDING, landing_pre); +} \ No newline at end of file diff --git a/fighters/tantan/src/status/mod.rs b/fighters/tantan/src/status/mod.rs index f05bb1f09e..0871e6e2ca 100644 --- a/fighters/tantan/src/status/mod.rs +++ b/fighters/tantan/src/status/mod.rs @@ -5,11 +5,13 @@ use globals::*; mod jump; mod catch; mod pass; +mod landing; mod attack; mod attack_air; mod attack_jump_aerial; mod attack_landing; +mod attack_ext; mod attack_s3; mod attack_s4; @@ -18,21 +20,9 @@ mod special_hi; /// Re-enables the ability to use aerial specials when connecting to ground or cliff unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L2CValue { - //remove double dragon effect - if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_ENTRY, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_REBIRTH, - *FIGHTER_STATUS_KIND_WIN, *FIGHTER_STATUS_KIND_LOSE]) || !sv_information::is_ready_go() { - let dragonEffect = VarModule::get_int(fighter.object(), vars::tantan::instance::ARMR_DRAGONIZE_EFFECT_HANDLE) as u32; - if EffectModule::is_exist_effect(fighter.module_accessor, dragonEffect) { - EffectModule::kill(fighter.module_accessor, dragonEffect, false, false); - } - VarModule::set_int(fighter.object(),vars::tantan::instance::ARMR_DRAGONIZE_EFFECT_HANDLE,0); - } if fighter.is_situation(*SITUATION_KIND_GROUND) || fighter.is_situation(*SITUATION_KIND_CLIFF) - || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_REBIRTH, *FIGHTER_STATUS_KIND_DEAD, *FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { - // println!("reset flag"); - VarModule::off_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_GROUND_START); - VarModule::off_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_AIR_JUMP); - VarModule::off_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_ENABLE_FREEFALL); + || fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_LANDING, *FIGHTER_STATUS_KIND_GIMMICK_SPRING_JUMP]) { + reset_vars(fighter); } true.into() } @@ -40,9 +30,60 @@ unsafe extern "C" fn change_status_callback(fighter: &mut L2CFighterCommon) -> L unsafe extern "C" fn on_start(fighter: &mut L2CFighterCommon) { // set the callbacks on fighter init fighter.global_table[globals::STATUS_CHANGE_CALLBACK].assign(&L2CValue::Ptr(change_status_callback as *const () as _)); + reset_vars(fighter); +} + +unsafe fn reset_vars(fighter: &mut L2CFighterCommon) { VarModule::off_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_GROUND_START); VarModule::off_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_AIR_JUMP); VarModule::off_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::off_flag(fighter.battle_object, vars::tantan::instance::ARMS_ATTACK_CANCEL); +} + +unsafe fn reset_dragon(fighter: &mut L2CFighterCommon) { + // remove double dragon effect + let dragonEffect = VarModule::get_int(fighter.object(), vars::tantan::instance::ARMR_DRAGONIZE_EFFECT_HANDLE) as u32; + if EffectModule::is_exist_effect(fighter.module_accessor, dragonEffect) { + EffectModule::kill(fighter.module_accessor, dragonEffect, false, false); + } + VarModule::set_int(fighter.object(), vars::tantan::instance::ARMR_DRAGONIZE_EFFECT_HANDLE, 0); +} + +unsafe extern "C" fn entry_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_ENTRY)(fighter); + reset_dragon(fighter); + + return ret; +} + +unsafe extern "C" fn dead_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_DEAD)(fighter); + reset_dragon(fighter); + reset_vars(fighter); + + return ret; +} + +unsafe extern "C" fn rebirth_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_REBIRTH)(fighter); + reset_dragon(fighter); + reset_vars(fighter); + + return ret; +} + +unsafe extern "C" fn win_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_WIN)(fighter); + reset_dragon(fighter); + + return ret; +} + +unsafe extern "C" fn lose_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let ret = smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_LOSE)(fighter); + reset_dragon(fighter); + + return ret; } pub fn install(agent: &mut Agent) { @@ -51,14 +92,22 @@ pub fn install(agent: &mut Agent) { jump::install(agent); catch::install(agent); pass::install(agent); + landing::install(agent); attack::install(agent); attack_air::install(agent); attack_jump_aerial::install(agent); attack_landing::install(agent); + attack_ext::install(agent); attack_s3::install(agent); attack_s4::install(agent); special_n::install(agent); special_hi::install(agent); + + agent.status(Main, *FIGHTER_STATUS_KIND_ENTRY, entry_main); + agent.status(Main, *FIGHTER_STATUS_KIND_DEAD, dead_main); + agent.status(Main, *FIGHTER_STATUS_KIND_REBIRTH, rebirth_main); + agent.status(Main, *FIGHTER_STATUS_KIND_WIN, win_main); + agent.status(Main, *FIGHTER_STATUS_KIND_LOSE, lose_main); } \ No newline at end of file diff --git a/fighters/tantan/src/status/special_hi.rs b/fighters/tantan/src/status/special_hi.rs index 2b535b9042..1f7394cd5f 100644 --- a/fighters/tantan/src/status/special_hi.rs +++ b/fighters/tantan/src/status/special_hi.rs @@ -118,6 +118,35 @@ unsafe extern "C" fn special_hi_ground_jump_init(fighter: &mut L2CFighterCommon) return smashline::original_status(Init, fighter, *FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_GROUND_JUMP)(fighter); } +unsafe extern "C" fn special_hi_ground_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_AIR), + *FIGHTER_KINETIC_TYPE_AIR_STOP, + *GROUND_CORRECT_KIND_AIR as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_TANTAN_STATUS_WORK_KEEP_FLAG_SPECIAL_HI_JUMP_FLAG, + *FIGHTER_TANTAN_STATUS_WORK_KEEP_FLAG_SPECIAL_HI_JUMP_INT, + *FIGHTER_TANTAN_STATUS_WORK_KEEP_FLAG_SPECIAL_HI_JUMP_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_NONE as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_HI as u32, + 0 + ); + + return 0.into(); +} + unsafe extern "C" fn special_hi_ground_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { let control_accel_x_mul = fighter.get_param_float("param_special_hi", "end_control_accel_x_mul_g"); let control_max_speed_x_mul = fighter.get_param_float("param_special_hi", "end_control_max_speed_x_mul_g"); @@ -128,14 +157,16 @@ unsafe extern "C" fn special_hi_ground_end_main(fighter: &mut L2CFighterCommon) let air_accel_x_add = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_add"), 0); let air_start_speed_mul = if VarModule::is_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_GROUND_START) { 1.0 } else { ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.air_jump_start_speed_mul") }; - let air_start_accel_mul = if VarModule::is_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_GROUND_START) - { 1.0 } else { ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.air_jump_start_accel_mul") }; + let air_start_accel_mul = 1.0;// if VarModule::is_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_GROUND_START) + //{ 1.0 } else { ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.air_jump_start_accel_mul") }; + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0, 0.0, 0.0, 0.0); sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0); sv_kinetic_energy!(set_brake, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, control_brake_x, 0.0); - sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * control_max_speed_x_mul * air_start_speed_mul, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.0, 0.0); sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_speed_x_stable * control_max_speed_x_mul * air_start_speed_mul, 0.0); sv_kinetic_energy!(controller_set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_accel_x_mul * control_accel_x_mul * air_start_accel_mul); sv_kinetic_energy!(controller_set_accel_x_add, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, air_accel_x_add * control_accel_add * air_start_accel_mul); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); let motion = if VarModule::is_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_AIR_JUMP) { Hash40::new("special_air_hi_short_end") } else { Hash40::new("special_hi_long_end") }; @@ -180,6 +211,7 @@ unsafe extern "C" fn special_hi_air_pre(fighter: &mut L2CFighterCommon) -> L2CVa } else { VarModule::on_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_ENABLE_FREEFALL); + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_LAG); } StatusModule::init_settings( fighter.module_accessor, @@ -210,16 +242,25 @@ unsafe extern "C" fn special_hi_air_pre(fighter: &mut L2CFighterCommon) -> L2CVa } unsafe extern "C" fn special_hi_air_exec(fighter: &mut L2CFighterCommon) -> L2CValue { - if fighter.status_frame() == 6 && ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) - && !VarModule::is_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_GROUND_START) - && !VarModule::is_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_AIR_JUMP) { - // start charging, but only if we haven't already used Arm Jump yet - VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); - fighter.off_flag(*FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_SPECIAL_HI_AIR_HOP); - fighter.change_status(FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_GROUND.into(), false.into()); - notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_09) + -1); - return 1.into(); + if fighter.check_hold_input(0, 9, Buttons::SpecialAll) { // this is in exec, so it will pass on frame 10 of the status + if !VarModule::is_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_GROUND_START) + && !VarModule::is_flag(fighter.battle_object, vars::tantan::instance::SPECIAL_HI_AIR_JUMP) { + // start charging, but only if we haven't already used Arm Jump yet + VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL); + fighter.off_flag(*FIGHTER_TANTAN_INSTANCE_WORK_ID_FLAG_SPECIAL_HI_AIR_HOP); + fighter.change_status(FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_GROUND.into(), false.into()); + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x20cbc92683), 1, FIGHTER_LOG_DATA_INT_ATTACK_NUM_KIND, (*FIGHTER_LOG_ATTACK_KIND_ADDITIONS_ATTACK_09) + -1); + return 1.into(); + } } + else { + if fighter.status_frame() == 9 { + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_STATUS_AIR_LASSO_FLAG_HANG_IMMIDIATE); + GroundModule::select_cliff_hangdata(fighter.module_accessor, *FIGHTER_TANTAN_CLIFF_HANG_DATA_AIR_LASSO as u32); + } + } + let angle = (fighter.stick_x() * -10.0 * PostureModule::lr(fighter.module_accessor)) - 5.0; WorkModule::set_float(fighter.module_accessor, angle, *FIGHTER_TANTAN_INSTANCE_WORK_ID_FLOAT_ATTACK_SHIFT_ANGLE_L); if (fighter.motion_frame() >= 10.0) { @@ -246,9 +287,11 @@ pub fn install(agent: &mut Agent) { agent.status(Init, *FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_GROUND_JUMP, special_hi_ground_jump_init); + agent.status(Pre, *FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_GROUND_END, special_hi_ground_end_pre); agent.status(Main, *FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_GROUND_END, special_hi_ground_end_main); agent.status(Pre, *FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_AIR, special_hi_air_pre); + //agent.status(Main, *FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_AIR, special_hi_air_main); agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_AIR, special_hi_air_exec); agent.status(Exec, *FIGHTER_TANTAN_STATUS_KIND_SPECIAL_HI_AIR_REACH, special_hi_air_reach_exec); diff --git a/fighters/tantan/src/status/special_n.rs b/fighters/tantan/src/status/special_n.rs index 8a4b17b1e3..e1ab59aad8 100644 --- a/fighters/tantan/src/status/special_n.rs +++ b/fighters/tantan/src/status/special_n.rs @@ -4,7 +4,33 @@ use super::*; unsafe extern "C" fn special_n_pre(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.is_situation(*SITUATION_KIND_AIR) { - return fighter.status_pre_AttackAir(); + fighter.status_pre_AttackAir(); + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_NONE), + *FIGHTER_KINETIC_TYPE_UNIQ, + *GROUND_CORRECT_KIND_KEEP as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, + 0 + ); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_N | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_N as u32, + 0 + ); + + return 0.into(); } else { return smashline::original_status(Pre, fighter, *FIGHTER_STATUS_KIND_SPECIAL_N)(fighter); diff --git a/fighters/toonlink/Cargo.toml b/fighters/toonlink/Cargo.toml index 3415b44fc8..18a038ff55 100644 --- a/fighters/toonlink/Cargo.toml +++ b/fighters/toonlink/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/toonlink/src/acmd/aerials.rs b/fighters/toonlink/src/acmd/aerials.rs index e69d974138..75db2da019 100644 --- a/fighters/toonlink/src/acmd/aerials.rs +++ b/fighters/toonlink/src/acmd/aerials.rs @@ -5,55 +5,60 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 4.0); + FT_MOTION_RATE_RANGE(agent, 4.0, 5.5, 2.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 6.0); + frame(lua_state, 5.5); + FT_MOTION_RATE_RANGE(agent, 5.5, 7.5, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 10.5, 50, 100, 0, 20, 3.5, 5.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 10.5, 50, 100, 0, 20, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("arml"), 10.5, 50, 100, 0, 20, 3.5, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("clavicler"), 10.5, 50, 100, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 9.0, 50, 113, 0, 20, 3.5, 5.75, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 50, 113, 0, 20, 3.5, 1.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("arml"), 9.0, 50, 113, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } - frame(lua_state, 9.0); + frame(lua_state, 7.5); + FT_MOTION_RATE_RANGE(agent, 7.5, 12.0, 3.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 13.0); + frame(lua_state, 12.0); + FT_MOTION_RATE(agent, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword2"), 9.0, 35, 100, 0, 20, 3.5, 5.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 35, 100, 0, 20, 3.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("arml"), 9.0, 35, 100, 0, 20, 3.5, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("clavicler"), 9.0, 35, 100, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 7.0, 50, 113, 0, 20, 3.5, 5.75, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 7.0, 50, 113, 0, 20, 3.5, 1.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("arml"), 7.0, 50, 113, 0, 20, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } + frame(lua_state, 13.0); + FT_MOTION_RATE_RANGE(agent, 13.0, 16.0, 2.0); frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 42.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 4.0); + frame(lua_state, 4.25); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 5, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 4, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); } frame(lua_state, 9.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 4); + AFTER_IMAGE_OFF(agent, 2); } - frame(lua_state, 10.0); + frame(lua_state, 11.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 5, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 4, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); } frame(lua_state, 16.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 3); + AFTER_IMAGE_OFF(agent, 2); } } @@ -61,27 +66,31 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.833); + FT_MOTION_RATE_RANGE(agent, 1.0, 12.0, 9.0); frame(lua_state, 4.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 12.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 13.0); + FT_MOTION_RATE_RANGE(agent, 13.0, 17.0, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 13.0, 361, 98, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 13.0, 361, 98, 0, 35, 3.5, 1.0, -1.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 361, 98, 0, 35, 4.0, 5.0, -1.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 13.0, 48, 98, 0, 35, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 13.0, 48, 98, 0, 35, 3.5, 1.0, -1.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 48, 98, 0, 35, 3.5, 5.75, -1.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } - wait(lua_state, 4.0); + frame(lua_state, 17.0); + FT_MOTION_RATE_RANGE(agent, 17.0, 39.0, 21.0); if is_excute(agent) { AttackModule::clear_all(boma); } frame(lua_state, 32.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 39.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { @@ -89,13 +98,11 @@ unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 12.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 6, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("null"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); - EFFECT_FOLLOW(agent, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 4, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); } frame(lua_state, 17.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 4); - EFFECT_OFF_KIND(agent, Hash40::new("toonlink_sword"), false, false); + AFTER_IMAGE_OFF(agent, 2); } } @@ -119,23 +126,25 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 9.0, 67, 105, 0, 25, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 9.0, 67, 105, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 67, 105, 0, 25, 3.5, 1.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 67, 105, 0, 25, 4.0, 5.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 67, 105, 0, 25, 3.5, 5.75, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 12.0); - FT_MOTION_RATE(agent, 1.667); + FT_MOTION_RATE_RANGE(agent, 12.0, 30.0, 19.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 19.0); + frame(lua_state, 24.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } + frame(lua_state, 30.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { @@ -143,13 +152,11 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 4, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("null"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); - EFFECT_FOLLOW(agent, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 4, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); } - frame(lua_state, 11.0); + frame(lua_state, 12.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 2); - EFFECT_OFF_KIND(agent, Hash40::new("toonlink_sword"), false, false); } } @@ -172,50 +179,54 @@ unsafe extern "C" fn expression_attackairb(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 5.0); frame(lua_state, 6.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } - frame(lua_state, 10.0); - FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 9.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 11.0); + FT_MOTION_RATE_RANGE(agent, 11.0, 33.0, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 1.5, 365, 40, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 1.5, 365, 40, 0, 30, 3.5, 1.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 1.5, 365, 40, 0, 30, 4.0, 5.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 1.5, 97, 40, 0, 35, 3.25, -0.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 1.5, 366, 40, 0, 30, 4.0, 4.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 1.5, 97, 40, 0, 30, 3.5, -0.5, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 3, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 33.0); FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 33.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 8.0, 80, 126, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword2"), 8.0, 80, 126, 0, 40, 4.0, 1.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 8.0, 80, 126, 0, 40, 4.5, 5.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 1, Hash40::new("arml"), 7.0, 80, 140, 0, 38, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 1, Hash40::new("sword2"), 7.0, 80, 140, 0, 38, 4.75, 4.0, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 1, Hash40::new("sword2"), 7.0, 80, 140, 0, 38, 4.25, -0.5, 0.0, 0.0, None, None, None, 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } - frame(lua_state, 39.0); + frame(lua_state, 37.0); if is_excute(agent) { AttackModule::clear_all(boma); } - wait(lua_state, 6.0); + frame(lua_state, 51.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } } unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 10.0); + frame(lua_state, 7.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 0, 0, 0, 1, true); LAST_EFFECT_SET_RATE(agent, 0.8); } - frame(lua_state, 11.0); + frame(lua_state, 10.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_club_tornado"), Hash40::new("sword1"), 0.0, 0.0, 0.0, 90, 75, 0, 0.55, true); - LAST_EFFECT_SET_RATE(agent, 1.8); + EFFECT_FOLLOW(agent, Hash40::new("sys_club_tornado"), Hash40::new("sword1"), -0.5, 0.0, 0.0, 90, 75, 0, 0.55, true); + LAST_EFFECT_SET_RATE(agent, 1.5); + LAST_EFFECT_SET_SCALE_W(agent, 0.44, 0.4, 0.44); } - frame(lua_state, 39.0); + frame(lua_state, 36.0); if is_excute(agent) { EFFECT_OFF_KIND(agent, Hash40::new("toonlink_sword"), false, false); EFFECT_OFF_KIND(agent, Hash40::new("sys_club_tornado"), false, true); @@ -272,43 +283,45 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + agent.on_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); SET_SPEED_EX(agent, 0, 1.6, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + agent.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); KineticModule::suspend_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); + agent.on_flag(*FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); } if is_excute(agent) { JostleModule::set_status(boma, false); } frame(lua_state, 6.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.on_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 17.0); if is_excute(agent) { JostleModule::set_status(boma, true); WorkModule::on_flag(boma,*FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); SET_SPEED_EX(agent, 0, -3.8, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - WorkModule::off_flag(boma, *FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); - WorkModule::on_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_ATTACK_AIR_LW_SET_ATTACK); - ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 268, 58, 0, 16, 5.5, 1.0, -1.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + agent.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NO_SPEED_OPERATION_CHK); + agent.on_flag(*FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_ATTACK_AIR_LW_SET_ATTACK); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 16.0, 268, 58, 0, 16, 4.0, 5.25, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 16.0, 268, 58, 0, 16, 4.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } wait(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 50, 98, 0, 40, 5.0, 1.0, -1.1, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword2"), 14.0, 50, 98, 0, 40, 3.5, 5.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 50, 98, 0, 40, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 65.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::off_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_ATTACK_AIR_LW_SET_ATTACK); - WorkModule::off_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); + agent.off_flag(*FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_ATTACK_AIR_LW_SET_ATTACK); + agent.off_flag(*FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 71.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); + agent.off_flag(*FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE); KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } } @@ -317,11 +330,11 @@ unsafe extern "C" fn game_aircatch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); + agent.on_flag(*FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); } wait(lua_state, 5.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); + agent.off_flag(*FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK); } frame(lua_state, 7.0); if is_excute(agent) { @@ -330,15 +343,22 @@ unsafe extern "C" fn game_aircatch(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("throw"), 6.0, 60, 100, 0, 40, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); + ATTACK(agent, 0, 0, Hash40::new("throw"), 5.0, 55, 125, 0, 25, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 1, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT); ArticleModule::change_status(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT, *WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_SHOOT, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); ArticleModule::change_motion(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, smash::phx::Hash40::new("shoot"), false, 0.0); } frame(lua_state, 12.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_LANDING); + agent.on_flag(*FIGHTER_STATUS_AIR_LASSO_FLAG_LANDING); + } + frame(lua_state, 16.0); + if is_excute(agent) { + AttackModule::set_power(boma, 0, 7.5, false); + AttackModule::set_reaction_add(boma, 0, 15, false); + AttackModule::set_optional_hit_sound(boma, 0, Hash40::new("se_common_kick_hit_m")); } - frame(lua_state, 21.0); + frame(lua_state, 22.0); + FT_MOTION_RATE_RANGE(agent, 22.0, 74.0, 33.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -346,17 +366,19 @@ unsafe extern "C" fn game_aircatch(agent: &mut L2CAgentBase) { if is_excute(agent) { ArticleModule::change_status_exist(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT, *WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_REWIND); ArticleModule::change_motion(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, smash::phx::Hash40::new("back"), false, 0.0); - WorkModule::on_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_OFF_MAP_COLL_OFFSET); + agent.on_flag(*FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_OFF_MAP_COLL_OFFSET); } frame(lua_state, 46.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_LANDING); + agent.off_flag(*FIGHTER_STATUS_AIR_LASSO_FLAG_LANDING); } frame(lua_state, 68.0); if is_excute(agent) { ArticleModule::remove_exist(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); ArticleModule::remove_exist(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, app::ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); - } + } + frame(lua_state, 74.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_aircatch(agent: &mut L2CAgentBase) { @@ -368,6 +390,21 @@ unsafe extern "C" fn effect_aircatch(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_aircatchlanding(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 9.0); + if is_excute(agent) { + ArticleModule::change_status_exist(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT, *WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_REWIND); + ArticleModule::change_motion(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, Hash40::new("back"), false, -1.0); + } + frame(lua_state, 35.0); + if is_excute(agent) { + ArticleModule::remove_exist(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + ArticleModule::remove_exist(boma, *FIGHTER_TOONLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); agent.acmd("effect_attackairn", effect_attackairn, Priority::Low); @@ -389,5 +426,5 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_aircatch", game_aircatch, Priority::Low); agent.acmd("effect_aircatch", effect_aircatch, Priority::Low); - agent.acmd("game_aircatchlanding", acmd_stub, Priority::Low); + agent.acmd("game_aircatchlanding", game_aircatchlanding, Priority::Low); } \ No newline at end of file diff --git a/fighters/toonlink/src/acmd/ground.rs b/fighters/toonlink/src/acmd/ground.rs index 63484ff7b2..30fb580a88 100644 --- a/fighters/toonlink/src/acmd/ground.rs +++ b/fighters/toonlink/src/acmd/ground.rs @@ -4,33 +4,33 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 4.75, 2.0); + frame(lua_state, 4.75); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 5.75); + FT_MOTION_RATE_RANGE(agent, 5.75, 8.0, 3.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 0.5); - } - frame(lua_state, 3.0); - if is_excute(agent) { - FT_MOTION_RATE(agent, 1.0); - } - frame(lua_state, 6.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 65, 100, 30, 0, 1.8, 0.0, 6.0, 8.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 75, 100, 27, 0, 1.8, 0.0, 6.0, 10.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 85, 100, 24, 0, 1.8, 0.0, 6.0, 14.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 85, 100, 24, 0, 1.8, 0.0, 6.0, 14.0, Some(0.0), Some(6.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - // Locking hitbox - ATTACK(agent, 4, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 1.8, 0.0, 3.0, 6.0, Some(0.0), Some(3.0), Some(14.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 2.0, 70, 100, 30, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 2.0, 79, 100, 27, 0, 3.5, 1.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 2.0, 90, 100, 24, 0, 3.5, 5.75, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 2.0, 361, 15, 0, 30, 2.0, 0.0, 2.0, 6.0, Some(0.0), Some(2.0), Some(15.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 8.0); + FT_MOTION_RATE_RANGE(agent, 8.0, 20.0, 11.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } + frame(lua_state, 20.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 4.0); + frame(lua_state, 4.5); if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false); AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 4, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); @@ -41,23 +41,49 @@ unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn expression_attack11(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + AttackModule::set_attack_reference_joint_id(boma, Hash40::new("sword1"), AttackDirectionAxis(*ATTACK_DIRECTION_Z), AttackDirectionAxis(*ATTACK_DIRECTION_X), AttackDirectionAxis(*ATTACK_DIRECTION_Y)); + ItemModule::set_have_item_visibility(boma, false, 0); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 4.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 6, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 5.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashs"), 0); + } +} + unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 4.75, 4.0); + frame(lua_state, 4.75); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 5.75); + FT_MOTION_RATE_RANGE(agent, 5.75, 8.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 65, 100, 30, 0, 2.5, 0.0, 6.0, 8.0, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 75, 100, 27, 0, 3.2, 0.0, 6.0, 11.0, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 85, 100, 24, 0, 3.2, 0.0, 6.0, 14.5, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 85, 100, 24, 0, 3.2, 0.0, 6.0, 14.5, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - // Locking hitbox - ATTACK(agent, 4, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 3.2, 0.0, 3.5, 7.0, Some(0.0), Some(3.5), Some(14.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 3.0, 65, 100, 30, 0, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 3.0, 75, 100, 27, 0, 3.5, 1.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 3.0, 85, 100, 24, 0, 3.5, 5.75, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_FIGHTER, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 15, 0, 30, 2.0, 0.0, 2.0, 7.0, Some(0.0), Some(2.0), Some(14.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + AttackModule::set_down_only(boma, 3, true); } frame(lua_state, 8.0); + FT_MOTION_RATE_RANGE(agent, 8.0, 17.0, 8.0); if is_excute(agent) { AttackModule::clear_all(boma); - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } + frame(lua_state, 17.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { @@ -70,35 +96,79 @@ unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 4); + AFTER_IMAGE_OFF(agent, 1); + } +} + +unsafe extern "C" fn expression_attack12(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + AttackModule::set_attack_reference_joint_id(boma, Hash40::new("sword1"), AttackDirectionAxis(*ATTACK_DIRECTION_Z), AttackDirectionAxis(*ATTACK_DIRECTION_X), AttackDirectionAxis(*ATTACK_DIRECTION_Y)); + ItemModule::set_have_item_visibility(boma, false, 0); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 3.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 6, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 4.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashs"), 0); } } unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 5.6, 6.0); + frame(lua_state, 5.6); + FT_MOTION_RATE_RANGE(agent, 5.6, 15.0, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 30, 70, 0, 75, 3.5, 0.0, 6.0, 8.0, Some(0.0), Some(6.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 30, 70, 0, 70, 4.5, 0.0, 6.0, 16.5, Some(0.0), Some(6.0), Some(8.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 4.0, 30, 120, 0, 45, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 4.0, 30, 120, 0, 45, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 4.0, 30, 120, 0, 45, 3.5, 5.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } - wait(lua_state, 2.0); + frame(lua_state, 15.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } } +unsafe extern "C" fn expression_attack13(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + AttackModule::set_attack_reference_joint_id(boma, Hash40::new("sword1"), AttackDirectionAxis(*ATTACK_DIRECTION_X), AttackDirectionAxis(*ATTACK_DIRECTION_Y), AttackDirectionAxis(*ATTACK_DIRECTION_Z)); + ItemModule::set_have_item_visibility(boma, false, 0); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 4.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohits"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 5.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_pierces"), 0); + } +} + unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE_RANGE(agent, 1.0, 9.0, 6.0); - frame(lua_state, 9.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 3.0); + frame(lua_state, 5.0); + FT_MOTION_RATE_RANGE(agent, 5.0, 8.0, 2.0); + frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 8.0, 63, 105, 0, 39, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 8.0, 63, 105, 0, 39, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 8.0, 63, 105, 0, 39, 3.5, 1.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 8.0, 63, 105, 0, 39, 4.0, 5.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 8.0, 63, 105, 0, 39, 3.5, 5.75, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.3, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 13.0); if is_excute(agent) { @@ -115,22 +185,25 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { } frame(lua_state, 8.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 7, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("null"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); - EFFECT_FOLLOW(agent, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 7, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_sword"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); } - frame(lua_state, 16.0); + frame(lua_state, 15.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 5); - EFFECT_OFF_KIND(agent, Hash40::new("toonlink_sword"), false, false); } } pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); agent.acmd("effect_attack11", effect_attack11, Priority::Low); + agent.acmd("expression_attack11", expression_attack11, Priority::Low); + agent.acmd("game_attack12", game_attack12, Priority::Low); agent.acmd("effect_attack12", effect_attack12, Priority::Low); + agent.acmd("expression_attack12", expression_attack12, Priority::Low); + agent.acmd("game_attack13", game_attack13, Priority::Low); + agent.acmd("expression_attack13", expression_attack13, Priority::Low); agent.acmd("game_attackdash", game_attackdash, Priority::Low); agent.acmd("effect_attackdash", effect_attackdash, Priority::Low); diff --git a/fighters/toonlink/src/acmd/other.rs b/fighters/toonlink/src/acmd/other.rs index a027a21933..6bad4ec476 100644 --- a/fighters/toonlink/src/acmd/other.rs +++ b/fighters/toonlink/src/acmd/other.rs @@ -106,15 +106,11 @@ unsafe extern "C" fn effect_jumpaerialback(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -124,10 +120,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/toonlink/src/acmd/smashes.rs b/fighters/toonlink/src/acmd/smashes.rs index 965f981732..0df1060fd7 100644 --- a/fighters/toonlink/src/acmd/smashes.rs +++ b/fighters/toonlink/src/acmd/smashes.rs @@ -5,15 +5,19 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 9.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 16.0); + FT_MOTION_RATE_RANGE(agent, 16.0, 18.0, 3.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 16.0, 40, 105, 0, 25, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 16.0, 40, 105, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 16.0, 40, 105, 0, 25, 3.5, 1.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 16.0, 40, 105, 0, 25, 4.0, 5.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 16.0, 40, 105, 0, 25, 3.5, 6.25, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } - wait(lua_state, 4.0); + frame(lua_state, 18.0); + FT_MOTION_RATE_RANGE(agent, 18.0, 20.0, 1.0); + frame(lua_state, 20.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -28,8 +32,7 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 5, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("null"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); - EFFECT_FOLLOW(agent, Hash40::new("toonlink_kaiten_flare"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_sword_hdr"), Hash40::new("toonlink_sword2"), 5, Hash40::new("sword1"), 0.5, 0, -0.5, Hash40::new("sword1"), 10.57, -0.13, -0.12, true, Hash40::new("toonlink_kaiten_flare"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); } frame(lua_state, 15.0); if is_excute(agent) { @@ -37,11 +40,7 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { } frame(lua_state, 20.0); if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 10); - } - frame(lua_state, 23.0); - if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("toonlink_kaiten_flare"), false, false); + AFTER_IMAGE_OFF(agent, 7); } } @@ -50,26 +49,30 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 5.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 11.0); FT_MOTION_RATE_RANGE(agent, 11.0, 14.0, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 14.0, 96, 100, 0, 43, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 14.0, 96, 100, 0, 43, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 14.0, 96, 100, 0, 43, 3.5, 1.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 96, 100, 0, 43, 4.0, 5.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 14.0, 96, 100, 0, 43, 3.5, 5.75, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 12.5); if is_excute(agent) { - ATK_POWER(agent, 0, 11); - ATK_POWER(agent, 1, 11); - ATK_POWER(agent, 2, 11); + ATK_POWER(agent, 0, 11); + ATK_POWER(agent, 1, 11); + ATK_POWER(agent, 2, 11); } frame(lua_state, 14.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 28.0); + FT_MOTION_RATE_RANGE(agent, 28.0, 45.0, 15.0); + frame(lua_state, 45.0); + FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { @@ -97,13 +100,13 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); + agent.on_flag(*FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 12.0, 30, 89, 0, 55, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 12.0, 30, 89, 0, 55, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 12.0, 30, 89, 0, 55, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 30, 89, 0, 55, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 12.0, 30, 89, 0, 55, 3.5, 5.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -112,9 +115,9 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 13.0, 30, 89, 0, 55, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 13.0, 30, 89, 0, 55, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 13.0, 30, 89, 0, 55, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 30, 89, 0, 55, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 13.0, 30, 89, 0, 55, 3.5, 5.75, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); @@ -122,7 +125,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { AttackModule::clear_all(boma); } frame(lua_state, 24.0); - FT_MOTION_RATE(agent, 0.88); + FT_MOTION_RATE_RANGE(agent, 24.0, 50.0, 23.0); frame(lua_state, 50.0); FT_MOTION_RATE(agent, 1.0); } @@ -143,7 +146,7 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -5, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); LAST_EFFECT_SET_RATE(agent, 1.4); } - frame(lua_state, 12.0); + frame(lua_state, 11.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 3); } @@ -157,7 +160,7 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), 5, 0, 0, 0, 180, 0, 0.7, 0, 0, 0, 0, 0, 0, false); LAST_EFFECT_SET_RATE(agent, 1.4); } - frame(lua_state, 22.0); + frame(lua_state, 21.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 3); EFFECT_OFF_KIND(agent, Hash40::new("toonlink_sword"), false, false); diff --git a/fighters/toonlink/src/acmd/specials.rs b/fighters/toonlink/src/acmd/specials.rs index 48c7f1d9bb..9bd3565d2b 100644 --- a/fighters/toonlink/src/acmd/specials.rs +++ b/fighters/toonlink/src/acmd/specials.rs @@ -1,5 +1,34 @@ use super::*; +unsafe extern "C" fn game_specialhistart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + FT_MOTION_RATE_RANGE(agent, 3.0, 8.0, 3.0); // 4f -> 6f spent in windup +} + +unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("arml"), 1.0, 0, 100, 20, 0, 2.75, -0.5, 0.0, 0.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 1, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 1.0, 180, 100, 40, 0, 3.5, 1.0, 0.0, -2.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 1, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 1.0, 180, 100, 40, 0, 3.5, 5.75, 0.0, -2.0, None, None, None, 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 1, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + } + frame(lua_state, 45.0); + if is_excute(agent) { + ATTACK(agent, 0, 1, Hash40::new("arml"), 3.125, 50, 200, 0, 55, 3.25, -0.5, 0.0, 0.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 1, Hash40::new("sword2"), 3.125, 50, 200, 0, 55, 4.5, 1.0, 0.0, -2.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 1, Hash40::new("sword2"), 3.125, 50, 200, 0, 55, 4.5, 5.75, 0.0, -2.0, None, None, None, 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 5, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + } + frame(lua_state, 48.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + agent.on_flag(*FIGHTER_LINK_STATUS_RSLASH_FLAG_RESET_SPEED_MAX_X); + } +} + unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -7,35 +36,80 @@ unsafe extern "C" fn effect_specialhi(agent: &mut L2CAgentBase) { if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); LAST_EFFECT_SET_RATE(agent, 1.2); - EFFECT_FOLLOW(agent, Hash40::new("toonlink_kaiten_s"), Hash40::new("top"), 0, 6, 0, 0, 0, -12, 1, true); - AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_spin"), Hash40::new("toonlink_kaitengiri2"), 7, Hash40::new("sword1"), 1.7, 0, -0.5, Hash40::new("sword1"), 15, -0.15, 0.1, true, Hash40::new("toonlink_kaiten_flare"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.7, 0.2); + EFFECT_FOLLOW(agent, Hash40::new("toonlink_kaiten_s"), Hash40::new("top"), 0, 6, 0, 0, 0, -12, 0.8, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_spin"), Hash40::new("toonlink_kaitengiri2"), 7, Hash40::new("sword1"), 1.7, 0, -0.5, Hash40::new("sword1"), 14.5, -0.15, 0.1, true, Hash40::new("toonlink_kaiten_flare"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.5, 0.2); FLASH(agent, 1, 0.667, 0, 0.235); } frame(lua_state, 6.0); for _ in 0..5 { + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, 2, 0, 2, 0, 45, 0, false); + LAST_EFFECT_SET_RATE(agent, 1.5); + } + wait(lua_state, 7.0); + } + frame(lua_state, 43.0); if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.5, 2, 0, 2, 0, 45, 0, false); - LAST_EFFECT_SET_RATE(agent, 1.5); + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_RATE(agent, 1.3); + FLASH_FRM(agent, 20, 0, 0, 0, 0); + } + frame(lua_state, 46.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -4, 0, -4, 0, 20, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + COL_NORMAL(agent); + } + frame(lua_state, 47.0); + if is_excute(agent) { + AFTER_IMAGE_OFF(agent, 4); + EFFECT_OFF_KIND(agent, Hash40::new("toonlink_kaiten_s"), false, false); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword1"), 10.0, 0, 0.0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } - wait(lua_state, 7.0); -} -frame(lua_state, 43.0); -if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - LAST_EFFECT_SET_RATE(agent, 1.3); - FLASH_FRM(agent, 20, 0, 0, 0, 0); -} -frame(lua_state, 46.0); -if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("sys_dash_smoke"), Hash40::new("top"), -4, 0, -4, 0, 20, 0, 0.9, 0, 0, 0, 0, 0, 0, false); - COL_NORMAL(agent); -} -frame(lua_state, 48.0); -if is_excute(agent) { - AFTER_IMAGE_OFF(agent, 4); - EFFECT_OFF_KIND(agent, Hash40::new("toonlink_kaiten_s"), false, false); - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword1"), 10.0, 0, 0.0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } + +unsafe extern "C" fn expression_specialhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + } + frame(lua_state, 1.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_erase"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 2.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 4, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 3.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashs"), 9); + } + frame(lua_state, 8.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 7, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 16.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 7, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 24.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 7, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 32.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 7, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 43.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_erase"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 44.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_slashm"), 0); + ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitll"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } } unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { @@ -44,10 +118,13 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { boma.select_cliff_hangdata_from_name("special_hi"); } + frame(lua_state, 7.0); + if is_excute(agent) { + KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_LINK_SPECIAL_AIR_HI); + } frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 88, 100, 90, 0, 5.0, 0.0, 7.0, 13.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 74, 100, 83, 0, 5.0, 0.0, 7.0, 13.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 88, 100, 94, 0, 5.0, 0.0, 7.0, 13.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 3.0); @@ -56,7 +133,7 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 50, 100, 90, 0, 5.5, 0.0, 7.0, -10.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 65, 100, 94, 0, 5.5, 0.0, 7.0, -10.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -65,8 +142,8 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 16.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 88, 100, 85, 0, 5.0, 0.0, 7.5, 13.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 95, 100, 65, 0, 5.0, 0.0, 7.5, 13.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 90, 100, 83, 0, 5.0, 0.0, 6.5, 13.0, Some(0.0), Some(6.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 95, 100, 73, 0, 5.0, 0.0, 6.5, 13.0, Some(0.0), Some(6.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 3.0); @@ -75,7 +152,7 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 19.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 40, 100, 88, 0, 5.5, 0.0, 3.5, -8.5, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 55, 100, 83, 0, 5.5, 0.0, 3.5, -8.5, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -84,8 +161,8 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 22.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 60, 100, 60, 0, 5.0, 0.0, 7.0, 5.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 95, 100, 70, 0, 5.0, 0.0, 8.0, 13.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 80, 100, 60, 0, 5.0, 0.0, 7.0, 5.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 105, 100, 75, 0, 5.0, 0.0, 8.0, 13.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 95, 100, 65, 0, 5.0, 0.0, 8.0, 13.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } @@ -95,7 +172,7 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 27.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 30, 100, 80, 0, 5.5, 0.0, 4.0, -10.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 45, 100, 80, 0, 5.5, 0.0, 4.0, -10.0, None, None, None, 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -104,8 +181,8 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 31.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 65, 100, 52, 0, 5.0, 0.0, 7.0, 5.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 120, 100, 20, 0, 5.0, 0.0, 8.5, 12.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 80, 100, 55, 0, 5.0, 0.0, 7.0, 5.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 105, 100, 20, 0, 5.0, 0.0, 8.5, 12.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 95, 100, 65, 0, 5.0, 0.0, 8.5, 12.0, Some(0.0), Some(7.0), Some(5.0), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } @@ -115,8 +192,8 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 35.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 18, 100, 85, 0, 5.5, 0.0, 5.5, -9.0, Some(0.0), Some(5.5), Some(-5.5), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 18, 100, 80, 0, 5.5, 0.0, 5.5, -5.5, Some(0.0), Some(5.5), Some(-5.5), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 30, 100, 85, 0, 5.5, 0.0, 5.5, -9.0, Some(0.0), Some(5.5), Some(-5.5), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 30, 100, 80, 0, 5.5, 0.0, 5.5, -5.5, Some(0.0), Some(5.5), Some(-5.5), 0.75, 0.3, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 1.0); @@ -135,28 +212,29 @@ unsafe extern "C" fn game_specialairhi(agent: &mut L2CAgentBase) { if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("top"), 4.0, 45, 186, 0, 40, 7.0, 0.0, 12.5, 7.75, Some(0.0), Some(8.5), Some(6.25), 1.5, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } - frame(lua_state, 48.0); - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_LINK_STATUS_RSLASH_FLAG_RESET_SPEED_MAX_X); - } frame(lua_state, 49.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 51.0); + if is_excute(agent) { + agent.on_flag(*FIGHTER_LINK_STATUS_RSLASH_FLAG_RESET_SPEED_MAX_X); + } } unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("toonlink_kaiten_s"), Hash40::new("top"), 0, 6, 0, 0, 0, -20, 0.9, true); - } frame(lua_state, 2.0); if is_excute(agent) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("sword1"), 11, 0, 0.0, 0, 0, 0, 0.75, 0, 0, 0, 0, 0, 0, true); LAST_EFFECT_SET_RATE(agent, 1.5); FLASH(agent, 1, 0.667, 0, 0.235); } + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("toonlink_kaiten_s"), Hash40::new("top"), 0, 6, 0, 0, 0, -20, 0.9, true); + } frame(lua_state, 7.0); if is_excute(agent) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_toonlink_spin"), Hash40::new("toonlink_kaitengiri2"), 7, Hash40::new("sword1"), 1.7, 0, -0.5, Hash40::new("sword1"), 15, -0.15, 0.1, true, Hash40::new("toonlink_kaiten_flare"), Hash40::new("sword1"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.7, 0.2); @@ -187,7 +265,11 @@ unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { } pub fn install(agent: &mut Agent) { + agent.acmd("game_specialhistart", game_specialhistart, Priority::Low); + + agent.acmd("game_specialhi", game_specialhi, Priority::Low); agent.acmd("effect_specialhi", effect_specialhi, Priority::Low); + agent.acmd("game_specialairhi", game_specialairhi, Priority::Low); agent.acmd("effect_specialairhi", effect_specialairhi, Priority::Low); } \ No newline at end of file diff --git a/fighters/toonlink/src/acmd/tilts.rs b/fighters/toonlink/src/acmd/tilts.rs index 8ce732e47d..1b822fda65 100644 --- a/fighters/toonlink/src/acmd/tilts.rs +++ b/fighters/toonlink/src/acmd/tilts.rs @@ -8,9 +8,9 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { frame(lua_state, 9.245); // we do a bit of partial framing FT_MOTION_RATE_RANGE(agent, 9.245, 9.75, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 11.0, 40, 100, 0, 25, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 11.0, 40, 100, 0, 25, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 11.0, 40, 100, 0, 25, 3.5, 1.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 11.0, 40, 100, 0, 25, 4.0, 5.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 11.0, 40, 100, 0, 25, 3.5, 5.65, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); } frame(lua_state, 9.75); FT_MOTION_RATE_RANGE(agent, 9.75, 13.0, 3.0); @@ -49,9 +49,15 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 9.0, 95, 95, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 9.0, 95, 95, 0, 40, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 95, 95, 0, 40, 3.5, 1.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 95, 95, 0, 40, 4.0, 5.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 95, 95, 0, 40, 3.5, 5.65, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + } + frame(lua_state, 10.0); + if is_excute(agent) { + AttackModule::set_vector(boma, 0, 90, false); + AttackModule::set_vector(boma, 1, 90, false); + AttackModule::set_vector(boma, 2, 90, false); } frame(lua_state, 14.0); if is_excute(agent) { @@ -81,9 +87,9 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 9.0, 75, 65, 0, 65, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.5, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("arml"), 9.0, 75, 65, 0, 65, 3.5, 2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.5, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 75, 65, 0, 65, 3.5, 5.5, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.5, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 9.0, 75, 65, 0, 65, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.5, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword2"), 9.0, 75, 65, 0, 65, 3.5, 1.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.5, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword2"), 9.0, 75, 65, 0, 65, 3.5, 5.65, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.5, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TOONLINK_HIT, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 2.0); diff --git a/fighters/toonlink/src/boomerang/mod.rs b/fighters/toonlink/src/boomerang/mod.rs index 3bf775db27..bcdb6236e8 100644 --- a/fighters/toonlink/src/boomerang/mod.rs +++ b/fighters/toonlink/src/boomerang/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod opff; pub fn install() { let agent = &mut Agent::new("toonlink_boomerang"); acmd::install(agent); + opff::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/toonlink/src/boomerang/opff.rs b/fighters/toonlink/src/boomerang/opff.rs new file mode 100644 index 0000000000..f2abf3e0ac --- /dev/null +++ b/fighters/toonlink/src/boomerang/opff.rs @@ -0,0 +1,41 @@ +// opff import +utils::import_noreturn!(common::opff::fighter_common_opff); +use super::*; +use globals::*; + +unsafe fn boomerang_reflect_fix(weapon: &mut smash::lua2cpp::L2CFighterBase) { + // this opff runs once after reflection + let boma = weapon.module_accessor; + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_REFLECTOR | *COLLISION_KIND_MASK_PARRY) { + return; + } + AttackModule::clear_inflict_kind_status(boma); + + // update position, accounting for boomerang-weirdness + let top_pos = *PostureModule::pos(boma); + let rot_pos = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + ModelModule::joint_global_position(boma, Hash40::new("rot"), rot_pos, false); + PostureModule::set_pos(boma, &Vector3f{ x: rot_pos.x, y: top_pos.y, z: top_pos.z }); + + // update facing direction depending on whether it is traveling forwards or backwards + let lr = PostureModule::lr(boma); + let speed_x = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + if weapon.is_status(*WN_LINK_BOOMERANG_STATUS_KIND_FLY) { + PostureModule::reverse_lr(boma); + PostureModule::update_rot_y_lr(boma); + } + + // lifetime fix + weapon.set_int_from_param(*WN_LINK_BOOMERANG_INSTANCE_WORK_ID_INT_LIFE, "boomerang", "life"); + + // restart status + weapon.change_status(WN_LINK_BOOMERANG_STATUS_KIND_FLY.into(), false.into()); +} + +pub unsafe extern "C" fn toonlink_boomerang_frame(weapon: &mut smash::lua2cpp::L2CFighterBase) { + boomerang_reflect_fix(weapon); +} + +pub fn install(agent: &mut Agent) { + agent.on_line(Main, toonlink_boomerang_frame); +} \ No newline at end of file diff --git a/fighters/toonlink/src/lib.rs b/fighters/toonlink/src/lib.rs index 24be6107e0..b9a3293ebd 100644 --- a/fighters/toonlink/src/lib.rs +++ b/fighters/toonlink/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/toonlink/src/opff.rs b/fighters/toonlink/src/opff.rs index 886057c1a8..b67712bba2 100644 --- a/fighters/toonlink/src/opff.rs +++ b/fighters/toonlink/src/opff.rs @@ -4,11 +4,11 @@ use super::*; use globals::*; -unsafe fn heros_bow_drift(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat2: i32, stick_y: f32) { - if status_kind == *FIGHTER_STATUS_KIND_SPECIAL_N { - if situation_kind == *SITUATION_KIND_AIR { - if KineticModule::get_kinetic_type(boma) != *FIGHTER_KINETIC_TYPE_FALL { - KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); +unsafe fn heros_bow_drift(fighter: &mut L2CFighterCommon) { + if fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_N) { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_AIR { + if KineticModule::get_kinetic_type(fighter.module_accessor) != *FIGHTER_KINETIC_TYPE_FALL { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); } } } @@ -16,8 +16,17 @@ unsafe fn heros_bow_drift(boma: &mut BattleObjectModuleAccessor, status_kind: i3 // Lengthen sword unsafe fn sword_length(boma: &mut BattleObjectModuleAccessor) { - let long_sword_scale = Vector3f{x: 1.2, y: 1.0, z: 1.0}; - ModelModule::set_joint_scale(boma, smash::phx::Hash40::new("sword2"), &long_sword_scale); + let mut long_sword_scale = Vector3f{x: 1.175, y: 1.0, z: 1.0}; + if boma.is_motion_one_of(&[ + Hash40::new("attack_air_hi"), + //Hash40::new("attack_s4"), + Hash40::new("special_air_hi"), + Hash40::new("special_hi"), + Hash40::new("special_hi_start")]) + { // match sword size better w/o ton of extra range + long_sword_scale.x = 1.1375; + } + ModelModule::set_joint_scale(boma, smash::phx::Hash40::new("sword1"), &long_sword_scale); } // Prevents Toon Link from being able to use both aerial jumps immediately after one another @@ -45,34 +54,17 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { *FIGHTER_LINK_STATUS_KIND_SPECIAL_S2, *FIGHTER_LINK_STATUS_KIND_SPECIAL_LW_BLAST ]) - || (fighter.is_motion(Hash40::new("special_air_hi")) && fighter.motion_frame() > 59.0) ) + || (fighter.is_motion(Hash40::new("special_air_hi")) && fighter.motion_frame() > 63.0) ) && fighter.is_situation(*SITUATION_KIND_AIR) { fighter.sub_air_check_dive(); } } -pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { - heros_bow_drift(boma, status_kind, situation_kind, cat[1], stick_y); +pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { + heros_bow_drift(fighter); sword_length(boma); triple_jump_lockout(fighter); fastfall_specials(fighter); - - - // Frame Data - frame_data(boma, status_kind, motion_kind, frame); -} - -unsafe fn frame_data(boma: &mut BattleObjectModuleAccessor, status_kind: i32, motion_kind: u64, frame: f32) { - if status_kind == *FIGHTER_STATUS_KIND_ATTACK { - if motion_kind == hash40("attack_11") { - if frame < 6.0 { - MotionModule::set_rate(boma, 1.667); - } - if frame >= 6.0 { - MotionModule::set_rate(boma, 1.0); - } - } - } } pub extern "C" fn toonlink_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterCommon) { @@ -84,7 +76,7 @@ pub extern "C" fn toonlink_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighte pub unsafe fn toonlink_frame(fighter: &mut smash::lua2cpp::L2CFighterCommon) { if let Some(info) = FrameInfo::update_and_get(fighter) { - moveset(fighter, &mut *info.boma, info.id, info.cat, info.status_kind, info.situation_kind, info.motion_kind.hash, info.stick_x, info.stick_y, info.facing, info.frame); + moveset(fighter, &mut *info.boma); } } diff --git a/fighters/toonlink/src/status/special_hi.rs b/fighters/toonlink/src/status/special_hi.rs index 2f316fc362..7dd9ac2688 100644 --- a/fighters/toonlink/src/status/special_hi.rs +++ b/fighters/toonlink/src/status/special_hi.rs @@ -6,9 +6,9 @@ pub unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CVa if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { let start_speed = fighter.get_speed_x(*FIGHTER_KINETIC_ENERGY_ID_CONTROL); let start_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_x_mul"); - fighter.clear_lua_stack(); - lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_speed * start_x_mul); - app::sv_kinetic_energy::set_speed(fighter.lua_state_agent); + sv_kinetic_energy!(mul_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, start_x_mul); + let start_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.start_y_mul"); + sv_kinetic_energy!(mul_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, start_y_mul); } let mask_flag = if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_AIR { (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_HI | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64 @@ -42,6 +42,86 @@ pub unsafe extern "C" fn special_hi_pre(fighter: &mut L2CFighterCommon) -> L2CVa 0.into() } +pub unsafe extern "C" fn special_hi_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + fighter.sub_change_motion_by_situation(L2CValue::Hash40s("special_hi_start"), L2CValue::Hash40s("special_air_hi"), false.into()); + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + fighter.enable_transition_term(*FIGHTER_LINK_STATUS_RSLASH_TRANSITION_TERM_ID_HOLD); + fighter.enable_transition_term(*FIGHTER_LINK_STATUS_RSLASH_TRANSITION_TERM_ID_END); + } else { + // prevent entering charge/grspin when started in air + fighter.off_flag(*FIGHTER_LINK_STATUS_RSLASH_FLAG_GROUND); + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 1.into()); + } + WorkModule::set_float(fighter.module_accessor, 0.0, *FIGHTER_LINK_STATUS_RSLASH_WORK_HOLD_FRAME); + let rslash_landing_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_hi"), hash40("rslash_landing_frame")); + WorkModule::set_float(fighter.module_accessor, rslash_landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_main_loop as *const () as _)) +} + +unsafe extern "C" fn special_hi_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + let rslash_charge_spd = fighter.get_param_float("param_special_hi", "rslash_charge_spd_div"); + + MotionModule::set_rate(fighter.module_accessor, rslash_charge_spd); + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + + if MotionModule::is_end(fighter.module_accessor) { + // check if charging or instant releasing + if fighter.is_motion(Hash40::new("special_hi_start")) { + if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND + && fighter.is_button_on(Buttons::Special) { + fighter.change_status(FIGHTER_LINK_STATUS_KIND_SPECIAL_HI_HOLD.into(), true.into()); + return 1.into(); + } + fighter.change_status(FIGHTER_LINK_STATUS_KIND_SPECIAL_HI_END.into(), true.into()); + return 1.into(); + } + fighter.change_status_by_situation(*FIGHTER_STATUS_KIND_WAIT, *FIGHTER_STATUS_KIND_FALL_SPECIAL, false); + return 1.into(); + } + // enable landing after rise begins + if KineticModule::get_kinetic_type(fighter.module_accessor) == *FIGHTER_KINETIC_TYPE_LINK_SPECIAL_AIR_HI { + fighter.set_situation_keep(L2CValue::I32(*SITUATION_KIND_AIR), 0.into()); + } + // cut speed on aerial endlag, now increases gravity + if fighter.is_flag(*FIGHTER_LINK_STATUS_RSLASH_FLAG_RESET_SPEED_MAX_X) { + // gravity + let air_accel_y = fighter.get_param_float("air_accel_y", ""); + let end_accel_y_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.end_accel_y_mul"); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -air_accel_y * end_accel_y_mul); + // drift mul + let rslash_end_air_accel_x_mul = fighter.get_param_float("param_special_hi", "rslash_end_air_accel_x_mul"); + sv_kinetic_energy!(set_accel_x_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, rslash_end_air_accel_x_mul); + let rslash_air_max_x_mul = fighter.get_param_float("param_special_hi", "rslash_air_max_x_mul"); + let air_speed_x_stable = fighter.get_param_float("air_speed_x_stable", ""); + let rslash_end_air_max_x = fighter.get_param_float("param_special_hi", "rslash_end_air_max_x"); + let mul_x_speed_max = ((rslash_end_air_max_x / air_speed_x_stable) / rslash_air_max_x_mul); + // max speed mul + sv_kinetic_energy!(mul_x_speed_max, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, mul_x_speed_max); + fighter.off_flag(*FIGHTER_LINK_STATUS_RSLASH_FLAG_RESET_SPEED_MAX_X); + } + // check if grounded during startup + if !fighter.is_flag(*FIGHTER_LINK_STATUS_RSLASH_FLAG_GROUND) + && fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND + && !fighter.is_motion(Hash40::new("special_air_hi")) { + fighter.on_flag(*FIGHTER_LINK_STATUS_RSLASH_FLAG_GROUND); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + // land cancel if started in air + if !fighter.is_flag(*FIGHTER_LINK_STATUS_RSLASH_FLAG_GROUND) { + fighter.change_status(L2CValue::I32(*FIGHTER_STATUS_KIND_LANDING_FALL_SPECIAL), L2CValue::Bool(false)) + } + // if sliding during startup go into normal aerial version + fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND, *GROUND_CORRECT_KIND_AIR); + fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_UNIQ); + } + + 0.into() +} + // FIGHTER_LINK_STATUS_KIND_SPECIAL_HI_END // unsafe extern "C" fn link_situation_helper(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -89,8 +169,8 @@ pub unsafe extern "C" fn special_hi_end_pre(fighter: &mut L2CFighterCommon) -> L } pub unsafe extern "C" fn special_hi_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_FALL_SPECIAL); - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_WAIT); + fighter.enable_transition_term(*FIGHTER_STATUS_TRANSITION_TERM_ID_FALL_SPECIAL); + fighter.enable_transition_term(*FIGHTER_STATUS_TRANSITION_TERM_ID_WAIT); if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); GroundModule::correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP_ATTACK)); @@ -101,8 +181,8 @@ pub unsafe extern "C" fn special_hi_end_main(fighter: &mut L2CFighterCommon) -> MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi"), 0.0, 1.0, false, 0.0, false, false); WorkModule::on_flag(fighter.module_accessor, *FIGHTER_LINK_STATUS_RSLASH_END_FLAG_FIRST); } - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_WAIT); - WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_FALL_SPECIAL); + fighter.enable_transition_term(*FIGHTER_STATUS_TRANSITION_TERM_ID_WAIT); + fighter.unable_transition_term(*FIGHTER_STATUS_TRANSITION_TERM_ID_FALL_SPECIAL); } fighter.sub_shift_status_main(L2CValue::Ptr(specialhi_end_Main as *const () as _)) } @@ -136,8 +216,8 @@ unsafe extern "C" fn specialhi_end_Main(fighter: &mut L2CFighterCommon) -> L2CVa MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_hi"), 0.0, 1.0, false, 0.0, false, false); WorkModule::on_flag(fighter.module_accessor, *FIGHTER_LINK_STATUS_RSLASH_END_FLAG_FIRST); } - WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_FALL_SPECIAL); - WorkModule::unable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_WAIT); + fighter.enable_transition_term(*FIGHTER_STATUS_TRANSITION_TERM_ID_FALL_SPECIAL); + fighter.unable_transition_term(*FIGHTER_STATUS_TRANSITION_TERM_ID_WAIT); fighter.shift(L2CValue::Ptr(sub_specialhi_end_Main as *const () as _)); return 0.into() } @@ -219,6 +299,8 @@ unsafe extern "C" fn sub_specialhi_end_Main(fighter: &mut L2CFighterCommon) -> L pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_main); + agent.status(Pre, *FIGHTER_LINK_STATUS_KIND_SPECIAL_HI_END, special_hi_end_pre); agent.status(Main, *FIGHTER_LINK_STATUS_KIND_SPECIAL_HI_END, special_hi_end_main); } diff --git a/fighters/toonlink/src/status/special_lw.rs b/fighters/toonlink/src/status/special_lw.rs index 7e33ac5617..8e82508dcb 100644 --- a/fighters/toonlink/src/status/special_lw.rs +++ b/fighters/toonlink/src/status/special_lw.rs @@ -18,6 +18,14 @@ unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue ret } +unsafe extern "C" fn special_lw_init(fighter: &mut L2CFighterCommon) -> L2CValue { + let start_x_mul = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_lw.start_x_mul"); + KineticModule::mul_speed(fighter.module_accessor, &Vector3f{x: start_x_mul, y: 1.0, z: 1.0}, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + + 0.into() +} + pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); + agent.status(Init, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_init); } \ No newline at end of file diff --git a/fighters/trail/Cargo.toml b/fighters/trail/Cargo.toml index 01772a0003..fbc91e3277 100644 --- a/fighters/trail/Cargo.toml +++ b/fighters/trail/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/trail/src/acmd/aerials.rs b/fighters/trail/src/acmd/aerials.rs index 0633636415..be64859e9b 100644 --- a/fighters/trail/src/acmd/aerials.rs +++ b/fighters/trail/src/acmd/aerials.rs @@ -17,15 +17,15 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } frame(lua_state, 15.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 12.0, 361, 114, 0, 25, 3.5, 0.0, 0.0, 2.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 361, 114, 0, 25, 3.5, 0.0, 3.875, 2.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 361, 114, 0, 25, 3.5, 0.0, 7.75, 2.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 12.0, 361, 114, 0, 20, 3.5, 0.0, 0.0, 2.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 361, 114, 0, 20, 3.5, 0.0, 3.875, 2.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 361, 114, 0, 20, 3.5, 0.0, 7.75, 2.0, None, None, None, 0.9, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); } - frame(lua_state, 20.0); + frame(lua_state, 19.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 25, 3.5, 0.0, 0.0, 2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 25, 3.5, 0.0, 3.875, 2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 25, 3.5, 0.0, 7.75, 2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 20, 3.5, 0.0, 0.0, 2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 20, 3.5, 0.0, 3.875, 2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 9.0, 361, 100, 0, 20, 3.5, 0.0, 7.75, 2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); } frame(lua_state, 27.0); if is_excute(agent) { @@ -64,7 +64,7 @@ unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { //EFFECT_FOLLOW(agent, Hash40::new("sys_heart"), Hash40::new("haver"), 0, 8.0, 0, 0, 0, 90.0, 0.5, true); //LAST_EFFECT_SET_COLOR(agent, 4.0, 5.0, 1.0); } - frame(lua_state, 15.0); + frame(lua_state, 14.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("trail_keyblade_light"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1.0, true); EFFECT_FOLLOW(agent, Hash40::new("trail_keyblade_flare"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); @@ -275,18 +275,16 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { - frame(agent.lua_state_agent, 11.0); + frame(agent.lua_state_agent, 10.0); if is_excute(agent) { EFFECT_FOLLOW(agent, Hash40::new("trail_keyblade_flare"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); - } - frame(agent.lua_state_agent, 12.0); AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_trail_keyblade_hdr"), Hash40::new("tex_trail_keyblade2"), 7, Hash40::new("haver"), 0, 2, 0, Hash40::new("haver"), 0, 13.8, 0, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); - -frame(agent.lua_state_agent, 16.0); -if is_excute(agent) { - EFFECT_OFF_KIND(agent, Hash40::new("trail_keyblade_flare"), false, true); - AFTER_IMAGE_OFF(agent, 4); -} + } + frame(agent.lua_state_agent, 16.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("trail_keyblade_flare"), false, true); + AFTER_IMAGE_OFF(agent, 4); + } } unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { @@ -299,16 +297,28 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - MotionModule::set_rate(boma, (9.5-5.0)/5.0); + MotionModule::set_rate(boma, (9.0-5.0)/4.0); } - frame(lua_state, 9.5); + frame(lua_state, 9.0); if is_excute(agent) { - MotionModule::set_rate(boma, (20.0-9.5)/8.0); - ATTACK(agent, 0, 0, Hash40::new("haver"), 10.0, 75, 70, 0, 65, 3.5, 0.0, 0.0, -2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 75, 70, 0, 65, 3.5, 0.0, 4.0, -2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 10.0, 75, 70, 0, 65, 3.5, 0.0, 8.25, -2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE, *ATTACK_REGION_SWORD); + MotionModule::set_rate(boma, (9.75-9.0)/1.0); } - frame(lua_state, 20.0); + frame(lua_state, 9.75); + if is_excute(agent) { + MotionModule::set_rate(boma, (10.75-9.75)/1.0); + ATTACK(agent, 0, 0, Hash40::new("haver"), 10.0, 75, 98, 0, 36, 3.5, 0.0, 0.0, -2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 10.0, 75, 98, 0, 36, 3.5, 0.0, 4.0, -2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 10.0, 75, 98, 0, 36, 3.5, 0.0, 8.25, -2.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE, *ATTACK_REGION_SWORD); + } + frame(lua_state, 10.75); + if is_excute(agent) { + MotionModule::set_rate(boma, (12.0-10.75)/1.0); + } + frame(lua_state, 12.0); + if is_excute(agent) { + MotionModule::set_rate(boma, 2.0); + } + frame(lua_state, 20.0); // total 6 frames if is_excute(agent) { MotionModule::set_rate(boma, 1.0); AttackModule::clear_all(boma); @@ -349,18 +359,18 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { MotionModule::set_rate(boma, (15.5-10.0)/4.0); } - frame(lua_state, 15.5); + frame(lua_state, 15.5); // f8 if is_excute(agent) { MotionModule::set_rate(boma, (25.0-15.5)/7.0); - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 62, 70, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 62, 70, 0, 50, 3.5, 0.4, 0.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 62, 70, 0, 50, 3.5, 0.4, 4.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("haver"), 8.0, 62, 70, 0, 50, 3.5, 0.4, 8.25, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 62, 83, 0, 38, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 62, 83, 0, 38, 3.5, 0.4, 0.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 62, 83, 0, 38, 3.5, 0.4, 4.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("haver"), 8.0, 62, 83, 0, 38, 3.5, 0.4, 8.25, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); } - frame(lua_state, 15.5 + 5.0*((25.0-15.5)/7.0)); + frame(lua_state, 15.5 + 5.0*((25.0-15.5)/7.0)); // f13 if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 58, 80, 0, 60, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 58, 80, 0, 60, 3.5, 0.4, 0.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderr"), 8.0, 58, 108, 0, 38, 3.5, 0.0, 0.0, 0.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 58, 108, 0, 38, 3.5, 0.4, 0.0, 2.0, None, None, None, 0.75, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); /* Ground-only */ ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 285, 70, 0, 30, 3.5, 0.4, 4.0, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("haver"), 8.0, 285, 70, 0, 30, 3.5, 0.4, 8.25, 2.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); @@ -393,8 +403,8 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 10.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("haver"), 0, 10, 0, 0, 0, 0, 0.65, 0, 0, 0, 0, 0, 0, true); - LAST_EFFECT_SET_RATE(agent, 1.25); + // EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("haver"), 0, 10, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); + // LAST_EFFECT_SET_RATE(agent, 1.25); } frame(lua_state, 14.0); if is_excute(agent) { diff --git a/fighters/trail/src/acmd/ground.rs b/fighters/trail/src/acmd/ground.rs index df47b42b4a..dc1725f319 100644 --- a/fighters/trail/src/acmd/ground.rs +++ b/fighters/trail/src/acmd/ground.rs @@ -13,13 +13,11 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 1, 0, Hash40::new("haver"), 3.0, 70, 25, 0, 30, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 3.0, 320, 25, 0, 15, 3.5, 0.0, 4.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("haver"), 3.0, 320, 25, 0, 15, 3.5, 0.0, 8.25, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - // Jab lock hitbox + // Jab lock hitboxes ATTACK(agent, 4, 0, Hash40::new("shoulderr"), 3.0, 361, 16, 0, 26, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); ATTACK(agent, 5, 0, Hash40::new("haver"), 3.0, 361, 20, 0, 20, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); ATTACK(agent, 6, 0, Hash40::new("haver"), 3.0, 361, 20, 0, 20, 3.5, 0.0, 4.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); ATTACK(agent, 7, 0, Hash40::new("haver"), 3.0, 361, 20, 0, 20, 3.5, 0.0, 8.25, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame_revised(boma, 0, 5.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 5.0, false); AttackModule::set_add_reaction_frame_revised(boma, 2, 7.0, false); AttackModule::set_add_reaction_frame_revised(boma, 3, 7.0, false); AttackModule::set_down_only(boma, 4, false); @@ -77,13 +75,10 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("haver"), 3.0, 60, 16, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("haver"), 3.0, 60, 16, 0, 30, 3.5, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 3.0, 85, 16, 0, 25, 3.5, 0.0, 8.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - // Jab lock hitbox + // Jab lock hitboxes ATTACK(agent, 3, 0, Hash40::new("haver"), 3.0, 361, 20, 0, 20, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); ATTACK(agent, 4, 0, Hash40::new("haver"), 3.0, 361, 20, 0, 20, 3.5, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); ATTACK(agent, 5, 0, Hash40::new("haver"), 3.0, 361, 20, 0, 20, 3.5, 0.0, 8.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame_revised(boma, 0, 6.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 1, 6.0, false); - AttackModule::set_add_reaction_frame_revised(boma, 2, 8.0, false); AttackModule::set_down_only(boma, 3, false); AttackModule::set_down_only(boma, 4, false); AttackModule::set_down_only(boma, 5, false); diff --git a/fighters/trail/src/acmd/other.rs b/fighters/trail/src/acmd/other.rs index c427943563..32b4f2f7ab 100644 --- a/fighters/trail/src/acmd/other.rs +++ b/fighters/trail/src/acmd/other.rs @@ -64,16 +64,12 @@ unsafe extern "C" fn sound_dash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -83,10 +79,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_run(agent: &mut L2CAgentBase) { @@ -203,6 +196,21 @@ unsafe extern "C" fn effect_slipattack(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + if VarModule::is_flag(agent.battle_object, vars::trail::instance::ATTACK_LW4_REBOUND) { + VarModule::off_flag(agent.battle_object, vars::trail::instance::ATTACK_LW4_REBOUND); + MotionModule::set_rate(boma, 1.65); + KineticModule::mul_speed(boma, &Vector3f::new(0.0, 0.5, 0.0), *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + } + else { + PostureModule::add_pos(boma, &Vector3f::new(0.0, -1.2, 0.0)); + } + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_cliffescape", acmd_stub, Priority::Low); @@ -225,4 +233,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("effect_downattackd", effect_downattackd, Priority::Low); agent.acmd("effect_downattacku", effect_downattacku, Priority::Low); agent.acmd("effect_slipattack", effect_slipattack, Priority::Low); + + agent.acmd("game_cliffjump2", game_cliffjump2, Priority::Low); } diff --git a/fighters/trail/src/acmd/smashes.rs b/fighters/trail/src/acmd/smashes.rs index b33ed49399..230a64d6ba 100644 --- a/fighters/trail/src/acmd/smashes.rs +++ b/fighters/trail/src/acmd/smashes.rs @@ -12,15 +12,15 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { frame(lua_state, 17.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 15.0, 40, 105, 0, 30, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 15.0, 40, 105, 0, 30, 3.5, 0.0, 4.0, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 15.0, 40, 105, 0, 30, 3.5, 0.0, 8.25, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 15.0, 361, 105, 0, 30, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 15.0, 361, 105, 0, 30, 3.5, 0.0, 4.0, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 15.0, 361, 105, 0, 30, 3.5, 0.0, 8.25, -2.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); } frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 13.5, 40, 108, 0, 35, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 13.5, 40, 108, 0, 35, 3.5, 0.0, 4.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 13.5, 40, 108, 0, 35, 3.5, 0.0, 8.25, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 13.0, 361, 105, 0, 30, 3.5, 0.0, 0.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 13.0, 361, 105, 0, 30, 3.5, 0.0, 4.0, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 13.0, 361, 105, 0, 30, 3.5, 0.0, 8.25, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); } frame(lua_state, 21.0); if is_excute(agent) { @@ -71,8 +71,9 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 12.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 0.6, 100, 100, 100, 0, 3.2, 0.0, 7.4, 2.2, Some(0.0), Some(7.4), Some(4.4), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); - ATTACK(agent, 1, 0, Hash40::new("top"), 0.6, 120, 100, 100, 0, 3.2, 0.0, 7.4, 2.2, Some(0.0), Some(7.4), Some(9.4), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 1.0, 84, 100, 100, 0, 3.2, 0.0, 7.4, 1.2, Some(0.0), Some(7.4), Some(1.2), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); + ATTACK(agent, 1, 0, Hash40::new("top"), 1.0, 100, 100, 100, 0, 3.2, 0.0, 7.4, 1.2, Some(0.0), Some(7.4), Some(4.4), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); + ATTACK(agent, 2, 0, Hash40::new("top"), 1.0, 120, 100, 100, 0, 3.2, 0.0, 7.4, 1.2, Some(0.0), Some(7.4), Some(9.4), 0.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_NONE); AttackModule::set_no_damage_fly_smoke_all(boma, true, false); } wait(lua_state, 2.0); @@ -81,9 +82,9 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 17.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 14.0, 84, 90, 0, 52, 3.5, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_KICK, *ATTACK_REGION_MAGIC); + ATTACK(agent, 0, 0, Hash40::new("haver"), 14.0, 84, 90, 0, 52, 4.0, 0.0, -1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_KICK, *ATTACK_REGION_MAGIC); ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 84, 92, 0, 54, 4.8, 0.0, 28.6, 3.8, None, None, None, 1.15, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_MAGIC); - ATTACK(agent, 2, 0, Hash40::new("haver"), 14.0, 84, 90, 0, 52, 3.5, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_KICK, *ATTACK_REGION_MAGIC); + ATTACK(agent, 2, 0, Hash40::new("haver"), 14.0, 84, 90, 0, 52, 4.0, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_KICK, *ATTACK_REGION_MAGIC); } wait(lua_state, 4.0); if is_excute(agent) { @@ -124,8 +125,7 @@ unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { } frame(lua_state, 21.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("throw"), 12.0, 76, 90, 0, 50, 4.0, 0.0, 4.0, -6.0, Some(0.0), Some(4.0), Some(6.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("throw"), 12.0, 76, 90, 0, 50, 4.0, 0.0, 4.0, -12.0, Some(0.0), Some(4.0), Some(11.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("throw"), 12.0, 76, 90, 0, 50, 4.0, 0.0, 4.0, -12.0, Some(0.0), Some(4.0), Some(11.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_SWORD); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false); } wait(lua_state, 3.0); diff --git a/fighters/trail/src/acmd/specials.rs b/fighters/trail/src/acmd/specials.rs index dda9d5e251..adb46d27c9 100644 --- a/fighters/trail/src/acmd/specials.rs +++ b/fighters/trail/src/acmd/specials.rs @@ -109,15 +109,6 @@ unsafe extern "C" fn game_specialn2(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 50.0); - if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 4.5, 361, 60, 0, 30, 6.0, 0.0, 6.0, 1.0, Some(0.0), Some(6.0), Some(-1.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FREEZE, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("top"), 4.5, 361, 60, 0, 30, 3.0, 0.0, 6.0, 12.0, Some(0.0), Some(6.0), Some(-12.0), 0.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FREEZE, *ATTACK_REGION_SWORD); - } - wait(lua_state, 6.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - } frame(lua_state, 90.0); if is_excute(agent) { WorkModule::off_flag(boma, *FIGHTER_TRAIL_INSTANCE_WORK_ID_FLAG_MAGIC_SELECT_FORBID); @@ -190,70 +181,14 @@ unsafe extern "C" fn expression_specialn2(agent: &mut L2CAgentBase) { } } -// Now unused - unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - FT_MOTION_RATE(agent, 0.8); - frame(lua_state, 16.0); - FT_MOTION_RATE(agent, 1.0); -} - -unsafe extern "C" fn game_specialairs1(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 3.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); - ATTACK(agent, 0, 0, Hash40::new("haver"), 5.2, 72, 10, 0, 85, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 5.2, 72, 10, 0, 85, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - WorkModule::on_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - } - frame(lua_state, 11.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - //KineticModule::add_speed(boma, &Vector3f::new(-1.0, 0, 0.0)); - } - frame(lua_state, 13.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - } - frame(lua_state, 17.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } -} - -// Is now effectively Sonic Blade 1 - -unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - sv_kinetic_energy!( - set_accel, - agent, - FIGHTER_KINETIC_ENERGY_ID_GRAVITY, - 0.0 - ); - sv_kinetic_energy!( - set_speed, - agent, - FIGHTER_KINETIC_ENERGY_ID_GRAVITY, - 0.0 - ); - } frame(lua_state, 3.0); if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 120, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 120, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - WorkModule::on_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - let angle = WorkModule::get_float(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); - if angle == 0.0 || angle >= 180.0 { - GroundModule::correct(boma, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - } } frame(lua_state, 11.0); if is_excute(agent) { @@ -261,61 +196,32 @@ unsafe extern "C" fn game_specials2(agent: &mut L2CAgentBase) { KineticModule::add_speed(boma, &Vector3f::new(-0.5, 0.0, 0.0)); } frame(lua_state, 13.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - } - - // Ensure only specials2 comes out - WorkModule::set_int(boma, 4, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT); - if is_excute(agent) { notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); } } -unsafe extern "C" fn game_specialairs2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn game_specialairs1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - if is_excute(agent) { - sv_kinetic_energy!( - set_accel, - agent, - FIGHTER_KINETIC_ENERGY_ID_GRAVITY, - 0.0 - ); - sv_kinetic_energy!( - set_speed, - agent, - FIGHTER_KINETIC_ENERGY_ID_GRAVITY, - 0.0 - ); - } frame(lua_state, 3.0); if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE); ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 120, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 120, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - WorkModule::on_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - let angle = WorkModule::get_float(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); - if angle == 0.0 || angle >= 180.0 { - GroundModule::correct(boma, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - } } frame(lua_state, 11.0); if is_excute(agent) { AttackModule::clear_all(boma); - // KineticModule::add_speed(boma, &Vector3f::new(-0.5, 0, 0.0)); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); + KineticModule::add_speed(boma, &Vector3f::new(-1.0, 0.0, 0.0)); } frame(lua_state, 13.0); if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); } - - // Ensure only specials2 comes out - WorkModule::set_int(boma, 4, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT); } -unsafe extern "C" fn sound_specials2(agent: &mut L2CAgentBase) { +unsafe extern "C" fn sound_specials1(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; if is_excute(agent) { let rng = sv_math::rand(hash40("fighter"), 3) as i32; @@ -331,130 +237,6 @@ unsafe extern "C" fn sound_specials2(agent: &mut L2CAgentBase) { } } -unsafe extern "C" fn game_specials3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 3.0); - if is_excute(agent) { - let attack_num = WorkModule::get_param_int(boma, hash40("param_special_s"), hash40("attack_num")); - // New check since this ACMD script gets used for both the second and third Sonic Blades now. - if WorkModule::get_int(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT) < attack_num - 1 { - // For when you're *not* on the last rep. - if WorkModule::is_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_ATTACK_BUTTON){ - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - } - else{ - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - } - } - else { - // For when you *are* on the last rep. - if WorkModule::is_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_ATTACK_BUTTON){ - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - } - else{ - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - } - } - let angle = WorkModule::get_float(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); - if angle == 0.0 || angle >= 180.0 { - GroundModule::correct(boma, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - } - } - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - } - frame(lua_state, 11.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - KineticModule::add_speed(boma, &Vector3f::new(-0.5, 0.0, 0.0)); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } - frame(lua_state, 13.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - } -} - -unsafe extern "C" fn game_specialairs3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 3.0); - if is_excute(agent) { - let attack_num = WorkModule::get_param_int(boma, hash40("param_special_s"), hash40("attack_num")); - // New check since this ACMD script gets used for both the second and third Sonic Blades now. - if WorkModule::get_int(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT) < attack_num - 1 { - // For when you're *not* on the last rep. - if WorkModule::is_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_ATTACK_BUTTON){ - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - } - else{ - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_STAB, *ATTACK_REGION_SWORD); - } - } - else { - // For when you *are* on the last rep. - if WorkModule::is_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_ATTACK_BUTTON){ - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - } - else{ - ATTACK(agent, 0, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.2, 0.0, 4.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 8.0, 72, 10, 0, 80, 3.8, 0.0, -3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_CLEAVE_SINGLE, *ATTACK_REGION_SWORD); - } - } - let angle = WorkModule::get_float(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); - if angle == 0.0 || angle >= 180.0 { - GroundModule::correct(boma, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND)); - } - } - if is_excute(agent) { - WorkModule::on_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - } - frame(lua_state, 11.0); - if is_excute(agent) { - AttackModule::clear_all(boma); - //KineticModule::add_speed(boma, &Vector3f::new(-0.5, 0, 0.0)); - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ON_DROP); - } - frame(lua_state, 13.0); - if is_excute(agent) { - WorkModule::off_flag(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); - } -} - -unsafe extern "C" fn sound_specials3(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - frame(lua_state, 2.0); - let attack_num = WorkModule::get_param_int(boma, hash40("param_special_s"), hash40("attack_num")); - // New check since this ACMD script gets used for both the second and third Sonic Blades now. - if WorkModule::get_int(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT) < attack_num - 1 { - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_trail_special_s03")); - } - } - else { - if is_excute(agent) { - PLAY_SE(agent, Hash40::new("se_trail_special_s04")); - } - } -} - -unsafe extern "C" fn effect_specialsstart2(agent: &mut L2CAgentBase) { - let lua_state = agent.lua_state_agent; - let boma = agent.boma(); - if is_excute(agent) { - EFFECT(agent, Hash40::new("trail_sonic_turn"), Hash40::new("top"), 0, 10, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, true); - } -} - unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -706,6 +488,253 @@ unsafe extern "C" fn effect_specialairhi(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + FT_MOTION_RATE_RANGE(agent, 1.0, 21.0, 13.0); + frame(lua_state, 21.0); + FT_MOTION_RATE(agent, 0.5); + frame(lua_state, 22.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::trail::status::SPECIAL_LW_ENABLE_CONTROL); + ATTACK(agent, 0, 0, Hash40::new("rot"), 9.0, 75, 100, 150, 0, 4.5, 0.0, 1.0, 0.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + } + frame(lua_state, 30.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("rot"), 7.0, 75, 100, 100, 0, 4.5, 0.0, 1.0, 0.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + } + frame(lua_state, 40.0); + if is_excute(agent) { + CancelModule::enable_cancel(boma); + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + ATTACK(agent, 0, 0, Hash40::new("rot"), 5.0, 80, 100, 80, 0, 4.5, 0.0, 1.0, 0.25, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_BODY); + } + frame(lua_state, 61.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + FT_MOTION_RATE(agent, 0.875); + frame(lua_state, 80.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::trail::status::SPECIAL_LW_ENABLE_GRAVITY); + } +} + +unsafe extern "C" fn effect_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 3.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("trail_flow_launch"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("hip"), 0, 0, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("clavicler"), 0, 0, 0, 0, 0, 0, 1.5, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("claviclel"), 0, 0, 0, 0, 0, 0, 1.5, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("kneer"), 0, 0, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("kneel"), 0, 0, 0, 0, 0, 0, 1, true); + } + frame(lua_state, 20.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_v_smoke_a"), Hash40::new("top"), -1, 0, 0, 0, 0, 0, 0.85, 0, 0, 0, 0, 0, 0, false); + //EFFECT_OFF_KIND(agent, Hash40::new("sys_shield_smoke"),false,false); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_spark"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, true); + } + frame(lua_state, 21.0); + if is_excute(agent) { + //EFFECT_FOLLOW(agent, Hash40::new("trail_super_jump"), Hash40::new("rot"), 0.0,0.0,1.0, 30.0,0,0, 1.0, true); + //LAST_EFFECT_SET_SCALE_W(agent, 1.0, 1.5, 1.0); + //LAST_EFFECT_SET_COLOR(agent,1.0,0.0,1.0); + //LAST_PARTICLE_SET_COLOR(agent, 1.0,0.0,1.0); + } + frame(lua_state, 60.0); + for i in 0..11 { + if is_excute(agent) { + let alpha = (11.0-i as f32)/11.0; + LAST_EFFECT_SET_ALPHA(agent, alpha); + } + wait(lua_state, 1.0); + } + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("trail_aura"), false, false); + } +} + +unsafe extern "C" fn sound_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_trail_special_l01")); + } + frame(lua_state, 20.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_trail_special_l01_counter01")); + } +} + +unsafe extern "C" fn expression_speciallwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 3); + } + frame(lua_state, 20.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attackm"), 6, false, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + +unsafe extern "C" fn game_specialairlwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 16.0); + if is_excute(agent) { + notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); + } + frame(lua_state, 20.0); + for f in (20..34).step_by(3) { + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 1.6, 105, 20, 0, 20, 7.0, 0.0, 6.0, 0.0, None, None, None, 0.8, 0.6, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_NONE); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + wait(lua_state, 1.0); + } + frame(lua_state, 37.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("haver"), 12.0, 65, 65, 0, 80, 4.6, 0.0, 0.0, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 12.0, 65, 65, 0, 80, 4.6, 0.0, 6.2, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 12.0, 65, 65, 0, 80, 4.6, 0.0, 10.6, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + } + frame(lua_state, 38.0); + if is_excute(agent) { + VarModule::on_flag(agent.battle_object, vars::trail::status::SPECIAL_LW_AIR_FALL); + } + frame(lua_state, 41.0); + if is_excute(agent) { + AttackModule::clear(boma, 2, false); + ATTACK(agent, 0, 0, Hash40::new("haver"), 9.0, 65, 75, 0, 75, 4.6, 0.0, 0.0, -1.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 9.0, 65, 75, 0, 75, 4.6, 0.0, 2.0, 7.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + } + frame(lua_state, 60.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn effect_specialairlwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("hip"), 0, 0, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("clavicler"), 0, 0, 0, 0, 0, 0, 1.5, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("claviclel"), 0, 0, 0, 0, 0, 0, 1.5, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("kneer"), 0, 0, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_aura"), Hash40::new("kneel"), 0, 0, 0, 0, 0, 0, 1, true); + } + frame(lua_state, 15.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("trail_keyblade_flare"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_COLOR(agent, 5.0, 0.0, 3.0); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_spiral"), Hash40::new("top"), 0, 9, 0, 0, 0, 0, 1, true); + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_spiral2"), Hash40::new("top"), 0, 9, 0, 0, 0, 0, 0.5, true); + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("haver"), 0, 5, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); + LAST_EFFECT_SET_RATE(agent, 10.0/13.0); + } + frame(lua_state, 36.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("trail_flow_spark"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, true); + AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_trail_flow"), Hash40::new("tex_trail_keyblade2"), 14, Hash40::new("haver"), 0, 2, 0, Hash40::new("haver"), 0, 13.8, 0, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); + } + frame(lua_state, 65.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("trail_aura"), false, false); + EFFECT_OFF_KIND(agent, Hash40::new("trail_keyblade_flare"), false, true); + AFTER_IMAGE_OFF(agent, 3); + } +} + +unsafe extern "C" fn sound_specialairlwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 5.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_trail_special_l02_01")); + } + frame(lua_state, 37.0); + if is_excute(agent) { + } +} + +unsafe extern "C" fn expression_specialairlwstart(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 3); + } + frame(lua_state, 37.0); + if is_excute(agent) { + ControlModule::set_rumble(boma, Hash40::new("rbkind_attackm"), 6, false, *BATTLE_OBJECT_ID_INVALID as u32); + } +} + +unsafe extern "C" fn game_specialairlwrebound(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 1.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_L); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 38, 82, 0, 54, 4.7, 0.0, 3.6, -9.2, Some(0.0), Some(3.6), Some(13.2), 0.6, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_NONE); + } + frame(lua_state, 3.0); + FT_MOTION_RATE_RANGE(agent, 3.0, 38.0, 25.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } + frame(lua_state, 38.0); // 27 frames of landing lag + FT_MOTION_RATE(agent, 1.0); +} + +unsafe extern "C" fn effect_specialairlwrebound(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("trail_flow_shockwave"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + LANDING_EFFECT(agent, Hash40::new("trail_flow_shockwave2"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, false); + } +} + +unsafe extern "C" fn sound_specialairlwrebound(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_trail_special_l02_02")); + } +} + +unsafe extern "C" fn expression_specialairlwrebound(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + ItemModule::set_have_item_visibility(boma, false, 0); + ControlModule::set_rumble(boma, Hash40::new("rbkind_lands"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); + } + frame(lua_state, 45.0); + if is_excute(agent) { + ItemModule::set_have_item_visibility(boma, true, 0); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_specialn3", game_specialn3, Priority::Low); agent.acmd("game_specialairn3", game_specialairn3, Priority::Low); @@ -720,27 +749,27 @@ pub fn install(agent: &mut Agent) { agent.acmd("expression_specialairn2", expression_specialn2, Priority::Low); agent.acmd("game_specials1", game_specials1, Priority::Low); + agent.acmd("sound_specials1", sound_specials1, Priority::Low); agent.acmd("game_specialairs1", game_specialairs1, Priority::Low); + agent.acmd("sound_specialairs1", sound_specials1, Priority::Low); - agent.acmd("game_specials2", game_specials2, Priority::Low); - agent.acmd("game_specialairs2", game_specialairs2, Priority::Low); - agent.acmd("sound_specials2", sound_specials2, Priority::Low); - agent.acmd("sound_specialairs2", sound_specials2, Priority::Low); - - agent.acmd("game_specials3", game_specials3, Priority::Low); - agent.acmd("game_specialairs3", game_specialairs3, Priority::Low); - agent.acmd("sound_specials3", sound_specials3, Priority::Low); - agent.acmd("sound_specialairs3", sound_specials3, Priority::Low); - - agent.acmd("effect_specialsstart2", effect_specialsstart2, Priority::Low); - agent.acmd("effect_specialairsstart2", effect_specialsstart2, Priority::Low); - agent.acmd("effect_specialsup", effect_specialsstart2, Priority::Low); - agent.acmd("effect_specialairsup", effect_specialsstart2, Priority::Low); - agent.acmd("effect_specialsdown", effect_specialsstart2, Priority::Low); - agent.acmd("effect_specialairsdown", effect_specialsstart2, Priority::Low); - agent.acmd("game_specialhi", game_specialhi, Priority::Low); agent.acmd("effect_specialhi", effect_specialhi, Priority::Low); agent.acmd("game_specialairhi", game_specialhi, Priority::Low); agent.acmd("effect_specialairhi", effect_specialairhi, Priority::Low); -} + + agent.acmd("game_speciallwstart", game_speciallwstart, Priority::Low); + agent.acmd("effect_speciallwstart", effect_speciallwstart, Priority::Low); + agent.acmd("sound_speciallwstart", sound_speciallwstart, Priority::Low); + agent.acmd("expression_speciallwstart", expression_speciallwstart, Priority::Low); + + agent.acmd("game_specialairlwstart", game_specialairlwstart, Priority::Low); + agent.acmd("effect_specialairlwstart", effect_specialairlwstart, Priority::Low); + agent.acmd("sound_specialairlwstart", sound_specialairlwstart, Priority::Low); + agent.acmd("expression_specialairlwstart", expression_specialairlwstart, Priority::Low); + + agent.acmd("game_specialairlwrebound", game_specialairlwrebound, Priority::Low); + agent.acmd("effect_specialairlwrebound", effect_specialairlwrebound, Priority::Low); + agent.acmd("sound_specialairlwrebound", sound_specialairlwrebound, Priority::Low); + agent.acmd("expression_specialairlwrebound", expression_specialairlwrebound, Priority::Low); +} \ No newline at end of file diff --git a/fighters/trail/src/acmd/throws.rs b/fighters/trail/src/acmd/throws.rs index 2b00f42846..698e4d3ae9 100644 --- a/fighters/trail/src/acmd/throws.rs +++ b/fighters/trail/src/acmd/throws.rs @@ -4,16 +4,15 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); frame(lua_state, 1.0); - FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 5.0); - FT_MOTION_RATE(agent, 1.0); - frame(lua_state, 8.0); + FT_MOTION_RATE(agent, 0.5); if is_excute(agent) { GrabModule::set_rebound(boma, true); } + frame(lua_state, 5.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(9.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -61,7 +60,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -4.6, Some(0.0), Some(6.6), Some(-11.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 6.6, -6.0, Some(0.0), Some(6.6), Some(-11.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -76,7 +75,7 @@ unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 11.0, 44, 84, 0, 56, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 10.0, 55, 65, 0, 70, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 11.0); diff --git a/fighters/trail/src/acmd/tilts.rs b/fighters/trail/src/acmd/tilts.rs index 45598e4872..962be48a75 100644 --- a/fighters/trail/src/acmd/tilts.rs +++ b/fighters/trail/src/acmd/tilts.rs @@ -5,13 +5,20 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.5); - frame(lua_state, 6.0); if VarModule::is_flag(agent.battle_object, vars::trail::instance::ATTACK_12_ENABLE_S3_COMBO) { + frame(lua_state, 6.0); FT_MOTION_RATE(agent, 0.3); + frame(lua_state, 13.0); } else { + frame(lua_state, 6.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 11.0); + FT_MOTION_RATE_RANGE(agent, 11.0, 12.5, 1.0); + frame(lua_state, 12.5); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 13.0); FT_MOTION_RATE(agent, 1.0); } - frame(lua_state, 13.0); if is_excute(agent) { if VarModule::is_flag(agent.battle_object, vars::trail::instance::ATTACK_12_ENABLE_S3_COMBO) { // Jab 2 -> Ftilt cancel @@ -59,9 +66,6 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); EFFECT_FOLLOW(agent, Hash40::new("trail_keyblade_flare"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, true); - } - frame(lua_state, 13.0); - if is_excute(agent) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_trail_keyblade_hdr"), Hash40::new("tex_trail_keyblade2"), 7, Hash40::new("haver"), 0, 2, 0, Hash40::new("haver"), 0, 13.8, 0, true, Hash40::new("null"), Hash40::new("haver"), 0, 0, 0, 0, 0, 0, 1, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.4, 0.2); } frame(lua_state, 19.0); @@ -196,14 +200,22 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { frame(lua_state, 33.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("haver"), 4.5, 86, 132, 0, 52, 3.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("haver"), 4.5, 86, 132, 0, 52, 3.8, 0.0, 4.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("haver"), 4.5, 86, 132, 0, 52, 3.8, 0.0, 9.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("haver"), 5.0, 81, 135, 0, 55, 3.8, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("haver"), 5.0, 81, 135, 0, 55, 3.8, 0.0, 4.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("haver"), 5.0, 81, 135, 0, 55, 3.8, 0.0, 9.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_TRAIL_SLASH, *ATTACK_REGION_SWORD); } frame(lua_state, 37.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 38.0); + if is_excute(agent) { + FT_MOTION_RATE(agent, 1.75); + } + frame(lua_state, 41.0); + if is_excute(agent) { + FT_MOTION_RATE(agent, 1.0); + } } unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { @@ -292,4 +304,4 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_attacklw3", game_attacklw3, Priority::Low); agent.acmd("effect_attacklw3", effect_attacklw3, Priority::Low); -} \ No newline at end of file +} diff --git a/fighters/trail/src/lib.rs b/fighters/trail/src/lib.rs index ed7f72e4d1..f18b97d6b1 100644 --- a/fighters/trail/src/lib.rs +++ b/fighters/trail/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/trail/src/opff.rs b/fighters/trail/src/opff.rs index b9da5659cf..cf130195ad 100644 --- a/fighters/trail/src/opff.rs +++ b/fighters/trail/src/opff.rs @@ -18,23 +18,15 @@ unsafe fn jab_2_ftilt_cancel(boma: &mut BattleObjectModuleAccessor) { } // lets sora bounce upwards upon landing down smash -unsafe fn attack_lw4_rebound(boma: &mut BattleObjectModuleAccessor, frame: f32) { +unsafe fn attack_lw4_rebound(boma: &mut BattleObjectModuleAccessor) { if boma.is_status(*FIGHTER_STATUS_KIND_ATTACK_LW4) - && (19.0..20.5).contains(&frame) - && AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) - { + && (18.0..20.0).contains(&boma.motion_frame()) + && AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) { VarModule::on_flag(boma.object(), vars::trail::instance::ATTACK_LW4_REBOUND); KineticModule::clear_speed_energy_id(boma, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); KineticModule::add_speed(boma, &Vector3f::new(0.0, 1.5, 0.0)); boma.change_status_req(*FIGHTER_STATUS_KIND_CLIFF_JUMP2, true); } - // set proper params for the bounce off - if boma.is_status(*FIGHTER_STATUS_KIND_CLIFF_JUMP2) - && VarModule::is_flag(boma.object(), vars::trail::instance::ATTACK_LW4_REBOUND) { - VarModule::off_flag(boma.object(), vars::trail::instance::ATTACK_LW4_REBOUND); - MotionModule::set_rate(boma, 1.65); - KineticModule::mul_speed(boma, &Vector3f::new(0.0, 0.5, 0.0), *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - } } unsafe fn nair_fair_momentum_handling(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { @@ -87,7 +79,7 @@ unsafe fn nair_fair_momentum_handling(fighter: &mut smash::lua2cpp::L2CFighterCo } } -unsafe fn magic_handling(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, frame: f32) { +unsafe fn magic_handling(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { // firaga airdodge cancel if boma.is_status(*FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N1_SHOOT) && boma.is_motion(Hash40::new("special_air_n1")) @@ -102,7 +94,7 @@ unsafe fn magic_handling(fighter: &mut L2CFighterCommon, boma: &mut BattleObject // blizzaga jump cancel if (boma.is_status(*FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N2) && boma.motion_frame() > 12.0) { - boma.check_jump_cancel(false, false); + boma.check_jump_cancel(false, false, false); } // handles the cooldown timer between casting spells @@ -154,110 +146,11 @@ unsafe fn flower_frame(boma: &mut BattleObjectModuleAccessor) { } } -unsafe fn side_special_actionability(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status(*FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END) { - if MotionModule::frame(boma) > MotionModule::end_frame(boma) - 1.0 { - boma.change_status_req(*FIGHTER_STATUS_KIND_FALL, true); - } - } -} - -unsafe fn side_special_hit_check(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { - if !fighter.is_status_one_of(&[ - *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_ATTACK, - *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_SEARCH, - *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END]) { - return; - } - if fighter.is_status(*FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_ATTACK) { - if !VarModule::is_flag(boma.object(), vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT) { - VarModule::on_flag(boma.object(), vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); - } - if fighter.global_table[CURRENT_FRAME].get_i32() == 1 { - VarModule::off_flag(boma.object(), vars::trail::status::SPECIAL_S_HIT); - VarModule::off_flag(boma.object(), vars::trail::status::SPECIAL_S_STOP); - } - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_HIT) - && !fighter.is_in_hitlag() - && (WorkModule::get_param_int(boma, hash40("param_special_s"), hash40("attack_num")) - 1) > WorkModule::get_int(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT) { - VarModule::on_flag(boma.object(), vars::trail::status::SPECIAL_S_HIT); - if fighter.check_jump_cancel(false, false) { - let x_speed = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - VarModule::set_float(boma.object(), vars::trail::instance::SPECIAL_S_JUMP_SPEED_X, x_speed); - return; - } - } - if AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_SHIELD) { - VarModule::on_flag(boma.object(), vars::trail::status::SPECIAL_S_STOP); - } - } - if fighter.is_status(*FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_SEARCH) { - if fighter.global_table[CURRENT_FRAME].get_i32() == 1 { - VarModule::off_flag(boma.object(), vars::trail::status::SPECIAL_S_INPUT_CHECK); - } - if compare_mask(ControlModule::get_command_flag_cat(boma, 0), *FIGHTER_PAD_CMD_CAT1_FLAG_SPECIAL_ANY) { - VarModule::on_flag(boma.object(), vars::trail::status::SPECIAL_S_INPUT_CHECK); - } - if VarModule::is_flag(boma.object(), vars::trail::status::SPECIAL_S_HIT) - && WorkModule::get_param_int(boma, hash40("param_special_s"), hash40("attack_num")) > WorkModule::get_int(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT) { - if fighter.check_jump_cancel(false, false) { - return; - } - } - } - if fighter.is_status(*FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END) { - // allow jump cancel if sora hit during the attack portion - if VarModule::is_flag(boma.object(), vars::trail::status::SPECIAL_S_HIT) - && fighter.check_jump_cancel(false, false) { - let x_speed = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); - VarModule::set_float(boma.object(), vars::trail::instance::SPECIAL_S_JUMP_SPEED_X, x_speed); - return; - } - - if !VarModule::is_flag(boma.object(), vars::trail::status::SPECIAL_S_STOP) - && WorkModule::get_param_int(boma, hash40("param_special_s"), hash40("attack_num")) > WorkModule::get_int(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT) - && fighter.global_table[CURRENT_FRAME].get_i32() == 15 { - VarModule::off_flag(boma.object(), vars::trail::status::SPECIAL_S_STOP); - if fighter.is_situation(*SITUATION_KIND_GROUND) { - fighter.change_status_req(*FIGHTER_STATUS_KIND_WAIT, false); - } - else { - fighter.change_status_req(*FIGHTER_STATUS_KIND_FALL, false); - } - return; - } - } -} - -// wall jump out of sonic blade -unsafe fn side_special_walljump(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status_one_of(&[ - // *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_ATTACK, - *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END]) - && boma.is_situation(*SITUATION_KIND_AIR) { - boma.check_wall_jump_cancel(); - } -} - -// remove arrow effect from sonic blade once sora begins the attack -unsafe fn side_special_effect_handler(boma: &mut BattleObjectModuleAccessor) { - if boma.is_status_one_of(&[*FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_ATTACK, *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END]) { - let effect = WorkModule::get_int(boma, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_GUIDE_EFFECT_HANDLE) as u32; - if effect != 0 { - EffectModule::kill(boma, effect, true, true); - WorkModule::set_int(boma, 0, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_GUIDE_EFFECT_HANDLE); - } - } -} - unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) - && ( fighter.is_status_one_of(&[ - *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N3, - *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END - ]) - || (fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) && fighter.status_frame() > 10) ) + && (fighter.is_status(*FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N3) + || (fighter.is_status(*FIGHTER_STATUS_KIND_SPECIAL_HI) && fighter.status_frame() > 10)) && fighter.is_situation(*SITUATION_KIND_AIR) { fighter.sub_air_check_dive(); } @@ -278,16 +171,12 @@ pub unsafe fn initialize_magic(fighter: &mut L2CFighterCommon) { // } } -pub unsafe fn moveset(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { +pub unsafe fn moveset(fighter: &mut smash::lua2cpp::L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) { jab_2_ftilt_cancel(boma); nair_fair_momentum_handling(fighter, boma); - attack_lw4_rebound(boma, frame); - magic_handling(fighter, boma, frame); + attack_lw4_rebound(boma); + magic_handling(fighter, boma); flower_frame(boma); - side_special_actionability(boma); - side_special_hit_check(fighter, boma); - side_special_walljump(boma); - side_special_effect_handler(boma); fastfall_specials(fighter); initialize_magic(fighter); } @@ -306,7 +195,7 @@ pub unsafe fn trail_frame(fighter: &mut smash::lua2cpp::L2CFighterCommon) { // } else { // info.status_kind // }; - moveset(fighter, &mut *info.boma, info.id, info.cat, info.status_kind, info.situation_kind, info.motion_kind.hash, info.stick_x, info.stick_y, info.facing, info.frame); + moveset(fighter, &mut *info.boma); } } diff --git a/fighters/trail/src/status/special_lw.rs b/fighters/trail/src/status/special_lw.rs index 9a99e2d00b..20f6f4a3ea 100644 --- a/fighters/trail/src/status/special_lw.rs +++ b/fighters/trail/src/status/special_lw.rs @@ -1,18 +1,44 @@ use super::*; -unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { +const FIGHTER_TRAIL_STATUS_SPECIAL_AIR_LW_FLAG_FALLING: i32 = 0x21000014; + +const FIGHTER_TRAIL_STATUS_SPECIAL_LW_FLAG_IS_JUMPING: i32 = 0x21000016; +const FIGHTER_TRAIL_STATUS_SPECIAL_LW_FLAG_IS_CONTROL_ENABLED: i32 = 0x21000018; + +const JUMP_MUL: f32 = 1.0; +const JUMP_ANGLE: f32 = 0.0; +const JUMP_STICK_BASE: f32 = 0.75; +const JUMP_STICK_MUL: f32 = 0.75; +const JUMP_CONTROL_ACCEL_MUL: f32 = 0.25; +const JUMP_CONTROL_MAX_MUL: f32 = 1.0; +const JUMP_FALL_GRAVITY_MUL: f32 = 0.5; +const JUMP_FALL_STABLE_MUL: f32 = 1.0; + +const AIR_FALL_SPEED_X: f32 = 0.0; +const AIR_FALL_SPEED_Y: f32 = -3.5; +//const AIR_LANDING_LAG: f32 = 27.0; + +pub unsafe extern "C" fn speciallw_main(fighter: &mut smashline::L2CFighterCommon) -> smashline::L2CValue { + if StatusModule::situation_kind(fighter.module_accessor) == *SITUATION_KIND_AIR { + return speciallw_air_main(fighter); + } + return speciallw_ground_main(fighter); +} + +pub unsafe extern "C" fn speciallw_pre(fighter: &mut L2CFighterCommon) -> L2CValue { StatusModule::init_settings( fighter.module_accessor, - app::SituationKind(*SITUATION_KIND_NONE), + SituationKind(*SITUATION_KIND_NONE), *FIGHTER_KINETIC_TYPE_UNIQ, *GROUND_CORRECT_KIND_KEEP as u32, - app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), true, *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLOAT, 0 ); + FighterStatusModuleImpl::set_fighter_status_data( fighter.module_accessor, false, @@ -21,14 +47,343 @@ unsafe extern "C" fn special_lw_pre(fighter: &mut L2CFighterCommon) -> L2CValue false, false, (*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_LW | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64, - *FIGHTER_STATUS_ATTR_START_TURN as u32, - *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW as u32, + (*FIGHTER_STATUS_ATTR_START_TURN as u32), //important b-reverse part + (*FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_LW) as u32, + 0 + ); + 0.into() +} +/* +GROUND +*/ +pub unsafe extern "C" fn speciallw_ground_main(fighter: &mut smashline::L2CFighterCommon) -> smashline::L2CValue { + WorkModule::off_flag(fighter.module_accessor, FIGHTER_TRAIL_STATUS_SPECIAL_LW_FLAG_IS_JUMPING); + + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR_ANGLE); + KineticModule::suspend_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + sv_kinetic_energy!( + set_speed_mul_2nd, + fighter, + FIGHTER_KINETIC_ENERGY_ID_MOTION, + 1.0, + JUMP_MUL + ); + sv_kinetic_energy!( + set_angle, + fighter, + FIGHTER_KINETIC_ENERGY_ID_MOTION, + (-JUMP_ANGLE).to_radians() + ); + + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_lw_start"), 0.0, 1.0, false, 0.0, false, false); + + fighter.sub_shift_status_main(L2CValue::Ptr( speciallw_ground_main_loop as *const () as _)) +} + +unsafe extern "C" fn speciallw_handle_angle(fighter: &mut L2CFighterCommon){ + let stick_min = 0.25; + let mut stick_x = ControlModule::get_stick_x(fighter.module_accessor); + let lr = PostureModule::lr(fighter.module_accessor); + let mut is_reverse = stick_x.signum() != lr; + if stick_x.abs() <= 0.25 { + stick_x = 0.0; + is_reverse = false; + } + let mut angle = JUMP_STICK_MUL*stick_x; + angle += JUMP_STICK_BASE*lr; + + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP); + + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + angle + ); + sv_kinetic_energy!( + set_stable_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + 0.0 + ); +} + +unsafe extern "C" fn speciallw_start_control(fighter: &mut L2CFighterCommon) { + WorkModule::on_flag(fighter.module_accessor, FIGHTER_TRAIL_STATUS_SPECIAL_LW_FLAG_IS_CONTROL_ENABLED); + StatusModule::set_keep_situation_air(fighter.module_accessor, false); + let speed_x = KineticModule::get_sum_speed_x(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + + sv_kinetic_energy!( + set_brake, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + 0.01 + ); + sv_kinetic_energy!( + set_angle, + fighter, + FIGHTER_KINETIC_ENERGY_ID_MOTION, + 0.0 + ); + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, + speed_x, + 0.0, + 0.0, + 0.0, + 0.0 + ); + + //I hate that I gotta do all this... + let air_accel_x_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_mul"), 0); + let air_accel_x_add = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_x_add"), 0); + let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); + KineticModule::resume_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + sv_kinetic_energy!( + controller_set_accel_x_mul, + fighter, + air_accel_x_mul * JUMP_CONTROL_ACCEL_MUL + ); + sv_kinetic_energy!( + controller_set_accel_x_add, + fighter, + air_accel_x_add * JUMP_CONTROL_ACCEL_MUL + ); + sv_kinetic_energy!( + set_limit_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + air_speed_x_stable * JUMP_CONTROL_MAX_MUL, + 0.0 + ); + sv_kinetic_energy!( + set_stable_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + air_speed_x_stable * JUMP_CONTROL_MAX_MUL, + 0.0 + ); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); +} + +unsafe extern "C" fn speciallw_start_gravity(fighter: &mut L2CFighterCommon) { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + let air_speed_y_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_y_stable"), 0); + let fall_speed_y = WorkModule::get_param_float(fighter.module_accessor, hash40("air_accel_y"), 0); + sv_kinetic_energy!( + set_accel, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + -fall_speed_y*JUMP_FALL_GRAVITY_MUL + ); + sv_kinetic_energy!( + set_stable_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + air_speed_y_stable*JUMP_FALL_STABLE_MUL + ); +} + +unsafe extern "C" fn speciallw_ground_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + let motion_y: f32 = MotionModule::trans_move_speed(fighter.module_accessor).y(); + let speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let sit = StatusModule::situation_kind(fighter.module_accessor); + + //Check for jump + if !WorkModule::is_flag(fighter.module_accessor, FIGHTER_TRAIL_STATUS_SPECIAL_LW_FLAG_IS_JUMPING) { + if motion_y > 0.0 { + WorkModule::on_flag(fighter.module_accessor, FIGHTER_TRAIL_STATUS_SPECIAL_LW_FLAG_IS_JUMPING); + let lr = PostureModule::lr(fighter.module_accessor); + /* + sv_kinetic_energy!( + set_angle, + fighter, + FIGHTER_KINETIC_ENERGY_ID_MOTION, + (-30.0f32).to_radians()*lr + ); + */ + + let jump_count_max = WorkModule::get_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT_MAX); + WorkModule::set_int(fighter.module_accessor, jump_count_max, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + + fighter.set_situation(SITUATION_KIND_AIR.into()); + StatusModule::set_keep_situation_air(fighter.module_accessor, true); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + return 0.into(); + } + //Jumping loop... + + if !WorkModule::is_flag(fighter.module_accessor, FIGHTER_TRAIL_STATUS_SPECIAL_LW_FLAG_IS_CONTROL_ENABLED) { + //speciallw_handle_angle(fighter); + if VarModule::is_flag(fighter.battle_object,vars::trail::status::SPECIAL_LW_ENABLE_CONTROL) { + speciallw_start_control(fighter); + } + } + if VarModule::is_flag(fighter.battle_object, vars::trail::status::SPECIAL_LW_ENABLE_GRAVITY) { + if VarModule::is_flag(fighter.battle_object,vars::trail::status::SPECIAL_LW_ENABLE_CONTROL) { + VarModule::off_flag(fighter.battle_object, vars::trail::status::SPECIAL_LW_ENABLE_GRAVITY); + speciallw_start_gravity(fighter); + } + } + + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + // if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN) > 0.0 { + // KineticModule::mul_speed(fighter.module_accessor, &Vector3f::new(1.0, 0.8, 1.0), *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + // } + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) || StatusModule::situation_kind(fighter.module_accessor) == *SITUATION_KIND_GROUND { + //Maybe add landing lag here? + fighter.change_status_by_situation(FIGHTER_STATUS_KIND_LANDING.into(), FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 1.into(); + } + 0.into() +} + +/* +AIR +*/ +pub unsafe extern "C" fn speciallw_air_main(fighter: &mut smashline::L2CFighterCommon) -> smashline::L2CValue { + if StatusModule::situation_kind(fighter.module_accessor) != *SITUATION_KIND_AIR { + return smashline::original_status(Main, fighter, *FIGHTER_STATUS_KIND_SPECIAL_S)(fighter); + } + + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + KineticModule::clear_speed_all(fighter.module_accessor); + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + ENERGY_STOP_RESET_TYPE_FREE, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ); + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw_start"), 0.0, 1.0, false, 0.0, false, false); + fighter.sub_shift_status_main(L2CValue::Ptr( speciallw_air_main_loop as *const () as _)) +} + +unsafe extern "C" fn speciallw_air_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + + if VarModule::is_flag(fighter.battle_object,vars::trail::status::SPECIAL_LW_AIR_FALL) { + if !KineticModule::get_kinetic_type(fighter.module_accessor) != *FIGHTER_KINETIC_TYPE_FALL { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL); + } + KineticModule::unable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + + let mut gravity_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) as *mut app::FighterKineticEnergyGravity; + smash::app::lua_bind::FighterKineticEnergyGravity::set_speed(gravity_energy, AIR_FALL_SPEED_Y); + smash::app::lua_bind::FighterKineticEnergyGravity::set_accel(gravity_energy, 0.0); + + WorkModule::on_flag(fighter.module_accessor, FIGHTER_TRAIL_STATUS_SPECIAL_AIR_LW_FLAG_FALLING); + } + + if CancelModule::is_enable_cancel(fighter.module_accessor) + && WorkModule::is_flag(fighter.module_accessor, FIGHTER_TRAIL_STATUS_SPECIAL_AIR_LW_FLAG_FALLING) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) || + (WorkModule::is_flag(fighter.module_accessor, FIGHTER_TRAIL_STATUS_SPECIAL_AIR_LW_FLAG_FALLING) + && StatusModule::situation_kind(fighter.module_accessor) == *SITUATION_KIND_GROUND) + { + //Maybe add landing lag here? Or maybe go into a different status? + fighter.change_status_by_situation(statuses::trail::SPECIAL_LW_LANDING.into(), FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 1.into(); + } + 0.into() +} + +pub unsafe extern "C" fn speciallw_landing_pre(fighter: &mut L2CFighterCommon) -> L2CValue { + StatusModule::init_settings( + fighter.module_accessor, + app::SituationKind(*SITUATION_KIND_GROUND), + *FIGHTER_KINETIC_TYPE_MOTION, + *GROUND_CORRECT_KIND_GROUND as u32, + app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE), + true, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG, + *FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_INT, + *FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT, 0 ); - return 0.into(); + FighterStatusModuleImpl::set_fighter_status_data( + fighter.module_accessor, + false, + *FIGHTER_TREADED_KIND_NO_REAC, + false, + false, + false, + 0, + 0, + *FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32, + 0 + ); + 0.into() +} +pub unsafe extern "C" fn speciallw_landing_main(fighter: &mut L2CFighterCommon) -> L2CValue { + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_FORCE_LOUPE); + + //calculate landing frame? + //let motion = hash40(); + //let landing_rate = fighter.sub_get_landing_motion_rate(motion.into(),AIR_LANDING_LAG.into()).get_f32(); + + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_air_lw_rebound"), 0.0, 1.0, false, 0.0, false, false); + + fighter.sub_shift_status_main(L2CValue::Ptr(speciallw_landing_main_loop as *const () as _)) +} +pub unsafe extern "C" fn speciallw_landing_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 1.into(); + } + } + if MotionModule::is_end(fighter.module_accessor) { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + return 1.into(); + } + if !StatusModule::is_changing(fighter.module_accessor) && + StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_status_by_situation(FIGHTER_STATUS_KIND_WAIT.into(), FIGHTER_STATUS_KIND_FALL.into(), false.into()); + } + + 0.into() +} +pub unsafe extern "C" fn speciallw_landing_end(fighter: &mut L2CFighterCommon) -> L2CValue { + 0.into() } -pub fn install(agent: &mut Agent) { - agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, special_lw_pre); +pub fn install(agent: &mut smashline::Agent) { + agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_LW, speciallw_main); + + agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_LW, speciallw_pre); + agent.status(Pre, statuses::trail::SPECIAL_LW_LANDING, speciallw_landing_pre); + agent.status(Main, statuses::trail::SPECIAL_LW_LANDING, speciallw_landing_main); + agent.status(End, statuses::trail::SPECIAL_LW_LANDING, speciallw_landing_end); } \ No newline at end of file diff --git a/fighters/trail/src/status/special_n.rs b/fighters/trail/src/status/special_n.rs index 83a9d317f0..2bd95df7e4 100644 --- a/fighters/trail/src/status/special_n.rs +++ b/fighters/trail/src/status/special_n.rs @@ -207,6 +207,7 @@ unsafe extern "C" fn special_n1_end_end(fighter: &mut L2CFighterCommon) -> L2CVa } unsafe extern "C" fn special_n2_end(fighter: &mut L2CFighterCommon) -> L2CValue { + ArticleModule::remove_exist(fighter.module_accessor, *FIGHTER_TRAIL_GENERATE_ARTICLE_FLOWER, app::ArticleOperationTarget(0)); WorkModule::on_flag(fighter.module_accessor, *FIGHTER_TRAIL_INSTANCE_WORK_ID_FLAG_MAGIC_SELECT_FORBID); WorkModule::off_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_N2_FLAG_CHANGE_MAGIC); VarModule::set_int(fighter.battle_object, vars::trail::instance::SPECIAL_N_MAGIC_TIMER, MAGIC_COOLDOWN_FRAME); diff --git a/fighters/trail/src/status/special_s.rs b/fighters/trail/src/status/special_s.rs index fc86eeabb3..0aa0dd9baa 100644 --- a/fighters/trail/src/status/special_s.rs +++ b/fighters/trail/src/status/special_s.rs @@ -37,15 +37,14 @@ unsafe extern "C" fn special_s_main(fighter: &mut L2CFighterCommon) -> L2CValue VarModule::on_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT); fighter.sub_change_motion_by_situation(Hash40::new("special_s_start").into(), Hash40::new("special_air_s_start").into(), false.into()); fighter.sub_set_special_start_common_kinetic_setting(hash40("param_special_s").into()); - WorkModule::set_int(fighter.module_accessor, 1, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT); - WorkModule::set_int(fighter.module_accessor, *BATTLE_OBJECT_ID_INVALID, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_TARGET_ID); VarModule::on_flag(fighter.battle_object, vars::common::status::ENABLE_SPECIAL_WALLJUMP); fighter.sub_shift_status_main(L2CValue::Ptr(special_s_main_loop as *const () as _)) } unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { - trail_special_s_set_angle_guide(fighter); + let effect = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_GUIDE_EFFECT_HANDLE); + special_s_set_angle_guide(fighter, effect.into(), FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_GUIDE_EFFECT_HANDLE.into()); if MotionModule::is_end(fighter.module_accessor) { fighter.change_status(FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_ATTACK.into(), false.into()); return 0.into(); @@ -58,8 +57,8 @@ unsafe extern "C" fn special_s_main_loop(fighter: &mut L2CFighterCommon) -> L2CV 0.into() } -unsafe extern "C" fn trail_special_s_set_angle_guide(fighter: &mut L2CFighterCommon) { - let effect = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_GUIDE_EFFECT_HANDLE) as u32; +unsafe extern "C" fn special_s_set_angle_guide(fighter: &mut L2CFighterCommon, eff_handle: L2CValue, angle_const: L2CValue) { + let effect = eff_handle.get_u32(); let stick_x = ControlModule::get_stick_x(fighter.module_accessor); let stick_y = ControlModule::get_stick_y(fighter.module_accessor); let vector = fighter.Vector2__create(stick_x.into(), stick_y.into()); @@ -70,7 +69,7 @@ unsafe extern "C" fn trail_special_s_set_angle_guide(fighter: &mut L2CFighterCom if effect == 0 { return; } - angle = WorkModule::get_float(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); + angle = WorkModule::get_float(fighter.module_accessor, angle_const.get_i32()); } else { let mut degrees = vector["y"].get_f32().atan2(vector["x"].get_f32()).to_degrees(); @@ -92,7 +91,7 @@ unsafe extern "C" fn trail_special_s_set_angle_guide(fighter: &mut L2CFighterCom WorkModule::set_float(fighter.module_accessor, angle, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); WorkModule::on_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_STICK); } - let guide_pos = trail_special_s_get_guide_pos(fighter, angle.into()); + let guide_pos = special_s_get_guide_pos(fighter, angle.into()); if effect != 0 { EffectModule::set_pos(fighter.module_accessor, effect, &Vector3f{x: guide_pos.x, y: guide_pos.y, z: 0.0}); EffectModule::set_rot(fighter.module_accessor, effect, &Vector3f{x: 0.0, y: 0.0, z: angle - 90.0}); @@ -117,7 +116,7 @@ unsafe extern "C" fn trail_special_s_set_angle_guide(fighter: &mut L2CFighterCom } } -unsafe extern "C" fn trail_special_s_get_guide_pos(fighter: &mut L2CFighterCommon, angle: L2CValue) -> Vector2f { +unsafe extern "C" fn special_s_get_guide_pos(fighter: &mut L2CFighterCommon, angle: L2CValue) -> Vector2f { let pos = PostureModule::pos(fighter.module_accessor); let rad = angle.get_f32().to_radians(); let scale = PostureModule::scale(fighter.module_accessor); @@ -130,6 +129,49 @@ unsafe extern "C" fn trail_special_s_get_guide_pos(fighter: &mut L2CFighterCommo Vector2f{x: x_pos, y: y_pos} } +pub unsafe extern "C" fn special_s_set_joint_rotate(fighter: &mut L2CFighterCommon, angle: L2CValue, param_3: L2CValue) { + let lr = PostureModule::lr(fighter.module_accessor); + let mut angle = angle.get_f32(); + + if lr == -1.0 { + angle = 180.0 - angle; + } + + if angle > 180.0 { + angle = angle - 360.0; + } + + if param_3.get_f32() < 1.0 { + angle = fighter.lerp(0.0_f32.into(), angle.into(), param_3).get_f32(); + } + + ModelModule::set_joint_rotate( + fighter.module_accessor, + Hash40::new("rot"), + &Vector3f{x: -angle, y: 0.0, z: 0.0}, + MotionNodeRotateCompose { _address: 0 }, + MotionNodeRotateOrder { _address: 0 } + ); +} + +pub unsafe extern "C" fn special_s_set_cursor_on_posture(fighter: &mut L2CFighterCommon) { + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_CURSOR_ON_POSTURE); + let cursor_offset_y = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("cursor_offset_y")); + let scale = PostureModule::scale(fighter.module_accessor); + WorkModule::set_float(fighter.module_accessor, cursor_offset_y * scale, *FIGHTER_INSTANCE_WORK_ID_FLOAT_CURSOR_OFFSET_Y); +} + +pub unsafe extern "C" fn special_s_reset_angle(fighter: &mut L2CFighterCommon) { + let lr = PostureModule::lr(fighter.module_accessor); + let angle = if lr == -1.0 { + 180.0 + } + else { + 0.0 + }; + WorkModule::set_float(fighter.module_accessor, angle, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); +} + unsafe extern "C" fn special_s_end(fighter: &mut L2CFighterCommon) -> L2CValue { let effect = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_GUIDE_EFFECT_HANDLE) as u32; if effect != 0 { @@ -139,10 +181,560 @@ unsafe extern "C" fn special_s_end(fighter: &mut L2CFighterCommon) -> L2CValue { 0.into() } +// FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_ATTACK + +unsafe extern "C" fn special_s_attack_main(fighter: &mut L2CFighterCommon) -> L2CValue { + let touch_down = GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); + let attack_count = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT); + let to_search = WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TO_SEARCH); + WorkModule::set_flag(fighter.module_accessor, to_search, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TO_SEARCH_PREV); + WorkModule::set_flag(fighter.module_accessor, touch_down, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TOUCH_GROUND); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON); + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TO_SEARCH); + + let attack_button = WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TO_SEARCH_PREV) + && !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_STICK); + WorkModule::set_flag(fighter.module_accessor, attack_button, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_ATTACK_BUTTON); + + special_s_attack_set_motion_multiple(fighter, attack_count.into(), false.into(), touch_down.into()); + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + GroundModule::set_passable_check(fighter.module_accessor, true); + let target_id = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_TARGET_ID) as u32; + let mut speed = special_s_attack_get_speed(fighter).get_f32(); + let mut speed_vec = fighter.Vector2__create(speed.into(), 0.0_f32.into()); + let lr = PostureModule::lr(fighter.module_accessor); + let mut new_lr = lr; + + let angle = WorkModule::get_float(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); + let attack_up_angle_min = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("attack_up_angle_min")); + let attack_up_angle_max = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("attack_up_angle_max")); + if angle >= attack_up_angle_min && angle <= attack_up_angle_max { + let attack_up_speed_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("attack_up_speed_mul")); + speed *= attack_up_speed_mul; + } + + let rad = angle.to_radians(); + let cos = rad.cos(); + speed_vec["x"].assign(&L2CValue::F32(cos * speed)); + let sin = rad.sin(); + speed_vec["y"].assign(&L2CValue::F32(sin * speed)); + + if !special_s_attack_check_angle_multiple(fighter, angle.into()).get_bool() { + let speed_x = speed_vec["x"].get_f32(); + if speed_x < 0.0 { + new_lr = -1.0; + } + else if speed_x > 0.0 { + new_lr = 1.0; + } + } + + if lr != new_lr { + PostureModule::set_lr(fighter.module_accessor, new_lr); + PostureModule::update_rot_y_lr(fighter.module_accessor); + } + + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + speed_vec["x"].get_f32(), + speed_vec["y"].get_f32() + ); + sv_kinetic_energy!( + set_brake, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + 0.0, + 0.0 + ); + sv_kinetic_energy!( + set_limit_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + -1.0, + -1.0 + ); + + sv_kinetic_energy!( + set_accel, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + 0.0 + ); + + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + 0.0 + ); + + let attack_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40("attack_frame")); + let end_frame = MotionModule::end_frame(fighter.module_accessor); + let rate = (end_frame / attack_frame as f32) + 0.01; + MotionModule::set_rate(fighter.module_accessor, rate); + + special_s_set_cursor_on_posture(fighter); + + fighter.sub_shift_status_main(L2CValue::Ptr(special_s_attack_main_loop as *const () as _)) +} + + +unsafe extern "C" fn special_s_attack_set_kinetic(fighter: &mut L2CFighterCommon) { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + let correct = if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_CLIFF_STOP) { + *GROUND_CORRECT_KIND_GROUND_CLIFF_STOP + } + else { + *GROUND_CORRECT_KIND_GROUND + }; + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(correct)); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } +} + +unsafe extern "C" fn special_s_attack_set_speed(fighter: &mut L2CFighterCommon) { + let speed = special_s_attack_get_speed(fighter).get_f32(); + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + speed * lr, + 0.0 + ); + sv_kinetic_energy!( + set_brake, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + 0.0, + 0.0 + ); + sv_kinetic_energy!( + set_limit_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + -1.0, + 0.0 + ); + sv_kinetic_energy!( + set_accel, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + 0.0 + ); +} + +unsafe extern "C" fn special_s_attack_get_speed(fighter: &mut L2CFighterCommon) -> L2CValue { + let mut attack_speed_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("attack_speed_x")); + let attack_count = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT); + if 0 < attack_count { + let attack_reduction_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), 0x15530d2d10); + for _ in 0..attack_count { + attack_speed_x *= attack_reduction_mul; + } + } + let hit_num = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_HIT_NUM); + if 0 < hit_num { + let hit_reduction_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), 0x17dd304b6f); + for _ in 0..hit_num { + attack_speed_x *= hit_reduction_mul; + } + } + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_ATTACK_BUTTON) { + let button_speed_mul = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), 0x1a41a10288); + attack_speed_x *= button_speed_mul; + } + + attack_speed_x.into() +} + +unsafe extern "C" fn special_s_attack_set_motion_multiple( + fighter: &mut L2CFighterCommon, + attack_count: L2CValue, + is_inherit: L2CValue, + touch_ground: L2CValue +) { + let motion = if attack_count.get_i32() == 0 { + if touch_ground.get_bool() { + "special_s_1" + } + else { + "special_air_s_1" + } + } + else if attack_count.get_i32() == 1 { + if touch_ground.get_bool() { + "special_s_2" + } + else { + "special_air_s_2" + } + } + else { + if touch_ground.get_bool() { + "special_s_3" + } + else { + "special_air_s_3" + } + }; + + if is_inherit.get_bool() { + let frame = MotionModule::frame(fighter.module_accessor); + let rate = MotionModule::rate(fighter.module_accessor); + MotionModule::change_motion_inherit_frame( + fighter.module_accessor, + Hash40::new(motion), + frame, + rate, + 0.0, + false, + false + ); + } + else { + MotionModule::change_motion( + fighter.module_accessor, + Hash40::new(motion), + 0.0, + 1.0, + false, + 0.0, + false, + false + ); + } +} + +unsafe extern "C" fn special_s_attack_check_angle_multiple(fighter: &mut L2CFighterCommon, angle: L2CValue) -> L2CValue { + let some_angle = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), 0xdeb5675e2); + let angle_adjust_1 = angle.get_f32() - 90.0; + let angle_adjust_2 = angle.get_f32() - 270.0; + if angle_adjust_1.abs() > some_angle + && angle_adjust_2.abs() > some_angle { + return false.into(); + } + + true.into() +} + +unsafe extern "C" fn special_s_attack_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 0.into(); + } + + // Reduce speed on shield + if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD | *COLLISION_KIND_MASK_PARRY) + && !fighter.is_in_hitlag() { + let shield_hit_end_speed_x = if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_ground_end_speed_x") + } else { + ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_s.shield_hit_air_end_speed_x") + }; + let lr = PostureModule::lr(fighter.module_accessor); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + shield_hit_end_speed_x * lr, + 0.0 + ); + fighter.change_status(FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + return 0.into(); + } + + let attack_count = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT); + // let to_search = WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TO_SEARCH); + // if !to_search { + // if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_SEARCH_BUTTON) { + // if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + // WorkModule::on_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TO_SEARCH); + // } + // } + // } + + if MotionModule::is_end(fighter.module_accessor) { + let attack_num = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40("attack_num")); + if attack_count < attack_num - 1 { + let mut status = FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END; + let mut clear_buffer = false; + let stick_x = ControlModule::get_stick_x(fighter.module_accessor); + let stick_y = ControlModule::get_stick_y(fighter.module_accessor); + let stick_vec = fighter.Vector2__create(stick_x.into(), stick_y.into()); + let length = fighter.Vector2__length(stick_vec); + let search_stick = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("search_stick")); + if length.get_f32() < search_stick { + if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TO_SEARCH) { + status = FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_SEARCH; + clear_buffer = true; + if attack_count == 0 { + special_s_reset_angle(fighter); + } + } + } + else { + if attack_count == 0 { + special_s_reset_angle(fighter); + } + status = FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_SEARCH; + clear_buffer = true; + } + fighter.change_status(status.into(), clear_buffer.into()); + } + else { + fighter.change_status(FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + } + return 0.into(); + } + + if !StatusModule::is_changing(fighter.module_accessor) { + let flags = GroundModule::get_touch_flag(fighter.module_accessor) as u32; + if flags & *GROUND_TOUCH_FLAG_DOWN as u32 != 0 { + if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TOUCH_GROUND) { + if flags & (*GROUND_TOUCH_FLAG_LEFT | *GROUND_TOUCH_FLAG_UP | *GROUND_TOUCH_FLAG_RIGHT) as u32 != 0 { + WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_TOUCH_GROUND_FRAME); + } + else { + if !fighter.global_table[IS_STOPPING].get_bool() { + let ground_frame = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_TOUCH_GROUND_FRAME); + let ground_frame_max = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), 0x1b949b05bc); + if ground_frame < ground_frame_max { + WorkModule::inc_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_TOUCH_GROUND_FRAME); + } + else { + fighter.change_status(FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END.into(), false.into()); + return 0.into(); + } + } + } + } + WorkModule::on_flag(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TOUCH_GROUND); + } + else { + WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_TOUCH_GROUND_FRAME); + } + } + + let attack_num = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40("attack_num")); + if attack_count < attack_num - 1 { + let handle = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_SEARCH_GUIDE_EFFECT_HANDLE); + if fighter.global_table[IS_STOPPING].get_bool() { + if handle != 0 { + let guide_angle = WorkModule::get_float(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_GUIDE_EFFECT_ANGLE_ATTACK); + let guide_pos = special_s_get_guide_pos(fighter, guide_angle.into()); + EffectModule::set_pos(fighter.module_accessor, handle as u32, &Vector3f{x: guide_pos.x, y: guide_pos.y, z: 0.0}); + } + } + else { + special_s_set_angle_guide(fighter, handle.into(), FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_GUIDE_EFFECT_ANGLE_ATTACK.into()); + } + } + + let angle = WorkModule::get_float(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); + special_s_set_joint_rotate(fighter, angle.into(), 1.0_f32.into()); + + 0.into() +} + // FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END +pub unsafe extern "C" fn special_s_end_main(fighter: &mut L2CFighterCommon) -> L2CValue { + // Sora is counted as being airborne when the move is performed horizontally along the ground + // If `FIGHTER_TRAIL_STATUS_SPECIAL_S_FLAG_TOUCH_GROUND` is checked instead, it will work properly there but then + // starting the move on the ground and ending in the air screws up his air physics. Ergo, we're using a ray check + // to force him to use his proper grounded landing animation if he is ending right above the ground (and not rising) + if KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL) <= 0.0 + && GroundModule::ray_check( + fighter.module_accessor, + &Vector2f{ x: PostureModule::pos_x(fighter.module_accessor), y: PostureModule::pos_y(fighter.module_accessor)}, + &Vector2f{ x: 0.0, y: -2.0}, true + ) == 1 { + fighter.set_situation(SITUATION_KIND_GROUND.into()); + } + special_s_search_end_set_kinetic(fighter); + special_s_search_end_set_speed(fighter); + fighter.sub_change_motion_by_situation( + Hash40::new("special_s_end").into(), + Hash40::new("special_air_s_end").into(), + false.into() + ); + + let attack_count = WorkModule::get_int(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_INT_ATTACK_COUNT); + let param = match attack_count { + 1 => "end_frame_1", + 2 => "end_frame_2", + _ => "end_frame_3" + }; + let end_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40(param)) as f32; + let motion_end_frame = MotionModule::end_frame(fighter.module_accessor); + MotionModule::set_rate(fighter.module_accessor, motion_end_frame / end_frame + 0.01); + + let angle = WorkModule::get_float(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_TARGET_ANGLE); + WorkModule::set_float(fighter.module_accessor, angle, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_BACK_ANGLE); + + special_s_set_cursor_on_posture(fighter); + + fighter.main_shift(special_s_end_main_loop) +} + +unsafe extern "C" fn special_s_search_end_set_kinetic(fighter: &mut L2CFighterCommon) { + if fighter.is_situation(*SITUATION_KIND_GROUND) { + // Despite what this would have you believe, somehow the cliff stop doesn't stop at the damn cliff so enjoy your edge cancels + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_GROUND_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP)); + } + else { + KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_AIR_STOP); + GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } +} + +unsafe extern "C" fn special_s_search_end_set_speed(fighter: &mut L2CFighterCommon) { + sv_kinetic_energy!( + set_limit_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + -1.0, + 0.0 + ); + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + let end_brake_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("end_brake_x")); + sv_kinetic_energy!( + set_brake, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + end_brake_x, + 0.0 + ); + KineticUtility::clear_unable_energy(*FIGHTER_KINETIC_ENERGY_ID_CONTROL, fighter.module_accessor); + } + else { + let end_brake_x_air = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("end_brake_x_air")); + sv_kinetic_energy!( + set_brake, + fighter, + FIGHTER_KINETIC_ENERGY_ID_STOP, + end_brake_x_air, + 0.0 + ); + fighter.clear_lua_stack(); + lua_args!(fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY); + let speed_y = sv_kinetic_energy::get_speed_y(fighter.lua_state_agent); + let end_speed_y = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("end_speed_y")); + sv_kinetic_energy!( + set_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + speed_y.clamp(-end_speed_y, end_speed_y) + ); + let end_accel_y = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("end_accel_y")); + sv_kinetic_energy!( + set_accel, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + -end_accel_y + ); + sv_kinetic_energy!( + set_limit_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_GRAVITY, + -1.0 + ); + + sv_kinetic_energy!( + reset_energy, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + ENERGY_CONTROLLER_RESET_TYPE_FALL_ADJUST, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ); + let air_speed_x_stable = WorkModule::get_param_float(fighter.module_accessor, hash40("air_speed_x_stable"), 0); + let end_speed_x_mul_air = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_s"), hash40("end_speed_x_mul_air")); + sv_kinetic_energy!( + set_stable_speed, + fighter, + FIGHTER_KINETIC_ENERGY_ID_CONTROL, + air_speed_x_stable * end_speed_x_mul_air, + 0.0 + ); + KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); + } +} + +pub unsafe extern "C" fn special_s_end_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 0.into(); + } + if CancelModule::is_enable_cancel(fighter.module_accessor) { + if fighter.sub_wait_ground_check_common(false.into()).get_bool() + || fighter.sub_air_check_fall_common().get_bool() { + return 0.into(); + } + } + fighter.check_wall_jump_cancel(); + if fighter.status_frame() > 10 { + fighter.sub_air_check_dive(); + } + if !StatusModule::is_changing(fighter.module_accessor) + && StatusModule::is_situation_changed(fighter.module_accessor) { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + let end_landing_fall_special_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40("end_landing_fall_special_frame")); + let frame = MotionModule::frame(fighter.module_accessor); + if frame >= end_landing_fall_special_frame as f32 { + // let attack_landing_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40("attack_landing_frame")); + // WorkModule::set_float(fighter.module_accessor, attack_landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + VarModule::set_float(fighter.battle_object, vars::common::instance::LAND_CANCEL_LAG, 6.0); + fighter.change_status(FIGHTER_STATUS_KIND_LANDING.into(), false.into()); + return 0.into(); + } + } + } + if MotionModule::is_end(fighter.module_accessor) { + if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { + fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into()); + } + else { + // let attack_landing_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40("attack_landing_frame")); + // WorkModule::set_float(fighter.module_accessor, attack_landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + // fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + } + return 0.into(); + } + if StatusModule::is_situation_changed(fighter.module_accessor) { + fighter.change_motion_inherit_frame_by_situation("special_s_end", "special_air_s_end", -1.0, 1.0, 0.0, false, false); + special_s_search_end_set_kinetic(fighter); + special_s_search_end_set_speed(fighter); + } + + 0.into() +} + +unsafe extern "C" fn special_s_end_joint_rotate(fighter: &mut L2CFighterCommon) { + let angle = WorkModule::get_float(fighter.module_accessor, *FIGHTER_TRAIL_STATUS_SPECIAL_S_FLOAT_BACK_ANGLE); + if 0.0 < angle { + let frame = fighter.global_table[CURRENT_FRAME].get_f32(); + let right_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_s"), hash40("right_frame")) as f32; + if frame < right_frame { + let lerp = 1.0 - (frame / right_frame); + special_s_set_joint_rotate(fighter, angle.into(), lerp.into()); + } + } +} + pub unsafe extern "C" fn special_s_end_end(fighter: &mut L2CFighterCommon) -> L2CValue { - VarModule::off_flag(fighter.battle_object, vars::trail::status::SPECIAL_S_STOP); 0.into() } @@ -150,5 +742,9 @@ pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_pre); agent.status(Main, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_main); agent.status(End, *FIGHTER_STATUS_KIND_SPECIAL_S, special_s_end); + + agent.status(Main, *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_ATTACK, special_s_attack_main); + + agent.status(Main, *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END, special_s_end_main); agent.status(End, *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_S_END, special_s_end_end); -} +} \ No newline at end of file diff --git a/fighters/wario/Cargo.toml b/fighters/wario/Cargo.toml index 87eb0b2a0d..556789d0db 100644 --- a/fighters/wario/Cargo.toml +++ b/fighters/wario/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/wario/src/acmd/aerials.rs b/fighters/wario/src/acmd/aerials.rs index 00bbe5153e..0063458a20 100644 --- a/fighters/wario/src/acmd/aerials.rs +++ b/fighters/wario/src/acmd/aerials.rs @@ -294,7 +294,7 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("hip"), 10.0, 60, 95, 0, 30, 5.5, 0.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD); AttackModule::clear(boma, 1, false); } - frame(lua_state, 40.0); + frame(lua_state, 28.0); if is_excute(agent) { KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL); } @@ -317,7 +317,7 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, -3, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); + // EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, -3, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 16.0); if is_excute(agent) { diff --git a/fighters/wario/src/acmd/ground.rs b/fighters/wario/src/acmd/ground.rs index 37e1be1e66..794aa2e435 100644 --- a/fighters/wario/src/acmd/ground.rs +++ b/fighters/wario/src/acmd/ground.rs @@ -11,7 +11,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 76, 66, 0, 21, 3.0, 0.0, 6.3, 7.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 76, 66, 0, 21, 3.0, 0.0, 5.6, 9.2, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 3.0, 76, 66, 0, 21, 3.5, 0.0, 4.0, 12.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - // jab lock hitboxes + // Jab lock hitbox ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 30, 2.5, 0.0, 3.0, 7.0, Some(0.0), Some(3.0), Some(12.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); AttackModule::set_down_only(boma, 3, false); } diff --git a/fighters/wario/src/acmd/other.rs b/fighters/wario/src/acmd/other.rs index 134ebb9000..4ecfb94982 100644 --- a/fighters/wario/src/acmd/other.rs +++ b/fighters/wario/src/acmd/other.rs @@ -68,15 +68,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -86,10 +82,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_appeals(agent: &mut L2CAgentBase) { diff --git a/fighters/wario/src/acmd/throws.rs b/fighters/wario/src/acmd/throws.rs index 2288940abe..54e2353775 100644 --- a/fighters/wario/src/acmd/throws.rs +++ b/fighters/wario/src/acmd/throws.rs @@ -12,7 +12,7 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.7, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(10.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.7, 0.0, 7.0, 4.7, Some(0.0), Some(7.0), Some(10.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); frame(lua_state, 11.0); @@ -32,7 +32,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 11.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.7, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(11.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.7, 0.0, 7.0, 4.7, Some(0.0), Some(7.0), Some(11.3), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); frame(lua_state, 14.0); @@ -52,7 +52,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 12.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.7, 0.0, 7.0, -4.0, Some(0.0), Some(7.0), Some(-15.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.7, 0.0, 7.0, -4.7, Some(0.0), Some(7.0), Some(-13.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 3.0); diff --git a/fighters/wario/src/lib.rs b/fighters/wario/src/lib.rs index 73c7ae37f5..6826d6c513 100644 --- a/fighters/wario/src/lib.rs +++ b/fighters/wario/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, @@ -50,5 +51,5 @@ pub fn install() { status::install(agent); agent.install(); - wariobike::install(); + // wariobike::install(); } diff --git a/fighters/wario/src/status/mod.rs b/fighters/wario/src/status/mod.rs index 741c31a945..c153242030 100644 --- a/fighters/wario/src/status/mod.rs +++ b/fighters/wario/src/status/mod.rs @@ -8,6 +8,7 @@ mod throw_kirby; mod special_hi; mod special_n; +mod special_s; pub const THROW_HI_STATUS_KIND: i32 = 0x47; @@ -24,4 +25,5 @@ pub fn install(agent: &mut Agent) { special_hi::install(agent); special_n::install(agent); + special_s::install(agent); } diff --git a/fighters/wario/src/status/special_s.rs b/fighters/wario/src/status/special_s.rs new file mode 100644 index 0000000000..250f7bfe01 --- /dev/null +++ b/fighters/wario/src/status/special_s.rs @@ -0,0 +1,98 @@ +use utils::consts::vars::wario; + +use super::*; + +// FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_DRIVE + +pub unsafe extern "C" fn special_s_drive_main(fighter: &mut L2CFighterCommon) -> L2CValue { + fighter.main_shift(special_s_drive_main_loop) +} + +unsafe extern "C" fn special_s_drive_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + // Jump cancel + if fighter.get_num_used_jumps() < fighter.get_jump_count_max() + && (ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) + || WorkModule::is_flag(fighter.module_accessor, *FIGHTER_WARIO_STATUS_SPECIAL_S_FLAG_RESERVE_JUMP)) + { + WorkModule::off_flag(fighter.module_accessor, *FIGHTER_WARIO_STATUS_SPECIAL_S_FLAG_RESERVE_JUMP); + + fighter.change_status(FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_ESCAPE_START.into(), false.into()); + return 0.into(); + } + + // Aerial neutral cancel (sends into tumble) + let bike = ArticleModule::get_article(fighter.module_accessor, *FIGHTER_WARIO_GENERATE_ARTICLE_WARIOBIKE); + let bike_id = smash::app::lua_bind::Article::get_battle_object_id(bike) as u32; + let bike_boma = sv_battle_object::module_accessor(bike_id); + + if StatusModule::situation_kind(bike_boma) == *SITUATION_KIND_AIR + && (ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_GUARD) + || ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_ATTACK) + || ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL)) + { + VarModule::on_flag(fighter.battle_object, wario::instance::SPECIAL_S_CANCEL); + + fighter.change_status(FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_ESCAPE_START.into(), false.into()); + return 0.into(); + } + + if (ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_APPEAL_HI) + || ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_APPEAL_LW) + || ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_APPEAL_S_R) + || ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_APPEAL_S_L)) + && { + notify_event_msc_cmd!(fighter, Hash40::new_raw(0x1daca540be)); + fighter.pop_lua_stack(1).get_bool() + } { + fighter.change_status(FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_APPEAL.into(), false.into()); + return 0.into(); + } + + 0.into() +} + +// FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_ESCAPE_START + +pub unsafe extern "C" fn special_s_escape_start_main(fighter: &mut L2CFighterCommon) -> L2CValue { + LinkModule::send_event_parents(fighter.module_accessor, *FIGHTER_WARIO_LINK_NO_BIKE, Hash40::new_raw(0x1f9a545917)); + + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_escape_start"), 0.0, 1.0, false, 0.0, false, false); + + fighter.main_shift(special_s_escape_start_main_loop) +} + +unsafe extern "C" fn special_s_escape_start_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if MotionModule::is_end(fighter.module_accessor) { + if VarModule::is_flag(fighter.battle_object, wario::instance::SPECIAL_S_CANCEL) { + fighter.change_status(FIGHTER_STATUS_KIND_DAMAGE_FALL.into(), true.into()); + } + else { + fighter.change_status(FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_ESCAPE.into(), false.into()); + } + } + + 0.into() +} + +pub unsafe extern "C" fn special_s_escape_start_end(fighter: &mut L2CFighterCommon) -> L2CValue { + let bike = ArticleModule::get_article(fighter.module_accessor, *FIGHTER_WARIO_GENERATE_ARTICLE_WARIOBIKE); + let bike_id = smash::app::lua_bind::Article::get_battle_object_id(bike) as u32; + let bike_boma = sv_battle_object::module_accessor(bike_id); + + // Jump cancel consumes double jump + if StatusModule::situation_kind(bike_boma) == *SITUATION_KIND_AIR + && fighter.get_num_used_jumps() < fighter.get_jump_count_max() + && !VarModule::is_flag(fighter.battle_object, wario::instance::SPECIAL_S_CANCEL) { + WorkModule::inc_int(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); + } + + VarModule::off_flag(fighter.battle_object, wario::instance::SPECIAL_S_CANCEL); + + 0.into() +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_DRIVE, special_s_drive_main); + agent.status(Main, *FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_ESCAPE_START, special_s_escape_start_main); + agent.status(End, *FIGHTER_WARIO_STATUS_KIND_SPECIAL_S_ESCAPE_START, special_s_escape_start_end); +} \ No newline at end of file diff --git a/fighters/wario/src/wariobike/status.rs b/fighters/wario/src/wariobike/status.rs index 498cf223cb..476b4e77ed 100644 --- a/fighters/wario/src/wariobike/status.rs +++ b/fighters/wario/src/wariobike/status.rs @@ -1,19 +1,4 @@ use super::*; use globals::*; -// WEAPON_WARIO_WARIOBIKE_STATUS_KIND_SPECIAL_S_ESCAPE_START - -pub unsafe extern "C" fn special_s_escape_start_exit(weapon: &mut L2CWeaponCommon) -> L2CValue { - let owner_id = WorkModule::get_int(weapon.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32; - let wario = utils::util::get_battle_object_from_id(owner_id); - let wario_boma = &mut *(*wario).module_accessor; - if weapon.global_table[SITUATION_KIND] == SITUATION_KIND_AIR - && wario_boma.get_num_used_jumps() < wario_boma.get_jump_count_max() { - WorkModule::inc_int(wario_boma, *FIGHTER_INSTANCE_WORK_ID_INT_JUMP_COUNT); - } - 0.into() -} - -pub fn install(agent: &mut Agent) { - agent.status(Exit, *WEAPON_WARIO_WARIOBIKE_STATUS_KIND_SPECIAL_S_ESCAPE_START, special_s_escape_start_exit); -} +pub fn install(agent: &mut Agent) {} diff --git a/fighters/wiifit/Cargo.toml b/fighters/wiifit/Cargo.toml index e90246e2cf..ce575efa60 100644 --- a/fighters/wiifit/Cargo.toml +++ b/fighters/wiifit/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -interpolation = "0.2.0" \ No newline at end of file +interpolation = "0.2.0" +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/wiifit/src/acmd/aerials.rs b/fighters/wiifit/src/acmd/aerials.rs index ef9d785290..7e9dcc8090 100644 --- a/fighters/wiifit/src/acmd/aerials.rs +++ b/fighters/wiifit/src/acmd/aerials.rs @@ -10,19 +10,24 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); } frame(lua_state, 9.0); + FT_MOTION_RATE_RANGE(agent, 9.0, 10.0, 2.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("hip"), 5.0, 78, 134, 0, 30, 4.0, 0.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("head"), 5.0, 80, 134, 0, 30, 3.5, -1.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 5.0, 80, 134, 0, 30, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("handr"), 5.0, 82, 134, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("footl"), 5.0, 82, 134, 0, 30, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + } + frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handr"), 5.0, 110, 72, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("head"), 5.0, 110, 72, 0, 50, 3.5, -1.0, 1.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("hip"), 5.0, 90, 72, 0, 50, 4.0, 0.0, 0.0, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("kneel"), 5.0, 110, 72, 0, 50, 3.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("footl"), 5.0, 110, 72, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::clear_all(boma); } frame(lua_state, 12.0); if is_excute(agent) { - AttackModule::clear_all(boma); - ATTACK(agent, 0, 0, Hash40::new("hip"), 6.0, 361, 80, 0, 45, 2.0, 0.0, 5.0, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("hip"), 6.0, 361, 80, 0, 45, 7.0, 0.0, 5.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("hip"), 6.0, 361, 80, 0, 45, 3.0, 0.0, 5.0, 4.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("hip"), 6.0, 361, 80, 0, 45, 6.5, 0.0, 5.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_PUNCH); } frame(lua_state, 16.0); if is_excute(agent) { @@ -35,12 +40,14 @@ unsafe extern "C" fn game_attackairn(agent: &mut L2CAgentBase) { } unsafe extern "C" fn effect_attackairn(agent: &mut L2CAgentBase) { - // let lua_state = agent.lua_state_agent; - // let boma = agent.boma(); - // frame(lua_state, 12.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 2, 9.5, 1.5, 0, 0, 0, 1.8, true); - // } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 12.0); + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 2, 9.5, 1.5, 0, 0, 0, 1.8, true); + } + } } unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { @@ -51,16 +58,19 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { frame(lua_state, 8.0); FT_MOTION_RATE(agent, 1.0); frame(lua_state, 9.0); + let (size_early, size_late) = if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) + { (4.5, 4.0) } else { (4.0, 3.5) }; if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 50, 102, 0, 20, 4.5, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 12.0, 50, 102, 0, 20, size_early, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("armr"), 12.0, 50, 102, 0, 20, 3.5, -2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 10.0, 300, 68, 0, 15, 3.5, 4.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 12.0, 50, 102, 0, 20, 3.5, 0.0, 11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 10.0, 300, 68, 0, 15, 3.5, 4.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 3, 0, Hash40::new("kneer"), 10.0, 294, 68, 0, 15, 3.5, 4.0, 0.0, 0.0, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 4, 0, Hash40::new("top"), 12.0, 50, 102, 0, 20, 3.5, 0.0, 11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 11.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 7.5, 55, 102, 0, 20, 4.0, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("armr"), 7.5, 55, 102, 0, 20, size_late, 3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("armr"), 7.5, 55, 102, 0, 20, 3.5, -2.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.0, 45, 102, 0, 20, 3.5, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 3, 0, Hash40::new("top"), 7.5, 55, 102, 0, 20, 3.5, 0.0, 11.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); @@ -79,18 +89,20 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { } unsafe extern "C" fn effect_attackairf(agent: &mut L2CAgentBase) { - // let lua_state = agent.lua_state_agent; - // let boma = agent.boma(); - // frame(lua_state, 7.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 5, 14, 0.5, 135, 0, 0, 0.85, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // } - // frame(lua_state, 9.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("armr"), 3, 0, 0, 0, 0, 0, 1, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 5, 14, 0.5, 135, 0, 0, 0.85, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 9.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("armr"), 3, 0, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + } } unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { @@ -123,20 +135,22 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) { - // let lua_state = agent.lua_state_agent; - // let boma = agent.boma(); - // frame(lua_state, 4.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 5, 4.3, 3.5, 175, 0, 0, 1, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 5, 4.3, 3.5, 190, 0, 0, 1, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // } - // frame(lua_state, 5.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 4.3, -10, 0, 0, 0, 1, true); - // LAST_EFFECT_SET_RATE(agent, 0.9); - // } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 5, 4.3, 3.5, 175, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 5, 4.3, 3.5, 190, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 4.3, -10, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.9); + } + } } unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { @@ -144,10 +158,12 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { + let (size_a, size_h) = if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) + { (4.0, 4.5) } else { (3.75, 4.0) }; WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); - ATTACK(agent, 0, 0, Hash40::new("bust"), 10.0, 72, 82, 0, 60, 4.5, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("bust"), 10.0, 72, 82, 0, 60, 4.0, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("bust"), 10.0, 72, 82, 0, 60, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("bust"), 10.0, 75, 95, 0, 44, size_h, 8.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("bust"), 10.0, 75, 95, 0, 44, size_a, 4.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("bust"), 10.0, 75, 95, 0, 44, 3.5, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 11.0); if is_excute(agent) { @@ -160,13 +176,15 @@ unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) { } unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) { - // let lua_state = agent.lua_state_agent; - // let boma = agent.boma(); - // frame(lua_state, 6.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 14, 0, 0, 70, 90, 0.9, true); - // LAST_EFFECT_SET_RATE(agent, 1.2); - // } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 14, 0, 0, 70, 90, 0.9, true); + LAST_EFFECT_SET_RATE(agent, 1.2); + } + } } unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { @@ -199,33 +217,35 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { } unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { - // let lua_state = agent.lua_state_agent; - // let boma = agent.boma(); - // frame(lua_state, 18.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 2, 16.5, 3, 100, 0, 0, 1, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // } - // frame(lua_state, 20.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("kneer"), 2.5, 0, 0, 0, 0, 0, 1, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 2, 16.5, 3, 100, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 20.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("kneer"), 2.5, 0, 0, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + } } pub fn install(agent: &mut Agent) { agent.acmd("game_attackairn", game_attackairn, Priority::Low); - //agent.acmd("effect_attackairn", effect_attackairn, Priority::Low); + agent.acmd("effect_attackairn", effect_attackairn, Priority::Low); agent.acmd("game_attackairf", game_attackairf, Priority::Low); - //agent.acmd("effect_attackairf", effect_attackairf, Priority::Low); + agent.acmd("effect_attackairf", effect_attackairf, Priority::Low); agent.acmd("game_attackairb", game_attackairb, Priority::Low); - //agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); + agent.acmd("effect_attackairb", effect_attackairb, Priority::Low); agent.acmd("game_attackairhi", game_attackairhi, Priority::Low); - //agent.acmd("effect_attackairhi", effect_attackairhi, Priority::Low); + agent.acmd("effect_attackairhi", effect_attackairhi, Priority::Low); agent.acmd("game_attackairlw", game_attackairlw, Priority::Low); - //agent.acmd("effect_attackairlw", effect_attackairlw, Priority::Low); + agent.acmd("effect_attackairlw", effect_attackairlw, Priority::Low); } \ No newline at end of file diff --git a/fighters/wiifit/src/acmd/ground.rs b/fighters/wiifit/src/acmd/ground.rs index b633c2b6a3..3cf57473a6 100644 --- a/fighters/wiifit/src/acmd/ground.rs +++ b/fighters/wiifit/src/acmd/ground.rs @@ -5,29 +5,33 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("handl"), 3.0, 361, 25, 0, 15, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 361, 25, 0, 20, 2.75, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("footr"), 5.0, 45, 54, 0, 54, 3.0, -0.5, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 30, 0, 20, 2.5, 0.0, 6.0, 4.0, Some(0.0), Some(6.0), Some(6.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("handl"), 3.0, 45, 10, 0, 23, 3.0, -1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("arml"), 3.0, 45, 10, 0, 23, 2.75, -3.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("footr"), 5.0, 45, 54, 0, 54, 3.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_B, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + // Jab lock hitbox + ATTACK(agent, 3, 0, Hash40::new("top"), 3.0, 361, 20, 0, 20, 2.5, 0.0, 6.0, 3.5, Some(0.0), Some(6.0), Some(7.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + AttackModule::set_down_only(boma, 3, true); } wait(lua_state, 2.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 8.0); + frame(lua_state, 10.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } } unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) { - // let lua_state = agent.lua_state_agent; - // let boma = agent.boma(); - // frame(lua_state, 4.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 13.5, 7.75, 0, 0, 0, 0.85, true); - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 5.5, -9.5, 0, 0, 0, 0.7, true); - // } + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 13.5, 7.75, 0, 0, 0, 0.85, true); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 5.5, -9.5, 0, 0, 0, 0.7, true); + } + } } unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { @@ -38,8 +42,8 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { FighterAreaModuleImpl::enable_fix_jostle_area(boma, 1.8, 5.2); } frame(lua_state, 3.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - FT_MOTION_RATE(agent, 1.0); ATTACK(agent, 0, 0, Hash40::new("top"), 2.0, 361, 24, 0, 45, 3.2, 0.0, 9.0, 2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("top"), 2.0, 8, 24, 0, 25, 3.2, 0.0, 9.0, 2.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 2, 0, Hash40::new("top"), 2.0, 361, 24, 0, 45, 4.5, 0.0, 9.3, 6.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); @@ -49,7 +53,7 @@ unsafe extern "C" fn game_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 8.0); + frame(lua_state, 10.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_ENABLE_COMBO); } @@ -65,10 +69,12 @@ unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false); } - // frame(lua_state, 3.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 10, 7, 0, 0, 0, 1, true); - // } + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 3.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 10, 7, 0, 0, 0, 1, true); + } + } } unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { @@ -80,7 +86,7 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 361, 50, 0, 10, 1.8, 0.0, 1.5, 4.7, Some(0.0), Some(1.5), Some(6.8), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_bury"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 270, 86, 0, 50, 1.8, 0.0, 1.5, 4.7, Some(0.0), Some(1.5), Some(6.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); ATTACK(agent, 1, 0, Hash40::new("top"), 3.0, 45, 95, 0, 50, 6.0, 0.0, 5.0, 6.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } wait(lua_state, 2.0); @@ -98,15 +104,17 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) { let boma = agent.boma(); sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.95); frame(lua_state, 6.0); + let offset = if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) + { 8.0 } else { 6.5 }; if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 50, 98, 0, 45, 5.0, 0.0, 7.0, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 11.0, 50, 98, 0, 45, 5.0, 0.0, 7.0, offset, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 11.0, 50, 98, 0, 45, 3.0, 0.0, 9.0, 3.0, Some(0.0), Some(10.5), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 11.0, 50, 98, 0, 45, 2.5, 0.0, 3.0, 4.0, Some(0.0), Some(2.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATK_SET_SHIELD_SETOFF_MUL_arg4(agent, 0, 1, 2, 1.1); } frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 65, 98, 0, 35, 4.5, 0.0, 7.0, 8.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 8.0, 65, 98, 0, 35, 4.5, 0.0, 7.0, offset, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 8.0, 65, 98, 0, 35, 2.0, 0.0, 9.0, 3.0, Some(0.0), Some(10.5), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 8.0, 65, 98, 0, 35, 2.0, 0.0, 3.0, 4.0, Some(0.0), Some(1.5), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATK_SET_SHIELD_SETOFF_MUL_arg4(agent, 0, 1, 2, 1.4); @@ -128,7 +136,7 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) { pub fn install(agent: &mut Agent) { agent.acmd("game_attack11", game_attack11, Priority::Low); - //agent.acmd("effect_attack11", effect_attack11, Priority::Low); + agent.acmd("effect_attack11", effect_attack11, Priority::Low); agent.acmd("game_attack12", game_attack12, Priority::Low); agent.acmd("effect_attack12", effect_attack12, Priority::Low); diff --git a/fighters/wiifit/src/acmd/other.rs b/fighters/wiifit/src/acmd/other.rs index 8c747e6545..ce7f08e3ca 100644 --- a/fighters/wiifit/src/acmd/other.rs +++ b/fighters/wiifit/src/acmd/other.rs @@ -72,15 +72,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -90,10 +86,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { @@ -105,6 +98,14 @@ unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_cliffjump2(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + PostureModule::add_pos(boma, &Vector3f::new(0.0, -1.2, 0.0)); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_cliffescape", acmd_stub, Priority::Low); @@ -121,4 +122,6 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_escapeairslide", game_escapeairslide, Priority::Low); agent.acmd("game_jumpaerialfront", game_jumpaerialfront, Priority::Low); -} + + agent.acmd("game_cliffjump2", game_cliffjump2, Priority::Low); +} \ No newline at end of file diff --git a/fighters/wiifit/src/acmd/smashes.rs b/fighters/wiifit/src/acmd/smashes.rs index 10cd258a6d..db6a73fcf5 100644 --- a/fighters/wiifit/src/acmd/smashes.rs +++ b/fighters/wiifit/src/acmd/smashes.rs @@ -37,8 +37,10 @@ unsafe extern "C" fn effect_attacks4(agent: &mut L2CAgentBase) { frame(lua_state, 16.0); if is_excute(agent) { LANDING_EFFECT(agent, Hash40::new("sys_down_smoke"), Hash40::new("top"), 0, 0, 6, 0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0, true); - //EFFECT_FOLLOW(agent, Hash40::new("wiifit_heading_shot"), Hash40::new("top"), 2, 10, 2, 0, 0, 0, 1.1, true); - //LAST_EFFECT_SET_RATE(agent, 0.8); + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + EFFECT_FOLLOW(agent, Hash40::new("wiifit_heading_shot"), Hash40::new("top"), 2, 10, 2, 0, 0, 0, 1.1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } } } @@ -63,7 +65,7 @@ unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 90, 97, 0, 31, 2.8, 0.0, 21.5, -0.3, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 18.0, 90, 88, 0, 31, 2.8, 0.0, 21.5, -0.3, None, None, None, 1.25, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 15.0, 90, 102, 0, 31, 4.5, 0.0, 21.5, -0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 15.0, 90, 102, 0, 31, 3.0, 0.0, 16.5, -0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("top"), 15.0, 90, 102, 0, 31, 3.5, 0.0, 10.0, -0.3, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); @@ -97,11 +99,13 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 20, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - // frame(lua_state, 14.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("wiifit_heading_shot"), Hash40::new("top"), 2, 22, -0.3, 0, 0, 0, 0.8, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // } + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 14.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("wiifit_heading_shot"), Hash40::new("top"), 2, 22, -0.3, 0, 0, 0, 0.8, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + } } unsafe extern "C" fn game_attacklw4(agent: &mut L2CAgentBase) { @@ -137,21 +141,29 @@ unsafe extern "C" fn effect_attacklw4(agent: &mut L2CAgentBase) { if is_excute(agent) { EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("handr"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true); } - frame(lua_state, 16.0); - if is_excute(agent) { - FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 2, 5, -3, 0, 0, 0, 1, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 2, 5, 5, 180, 0, 0, 1, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - } - // frame(lua_state, 18.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("wiifit_heading_shot"), Hash40::new("top"), 2, 5, 11, 0, 0, 0, 0.75, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // EFFECT_FOLLOW(agent, Hash40::new("wiifit_heading_shot"), Hash40::new("top"), 2, 5, -9, 0, 0, 0, 0.75, true); - // LAST_EFFECT_SET_RATE(agent, 0.8); - // } + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 16.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 2, 5, -3, 0, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 2, 5, 5, 180, 0, 0, 1, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + frame(lua_state, 18.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("wiifit_heading_shot"), Hash40::new("top"), 2, 5, 11, 0, 0, 0, 0.75, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + EFFECT_FOLLOW(agent, Hash40::new("wiifit_heading_shot"), Hash40::new("top"), 2, 5, -9, 0, 0, 0, 0.75, true); + LAST_EFFECT_SET_RATE(agent, 0.8); + } + } + else { + frame(lua_state, 16.0); + if is_excute(agent) { + FOOT_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), -2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + } } pub fn install(agent: &mut Agent) { diff --git a/fighters/wiifit/src/acmd/throws.rs b/fighters/wiifit/src/acmd/throws.rs index efc3b84ac0..0b0beedb08 100644 --- a/fighters/wiifit/src/acmd/throws.rs +++ b/fighters/wiifit/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.6, 0.0, Some(0.0), Some(8.6), Some(8.7), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 8.6, 3.5, Some(0.0), Some(8.6), Some(7.2), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.5, 4.0, Some(0.0), Some(7.5), Some(9.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 7.5, 4.0, Some(0.0), Some(7.5), Some(9.4), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 10.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 8.5, -4.0, Some(0.0), Some(8.5), Some(-13.65), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 3.5, 0.0, 8.5, -4.0, Some(0.0), Some(8.5), Some(-13.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -89,10 +88,31 @@ unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 8.0, 80, 80, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + } + frame(lua_state, 27.0); + if is_excute(agent) { + CHECK_FINISH_CAMERA(agent, 0, 22); + } + frame(lua_state, 28.0); + if is_excute(agent) { + let target = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT); + let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); + let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); + ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); + } +} + pub fn install(agent: &mut Agent) { agent.acmd("game_catch", game_catch, Priority::Low); agent.acmd("game_catchdash", game_catchdash, Priority::Low); agent.acmd("game_catchturn", game_catchturn, Priority::Low); agent.acmd("game_throwf", game_throwf, Priority::Low); -} + agent.acmd("game_throwhi", game_throwhi, Priority::Low); +} \ No newline at end of file diff --git a/fighters/wiifit/src/acmd/tilts.rs b/fighters/wiifit/src/acmd/tilts.rs index 24bf1c3bbc..3b555ffcae 100644 --- a/fighters/wiifit/src/acmd/tilts.rs +++ b/fighters/wiifit/src/acmd/tilts.rs @@ -20,15 +20,6 @@ unsafe extern "C" fn game_attacks3(agent: &mut L2CAgentBase) { } } -// unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { -// let lua_state = agent.lua_state_agent; -// let boma = agent.boma(); -// frame(lua_state, 6.0); -// // if is_excute(agent) && WorkModule::is_flag(boma, vars::wiifit::instance::IS_ZEN_MODE) { -// // crate::opff::start_ring(utils::util::get_fighter_common_from_accessor(boma), 14.0, 1.0, 1.5, Hash40::new("kneel"), Vector3f::new(1.5, 2.5, 0.0), Vector3f::new(3000.0, 0.7, 0.7), Vector3f::new(0.7, 1000.0, 0.7), false); -// // } -// } - unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -36,15 +27,17 @@ unsafe extern "C" fn effect_attacks3(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - // frame(lua_state, 4.0); - // if is_excute(agent) { - // EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_c"), Hash40::new("sys_attack_arc_c"), Hash40::new("top"), 0, 8, -5, 180, 0, 90, 1, true, *EF_FLIP_YZ); - // LAST_EFFECT_SET_RATE(agent, 1.3); - // } - // frame(lua_state, 6.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 11.5, 8.5, 0, 0, 0, 1, true); - // } + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_arc_c"), Hash40::new("sys_attack_arc_c"), Hash40::new("top"), 0, 8, -5, 180, 0, 90, 1, true, *EF_FLIP_YZ); + LAST_EFFECT_SET_RATE(agent, 1.3); + } + frame(lua_state, 6.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 11.5, 8.5, 0, 0, 0, 1, true); + } + } } unsafe extern "C" fn expression_attacks3(agent: &mut L2CAgentBase) { @@ -77,11 +70,13 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { } frame(lua_state, 5.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 90, 102, 0, 45, 4.3, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 75, 102, 0, 45, 3.0, 0.0, 10.0, -5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 90, 102, 0, 45, 4.0, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + let (size_a, size_h) = if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) + { (4.3, 4.0) } else { (3.5, 3.5) }; + ATTACK(agent, 0, 0, Hash40::new("armr"), 10.0, 90, 102, 0, 45, size_a, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 78, 102, 0, 45, 3.0, 0.0, 10.0, -5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 2, 0, Hash40::new("armr"), 10.0, 90, 102, 0, 45, size_h, -1.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 90, 102, 0, 45, 2.5, 0.0, 11.5, 3.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); - ATTACK(agent, 4, 0, Hash40::new("footl"), 10.0, 75, 102, 0, 45, 3.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); + ATTACK(agent, 4, 0, Hash40::new("footl"), 10.0, 78, 102, 0, 45, 3.0, -2.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH); } frame(lua_state, 13.0); if is_excute(agent) { @@ -98,14 +93,16 @@ unsafe extern "C" fn effect_attackhi3(agent: &mut L2CAgentBase) { if is_excute(agent) { FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -5, 0, -1.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); } - // frame(lua_state, 4.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 4, 6, 0.25, -90, 0, 0, 0.8, true); - // } - // frame(lua_state, 5.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 20, 0.25, 0, 0, 0, 1, true); - // } + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 4.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 4, 6, 0.25, -90, 0, 0, 0.8, true); + } + frame(lua_state, 5.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 20, 0.25, 0, 0, 0, 1, true); + } + } } unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { @@ -140,14 +137,22 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - // frame(lua_state, 7.0); - // if is_excute(agent) { - // EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 2, -1, 5, -30, 0, 0, 0.8, true); - // } - frame(lua_state, 9.0); - if is_excute(agent) { - LANDING_EFFECT(agent, Hash40::new("wiifit_atk_smoke"), Hash40::new("top"), 5, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); - //EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 5, 14.5, 0, 0, 0, 0.8, true); + if VarModule::is_flag(agent.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) { + frame(lua_state, 7.0); + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_line"), Hash40::new("top"), 2, -1, 5, -30, 0, 0, 0.8, true); + } + frame(lua_state, 9.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("wiifit_atk_smoke"), Hash40::new("top"), 5, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); + EFFECT_FOLLOW(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 5, 14.5, 0, 0, 0, 0.8, true); + } + } + else { + frame(lua_state, 9.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("wiifit_atk_smoke"), Hash40::new("top"), 5, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, false); + } } } diff --git a/fighters/wiifit/src/lib.rs b/fighters/wiifit/src/lib.rs index 16c66b9931..8bc87fb271 100644 --- a/fighters/wiifit/src/lib.rs +++ b/fighters/wiifit/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/wiifit/src/opff.rs b/fighters/wiifit/src/opff.rs index 21a57ba848..ca5f1458b8 100644 --- a/fighters/wiifit/src/opff.rs +++ b/fighters/wiifit/src/opff.rs @@ -3,119 +3,11 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -/// Starts ring effect for hitboxes -pub unsafe fn start_ring(fighter: &mut L2CFighterCommon, duration: f32, start_size: f32, end_size: f32, bone: Hash40, mut offset: Vector3f, mut color: Vector3f, mut color2: Vector3f, follow: bool) { - VarModule::on_flag(fighter.object(), vars::wiifit::instance::RING_EFFECT_VISIBLE); - VarModule::set_float(fighter.object(), vars::wiifit::instance::RING_END_FRAME, duration); - VarModule::set_float(fighter.object(), vars::wiifit::instance::RING_CURRENT_FRAME, 0.0); - VarModule::set_float(fighter.object(), vars::wiifit::instance::RING_START_SIZE, start_size); - VarModule::set_float(fighter.object(), vars::wiifit::instance::RING_END_SIZE, end_size); - VarModule::set_int64(fighter.object(), vars::wiifit::instance::RING_SHOW_MOTION, MotionModule::motion_kind(fighter.module_accessor)); - - // Make sure that no color alpha is zero - color.x = if color.x == 0.0 { 0.1 } else { color.x }; - color.y = if color.y == 0.0 { 0.1 } else { color.y }; - color.z = if color.z == 0.0 { 0.1 } else { color.z }; - VarModule::set_vec3(fighter.object(), vars::wiifit::instance::RING_COLOR, color); - color2.x = if color2.x == 0.0 { 0.1 } else { color2.x }; - color2.y = if color2.y == 0.0 { 0.1 } else { color2.y }; - color2.z = if color2.z == 0.0 { 0.1 } else { color2.z }; - VarModule::set_vec3(fighter.object(), vars::wiifit::instance::RING_SECOND_COLOR, color2); - - // Attach effect to bone if 'follow' arg is true, otherwise place effect at bone's current position with offset - //let mut calc_offset = ModelModule::joint_global_offset_from_top(fighter.module_accessor, bone, &mut offset); - //offset.x *= PostureModule::lr(fighter.module_accessor); - let handle = if follow { - EffectModule::req_follow(fighter.module_accessor, Hash40::new("wiifit_fukushiki_ring"), bone, &offset, &Vector3f::zero(), start_size, false, 0, 0, 0, 0, 0, false, false) - } else { - EffectModule::req_on_joint(fighter.module_accessor, Hash40::new("wiifit_fukushiki_ring"), bone, &offset, &Vector3f::zero(), start_size, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0) - }; - let dark_handle = if follow { - EffectModule::req_follow(fighter.module_accessor, Hash40::new("wiifit_fukushiki_ring"), bone, &offset, &Vector3f::zero(), start_size, false, 0, 0, 0, 0, 0, false, false) - } else { - EffectModule::req_on_joint(fighter.module_accessor, Hash40::new("wiifit_fukushiki_ring"), bone, &offset, &Vector3f::zero(), start_size, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0) - }; - let light_handle = if follow { - EffectModule::req_follow(fighter.module_accessor, Hash40::new("wiifit_fukushiki_ring"), bone, &offset, &Vector3f::zero(), start_size, false, 0, 0, 0, 0, 0, false, false) - } else { - EffectModule::req_on_joint(fighter.module_accessor, Hash40::new("wiifit_fukushiki_ring"), bone, &offset, &Vector3f::zero(), start_size, &Vector3f::zero(), &Vector3f::zero(), false, 0, 0, 0) - }; - - // Set effect color and store handle - EffectModule::set_rgb(fighter.module_accessor, handle as u32, color.x, color.y, color.z); - EffectModule::set_rgb(fighter.module_accessor, dark_handle as u32, color.x, color.y, color.z); - EffectModule::set_rgb(fighter.module_accessor, light_handle as u32, color.x, color.y, color.z); - VarModule::set_int(fighter.object(), vars::wiifit::instance::RING_EFFECT_HANDLE, handle as i32); - VarModule::set_int(fighter.object(), vars::wiifit::instance::RING_SECOND_EFFECT_HANDLE, dark_handle as i32); - VarModule::set_int(fighter.object(), vars::wiifit::instance::RING_THIRD_EFFECT_HANDLE, light_handle as i32); -} - -/// Updates ring color to second defined color -unsafe fn set_ring_color(fighter: &mut L2CFighterCommon, mut color: Vector3f) { - let handle = VarModule::get_int(fighter.object(), vars::wiifit::instance::RING_EFFECT_HANDLE); - let dark_handle = VarModule::get_int(fighter.object(), vars::wiifit::instance::RING_SECOND_EFFECT_HANDLE); - let light_handle = VarModule::get_int(fighter.object(), vars::wiifit::instance::RING_THIRD_EFFECT_HANDLE); - - // Make sure no color alpha is 0.0 - color.x = if color.x == 0.0 { 0.1 } else { color.x }; - color.y = if color.y == 0.0 { 0.1 } else { color.y }; - color.z = if color.z == 0.0 { 0.1 } else { color.z }; - - // Apply color to ring - EffectModule::set_rgb(fighter.module_accessor, handle as u32, color.x, color.y, color.z); - EffectModule::set_rgb(fighter.module_accessor, dark_handle as u32, color.x, color.y, color.z); - EffectModule::set_rgb(fighter.module_accessor, light_handle as u32, color.x, color.y, color.z); - - // Store color vars - VarModule::set_vec3(fighter.object(), vars::wiifit::instance::RING_COLOR, color); - VarModule::set_vec3(fighter.object(), vars::wiifit::instance::RING_SECOND_COLOR, color); -} - -/// Updates size and color of ring -pub unsafe fn update_ring(fighter: &mut L2CFighterCommon) { - if !VarModule::is_flag(fighter.object(), vars::wiifit::instance::RING_EFFECT_VISIBLE) { return; } - let motion_kind = VarModule::get_int64(fighter.object(), vars::wiifit::instance::RING_SHOW_MOTION); - if !fighter.is_motion(Hash40::new_raw(motion_kind)) { - EFFECT_OFF_KIND(fighter, Hash40::new("wiifit_fukushiki_ring"), false, true); - VarModule::off_flag(fighter.object(), vars::wiifit::instance::RING_EFFECT_VISIBLE); - return; +unsafe fn track_effect(fighter: &mut L2CFighterCommon) { + if VarModule::is_flag(fighter.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON) + && WorkModule::get_int(fighter.module_accessor, *FIGHTER_WIIFIT_INSTANCE_WORK_ID_INT_SPECIAL_LW_WAZA_EFFECTIVE_FRAME) <= 0 { + VarModule::off_flag(fighter.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON); } - - // Update ring size - let current_frame = VarModule::get_float(fighter.object(), vars::wiifit::instance::RING_CURRENT_FRAME); - let end_frame = VarModule::get_float(fighter.object(), vars::wiifit::instance::RING_END_FRAME); - - // Kill effect if beyond end frame - if current_frame > end_frame { - EFFECT_OFF_KIND(fighter, Hash40::new("wiifit_fukushiki_ring"), false, true); - VarModule::off_flag(fighter.object(), vars::wiifit::instance::RING_EFFECT_VISIBLE); - return; - } - - // Change to second color if attack hits - if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) { - let color = VarModule::get_vec3(fighter.object(), vars::wiifit::instance::RING_SECOND_COLOR); - set_ring_color(fighter, color); - } - - let handle = VarModule::get_int(fighter.object(), vars::wiifit::instance::RING_EFFECT_HANDLE); - let handle2 = VarModule::get_int(fighter.object(), vars::wiifit::instance::RING_SECOND_EFFECT_HANDLE); - let handle3 = VarModule::get_int(fighter.object(), vars::wiifit::instance::RING_THIRD_EFFECT_HANDLE); - let start_size = VarModule::get_float(fighter.object(), vars::wiifit::instance::RING_START_SIZE); - let end_size = VarModule::get_float(fighter.object(), vars::wiifit::instance::RING_END_SIZE); - let lerp = (current_frame as f32/end_frame as f32); - - // Linearly interpolate the size and color each frame - use interpolation::Lerp; - let lerp_size = Lerp::lerp(&start_size, &end_size, &lerp); - let lerp_color = Lerp::lerp(&1.0, &0.25, &lerp); - EffectModule::set_scale(fighter.module_accessor, handle as u32, &Vector3f{ x: lerp_size, y: lerp_size, z: lerp_size }); - EffectModule::set_scale(fighter.module_accessor, handle2 as u32, &Vector3f{ x: lerp_size - 0.05, y: lerp_size - 0.05, z: lerp_size - 0.05 }); - EffectModule::set_scale(fighter.module_accessor, handle3 as u32, &Vector3f{ x: lerp_size + 0.05, y: lerp_size + 0.05, z: lerp_size + 0.05 }); - EffectModule::set_alpha(fighter.module_accessor, handle as u32, lerp_color); - EffectModule::set_alpha(fighter.module_accessor, handle2 as u32, lerp_color); - EffectModule::set_alpha(fighter.module_accessor, handle3 as u32, lerp_color); - VarModule::set_float(fighter.object(), vars::wiifit::instance::RING_CURRENT_FRAME, current_frame + 1.0); } unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { @@ -138,9 +30,9 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { } } -pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) { +pub unsafe fn moveset(fighter: &mut L2CFighterCommon) { fastfall_specials(fighter); - //update_ring(fighter); + track_effect(fighter); } pub extern "C" fn wiifit_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterCommon) { @@ -152,7 +44,7 @@ pub extern "C" fn wiifit_frame_wrapper(fighter: &mut smash::lua2cpp::L2CFighterC pub unsafe fn wiifit_frame(fighter: &mut smash::lua2cpp::L2CFighterCommon) { if let Some(info) = FrameInfo::update_and_get(fighter) { - moveset(fighter, &mut *info.boma, info.id, info.cat, info.status_kind, info.situation_kind, info.motion_kind.hash, info.stick_x, info.stick_y, info.facing, info.frame); + moveset(fighter); } } diff --git a/fighters/wiifit/src/status/mod.rs b/fighters/wiifit/src/status/mod.rs index 48fadd4940..a8b6581ebb 100644 --- a/fighters/wiifit/src/status/mod.rs +++ b/fighters/wiifit/src/status/mod.rs @@ -3,6 +3,7 @@ use globals::*; // status script import mod special_hi; +mod special_lw; mod special_n; mod special_s; mod fall_special; @@ -24,6 +25,7 @@ pub fn install(agent: &mut Agent) { agent.on_start(on_start); special_hi::install(agent); + special_lw::install(agent); special_n::install(agent); special_s::install(agent); fall_special::install(agent); diff --git a/fighters/wiifit/src/status/special_hi.rs b/fighters/wiifit/src/status/special_hi.rs index 6f4e44917a..851e18e522 100644 --- a/fighters/wiifit/src/status/special_hi.rs +++ b/fighters/wiifit/src/status/special_hi.rs @@ -63,6 +63,125 @@ unsafe extern "C" fn special_hi_jump_pre(fighter: &mut L2CFighterCommon) -> L2CV return 0.into(); } +unsafe extern "C" fn special_hi_jump_main(fighter: &mut L2CFighterCommon) -> L2CValue { + MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_hi_jump"), 0.0, 1.0, false, 0.0, false, false); + fighter.set_float(0.0, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_RESTART_BACKUP_SPEED_Y); + fighter.set_float(0.0, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_RESTART_FRAME); + fighter.on_flag(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_FLAG_JUMP_RESTART); + fighter.on_flag(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_FLAG_JUMP_RESTART_NOW); + fighter.set_float(1.0, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_MOTION_RATE_NOW); + fighter.set_float(0.0, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_SE_PITCH); + + fighter.shift(L2CValue::Ptr(special_hi_jump_main_loop as *const () as _)); + return 0.into(); +} + +unsafe extern "C" fn special_hi_jump_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { + if fighter.sub_transition_group_check_air_cliff().get_bool() { + return 1.into(); + } + let hulahoop_jump_frame = fighter.get_param_int("param_special_hi", "hulahoop_jump_frame"); + if fighter.status_frame() >= hulahoop_jump_frame { + fighter.change_status(FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_HI_END.into(), false.into()); + return 1.into(); + } + let mut jump_flag = true; + if fighter.is_flag(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_FLAG_JUMP_RESTART) { + let restart_frame = fighter.get_float(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_RESTART_FRAME); + let prohibition_frame = fighter.get_param_int("param_special_hi", "hulahoop_jump_restart_prohibition_frame"); + if fighter.status_frame() as f32 - restart_frame <= prohibition_frame as f32 { + jump_flag = false; + } + } + if jump_flag { + let restart_start_frame = fighter.get_param_int("param_special_hi", "hulahoop_jump_restart_start_frame"); + if fighter.status_frame() >= restart_start_frame { + let restart_end_frame = fighter.get_param_int("param_special_hi", "hulahoop_jump_restart_end_frame"); + if fighter.status_frame() <= restart_end_frame { + if ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { + let sum_speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN); + let add_speed_y = fighter.get_param_float("param_special_hi", "hulahoop_jump_restart_add_speed_y"); + let mut speed_y = sum_speed_y + add_speed_y; + let max_speed_y = fighter.get_param_float("param_special_hi", "hulahoop_jump_max_speed_y"); + if speed_y > max_speed_y { + speed_y = max_speed_y; + } + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y); + fighter.set_float(speed_y, *FIGHTER_WIIFIT_INSTANCE_WORK_ID_FLOAT_SPECIAL_HI_JUMP_SPEED_Y); + //println!("setting speed_y to {}", speed_y); + let motion_rate_now = fighter.get_float(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_MOTION_RATE_NOW); + let add_motion_rate = fighter.get_param_float("param_special_hi", "hulahoop_jump_restart_add_motion_rate"); + let motion_rate = motion_rate_now + (add_motion_rate / 100.0); + MotionModule::set_rate(fighter.module_accessor, motion_rate); + fighter.set_float(motion_rate, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_MOTION_RATE_NOW); + let se_pitch = fighter.get_float(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_SE_PITCH); + SoundModule::stop_se(fighter.module_accessor, Hash40::new("se_wiifit_special_h01"), 0); + SoundModule::play_status_se(fighter.module_accessor, Hash40::new("se_wiifit_special_h01"), false, false, false); + SoundModule::set_se_pitch_status(fighter.module_accessor, se_pitch); + fighter.set_float(se_pitch + 300.0, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_SE_PITCH); + fighter.on_flag(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_FLAG_JUMP_RESTART); + fighter.on_flag(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_FLAG_JUMP_RESTART_NOW); + let frame = fighter.status_frame(); + fighter.set_float(frame as f32, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_RESTART_FRAME); + } + } + } + } + if fighter.is_flag(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_FLAG_JUMP_RESTART_NOW) { + let restart_frame = fighter.get_float(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_RESTART_FRAME); + let some_frame = fighter.status_frame() - restart_frame as i32; + let add_motion_rate_frame = fighter.get_param_int("param_special_hi", "hulahoop_jump_restart_add_motion_rate_frame"); + if add_motion_rate_frame < some_frame { + MotionModule::set_rate(fighter.module_accessor, 1.0); + fighter.set_float(1.0, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_MOTION_RATE_NOW); + fighter.off_flag(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_FLAG_JUMP_RESTART_NOW); + fighter.set_float(0.0, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_SE_PITCH); + } + } + else { + let jump_speed_y = fighter.get_float(*FIGHTER_WIIFIT_INSTANCE_WORK_ID_FLOAT_SPECIAL_HI_JUMP_SPEED_Y); + let jump_gravity = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_hi"), 0x1d57d7b043); + let jump_speed_y_mod = (jump_speed_y - jump_gravity).max(0.6); + let jump_y_speed = fighter.get_param_float("param_special_hi", "hulahoop_jump_y_speed"); + let init_speed_x = fighter.get_float(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_INIT_SPEED_X); + let max_speed_y_rate = fighter.get_param_float("param_special_hi", "hulahoop_jump_stick_max_speed_y_rate"); + let max_speed_x = fighter.get_param_float("param_special_hi", "hulahoop_jump_stick_max_speed_x"); + let fuckshit = 1.0 - (1.0 - max_speed_y_rate) * (init_speed_x / max_speed_x).abs(); + let mut l120 = jump_y_speed * fuckshit; + if jump_speed_y_mod < l120 { + l120 = jump_speed_y_mod; + } + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, l120); + fighter.set_float(l120, *FIGHTER_WIIFIT_INSTANCE_WORK_ID_FLOAT_SPECIAL_HI_JUMP_SPEED_Y); + } + let init_speed_x = fighter.get_float(*FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_INIT_SPEED_X); + let mut l90 = init_speed_x; + let stick_x = fighter.stick_x(); + if stick_x != 0.0 { + let x_speed_rate = fighter.get_param_float("param_special_hi", "hulahoop_jump_stick_x_speed_rate"); + let some_x_speed = stick_x * x_speed_rate; + l90 = init_speed_x + stick_x; + let max_speed_x = fighter.get_param_float("param_special_hi", "hulahoop_jump_stick_max_speed_x"); + if max_speed_x < l90.abs() { + if stick_x > 0.0 { + l90 = max_speed_x; + } + else { + l90 = -max_speed_x; + } + } + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, l90, 0.0); + fighter.set_float(l90, *FIGHTER_WIIFIT_STATUS_SPECIAL_HI_WORK_FLOAT_JUMP_INIT_SPEED_X); + } + let facing = fighter.lr(); + let x_inclination_rate = fighter.get_param_float("param_special_hi", "hulahoop_jump_stick_x_inclination_rate"); + let lb0 = x_inclination_rate * l90 * facing; + ModelModule::set_joint_rotate(fighter.module_accessor, Hash40::new("rot"), &Vector3f::new(0.0, 0.0, lb0), MotionNodeRotateCompose{_address: *MOTION_NODE_ROTATE_COMPOSE_NONE as u8}, MotionNodeRotateOrder{_address: *MOTION_NODE_ROTATE_ORDER_XYZ as u8}); + fighter.set_float(lb0, *FIGHTER_WIIFIT_INSTANCE_WORK_ID_FLOAT_SPECIAL_HI_JUMP_ROTATION); + + return 0.into(); +} + // FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_HI_END unsafe extern "C" fn special_hi_end_pre(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -96,6 +215,9 @@ unsafe extern "C" fn special_hi_end_pre(fighter: &mut L2CFighterCommon) -> L2CVa pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_STATUS_KIND_SPECIAL_HI, special_hi_pre); + agent.status(Pre, *FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_pre); + agent.status(Main, *FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_HI_JUMP, special_hi_jump_main); + agent.status(Pre, *FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_HI_END, special_hi_end_pre); } \ No newline at end of file diff --git a/fighters/wiifit/src/status/special_lw.rs b/fighters/wiifit/src/status/special_lw.rs new file mode 100644 index 0000000000..fbf2ce9c6d --- /dev/null +++ b/fighters/wiifit/src/status/special_lw.rs @@ -0,0 +1,18 @@ +use super::*; + +unsafe extern "C" fn special_lw_success_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::on_flag(fighter.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON); + + return smashline::original_status(Main, fighter, *FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_LW_SUCCESS)(fighter); +} + +unsafe extern "C" fn special_lw_failure_main(fighter: &mut L2CFighterCommon) -> L2CValue { + VarModule::off_flag(fighter.battle_object, vars::wiifit::instance::SPECIAL_LW_EFFECT_ON); + + return smashline::original_status(Main, fighter, *FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_LW_FAILURE)(fighter); +} + +pub fn install(agent: &mut Agent) { + agent.status(Main, *FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_LW_SUCCESS, special_lw_success_main); + agent.status(Main, *FIGHTER_WIIFIT_STATUS_KIND_SPECIAL_LW_FAILURE, special_lw_failure_main); +} \ No newline at end of file diff --git a/fighters/wiifit/src/status/special_n.rs b/fighters/wiifit/src/status/special_n.rs index 68a5af9f94..5798e2433b 100644 --- a/fighters/wiifit/src/status/special_n.rs +++ b/fighters/wiifit/src/status/special_n.rs @@ -91,7 +91,7 @@ unsafe extern "C" fn special_n_hold_main_loop(fighter: &mut L2CFighterCommon) -> && StatusModule::is_situation_changed(fighter.module_accessor) { fighter.ground_correct_by_situation(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP, *GROUND_CORRECT_KIND_AIR); fighter.change_kinetic_by_situation(*FIGHTER_KINETIC_TYPE_GROUND_STOP, *FIGHTER_KINETIC_TYPE_AIR_STOP); - fighter.sub_change_motion_by_situation(Hash40::new("special_n_hold").into(), Hash40::new("special_air_n_hold").into(), false.into()); + fighter.change_motion_inherit_frame_by_situation("special_n_hold", "special_air_n_hold", -1.0, 1.0, 0.0, false, false); } if !fighter.global_table[IS_STOPPING].get_bool() { if StatusModule::is_situation_changed(fighter.module_accessor) { diff --git a/fighters/wiifit/src/status/special_s.rs b/fighters/wiifit/src/status/special_s.rs index a4278e6d4d..029f5a3642 100644 --- a/fighters/wiifit/src/status/special_s.rs +++ b/fighters/wiifit/src/status/special_s.rs @@ -24,6 +24,7 @@ unsafe extern "C" fn special_s_init(fighter: &mut L2CFighterCommon) -> L2CValue sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, -heading_gravity); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); } + InputModule::set_command_life_count_max(fighter.battle_object, 3); return 0.into(); } @@ -64,19 +65,22 @@ unsafe extern "C" fn special_s_jump_main_loop(fighter: &mut L2CFighterCommon) -> return 0.into(); } } - if fighter.is_pad_flag(PadFlag::GuardTrigger) { - if !VarModule::is_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL) { - VarModule::on_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL); - ControlModule::reset_trigger(fighter.module_accessor); - ControlModule::clear_command_one(fighter.module_accessor, *FIGHTER_PAD_COMMAND_CATEGORY1, *FIGHTER_PAD_CMD_CAT1_AIR_ESCAPE); - fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + if fighter.status_frame() > 3 { + if fighter.is_pad_flag(PadFlag::GuardTrigger) { + if !VarModule::is_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL) { + VarModule::on_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL); + ControlModule::reset_trigger(fighter.module_accessor); + ControlModule::clear_command_one(fighter.module_accessor, *FIGHTER_PAD_COMMAND_CATEGORY1, *FIGHTER_PAD_CMD_CAT1_AIR_ESCAPE); + fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); + return 0.into(); + } + let heading_cancel_landing_frame = fighter.get_param_int("param_special_s", "heading_cancel_landing_frame"); + fighter.set_float(heading_cancel_landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); + fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); return 0.into(); } - let heading_cancel_landing_frame = fighter.get_param_int("param_special_s", "heading_cancel_landing_frame"); - fighter.set_float(heading_cancel_landing_frame as f32, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME); - fighter.change_status(FIGHTER_STATUS_KIND_FALL_SPECIAL.into(), false.into()); - return 0.into(); } + return 0.into(); } diff --git a/fighters/wiifit/src/sunbullet/acmd.rs b/fighters/wiifit/src/sunbullet/acmd.rs index 35b7c06fdf..802c7cc00f 100644 --- a/fighters/wiifit/src/sunbullet/acmd.rs +++ b/fighters/wiifit/src/sunbullet/acmd.rs @@ -18,7 +18,7 @@ unsafe extern "C" fn game_shoot(agent: &mut L2CAgentBase) { let boma = agent.boma(); if is_excute(agent) { ATTACK(agent, 0, 1, Hash40::new("top"), 5.0, 50, 63, 0, 30, 1.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -2.5, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_taiyo_hit"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); - ATTACK(agent, 1, 1, Hash40::new("top"), 22.0, 50, 64, 0, 38, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -5.3, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_taiyo_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); + ATTACK(agent, 1, 1, Hash40::new("top"), 22.0, 50, 61, 0, 38, 6.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, -5.3, 0.0, 0, true, true, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_taiyo_hit"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_ENERGY); attack!(agent, *MA_MSC_CMD_ATTACK_SET_LERP, 0, 1); } } diff --git a/fighters/wolf/Cargo.toml b/fighters/wolf/Cargo.toml index e698f92b83..8e17eb045b 100644 --- a/fighters/wolf/Cargo.toml +++ b/fighters/wolf/Cargo.toml @@ -8,7 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } smashline = { git = "https://github.com/HDR-Development/smashline" } -smash_rs = { package = "smash", git = "https://github.com/blu-dev/smash-rs" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/wolf/src/acmd/other.rs b/fighters/wolf/src/acmd/other.rs index 5409d055cc..4abf8dae3f 100644 --- a/fighters/wolf/src/acmd/other.rs +++ b/fighters/wolf/src/acmd/other.rs @@ -77,16 +77,12 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -97,10 +93,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_jumpaerialfront(agent: &mut L2CAgentBase) { diff --git a/fighters/wolf/src/acmd/throws.rs b/fighters/wolf/src/acmd/throws.rs index 69656501a7..59b33083ae 100644 --- a/fighters/wolf/src/acmd/throws.rs +++ b/fighters/wolf/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 1.2); - frame(lua_state, 5.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 6.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 0.0, Some(0.0), Some(7.0), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, 4.0, Some(0.0), Some(7.0), Some(9.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -53,7 +52,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 9.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -4.0, Some(0.0), Some(7.0), Some(-14.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.0, 0.0, 7.0, -6.5, Some(0.0), Some(7.0), Some(-14.5), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/wolf/src/lib.rs b/fighters/wolf/src/lib.rs index ada167b68c..2ae7089ba0 100644 --- a/fighters/wolf/src/lib.rs +++ b/fighters/wolf/src/lib.rs @@ -37,6 +37,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/wolf/src/opff.rs b/fighters/wolf/src/opff.rs index f7c234aeb1..8a3a177c6f 100644 --- a/fighters/wolf/src/opff.rs +++ b/fighters/wolf/src/opff.rs @@ -25,12 +25,28 @@ unsafe fn airdodge_cancel(boma: &mut BattleObjectModuleAccessor, status_kind: i3 // Wolf Shine Jump Cancels unsafe fn shine_jump_cancel(fighter: &mut L2CFighterCommon) { + // disables jump cancels when parried between statuses if fighter.is_status_one_of(&[ + *FIGHTER_STATUS_KIND_SPECIAL_LW, *FIGHTER_WOLF_STATUS_KIND_SPECIAL_LW_LOOP, - *FIGHTER_WOLF_STATUS_KIND_SPECIAL_LW_END]) + *FIGHTER_WOLF_STATUS_KIND_SPECIAL_LW_END, + *FIGHTER_WOLF_STATUS_KIND_SPECIAL_LW_HIT + ]) + && AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_PARRY) { + VarModule::on_flag(fighter.battle_object, vars::wolf::instance::SPECIAL_LW_DISABLE_JC); + if !fighter.is_status(*FIGHTER_WOLF_STATUS_KIND_SPECIAL_LW_END) + && !fighter.is_in_hitlag() { + fighter.change_status(FIGHTER_WOLF_STATUS_KIND_SPECIAL_LW_END.into(), false.into()); + } + } + + if fighter.is_status_one_of(&[ + *FIGHTER_WOLF_STATUS_KIND_SPECIAL_LW_LOOP, + *FIGHTER_WOLF_STATUS_KIND_SPECIAL_LW_END + ]) && !fighter.is_in_hitlag() - { - fighter.check_jump_cancel(false, false); + && !VarModule::is_flag(fighter.battle_object, vars::wolf::instance::SPECIAL_LW_DISABLE_JC) { + fighter.check_jump_cancel(false, false, false); } } diff --git a/fighters/wolf/src/status/special_lw.rs b/fighters/wolf/src/status/special_lw.rs index 6765878622..34c0b4cdc2 100644 --- a/fighters/wolf/src/status/special_lw.rs +++ b/fighters/wolf/src/status/special_lw.rs @@ -42,6 +42,7 @@ pub unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CV else { WorkModule::set_int(fighter.module_accessor, 0, *FIGHTER_FOX_REFLECTOR_STATUS_WORK_ID_INT_STOP_Y_FRAME); } + VarModule::off_flag(fighter.battle_object, vars::wolf::instance::SPECIAL_LW_DISABLE_JC); special_lw_motion_helper(fighter); fighter.main_shift(special_lw_main_loop) } @@ -49,7 +50,8 @@ pub unsafe extern "C" fn special_lw_main(fighter: &mut L2CFighterCommon) -> L2CV unsafe extern "C" fn special_lw_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.global_table[CURRENT_FRAME].get_i32() > 2 // Allows for jump cancel on frame 4 in game && !fighter.is_in_hitlag() - && fighter.check_jump_cancel(false, false) { + && !VarModule::is_flag(fighter.battle_object, vars::wolf::instance::SPECIAL_LW_DISABLE_JC) + && fighter.check_jump_cancel(false, false, false) { return 0.into(); } @@ -218,13 +220,15 @@ pub unsafe extern "C" fn special_lw_hit_main(fighter: &mut L2CFighterCommon) -> ControlModule::reset_flick_x(fighter.module_accessor); ControlModule::reset_flick_y(fighter.module_accessor); fighter.on_flag(*FIGHTER_FOX_REFLECTOR_STATUS_WORK_ID_FLAG_HIT_TO_RESTART); + VarModule::off_flag(fighter.battle_object, vars::wolf::instance::SPECIAL_LW_DISABLE_JC); special_lw_hit_motion_helper(fighter); fighter.main_shift(special_lw_hit_main_loop) } unsafe extern "C" fn special_lw_hit_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue { if MotionModule::is_end(fighter.module_accessor) { - if fighter.check_jump_cancel(false, false) { + if !VarModule::is_flag(fighter.battle_object, vars::wolf::instance::SPECIAL_LW_DISABLE_JC) + && fighter.check_jump_cancel(false, false, false) { return 0.into(); } if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) { diff --git a/fighters/yoshi/Cargo.toml b/fighters/yoshi/Cargo.toml index 8c818941d5..df1cd3adfb 100644 --- a/fighters/yoshi/Cargo.toml +++ b/fighters/yoshi/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/yoshi/src/acmd/other.rs b/fighters/yoshi/src/acmd/other.rs index c865b2ebd1..9db6013abc 100644 --- a/fighters/yoshi/src/acmd/other.rs +++ b/fighters/yoshi/src/acmd/other.rs @@ -72,15 +72,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -90,10 +86,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_guardoff(agent: &mut L2CAgentBase) { diff --git a/fighters/yoshi/src/acmd/specials.rs b/fighters/yoshi/src/acmd/specials.rs index 48cb96c662..3bf8976e63 100644 --- a/fighters/yoshi/src/acmd/specials.rs +++ b/fighters/yoshi/src/acmd/specials.rs @@ -43,7 +43,7 @@ unsafe extern "C" fn game_speciallw(agent: &mut L2CAgentBase) { } frame(lua_state, 27.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 80, 80, 0, 60, 6.8, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 15.0, 80, 80, 0, 60, 6.8, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } } @@ -57,12 +57,12 @@ unsafe extern "C" fn game_specialairlw(agent: &mut L2CAgentBase) { } frame(lua_state, 19.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 80, 85, 0, 70, 6.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 80, 85, 0, 70, 6.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } frame(lua_state, 20.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 80, 85, 0, 70, 6.4, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 25, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); + ATTACK(agent, 0, 0, Hash40::new("top"), 14.0, 80, 85, 0, 70, 6.4, 0.0, 5.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 20, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HIP); AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_HIGH), false); } } diff --git a/fighters/yoshi/src/lib.rs b/fighters/yoshi/src/lib.rs index faab10c1bc..ec807c5f5c 100644 --- a/fighters/yoshi/src/lib.rs +++ b/fighters/yoshi/src/lib.rs @@ -34,6 +34,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/yoshi/src/opff.rs b/fighters/yoshi/src/opff.rs index 4c523aabe2..25931c62b1 100644 --- a/fighters/yoshi/src/opff.rs +++ b/fighters/yoshi/src/opff.rs @@ -3,20 +3,6 @@ utils::import_noreturn!(common::opff::fighter_common_opff); use super::*; use globals::*; -/*unsafe fn egg_roll_jc_waveland(boma: &mut BattleObjectModuleAccessor, status_kind: i32, situation_kind: i32, cat1: i32, stick_x: f32, facing: f32) { - if [*FIGHTER_STATUS_KIND_SPECIAL_S, - *FIGHTER_YOSHI_STATUS_KIND_SPECIAL_S_LOOP, - *FIGHTER_YOSHI_STATUS_KIND_SPECIAL_S_TURN].contains(&status_kind) - { - boma.check_airdodge_cancel(); - } - - if status_kind == *FIGHTER_YOSHI_STATUS_KIND_SPECIAL_S_END { - boma.check_jump_cancel(true, false); - } -} -*/ - unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) { if !fighter.is_in_hitlag() && !StatusModule::is_changing(fighter.module_accessor) diff --git a/fighters/younglink/Cargo.toml b/fighters/younglink/Cargo.toml index 8fea0be3f3..d287863ab2 100644 --- a/fighters/younglink/Cargo.toml +++ b/fighters/younglink/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/younglink/src/acmd/aerials.rs b/fighters/younglink/src/acmd/aerials.rs index 83fc5f511a..b665dcd9a5 100644 --- a/fighters/younglink/src/acmd/aerials.rs +++ b/fighters/younglink/src/acmd/aerials.rs @@ -38,9 +38,12 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 13.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 6.0, 367, 30, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 6.0, 367, 30, 0, 35, 4.0, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 6.0, 367, 30, 0, 35, 3.0, 6.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 6.0, 366, 39, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 6.0, 366, 39, 0, 35, 4.0, 1.0, 0.0, 1.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 6.0, 366, 39, 0, 35, 3.0, 6.0, 0.0, 1.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("shoulderl"), 6.0, 80, 39, 0, 35, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 4, 0, Hash40::new("sword"), 6.0, 80, 39, 0, 35, 4.0, 1.0, 0.0, 1.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 5, 0, Hash40::new("sword"), 6.0, 80, 39, 0, 35, 3.0, 6.0, 0.0, 1.0, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 16.0); FT_MOTION_RATE_RANGE(agent, 16.0, 24.0, 3.0); @@ -51,9 +54,9 @@ unsafe extern "C" fn game_attackairf(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 29.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 8.0, 50, 100, 0, 45, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 8.0, 50, 100, 0, 45, 4.0, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 8.0, 50, 100, 0, 45, 3.0, 6.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 8.0, 52, 80, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 8.0, 52, 80, 0, 50, 4.0, 1.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 8.0, 52, 80, 0, 50, 3.0, 6.0, 0.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 3.0); if is_excute(agent) { @@ -118,24 +121,27 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) { } frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 5.0, 366, 100, 40, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneel"), 5.0, 366, 100, 40, 0, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneel"), 5.0, 366, 100, 40, 0, 3.5, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 3, 0, Hash40::new("hip"), 5.0, 70, 100, 40, 0, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 4, 0, Hash40::new("kneel"), 5.0, 75, 100, 40, 0, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 5, 0, Hash40::new("kneel"), 5.0, 80, 100, 40, 0, 3.5, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legl"), 5.0, 72, 62, 0, 43, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneel"), 5.0, 72, 62, 0, 43, 3.5, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneel"), 5.0, 72, 62, 0, 43, 3.5, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - wait(lua_state, 3.0); + wait(lua_state, 4.0); if is_excute(agent) { AttackModule::clear_all(boma); } + frame(lua_state, 12.0); + FT_MOTION_RATE_RANGE(agent, 12.0, 16.0, 2.0); + frame(lua_state, 16.0); + FT_MOTION_RATE(agent, 1.0); frame(lua_state, 18.0); + FT_MOTION_RATE_RANGE(agent, 18.0, 21.0, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("hip"), 8.0, 55, 75, 0, 40, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 8.0, 55, 75, 0, 40, 4.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 2, 0, Hash40::new("kneer"), 8.0, 55, 75, 0, 40, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("legr"), 6.0, 55, 90, 0, 34, 4.0, -0.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 6.0, 55, 90, 0, 34, 4.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 2, 0, Hash40::new("kneer"), 6.0, 55, 90, 0, 34, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); } - wait(lua_state, 3.0); + frame(lua_state, 21.0); + FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { AttackModule::clear_all(boma); } @@ -197,7 +203,12 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING); WorkModule::on_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_ATTACK_AIR_LW_SET_ATTACK); - ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 70, 83, 0, 30, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 16.0, 85, 87, 0, 33, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 281, 50, 0, 30, 3.5, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); + } + frame(lua_state, 17.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 80, 85, 0, 25, 4.5, 0.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("top"), 16.0, 281, 50, 0, 30, 3.5, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); } frame(lua_state, 41.0); @@ -221,7 +232,7 @@ unsafe extern "C" fn game_attackairlw2attack(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 55, 70, 0, 80, 4.0, 0.0, 3.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 70, 77, 0, 50, 4.0, 0.0, 3.5, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 281, 83, 0, 30, 3.0, 0.0, 9.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); } } diff --git a/fighters/younglink/src/acmd/ground.rs b/fighters/younglink/src/acmd/ground.rs index 9466cec91a..f77ea84c0f 100644 --- a/fighters/younglink/src/acmd/ground.rs +++ b/fighters/younglink/src/acmd/ground.rs @@ -70,9 +70,9 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("arml"), 3.5, 361, 70, 0, 70, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 3.5, 361, 70, 0, 70, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 3.5, 361, 70, 0, 70, 3.0, 5.5, 0.0,0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("arml"), 3.5, 361, 75, 0, 50, 2.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 3.5, 361, 75, 0, 50, 3.0, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 3.5, 361, 75, 0, 50, 3.0, 5.5, 0.0,0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 2.0); if is_excute(agent) { @@ -80,6 +80,20 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) { } } +unsafe extern "C" fn game_attack100end(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + wait(lua_state, 4.0); + if is_excute(agent) { + ATTACK(agent, 0, 0, Hash40::new("top"), 2.5, 45, 77, 0, 50, 4.0, 0.0, 12.0, 11.0, Some(0.0), Some(5.0), Some(11.0), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("top"), 2.5, 45, 77, 0, 50, 4.0, 0.0, 12.0, 17.5, Some(0.0), Some(5.0), Some(17.5), 2.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + } + wait(lua_state, 2.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + unsafe extern "C" fn effect_attack100end(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); diff --git a/fighters/younglink/src/acmd/other.rs b/fighters/younglink/src/acmd/other.rs index 0509235d84..370fa7c014 100644 --- a/fighters/younglink/src/acmd/other.rs +++ b/fighters/younglink/src/acmd/other.rs @@ -94,15 +94,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -112,10 +108,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn effect_cliffattack(agent: &mut L2CAgentBase) { diff --git a/fighters/younglink/src/acmd/smashes.rs b/fighters/younglink/src/acmd/smashes.rs index 38c6916e7e..c038a75604 100644 --- a/fighters/younglink/src/acmd/smashes.rs +++ b/fighters/younglink/src/acmd/smashes.rs @@ -11,9 +11,9 @@ unsafe extern "C" fn game_attacks4(agent: &mut L2CAgentBase) { frame(lua_state, 14.0); FT_MOTION_RATE(agent, 2.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 14.0, 48, 110, 0, 33, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 14.0, 48, 110, 0, 33, 3.0, 1.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 14.0, 48, 110, 0, 33, 3.0, 6.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 15.0, 48, 103, 0, 34, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 15.0, 48, 103, 0, 34, 3.0, 1.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 15.0, 48, 103, 0, 34, 3.0, 6.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 15.0); FT_MOTION_RATE(agent, 1.0); @@ -115,37 +115,32 @@ unsafe extern "C" fn expression_attacks4charge(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_attackhi4(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - frame(lua_state, 6.0); + frame(lua_state, 6.0); if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_FLAG_START_SMASH_HOLD); } frame(lua_state, 10.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 4.0, 105, 100, 33, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 0.4, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 4.0, 95, 100, 23, 0, 3.0, 1.0, -1.0, 1.0, None, None, None, 0.8, 0.4, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 4.0, 105, 100, 48, 0, 3.0, 6.0, -1.0, 1.0, None, None, None, 0.8, 0.4, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword"), 4.0, 149, 100, 23, 0, 3.0, 6.0, -1.0, 1.0, None, None, None, 0.8, 0.4, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - AttackModule::set_add_reaction_frame(boma, 0, 6.0, false); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 4.0, 121, 100, 40, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.8, 0.4, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 4.0, 132, 100, 46, 0, 3.0, 1.0, -1.0, 1.0, None, None, None, 0.8, 0.4, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 4.0, 149, 100, 51, 0, 3.0, 6.0, -1.0, 1.0, None, None, None, 0.8, 0.4, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword"), 4.0, 149, 100, 51, 0, 3.0, 6.0, -1.0, 1.0, None, None, None, 0.8, 0.4, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 14.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 26.0); + frame(lua_state, 25.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 10.0, 100, 108, 0, 75, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 10.0, 100, 108, 0, 75, 3.0, 1.0, -1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 10.0, 100, 108, 0, 75, 3.0, 6.0, -1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 100, 108, 0, 75, 3.5, 0.0, 8.5, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 10.0, 100, 139, 0, 36, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 10.0, 100, 139, 0, 36, 3.0, 1.0, -1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 10.0, 100, 139, 0, 36, 3.0, 6.0, -1.0, 1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 100, 139, 0, 36, 3.5, 0.0, 8.5, -0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 10, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 31.0); if is_excute(agent) { AttackModule::clear_all(boma); } - frame(lua_state, 50.0); - FT_MOTION_RATE_RANGE(agent, 50.0, 60.0, 7.0); - frame(lua_state, 60.0); - FT_MOTION_RATE(agent, 1.0); } unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { @@ -159,15 +154,15 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_younglink_sword_hdr"), Hash40::new("younglink_sword2"), 4, Hash40::new("sword"), 0.5, 0.0, 0.0, Hash40::new("sword"), 9.7, 0.0, -0.25, true, Hash40::new("younglink_sword_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.6, 0.2); } - frame(lua_state, 12.0); + frame(lua_state, 13.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 3); } - frame(lua_state, 25.0); + frame(lua_state, 24.0); if is_excute(agent) { AFTER_IMAGE4_ON_arg29(agent, Hash40::new("tex_younglink_sword_hdr"), Hash40::new("younglink_sword2"), 4, Hash40::new("sword"), 0.5, 0.0, 0.0, Hash40::new("sword"), 9.7, 0.0, -0.25, true, Hash40::new("younglink_sword_flare"), Hash40::new("sword"), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0, *EFFECT_AXIS_X, 0, *TRAIL_BLEND_ALPHA, 101, *TRAIL_CULL_NONE, 1.6, 0.2); } - frame(lua_state, 29.0); + frame(lua_state, 30.0); if is_excute(agent) { AFTER_IMAGE_OFF(agent, 3); } @@ -185,13 +180,13 @@ unsafe extern "C" fn sound_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { STOP_SE(agent, Hash40::new("se_common_smash_start_02")); } - wait(lua_state, 4.0); + frame(lua_state, 9.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("vc_younglink_attack04")); PLAY_SE(agent, Hash40::new("se_common_smashswing_03")); PLAY_SE(agent, Hash40::new("se_younglink_swing_ll")); } - wait(lua_state, 15.0); + frame(lua_state, 25.0); if is_excute(agent) { PLAY_SE(agent, Hash40::new("se_younglink_swing_ll")); } @@ -211,12 +206,12 @@ unsafe extern "C" fn expression_attackhi4(agent: &mut L2CAgentBase) { if is_excute(agent) { AttackModule::set_attack_reference_joint_id(boma, Hash40::new("sword"), AttackDirectionAxis(*ATTACK_DIRECTION_Z_MINUS), AttackDirectionAxis(*ATTACK_DIRECTION_X), AttackDirectionAxis(*ATTACK_DIRECTION_Y)); } - frame(lua_state, 10.0); + frame(lua_state, 9.0); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_slashm"), 0); ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); } - frame(lua_state, 26.0); + frame(lua_state, 25.0); if is_excute(agent) { RUMBLE_HIT(agent, Hash40::new("rbkind_slashl"), 0); ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitl"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32); diff --git a/fighters/younglink/src/acmd/specials.rs b/fighters/younglink/src/acmd/specials.rs index 87443e5672..de4c97f097 100644 --- a/fighters/younglink/src/acmd/specials.rs +++ b/fighters/younglink/src/acmd/specials.rs @@ -79,8 +79,8 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("sword"), 1.0, 173, 100, 55, 0, 3.5, 2.2, 0.0, 1.0, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 1.0, 173, 100, 55, 0, 3.5, 5.7, 0.0, 1.0, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("sword"), 1.0, 173, 100, 55, 0, 3.5, 2.2, -1.0, 1.0, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 1.0, 173, 100, 55, 0, 3.5, 5.7, -1.0, 1.0, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 2, 0, Hash40::new("arml"), 1.0, 173, 100, 55, 0, 3.0, 0.0, 0.0, 0.0, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 3, 0, Hash40::new("top"), 1.0, 80, 100, 10, 0, 3.0, 0.0, 5.0, 0.0, None, None, None, 0.5, 0.5, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, true, 0, 0.0, 4, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } @@ -90,7 +90,7 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) { } frame(lua_state, 44.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 70, 85, 0, 90, 4.0, 0.0, 7.0, -11.0, Some(0.0), Some(4.5), Some(8.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("top"), 3.0, 70, 85, 0, 90, 4.0, 0.0, 6.0, -11.0, Some(0.0), Some(6.0), Some(8.0), 1.5, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 45.0); FT_MOTION_RATE_RANGE(agent, 45.0, 66.0, 26.0); diff --git a/fighters/younglink/src/acmd/throws.rs b/fighters/younglink/src/acmd/throws.rs index 79d23e1e6b..4f56ab49e9 100644 --- a/fighters/younglink/src/acmd/throws.rs +++ b/fighters/younglink/src/acmd/throws.rs @@ -1,27 +1,207 @@ use super::*; +unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, false, -1); + ArticleModule::generate_article(boma,*FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, false, -1); + } + frame(lua_state, 11.0); + if is_excute(agent) { + GrabModule::set_rebound(boma, true); + } + frame(lua_state, 12.0); + if is_excute(agent) { + ArticleModule::change_status(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT,*WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_SHOOT, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + ArticleModule::change_motion(boma,*FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, Hash40::new("shoot"), false, -1.0); + CATCH(agent, 0, Hash40::new("throw"), 2.8, 0.0, 0.0, 0.0, None, None, None, *FIGHTER_STATUS_KIND_CAPTURE_PULLED,*COLLISION_SITUATION_MASK_GA); + CATCH(agent, 1, Hash40::new("handr"), 1.5, 0.0, 0.0, 0.0, None, None, None, *FIGHTER_STATUS_KIND_CAPTURE_PULLED,*COLLISION_SITUATION_MASK_GA); + CATCH(agent, 2, Hash40::new("handr"), 4.0, 0.0, 0.0, 0.0, None, None, None, *FIGHTER_STATUS_KIND_CAPTURE_PULLED,*COLLISION_SITUATION_MASK_G); + } + game_CaptureCutCommon(agent); + frame(lua_state, 14.0); + if is_excute(agent) { + grab!(agent, MA_MSC_CMD_GRAB_CLEAR, 1); + grab!(agent,MA_MSC_CMD_GRAB_CLEAR, 2); + } + frame(lua_state, 19.0); + if is_excute(agent) { + grab!(agent, MA_MSC_CMD_GRAB_CLEAR_ALL); + GrabModule::set_rebound(boma, false); + } + frame(lua_state, 46.0); + if is_excute(agent) { + ArticleModule::change_status_exist(boma,*FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, *WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_REWIND); + ArticleModule::change_motion(boma,*FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, Hash40::new("back"), false, -1.0); + WorkModule::on_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_OFF_MAP_COLL_OFFSET); + } + frame(lua_state, 65.0); + if is_excute(agent) { + ArticleModule::remove_exist(boma,*FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + ArticleModule::remove_exist(boma,*FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } +} + +unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 7.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, false, -1); + ArticleModule::generate_article(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, false, -1); + } + frame(lua_state, 13.0); + if is_excute(agent) { + GrabModule::set_rebound(boma, true); + } + frame(lua_state, 14.0); + if is_excute(agent) { + ArticleModule::change_status(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, *WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_SHOOT, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + ArticleModule::change_motion(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, Hash40::new("shoot"), false, -1.0); + CATCH(agent, 0, Hash40::new("throw"), 2.8, 0.0, 0.0, 0.0, None,None, None,*FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 1, Hash40::new("handr"), 1.5, 0.0, 0.0, 0.0, None,None, None,*FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 2, Hash40::new("handr"), 4.0, 0.0, 0.0, 0.0, None,None, None,*FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_G); + } + game_CaptureCutCommon(agent); + wait(lua_state, 2.0); + if is_excute(agent) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR, 1); + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR, 2); + } + wait(lua_state, 5.0); + if is_excute(agent) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); + GrabModule::set_rebound(boma, false); + } + frame(lua_state, 45.0); + if is_excute(agent) { + ArticleModule::change_status_exist(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, *WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_REWIND); + ArticleModule::change_motion(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, Hash40::new("back"), false, -1.0); + WorkModule::on_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_OFF_MAP_COLL_OFFSET); + } + frame(lua_state, 63.0); + if is_excute(agent) { + ArticleModule::remove_exist(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + ArticleModule::remove_exist(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } +} + +unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + ArticleModule::generate_article(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, false, -1); + ArticleModule::generate_article(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, false, -1); + } + frame(lua_state, 14.0); + if is_excute(agent) { + GrabModule::set_rebound(boma, true); + } + frame(lua_state, 15.0); + if is_excute(agent) { + ArticleModule::change_status(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, *WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_SHOOT, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + ArticleModule::change_motion(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, Hash40::new("shoot"), false, -1.0); + CATCH(agent, 0, Hash40::new("throw"), 2.8, 0.0, 0.0, 0.0, None,None, None,*FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 1, Hash40::new("handr"), 1.5, 0.0, 0.0, 0.0, None,None, None,*FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 2, Hash40::new("handr"), 4.0, 0.0, 0.0, 0.0, None,None, None,*FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_G); + } + game_CaptureCutCommon(agent); + wait(lua_state, 2.0); + if is_excute(agent) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR, 1); + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR, 2); + } + wait(lua_state, 5.0); + if is_excute(agent) { + grab!(agent, *MA_MSC_CMD_GRAB_CLEAR_ALL); + GrabModule::set_rebound(boma, false); + } + frame(lua_state, 53.0); + if is_excute(agent) { + ArticleModule::change_status_exist(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, *WEAPON_TOONLINK_HOOKSHOT_STATUS_KIND_REWIND); + ArticleModule::change_motion(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, Hash40::new("back"), false, -1.0); + WorkModule::on_flag(boma, *FIGHTER_LINK_INSTANCE_WORK_ID_FLAG_OFF_MAP_COLL_OFFSET); + } + frame(lua_state, 72.0); + if is_excute(agent) { + ArticleModule::remove_exist(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + ArticleModule::remove_exist(boma, *FIGHTER_YOUNGLINK_GENERATE_ARTICLE_HOOKSHOT_HAND, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL)); + } +} + unsafe extern "C" fn game_throwf(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 6.0, 48, 191, 0, 10, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 38, 133, 0, 33, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 60, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 2.0); - FT_MOTION_RATE_RANGE(agent, 2.0, 11.0, 8.0); - frame(lua_state, 11.0); + frame(lua_state, 9.0); + FT_MOTION_RATE_RANGE(agent, 9.0, 10.5, 1.0); + frame(lua_state, 10.5); + FT_MOTION_RATE(agent, 2.0); + frame(lua_state, 11.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("kneer"), 3.0, 361, 0, 120, 0, 3.1, 0.0, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); - ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 361, 0, 120, 0, 3.1, 3.5, 0.0, 0.0, None, None, None, 0.6, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 0, 0, Hash40::new("kneer"), 3.0, 361, 100, 90, 0, 3.1, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); + ATTACK(agent, 1, 0, Hash40::new("kneer"), 3.0, 361, 100, 90, 0, 3.1, 3.5, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK); AttackModule::set_catch_only_all(boma, true, false); CHECK_FINISH_CAMERA(agent, 21, 11); } frame(lua_state, 12.0); if is_excute(agent) { - AttackModule::clear_all(boma); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_OBJECT), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP), WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO)); } + frame(lua_state, 13.0); + if is_excute(agent) { + AttackModule::clear_all(boma); + } +} + +unsafe extern "C" fn sound_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 6.0); + if is_excute(agent) { + PLAY_SE(agent, Hash40::new("se_common_throw_01")); + } + wait(lua_state, 5.0); + if is_excute(agent) { + PLAY_SEQUENCE(agent, Hash40::new("seq_younglink_rnd_attack")); + } +} + +unsafe extern "C" fn expression_throwf(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + if is_excute(agent) { + FT_ATTACK_ABS_CAMERA_QUAKE(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, *CAMERA_QUAKE_KIND_NONE); + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE, *SLOPE_STATUS_LR); + VisibilityModule::set_int64(boma, hash40("shield") as i64, hash40("shield_back") as i64); + } + frame(lua_state, 10.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_L, 3); + } + frame(lua_state, 10.0); + if is_excute(agent) { + RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0); + } + frame(lua_state, 11.0); + if is_excute(agent) { + QUAKE(agent, *CAMERA_QUAKE_KIND_M); + } + frame(lua_state, 24.0); + if is_excute(agent) { + slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 3); + } + frame(lua_state, 44.0); + if is_excute(agent) { + VisibilityModule::set_int64(boma, hash40("shield") as i64, hash40("shield_normal") as i64); + } } unsafe extern "C" fn game_throwb(agent: &mut L2CAgentBase) { @@ -52,16 +232,20 @@ unsafe extern "C" fn game_throwhi(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); if is_excute(agent) { - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 80, 100, 0, 55, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 4.0, 88, 160, 0, 30, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } - frame(lua_state, 26.0); + frame(lua_state, 10.0); + FT_MOTION_RATE_RANGE(agent, 10.0, 20.0, 5.0); + frame(lua_state, 20.0); + FT_MOTION_RATE(agent, 1.0); + frame(lua_state, 27.0); if is_excute(agent) { ATTACK(agent, 0, 0, Hash40::new("sword"), 4.0, 20, 100, 0, 50, 3.1, 1.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); ATTACK(agent, 1, 0, Hash40::new("sword"), 4.0, 20, 100, 0, 50, 3.1, 6.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); AttackModule::set_catch_only_all(boma, true, false); } - frame(lua_state, 27.0); + frame(lua_state, 28.0); if is_excute(agent) { CHECK_FINISH_CAMERA(agent, 4, 21); } @@ -107,7 +291,7 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { if is_excute(agent) { FT_LEAVE_NEAR_OTTOTTO(agent, -2, 2); FT_LEAVE_NEAR_OTTOTTO(agent, 2.5, 2.5); - ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 138, 68, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); + ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, 0, 3.0, 108, 70, 0, 50, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); ATTACK_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_CATCH, 0, 3.0, 361, 100, 0, 40, 0.0, 1.0, *ATTACK_LR_CHECK_F, 0.0, true, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_NONE, *ATTACK_REGION_THROW); } frame(lua_state, 22.0); @@ -129,13 +313,17 @@ unsafe extern "C" fn game_throwlw(agent: &mut L2CAgentBase) { let target_group = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_GROUP); let target_no = WorkModule::get_int64(boma, *FIGHTER_STATUS_THROW_WORK_INT_TARGET_HIT_NO); ATK_HIT_ABS(agent, *FIGHTER_ATTACK_ABSOLUTE_KIND_THROW, Hash40::new("throw"), target, target_group, target_no); - let opponent_boma = agent.get_grabbed_opponent_boma(); - VarModule::on_flag(opponent_boma.object(), vars::common::instance::IS_KNOCKDOWN_THROW); } } pub fn install(agent: &mut Agent) { + agent.acmd("game_catch", game_catch, Priority::Low); + agent.acmd("game_catchdash", game_catchdash, Priority::Low); + agent.acmd("game_catchturn", game_catchturn, Priority::Low); + agent.acmd("game_throwf", game_throwf, Priority::Low); + agent.acmd("sound_throwf", sound_throwf, Priority::Low); + agent.acmd("expression_throwf", expression_throwf, Priority::Low); agent.acmd("game_throwb", game_throwb, Priority::Low); diff --git a/fighters/younglink/src/acmd/tilts.rs b/fighters/younglink/src/acmd/tilts.rs index 1786a8c44c..37e66f0712 100644 --- a/fighters/younglink/src/acmd/tilts.rs +++ b/fighters/younglink/src/acmd/tilts.rs @@ -45,9 +45,9 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 9.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 8.0, 85, 88, 0, 50, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 8.0, 85, 88, 0, 50, 3.0, 1.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 8.0, 85, 88, 0, 50, 3.0, 6.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 8.0, 85, 100, 0, 40, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 8.0, 85, 100, 0, 40, 3.0, 1.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 8.0, 85, 100, 0, 40, 3.0, 6.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } wait(lua_state, 6.0); if is_excute(agent) { @@ -79,11 +79,10 @@ unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 8.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 9.0, 80, 40, 0, 70, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 1, 0, Hash40::new("sword"), 9.0, 80, 40, 0, 70, 2.5, 0.7, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 2, 0, Hash40::new("sword"), 9.0, 80, 40, 0, 70, 2.5, 4.3, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); - ATTACK(agent, 3, 0, Hash40::new("sword"), 9.0, 276, 60, 0, 30, 2.5, 8.3, 0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); - ATTACK(agent, 4, 0, Hash40::new("sword"), 9.0, 276, 60, 0, 30, 2.5, 8.3, 0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_fire"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_SWORD); + ATTACK(agent, 0, 0, Hash40::new("shoulderl"), 9.0, 87, 76, 0, 48, 3.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 1, 0, Hash40::new("sword"), 9.0, 87, 76, 0, 48, 2.5, 0.7, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 2, 0, Hash40::new("sword"), 9.0, 89, 76, 0, 48, 2.5, 4.3, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); + ATTACK(agent, 3, 0, Hash40::new("sword"), 9.0, 91, 76, 0, 48, 2.5, 8.3, 0.7, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_SWORD); } frame(lua_state, 11.0); FT_MOTION_RATE(agent, 3.0); diff --git a/fighters/younglink/src/boomerang/mod.rs b/fighters/younglink/src/boomerang/mod.rs index b9458f01fb..54db03df73 100644 --- a/fighters/younglink/src/boomerang/mod.rs +++ b/fighters/younglink/src/boomerang/mod.rs @@ -1,9 +1,11 @@ use super::*; mod acmd; +mod opff; pub fn install() { let agent = &mut Agent::new("younglink_boomerang"); acmd::install(agent); + opff::install(agent); agent.install(); } \ No newline at end of file diff --git a/fighters/younglink/src/boomerang/opff.rs b/fighters/younglink/src/boomerang/opff.rs new file mode 100644 index 0000000000..9ddf0f30b4 --- /dev/null +++ b/fighters/younglink/src/boomerang/opff.rs @@ -0,0 +1,41 @@ +// opff import +utils::import_noreturn!(common::opff::fighter_common_opff); +use super::*; +use globals::*; + +unsafe fn boomerang_reflect_fix(weapon: &mut smash::lua2cpp::L2CFighterBase) { + // this opff runs once after reflection + let boma = weapon.module_accessor; + if !AttackModule::is_infliction_status(boma, *COLLISION_KIND_MASK_REFLECTOR | *COLLISION_KIND_MASK_PARRY) { + return; + } + AttackModule::clear_inflict_kind_status(boma); + + // update position, accounting for boomerang-weirdness + let top_pos = *PostureModule::pos(boma); + let rot_pos = &mut Vector3f{ x: 0.0, y: 0.0, z: 0.0 }; + ModelModule::joint_global_position(boma, Hash40::new("rot"), rot_pos, false); + PostureModule::set_pos(boma, &Vector3f{ x: rot_pos.x, y: top_pos.y, z: top_pos.z }); + + // update facing direction depending on whether it is traveling forwards or backwards + let lr = PostureModule::lr(boma); + let speed_x = KineticModule::get_sum_speed_x(boma, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_ALL); + if weapon.is_status(*WN_LINK_BOOMERANG_STATUS_KIND_FLY) { + PostureModule::reverse_lr(boma); + PostureModule::update_rot_y_lr(boma); + } + + // lifetime fix + weapon.set_int_from_param(*WN_LINK_BOOMERANG_INSTANCE_WORK_ID_INT_LIFE, "boomerang", "life"); + + // restart status + weapon.change_status(WN_LINK_BOOMERANG_STATUS_KIND_FLY.into(), false.into()); +} + +pub unsafe extern "C" fn younglink_boomerang_frame(weapon: &mut smash::lua2cpp::L2CFighterBase) { + boomerang_reflect_fix(weapon); +} + +pub fn install(agent: &mut Agent) { + agent.on_line(Main, younglink_boomerang_frame); +} \ No newline at end of file diff --git a/fighters/younglink/src/lib.rs b/fighters/younglink/src/lib.rs index 1a5a1cb33c..005a756b5c 100644 --- a/fighters/younglink/src/lib.rs +++ b/fighters/younglink/src/lib.rs @@ -35,6 +35,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/zelda/Cargo.toml b/fighters/zelda/Cargo.toml index 508ee05040..29de4e8c07 100644 --- a/fighters/zelda/Cargo.toml +++ b/fighters/zelda/Cargo.toml @@ -8,6 +8,9 @@ edition = "2018" [dependencies] utils = { package = "dynamic", path = "../../dynamic" } skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } -smashline = { git = "https://github.com/HDR-Development/smashline" } \ No newline at end of file +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } +smashline = { git = "https://github.com/HDR-Development/smashline" } +smash2 = { package = "smash", git = "https://github.com/WuBoytH/smash-rs" } +proc-hitbox = { git = "https://github.com/HDR-Development/compile-time-smash-script" } +proc-hitbox-macro = { git = "https://github.com/HDR-Development/compile-time-smash-script" } diff --git a/fighters/zelda/src/acmd/aerials.rs b/fighters/zelda/src/acmd/aerials.rs index c0a1054f8b..c630f644ca 100644 --- a/fighters/zelda/src/acmd/aerials.rs +++ b/fighters/zelda/src/acmd/aerials.rs @@ -272,7 +272,7 @@ unsafe extern "C" fn effect_attackairlw(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 3.0); if is_excute(agent) { - EFFECT_FOLLOW(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, -1, 0, 0, 0, 0, 0.8, true); + EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, -1, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, true); } frame(lua_state, 12.0); if is_excute(agent) { diff --git a/fighters/zelda/src/acmd/ground.rs b/fighters/zelda/src/acmd/ground.rs index c361243740..ae20290804 100644 --- a/fighters/zelda/src/acmd/ground.rs +++ b/fighters/zelda/src/acmd/ground.rs @@ -11,6 +11,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 361, 20, 0, 35, 4.42, 0.0, 11.55, 10.58, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 2.5, 361, 20, 0, 25, 2.5, 0.0, 5.4, 4.0, Some(0.0), Some(5.4), Some(9.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + AttackModule::set_down_only(boma, 4, true); } wait(lua_state, 1.0); if is_excute(agent) { @@ -24,6 +25,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { ATTACK(agent, 3, 0, Hash40::new("top"), 1.5, 361, 20, 0, 35, 4.42, 0.0, 11.55, 12.08, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA_d, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); // Jab lock hitbox ATTACK(agent, 4, 0, Hash40::new("top"), 2.5, 361, 20, 0, 40, 2.5, 0.0, 5.4, 5.0, Some(0.0), Some(5.4), Some(9.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_magic"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_MAGIC, *ATTACK_REGION_MAGIC); + AttackModule::set_down_only(boma, 4, true); } wait(lua_state, 1.0); if is_excute(agent) { diff --git a/fighters/zelda/src/acmd/other.rs b/fighters/zelda/src/acmd/other.rs index bef3c677ca..12add195d9 100644 --- a/fighters/zelda/src/acmd/other.rs +++ b/fighters/zelda/src/acmd/other.rs @@ -68,15 +68,11 @@ unsafe extern "C" fn game_turndash(agent: &mut L2CAgentBase) { unsafe extern "C" fn game_escapeair(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); - let escape_air_cancel_frame = WorkModule::get_param_float(boma, hash40("param_motion"), hash40("escape_air_cancel_frame")); frame(lua_state, 29.0); if is_excute(agent) { KineticModule::change_kinetic(boma, *FIGHTER_KINETIC_TYPE_FALL); } - frame(lua_state, escape_air_cancel_frame); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { @@ -86,10 +82,7 @@ unsafe extern "C" fn game_escapeairslide(agent: &mut L2CAgentBase) { if is_excute(agent) { WorkModule::on_flag(boma, *FIGHTER_STATUS_ESCAPE_AIR_FLAG_SLIDE_ENABLE_CONTROL); } - frame(lua_state, 39.0); - if is_excute(agent) { - notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES); - } + } unsafe extern "C" fn sound_appeallw(agent: &mut L2CAgentBase) { diff --git a/fighters/zelda/src/acmd/throws.rs b/fighters/zelda/src/acmd/throws.rs index e33074a12e..ff35f8ccab 100644 --- a/fighters/zelda/src/acmd/throws.rs +++ b/fighters/zelda/src/acmd/throws.rs @@ -5,14 +5,13 @@ unsafe extern "C" fn game_catch(agent: &mut L2CAgentBase) { let boma = agent.boma(); frame(lua_state, 1.0); FT_MOTION_RATE(agent, 0.7); - frame(lua_state, 9.0); if is_excute(agent) { GrabModule::set_rebound(boma, true); } frame(lua_state, 10.0); FT_MOTION_RATE(agent, 1.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 9.0, 0.0, Some(0.0), Some(9.0), Some(10.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 9.0, 4.5, Some(0.0), Some(9.0), Some(10.0), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -32,7 +31,7 @@ unsafe extern "C" fn game_catchdash(agent: &mut L2CAgentBase) { } frame(lua_state, 13.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 9.0, 4.0, Some(0.0), Some(9.0), Some(12.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 9.0, 4.5, Some(0.0), Some(9.0), Some(12.6), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); @@ -52,7 +51,7 @@ unsafe extern "C" fn game_catchturn(agent: &mut L2CAgentBase) { } frame(lua_state, 14.0); if is_excute(agent) { - CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 9.0, -4.0, Some(0.0), Some(9.0), Some(-18.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); + CATCH(agent, 0, Hash40::new("top"), 4.5, 0.0, 9.0, -4.5, Some(0.0), Some(9.0), Some(-16.8), *FIGHTER_STATUS_KIND_CAPTURE_PULLED, *COLLISION_SITUATION_MASK_GA); } game_CaptureCutCommon(agent); wait(lua_state, 2.0); diff --git a/fighters/zelda/src/lib.rs b/fighters/zelda/src/lib.rs index a883107ff6..3a8ae22ab8 100644 --- a/fighters/zelda/src/lib.rs +++ b/fighters/zelda/src/lib.rs @@ -36,6 +36,7 @@ use smash_script::{ *, macros::* }; +use smash_script::macros::ATTACK_ABS; use utils::{ *, util::*, diff --git a/fighters/zelda/src/status/special_hi.rs b/fighters/zelda/src/status/special_hi.rs index a0b07da4b5..5faa005593 100644 --- a/fighters/zelda/src/status/special_hi.rs +++ b/fighters/zelda/src/status/special_hi.rs @@ -1,3 +1,5 @@ +use core::f32; + use super::*; unsafe extern "C" fn special_hi2_pre(fighter: &mut L2CFighterCommon) -> L2CValue { @@ -29,15 +31,67 @@ unsafe extern "C" fn special_hi2_pre(fighter: &mut L2CFighterCommon) -> L2CValue return 0.into(); } +unsafe extern "C" fn angler(fighter: &mut L2CFighterCommon) -> L2CValue { + let stick_x = fighter.left_stick_x(); + let stick_y = fighter.left_stick_y(); + let mut length = sv_math::vec2_length(stick_x, stick_y); + let wrap_stick = fighter.get_param_float("param_special_hi", "wrap_stick"); + + PostureModule::set_stick_lr(fighter.module_accessor, 0.0); + PostureModule::update_rot_y_lr(fighter.module_accessor); + let lr = fighter.lr(); + let mut angle = if length >= wrap_stick { + stick_y.atan2(stick_x * lr) + } else { + 90.0_f32.to_radians() + }; + let test_angle = if angle < f32::consts::PI {angle} else {angle - f32::consts::PI}; + let mut detach = false; + if test_angle < f32::consts::PI && test_angle > 0.0 { + detach = true; + } + let wrap_speed_multi = fighter.get_param_float("param_special_hi", "wrap_speed_multi"); + let wrap_speed_add = fighter.get_param_float("param_special_hi", "wrap_speed_add"); + let mut speed_x = 0.0; + let mut speed_y = wrap_speed_multi + wrap_speed_add; + // if angled w/ stick + if length > wrap_stick { + let length_mul = wrap_speed_multi * length; + let speed = length_mul + wrap_speed_add; + let cos = angle.cos(); + speed_x = speed * cos; + speed_x *= lr; + + let sin = angle.sin(); + speed_y = speed * sin; + } + // If teleport angle is upwards or you are already in air + // force airborne state + if detach || fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { + fighter.set_situation(SITUATION_KIND_AIR.into()); + GroundModule::set_attach_ground(fighter.module_accessor, false); + GroundModule::set_correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); + } + KineticModule::unable_energy_all(fighter.module_accessor); + sv_kinetic_energy!(reset_energy, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, ENERGY_STOP_RESET_TYPE_FREE, speed_x, speed_y, 0.0, 0.0, 0.0); + sv_kinetic_energy!(set_accel, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, 0.0, 0.0); + sv_kinetic_energy!(set_limit_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, -1.0, -1.0); + sv_kinetic_energy!(enable, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP); + HitModule::set_whole(fighter.module_accessor, HitStatus(*HIT_STATUS_XLU), 0); + GroundModule::clear_cliff_point(fighter.module_accessor); + 0.into() +} + unsafe extern "C" fn special_hi2_main(fighter: &mut L2CFighterCommon) -> L2CValue { HitModule::set_whole(fighter.module_accessor, smash::app::HitStatus(*HIT_STATUS_XLU), 0); VisibilityModule::set_whole(fighter.module_accessor, false); notify_event_msc_cmd!(fighter, Hash40::new_raw(0x1f20a9d549), false); fighter.off_flag(*FIGHTER_INSTANCE_WORK_ID_FLAG_NAME_CURSOR); GroundModule::set_passable_check(fighter.module_accessor, true); - let cliff_check = fighter.get_int(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_WORK_INT_CLIFF_CHECK); - fighter.sub_fighter_cliff_check(cliff_check.into()); + fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_NONE.into()); fighter.set_int(0, *FIGHTER_ZELDA_STATUS_SPECIAL_HI_WORK_INT_FRAME); + angler(fighter); fighter.sub_shift_status_main(L2CValue::Ptr(special_hi2_main_loop as *const () as _)) } @@ -45,8 +99,9 @@ unsafe extern "C" fn special_hi2_main_loop(fighter: &mut L2CFighterCommon) -> L2 if fighter.sub_transition_group_check_air_cliff().get_bool() { return 1.into() } - let move_time = fighter.get_param_int("param_special_hi", "move_time"); //time spent moving - if move_time <= fighter.get_int(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_WORK_INT_FRAME) { + let frame = fighter.get_int(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_WORK_INT_FRAME); + let move_time = fighter.get_param_int("param_special_hi", "move_time"); + if frame >= move_time { fighter.change_status(FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_3.into(), true.into()) } if StatusModule::is_changing(fighter.module_accessor) @@ -58,16 +113,15 @@ unsafe extern "C" fn special_hi2_main_loop(fighter: &mut L2CFighterCommon) -> L2 GroundModule::correct(fighter.module_accessor, GroundCorrectKind(*GROUND_CORRECT_KIND_AIR)); } } - zelda_special_hi_2_check_ground(fighter); + special_hi_2_check_ground(fighter); if fighter.is_cat_flag(Cat1::SpecialAny) && !StatusModule::is_changing(fighter.module_accessor) { VarModule::on_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK); fighter.change_status(FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_3.into(), true.into()) } - //subsatus + //substatus if !StatusModule::is_changing(fighter.module_accessor) { WorkModule::inc_int(fighter.module_accessor, *FIGHTER_ZELDA_STATUS_SPECIAL_HI_WORK_INT_FRAME); - let frame: i32 = fighter.get_int(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_WORK_INT_FRAME); - let move_xlu: i32 = fighter.get_param_int("param_special_hi", "move_xlu"); //time ignoring platforms + let move_xlu = fighter.get_param_int("param_special_hi", "move_xlu"); // travel frame to begin ignoring platforms let cliff_check_frame = fighter.get_param_int("param_special_hi", "move_cliff_check"); if frame == move_xlu { GroundModule::set_passable_check(fighter.module_accessor, false); @@ -75,61 +129,63 @@ unsafe extern "C" fn special_hi2_main_loop(fighter: &mut L2CFighterCommon) -> L2 if frame == cliff_check_frame { fighter.sub_fighter_cliff_check(GROUND_CLIFF_CHECK_KIND_ON_DROP_BOTH_SIDES.into()); } - if frame < 2 {fighter.on_flag(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_FLAG_CHECK_GROUND);} + if frame < 2 { + fighter.on_flag(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_FLAG_CHECK_GROUND); + } } 0.into() } -//excludes a lot of vanilla stuff that adds wall bounce... makes wallride opff unnecessary -unsafe extern "C" fn zelda_special_hi_2_check_ground(fighter: &mut L2CFighterCommon) { - if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_ZELDA_STATUS_SPECIAL_HI_FLAG_CHECK_GROUND) { - return; - } - - if GroundModule::is_attach_cliff(fighter.module_accessor) { - return; - } - - if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND { - let line = GroundModule::get_touch_line_raw(fighter.module_accessor, GroundTouchID(*GROUND_TOUCH_ID_DOWN)) as *mut GroundCollisionLine; - let mut attach = true; - if GroundModule::is_passable_check(fighter.module_accessor) { //snap to platforms if no longer ignoring platforms - attach = sv_ground_collision_line::is_floor(line); - } - GroundModule::set_attach_ground(fighter.module_accessor, attach); - } - - let mut touch_id = *GROUND_TOUCH_ID_NONE; - let mut touch_flag = *GROUND_TOUCH_FLAG_NONE; +// Copies nasty vanilla math +// with adjusted logic to control wall-ride/floor-ride behavior +unsafe extern "C" fn special_hi_2_check_ground(fighter: &mut L2CFighterCommon) { let init_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_X); let init_speed_y = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_Y); - - if GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) - && init_speed_x.abs() >= 0.01 - && init_speed_y <= -0.01 { - touch_id = *GROUND_TOUCH_ID_DOWN; - touch_flag = *GROUND_TOUCH_FLAG_DOWN; + let floor_speed_x = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_FLOOR_SPEED_X); + if floor_speed_x.abs() > 0.0 && init_speed_y < 0.0 && init_speed_x.abs() > 0.0 + && (GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) && !GroundModule::is_passable_ground(fighter.module_accessor)) { + // Travel speed for diagonally-down floor-rides + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, floor_speed_x, 0.0, 0.0); } else { + // Travel speed for all other scenarios + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, init_speed_x, init_speed_y, 0.0); + } + // If on a platform, + // skip floor-ride speed redirection + if GroundModule::is_passable_check(fighter.module_accessor) && GroundModule::is_passable_ground(fighter.module_accessor) { return; } - let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; - let speed = Vector2f{ x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; - + let speed = Vector2f {x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; + // If not a diagonally-down teleport, + // or if already grounded, + // skip floor-ride speed redirection + if !GroundModule::is_touch(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32) + || (speed.x.abs() < 0.001 || speed.y > -0.001) + || fighter.global_table[PREV_SITUATION_KIND] != SITUATION_KIND_AIR { + return; + } + // Compute a new ground-aligned velocity vector + // for intended floor-ride speed redirection + // + // Only intended to run on the first frame you land during the travel let mut length = sv_math::vec3_length(speed.x, speed.y, 0.0); - if 0.0 < length { - let touch_x = GroundModule::get_touch_normal_x(fighter.module_accessor, touch_flag as u32); - let touch_y = GroundModule::get_touch_normal_y(fighter.module_accessor, touch_flag as u32); + if length > 0.0 { + let touch_x = GroundModule::get_touch_normal_x(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); + let touch_y = GroundModule::get_touch_normal_y(fighter.module_accessor, *GROUND_TOUCH_FLAG_DOWN as u32); let touch = fighter.Vector3__create(touch_x.into(), touch_y.into(), 0.0_f32.into()); let something = fighter.Vector3__create(0.0_f32.into(), 0.0_f32.into(), 1.0_f32.into()); let mut cross = fighter.Vector3__cross(touch.clone(), something); let math = 1.0 / length; - let speed_mul = Vector3f{x: speed.x * math, y: speed.y * math, z: 0.0}; + let speed_mul = Vector3f { + x: speed.x * math, + y: speed.y * math, + z: 0.0, + }; let mut final_dot = sv_math::vec3_dot(cross["x"].get_f32(), cross["y"].get_f32(), cross["z"].get_f32(), speed_mul.x, speed_mul.y, speed_mul.z); - if -0.00001 <= final_dot - && final_dot <= 0.00001 { + if -0.00001 <= final_dot && final_dot <= 0.00001 { final_dot = sv_math::vec3_dot(cross["x"].get_f32(), cross["y"].get_f32(), cross["z"].get_f32(), fighter.lr(), 0.0, 0.0); } @@ -141,47 +197,46 @@ unsafe extern "C" fn zelda_special_hi_2_check_ground(fighter: &mut L2CFighterCom cross["y"].assign(&L2CValue::F32(y * -1.0)); cross["z"].assign(&L2CValue::F32(z * -1.0)); } - sv_kinetic_energy!( - set_speed, - fighter, - FIGHTER_KINETIC_ENERGY_ID_STOP, - cross["x"].get_f32() * length, - cross["y"].get_f32() * length, - cross["z"].get_f32() * length - ); + sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_STOP, cross["x"].get_f32() * length, cross["y"].get_f32() * length, cross["z"].get_f32() * length); + // set new speed to be reapplied each frame + VarModule::set_float(fighter.battle_object, vars::common::status::TELEPORT_FLOOR_SPEED_X, cross["x"].get_f32() * length); } } unsafe extern "C" fn special_hi2_end(fighter: &mut L2CFighterCommon) -> L2CValue { if fighter.global_table[STATUS_KIND].get_i32() == *FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_3 { - //re-uses waveland window logic - let init_speed_y = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_Y); //teleport direction - let pos = *PostureModule::pos(fighter.module_accessor); //top bone (bottom of ecb w/o shifting) + // Reappearance turnaround + if fighter.left_stick_x() * fighter.lr() + <= fighter.get_param_float("common", "turn_stick_x") { + PostureModule::reverse_lr(fighter.module_accessor); + PostureModule::update_rot_y_lr(fighter.module_accessor); + } + // Use a waveland-esque snap threshold to determine whether to snap to ground + let init_speed_y = VarModule::get_float(fighter.battle_object, vars::common::status::TELEPORT_INITIAL_SPEED_Y); + let pos = *PostureModule::pos(fighter.module_accessor); let bot_snap = &Vector2f::new(pos.x, pos.y - 1.0); - let top_snap = &Vector2f::new(pos.x, pos.y + 11.0);//around chest level + let top_snap = &Vector2f::new(pos.x, pos.y + 11.0); // around chest level let ground_pos_any = &mut Vector2f::zero(); let ground_pos_stage = &mut Vector2f::zero(); let is_touch_any = GroundModule::line_segment_check(fighter.module_accessor, top_snap, bot_snap, &Vector2f::zero(), ground_pos_any, true); let is_touch_stage = GroundModule::line_segment_check(fighter.module_accessor, top_snap, bot_snap, &Vector2f::zero(), ground_pos_stage, false); - let can_snap = !(is_touch_any == 0 as *const *const u64 || (is_touch_stage != 0 as *const *const u64 && init_speed_y > 0.0)); //avoid snapping to stage from below + let can_snap = !(is_touch_any == 0 as *const *const u64 || (is_touch_stage != 0 as *const *const u64 && init_speed_y > 0.0)); // avoid snapping to stage during rising teleport if can_snap { PostureModule::set_pos(fighter.module_accessor, &Vector3f::new(pos.x, ground_pos_any.y + 0.1, pos.z)); GroundModule::attach_ground(fighter.module_accessor, false); StatusModule::set_situation_kind(fighter.module_accessor, SituationKind(*SITUATION_KIND_GROUND), false); - PostureModule::set_stick_lr(fighter.module_accessor, 0.0); - PostureModule::update_rot_y_lr(fighter.module_accessor); if VarModule::is_flag(fighter.battle_object, vars::common::instance::IS_HEAVY_ATTACK) { + // telecancel b reverse momentum let lr = PostureModule::lr(fighter.module_accessor); let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; let speed = Vector2f{ x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x.abs() * lr * 1.05, speed.y); //b-reverse telecancel reverses momentum on ground - //telecancel flash + // telecancel gfx EffectModule::req_follow(fighter.module_accessor, Hash40::new("zelda_atk"), Hash40::new("top"), &Vector3f::new(5.5 * lr, 8.0, -2.1), &Vector3f::zero(), 1.65, true, 0, 0, 0, 0, 0, false, false); - //EFFECT_FOLLOW(fighter, Hash40::new("zelda_atk"), Hash40::new("top"), 5.5 * lr, 8.0, -2.1, 0, 0, 0, 1.65, true); LAST_EFFECT_SET_COLOR(fighter, 0.95, 3.0, 0.6); LAST_EFFECT_SET_ALPHA(fighter, 0.75); - LAST_EFFECT_SET_RATE(fighter, 1.10); //spawn gr cancel eff frame 0 - //telecancel sound + LAST_EFFECT_SET_RATE(fighter, 1.10); + // telecancel sound PLAY_SE(fighter, Hash40::new("se_zelda_appear02")); } } @@ -249,7 +304,7 @@ unsafe extern "C" fn special_hi3_main_loop(fighter: &mut L2CFighterCommon) -> L2 } return 1.into(); } else { - //clear buffer + // clear buffer ControlModule::reset_trigger(fighter.module_accessor); ControlModule::clear_command(fighter.module_accessor, true); ControlModule::reset_special_command(fighter.module_accessor, true); @@ -260,28 +315,30 @@ unsafe extern "C" fn special_hi3_main_loop(fighter: &mut L2CFighterCommon) -> L2 if fighter.global_table[SITUATION_KIND] != SITUATION_KIND_GROUND { if fighter.is_flag(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_FLAG_DIVE) { fighter.sub_air_check_dive(); - } //bypass manual fastfall + } if fighter.is_flag(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_FLAG_CONTROL) { KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_FALL); fighter.off_flag(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_FLAG_CONTROL); - } //bypass manual drift code - if !fighter.global_table[IS_STOPPING].get_bool() && KineticModule::get_kinetic_type(fighter.module_accessor) != *FIGHTER_KINETIC_TYPE_MOTION_FALL { //only runs t he capping stuff before she can drift and fastfall + } + if !fighter.global_table[IS_STOPPING].get_bool() && KineticModule::get_kinetic_type(fighter.module_accessor) != *FIGHTER_KINETIC_TYPE_MOTION_FALL { if !fighter.is_flag(*FIGHTER_ZELDA_STATUS_SPECIAL_HI_FLAG_1) { let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; - let speed = Vector2f{x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)};//pretty sure code subtracts 1/10th of y speed every frame before normal fall is enabled - sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x, speed.y *0.9); + let speed = Vector2f{x: lua_bind::KineticEnergy::get_speed_x(stop_energy), y: lua_bind::KineticEnergy::get_speed_y(stop_energy)}; + // Gradually reduce y speed by 10% every frame + // until you change to MOTION_FALL energy + sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, speed.x, speed.y * 0.9); } else { if !KineticModule::is_enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY) { let stop_energy = KineticModule::get_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_STOP) as *mut app::KineticEnergy; let speed_y = lua_bind::KineticEnergy::get_speed_y(stop_energy); sv_kinetic_energy!(set_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y); KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY); - } //only enables gravity once instead of every frame - let air_speed_x_stable: f32 = fighter.get_param_float("air_speed_x_stable", ""); - let fall_x_mul: f32 = fighter.get_param_float("param_special_hi", "fall_x_mull_value"); - let mut x_cap = air_speed_x_stable * fall_x_mul; - sv_kinetic_energy!(set_limit_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, x_cap, 0.0); - } //bypass once per frame set_speed to x_cap + let air_speed_x_stable = fighter.get_param_float("air_speed_x_stable", ""); + let fall_x_mul = fighter.get_param_float("param_special_hi", "fall_x_mull_value"); + let mut x_cap = air_speed_x_stable * fall_x_mul; + sv_kinetic_energy!(set_limit_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_STOP, x_cap, 0.0); + } // only set limits and enable gravity once + } } } @@ -292,5 +349,6 @@ pub fn install(agent: &mut Agent) { agent.status(Pre, *FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_2, special_hi2_pre); agent.status(Main, *FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_2, special_hi2_main); agent.status(End, *FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_2, special_hi2_end); + agent.status(Main, *FIGHTER_ZELDA_STATUS_KIND_SPECIAL_HI_3, special_hi3_main); } \ No newline at end of file diff --git a/romfs/agent_params.txt b/romfs/agent_params.txt index ed70275cba..129d646a89 100644 --- a/romfs/agent_params.txt +++ b/romfs/agent_params.txt @@ -55,8 +55,17 @@ zelda: fighter/zelda/param/hdr.xml pikachu: fighter/pikachu/param/hdr.xml ridley: fighter/ridley/param/hdr.xml robot: fighter/robot/param/hdr.xml +rockman: fighter/rockman/param/hdr.xml shulk: fighter/shulk/param/hdr.xml peach: fighter/peach/param/hdr.xml mewtwo: fighter/mewtwo/param/hdr.xml reflet: fighter/reflet/param/hdr.xml -metaknight: fighter/metaknight/param/hdr.xml \ No newline at end of file +metaknight: fighter/metaknight/param/hdr.xml +palutena: fighter/palutena/param/hdr.xml +brave: fighter/brave/param/hdr.xml +elight: fighter/elight/param/hdr.xml +murabito: fighter/murabito/param/hdr.xml +shizue: fighter/shizue/param/hdr.xml +buddy: fighter/buddy/param/hdr.xml +trail: fighter/trail/param/hdr.xml +roy: fighter/roy/param/hdr.xml \ No newline at end of file diff --git a/romfs/config.json b/romfs/config.json index 293e252497..0f609a8619 100644 --- a/romfs/config.json +++ b/romfs/config.json @@ -175,6 +175,9 @@ "fighter/robot/cmn": [ "fighter/robot/param/hdr.xml" ], + "fighter/rockman/cmn": [ + "fighter/rockman/param/hdr.xml" + ], "fighter/shulk/cmn": [ "fighter/shulk/param/hdr.xml" ], @@ -189,6 +192,30 @@ ], "fighter/metaknight/cmn": [ "fighter/metaknight/param/hdr.xml" + ], + "fighter/buddy/cmn": [ + "fighter/buddy/param/hdr.xml" + ], + "fighter/trail/cmn": [ + "fighter/trail/param/hdr.xml" + ], + "fighter/palutena/cmn": [ + "fighter/palutena/param/hdr.xml" + ], + "fighter/brave/cmn": [ + "fighter/brave/param/hdr.xml" + ], + "fighter/elight/cmn": [ + "fighter/elight/param/hdr.xml" + ], + "fighter/murabito/cmn": [ + "fighter/murabito/param/hdr.xml" + ], + "fighter/shizue/cmn": [ + "fighter/shizue/param/hdr.xml" + ], + "fighter/roy/cmn": [ + "fighter/roy/param/hdr.xml" ] } } \ No newline at end of file diff --git a/romfs/source/fighter/bayonetta/motion/body/motion_patch.yaml b/romfs/source/fighter/bayonetta/motion/body/motion_patch.yaml index 1a402c513b..3c780d0fbe 100644 --- a/romfs/source/fighter/bayonetta/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/bayonetta/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -77,115 +77,67 @@ guard_off: blend_frames: 4 extra: cancel_frame: 12 -throw_b: - extra: - cancel_frame: 45 -throw_lw: - extra: - cancel_frame: 44 -throw_hi: +attack_11: extra: - cancel_frame: 35 + cancel_frame: 27 attack_12: extra: cancel_frame: 27 attack_13: extra: - cancel_frame: 29 -attack_11: - extra: - cancel_frame: 27 -attack_lw3: - flags: - move: false - extra: - cancel_frame: 32 -special_hi: - extra: - cancel_frame: 38 -special_lw: - extra: - xlu_start: 0 - xlu_end: 0 - cancel_frame: 66 -attack_hi3: + cancel_frame: 28 +attack_100_end: extra: - cancel_frame: 26 -appeal_lw_r: - blend_frames: 10 - animations: - - name: j02win1.nuanmb - scripts: - - expression_win1 - - sound_appeallwr - - effect_win1 -appeal_hi_l: + cancel_frame: 41 +attack_dash: extra: - cancel_frame: 26 -attack_s4_s: + cancel_frame: 43 attack_s3_s: extra: - cancel_frame: 45 -appeal_hi_r: - extra: - cancel_frame: 26 -appeal_lw_l: - blend_frames: 10 - animations: - - name: j02win2.nuanmb - scripts: - - expression_win2b - - sound_appeallwl - - effect_win2 -attack_air_f: + cancel_frame: 48 +attack_s3_s2: extra: - cancel_frame: 30 + cancel_frame: 47 attack_s3_s3: - blend_frames: 1 extra: - cancel_frame: 53 -attack_s4_lw: -attack_s3_s2: - blend_frames: 1 + cancel_frame: 50 +attack_hi3: extra: - cancel_frame: 47 -attack_dash: + cancel_frame: 28 +attack_lw3: + flags: + move: false extra: - cancel_frame: 44 + cancel_frame: 32 attack_air_n: extra: cancel_frame: 52 +attack_air_f: + extra: + cancel_frame: 30 attack_air_f2: - blend_frames: 2 + blend_frames: 0 extra: cancel_frame: 30 attack_air_f3: - blend_frames: 2 + blend_frames: 0 extra: - cancel_frame: 45 + cancel_frame: 42 attack_air_hi: extra: cancel_frame: 39 -special_air_lw: +special_air_n_end_h: extra: - intangible_start_frame: 0 - intangible_end_frame: 0 - cancel_frame: 66 -attack_100_end: + cancel_frame: 58 +special_n_end_h: extra: - cancel_frame: 41 -special_air_hi: - animations: - - name: d02specialhi.nuanmb - scripts: - - expression_specialhi - - sound_specialhi - - effect_specialhi + cancel_frame: 58 +special_air_n_end_f: extra: - cancel_frame: 38 -special_air_s_u: + cancel_frame: 48 +special_n_end_f: extra: - cancel_frame: 44 + cancel_frame: 48 special_s: extra: cancel_frame: 62 @@ -206,7 +158,7 @@ special_s_edge: unk_800: false unk_1000: false unk_2000: false - blend_frames: 5 + blend_frames: 2 animations: - name: d01specialsedge.nuanmb scripts: @@ -216,16 +168,75 @@ special_s_edge: extra: intangible_start_frame: 0 intangible_end_frame: 0 - cancel_frame: 25 + cancel_frame: 12 freeze_during_hitstop: false special_s_hold_end: extra: cancel_frame: 61 +special_air_s_u: + extra: + cancel_frame: 44 +special_air_s_u_wall_end: + extra: + cancel_frame: 41 special_air_s_d: - blend_frames: 2 + blend_frames: 1 + extra: + cancel_frame: 41 special_air_s_d_hit: extra: - cancel_frame: 32 + cancel_frame: 41 +special_air_s_d_wall_end: + extra: + cancel_frame: 41 +special_air_s_d_landing: + extra: + cancel_frame: 31 +special_air_s_d_landing_edge: + game_script: game_specialairsdlandingedge + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 1 + animations: + - name: d01specialairsdlandingedge.nuanmb + scripts: + - expression_specialairsdlandingedge + - sound_specialairsdlandingedge + - effect_specialairsdlandingedge + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 6 + freeze_during_hitstop: false +special_hi: + extra: + cancel_frame: 37 +special_air_hi: + extra: + cancel_frame: 33 +special_lw: + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 60 +special_air_lw: + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 60 catch_dash: extra: cancel_frame: 44 @@ -235,21 +246,40 @@ catch_turn: catch_attack: extra: cancel_frame: 0 -furafura_end: +throw_b: extra: - cancel_frame: 34 -special_air_n_end_h: + cancel_frame: 45 +throw_lw: extra: - cancel_frame: 58 -special_n_end_h: + cancel_frame: 51 +throw_hi: extra: - cancel_frame: 58 -special_air_n_end_f: + cancel_frame: 37 +appeal_lw_r: + blend_frames: 10 + animations: + - name: j02win1.nuanmb + scripts: + - expression_win1 + - sound_appeallwr + - effect_win1 +appeal_hi_l: extra: - cancel_frame: 48 -special_n_end_f: + cancel_frame: 26 +appeal_hi_r: extra: - cancel_frame: 48 + cancel_frame: 26 +appeal_lw_l: + blend_frames: 10 + animations: + - name: j02win2.nuanmb + scripts: + - expression_win2b + - sound_appeallwl + - effect_win2 +furafura_end: + extra: + cancel_frame: 34 shield_break_fly: animations: - name: f04downspotd.nuanmb diff --git a/romfs/source/fighter/bayonetta/param/hdr.xml b/romfs/source/fighter/bayonetta/param/hdr.xml index 8e599e99b2..61ac772e25 100644 --- a/romfs/source/fighter/bayonetta/param/hdr.xml +++ b/romfs/source/fighter/bayonetta/param/hdr.xml @@ -1,19 +1,29 @@ - - 8.0 - 6.0 - 3.0 - 6.0 - 6.0 - - - 15.0 - 29.0 - 19.0 - 25.0 - 5.0 - 0.4 - 0.04 - + + 10.0 + 6.0 + 0.0 + 4.0 + 4.0 + 4.0 + + + -0.5 + 15.0 + 29.0 + 19.0 + 25.0 + 5.0 + 0.4 + 0.04 + + + 0.4 + 0.25 + 0.132 + 0.5 + 19 + 0.04 + \ No newline at end of file diff --git a/romfs/source/fighter/bayonetta/param/vl.prcxml b/romfs/source/fighter/bayonetta/param/vl.prcxml index 7b02724bc7..7ddb144f00 100644 --- a/romfs/source/fighter/bayonetta/param/vl.prcxml +++ b/romfs/source/fighter/bayonetta/param/vl.prcxml @@ -8,14 +8,14 @@ 8 8 - 1.33 - 1.33 + 1.4 + 1.4 55 55 - 3 - 3 - 3 - 3 + 4 + 2 + 2 + 4 40 45 @@ -23,10 +23,12 @@ 150 7 - 0.35 - 0.35 - 0.038 - 0.038 + 0.5 + 0.5 + 0.055 + 1.3 + 0.055 + 1.3 dummy dummy @@ -36,6 +38,8 @@ 3 6 + 14.0 + 11 1.25 dummy @@ -44,20 +48,29 @@ - 0.8 + 0.9 0.5 - -20.5 - 0.79 + 0.6 + 0.4 + 0.9 + 0.08 + -1.0 + -19.0 + 0.8 16 22 -1 -1 - 0.9 - 0.25 - 2.4 + 1.2 + -0.5 + 0.375 + 2.5 0.132 - 0.04 - 1.0 + 2.35 + 3 + 0.08 + 1.03 + 1.03 15 30 30 @@ -73,11 +86,13 @@ - 1.2 - 1.2 - 1.1 - 0.2 + 1.275 + 1.275 + 1.125 + 0.25 0.4 + 0.132 + 0.5 15 18 20 @@ -91,14 +106,16 @@ 1.3 - 16 + 16 + 25 55 55 75 0.5 - 1.0 + 1.25 15 0.08 + 38.0 dummy dummy diff --git a/romfs/source/fighter/brave/motion/body/motion_patch.yaml b/romfs/source/fighter/brave/motion/body/motion_patch.yaml index 2d7f190a83..f7f207cb64 100644 --- a/romfs/source/fighter/brave/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/brave/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/brave/param/hdr.xml b/romfs/source/fighter/brave/param/hdr.xml new file mode 100644 index 0000000000..f183756ec7 --- /dev/null +++ b/romfs/source/fighter/brave/param/hdr.xml @@ -0,0 +1,6 @@ + + + + 14 + + \ No newline at end of file diff --git a/romfs/source/fighter/brave/param/vl.prcxml b/romfs/source/fighter/brave/param/vl.prcxml index 763240620f..466a7622b7 100644 --- a/romfs/source/fighter/brave/param/vl.prcxml +++ b/romfs/source/fighter/brave/param/vl.prcxml @@ -11,14 +11,14 @@ 1 0.5 0.5 - 7 - 18 - 40 + 12 + 22 + 42 12 - 20 + 22 42 - 10 - 16 + 12 + 20 25 @@ -47,8 +47,8 @@ 12 - 18 - 40 + 22 + 42 dummy dummy @@ -64,6 +64,7 @@ + 22 5.0 0.2 60 @@ -84,6 +85,7 @@ 0.85 0.5 0.8 + 60 3 15 600 @@ -134,13 +136,13 @@ 10 - 26 + 30 - 12 + 8 - 48 + 50 13 @@ -158,13 +160,13 @@ 6 - 17 + 25 - 21 + 25 - 18 + 15 21 diff --git a/romfs/source/fighter/buddy/motion/body/motion_patch.yaml b/romfs/source/fighter/buddy/motion/body/motion_patch.yaml index 69b0c1644a..3b6d6f460d 100644 --- a/romfs/source/fighter/buddy/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/buddy/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -92,6 +92,20 @@ attack_13: attack_11: extra: cancel_frame: 17 +attack_s3_hi: + remove: true +attack_s3_s: + game_script: game_attacks3 + animations: + - name: c01attacks3s.nuanmb + scripts: + - expression_attacks3 + - sound_attacks3 + - effect_attacks3 + extra: + cancel_frame: 32 +attack_s3_lw: + remove: true attack_hi4: extra: cancel_frame: 46 @@ -137,6 +151,152 @@ special_n_shoot_end: special_air_n_shoot_end: extra: cancel_frame: 8 +special_n_attack_hi: + game_script: game_specialnattack + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialnattackhi.nuanmb + scripts: + - expression_specialnattack + - sound_specialnattack + - effect_specialnattack + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 31 + no_stop_intp: false +special_n_attack_s: + game_script: game_specialnattack + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialnattacks.nuanmb + scripts: + - expression_specialnattack + - sound_specialnattack + - effect_specialnattack + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 31 + no_stop_intp: false +special_n_attack_lw: + game_script: game_specialnattack + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialnattacklw.nuanmb + scripts: + - expression_specialnattack + - sound_specialnattack + - effect_specialnattack + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 31 + no_stop_intp: false +special_n_attack_end: + game_script: game_specialnattackend + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 8 + animations: + - name: d00specialnstart.nuanmb + scripts: + - expression_specialnattackend + - sound_specialnattackend + - effect_specialnattackend + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 31 + no_stop_intp: false +special_s_jump: + game_script: game_specialsjump + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: false + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d01specialsjump.nuanmb + unk: 0 + scripts: + - expression_specialsjump + - sound_specialsjump + - effect_specialsjump + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false catch_attack: extra: cancel_frame: 0 diff --git a/romfs/source/fighter/buddy/param/hdr.xml b/romfs/source/fighter/buddy/param/hdr.xml new file mode 100644 index 0000000000..bb3afc8f23 --- /dev/null +++ b/romfs/source/fighter/buddy/param/hdr.xml @@ -0,0 +1,6 @@ + + + + 1.7 + + \ No newline at end of file diff --git a/romfs/source/fighter/buddy/param/vl.prcxml b/romfs/source/fighter/buddy/param/vl.prcxml index 6375486eea..4bcdda9eba 100644 --- a/romfs/source/fighter/buddy/param/vl.prcxml +++ b/romfs/source/fighter/buddy/param/vl.prcxml @@ -90,7 +90,7 @@ 1.3 0.72 - 30 + 14 dummy dummy diff --git a/romfs/source/fighter/captain/motion/body/motion_patch.yaml b/romfs/source/fighter/captain/motion/body/motion_patch.yaml index 31bf4e39fb..162930a417 100644 --- a/romfs/source/fighter/captain/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/captain/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/captain/param/hdr.xml b/romfs/source/fighter/captain/param/hdr.xml index 07aa53beb4..2ae42c331e 100644 --- a/romfs/source/fighter/captain/param/hdr.xml +++ b/romfs/source/fighter/captain/param/hdr.xml @@ -8,4 +8,7 @@ 10.5 + + 1.9 + \ No newline at end of file diff --git a/romfs/source/fighter/chrom/motion/body/motion_patch.yaml b/romfs/source/fighter/chrom/motion/body/motion_patch.yaml index 5cd175906a..beb3d2b75d 100644 --- a/romfs/source/fighter/chrom/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/chrom/motion/body/motion_patch.yaml @@ -3,7 +3,7 @@ attack_11: cancel_frame: 25 attack_air_f: extra: - cancel_frame: 32 + cancel_frame: 34 attack_hi3: animations: - name: d01specials3hi.nuanmb # Stolen from Dancing Blade 3 High @@ -41,7 +41,7 @@ attack_hi4: no_stop_intp: false attack_lw3: extra: - cancel_frame: 19 + cancel_frame: 24 attack_s3_s: extra: cancel_frame: 44 @@ -77,10 +77,10 @@ cliff_wait: blend_frames: 2 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_back_d: extra: cancel_frame: 36 @@ -212,7 +212,7 @@ special_air_s3_hi: # duplicated special_s4_hi - sound_specialairs4hi - effect_specialairs4hi extra: - cancel_frame: 40 + cancel_frame: 38 special_air_s3_lw: animations: - name: d01specialairs3lw.nuanmb @@ -222,14 +222,14 @@ special_air_s3_s: animations: - name: d01specialairs3s.nuanmb extra: - cancel_frame: 47 + cancel_frame: 32 # Dancing Blade 3 special_air_s4_hi: animations: - name: d01specialairs4hi.nuanmb extra: - cancel_frame: 40 + cancel_frame: 38 special_air_s4_lw: animations: - name: a02dash.nuanmb # replaced with a dash @@ -239,7 +239,7 @@ special_air_s4_s: animations: - name: d01specialairs4s.nuanmb extra: - cancel_frame: 59 + cancel_frame: 50 special_hi_1: flags: @@ -325,7 +325,7 @@ special_s3_hi: # duplicated special_s4_hi - sound_specials4hi - effect_specials4hi extra: - cancel_frame: 40 + cancel_frame: 38 special_s3_lw: animations: - name: d01specials3lw.nuanmb @@ -335,14 +335,14 @@ special_s3_s: animations: - name: d01specials3s.nuanmb extra: - cancel_frame: 44 + cancel_frame: 32 # Dancing Blade 3 special_s4_hi: animations: - name: d01specials4hi.nuanmb extra: - cancel_frame: 40 + cancel_frame: 38 special_s4_lw: animations: - name: a02dash.nuanmb # replaced with a dash @@ -352,7 +352,7 @@ special_s4_s: animations: - name: d01specials4s.nuanmb extra: - cancel_frame: 59 + cancel_frame: 50 step_pose_back: extra: diff --git a/romfs/source/fighter/chrom/param/hdr.xml b/romfs/source/fighter/chrom/param/hdr.xml index 2893d674f2..66a5fec025 100644 --- a/romfs/source/fighter/chrom/param/hdr.xml +++ b/romfs/source/fighter/chrom/param/hdr.xml @@ -8,6 +8,9 @@ 9 + + 0.5 + true true @@ -37,4 +40,7 @@ 1 0.6 + + 0.1 + \ No newline at end of file diff --git a/romfs/source/fighter/cloud/motion/body/motion_patch.yaml b/romfs/source/fighter/cloud/motion/body/motion_patch.yaml index 8caeb81af8..7886e5da19 100644 --- a/romfs/source/fighter/cloud/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/cloud/motion/body/motion_patch.yaml @@ -45,10 +45,10 @@ cliff_wait: blend_frames: 2 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_back_d: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/cloud/param/vl.prcxml b/romfs/source/fighter/cloud/param/vl.prcxml index f3d3add55e..1700d95144 100644 --- a/romfs/source/fighter/cloud/param/vl.prcxml +++ b/romfs/source/fighter/cloud/param/vl.prcxml @@ -48,11 +48,11 @@ 1.0 1.0 1.1 - 0.25 + 0.5 0.25 0.625 - 16 - 0.8 + 13 + 0.6 22 50 0.07 @@ -70,7 +70,7 @@ 0.25 0.25 0.625 - 16 + 13 0.8 22 50 @@ -83,7 +83,6 @@ 36 8 - 45 999 0.23 1200 @@ -151,4 +150,4 @@ 1.0 - \ No newline at end of file + diff --git a/romfs/source/fighter/common/hdr/param/common.xml b/romfs/source/fighter/common/hdr/param/common.xml index 45892b1d24..fdd72a2cb3 100644 --- a/romfs/source/fighter/common/hdr/param/common.xml +++ b/romfs/source/fighter/common/hdr/param/common.xml @@ -33,11 +33,10 @@ 0.3 -0.5 0.8945 - -0.5673 + -0.6 0.225 0.9 28 - 30 3 37 8 @@ -60,7 +59,15 @@ 2.0 4.5 - 4.0 - 3 + 5 6 + 17.0 + 35.0 + 15.0 + 2.5 + 80.0 + 25.0 + 24 + 3 + 3 \ No newline at end of file diff --git a/romfs/source/fighter/common/hdr/param/fighter_param.xml b/romfs/source/fighter/common/hdr/param/fighter_param.xml index ea2ccee4cb..df786a6600 100644 --- a/romfs/source/fighter/common/hdr/param/fighter_param.xml +++ b/romfs/source/fighter/common/hdr/param/fighter_param.xml @@ -7,6 +7,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 DONKEY @@ -14,6 +16,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 LINK @@ -21,6 +25,8 @@ 0.85 1.5 1.8 + 1.125 + 4.0 SAMUS @@ -28,6 +34,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 SAMUSD @@ -35,6 +43,8 @@ 0.95 1.5 1.8 + 1.125 + 4.0 YOSHI @@ -42,6 +52,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 KIRBY @@ -49,6 +61,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 FOX @@ -56,6 +70,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 PIKACHU @@ -63,6 +79,8 @@ 0.85 1.5 1.8 + 1.125 + 4.0 LUIGI @@ -70,6 +88,8 @@ 1.0 1.5 2.65 + 1.125 + 4.0 NESS @@ -77,6 +97,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 CAPTAIN @@ -84,6 +106,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 PURIN @@ -91,6 +115,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 PEACH @@ -98,6 +124,8 @@ 1.0 2.5 1.8 + 1.125 + 4.0 DAISY @@ -105,13 +133,17 @@ 1.0 2.5 1.8 + 1.125 + 4.0 KOOPA -1.0 - 1.0 + 2.0 1.5 1.8 + 1.125 + 4.0 SHEIK @@ -119,6 +151,8 @@ 0.9 1.5 1.8 + 1.125 + 4.0 ZELDA @@ -126,6 +160,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 MARIOD @@ -133,6 +169,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 PICHU @@ -140,6 +178,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 FALCO @@ -147,6 +187,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 MARTH @@ -154,6 +196,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 LUCINA @@ -161,6 +205,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 YOUNGLINK @@ -168,6 +214,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 GANON @@ -175,6 +223,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 MEWTWO @@ -182,6 +232,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 ROY @@ -189,6 +241,8 @@ 0.85 1.5 1.7 + 1.125 + 4.0 CHROM @@ -196,6 +250,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 GAMEWATCH @@ -203,6 +259,8 @@ 0.8 1.5 1.8 + 1.125 + 4.0 METAKNIGHT @@ -210,6 +268,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 PIT @@ -217,6 +277,8 @@ 0.95 1.5 1.8 + 1.125 + 4.0 PITB @@ -224,6 +286,8 @@ 0.95 1.5 1.8 + 1.125 + 4.0 SZEROSUIT @@ -231,6 +295,8 @@ 1.0 1.5 1.8 + 1.125 + 3.0 WARIO @@ -238,6 +304,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 SNAKE @@ -245,6 +313,8 @@ 1.0 2.75 1.8 + 1.125 + 4.0 IKE @@ -252,6 +322,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 PZENIGAME @@ -259,6 +331,8 @@ 0.9 1.5 1.7 + 1.125 + 4.0 PFUSHIGISOU @@ -266,6 +340,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 PLIZARDON @@ -273,6 +349,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 DIDDY @@ -280,6 +358,8 @@ 1.0 3.5 1.8 + 1.125 + 4.0 LUCAS @@ -287,6 +367,8 @@ 0.95 1.5 1.8 + 1.125 + 4.0 SONIC @@ -294,6 +376,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 DEDEDE @@ -301,6 +385,8 @@ 1.0 1.5 1.8 + 1.125 + 0.0 PIKMIN @@ -308,6 +394,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 LUCARIO @@ -315,6 +403,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 ROBOT @@ -322,6 +412,8 @@ 1.0 2.5 1.8 + 1.125 + 4.0 TOONLINK @@ -329,6 +421,8 @@ 1.0 3.25 1.8 + 1.125 + 4.0 WOLF @@ -336,6 +430,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 MURABITO @@ -343,6 +439,8 @@ 1.0 2.75 1.8 + 1.125 + 4.0 ROCKMAN @@ -350,6 +448,8 @@ 1.0 1.75 1.8 + 1.125 + 4.0 WIIFIT @@ -357,6 +457,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 ROSETTA @@ -364,6 +466,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 LITTLEMAC @@ -371,6 +475,8 @@ 0.9 1.5 1.8 + 1.125 + 4.0 GEKKOUGA @@ -378,6 +484,8 @@ 0.9 1.5 1.8 + 1.125 + 4.0 PALUTENA @@ -385,6 +493,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 PACMAN @@ -392,6 +502,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 REFLET @@ -399,6 +511,8 @@ 1.0 3.0 1.7 + 1.125 + 4.0 SHULK @@ -406,6 +520,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 KOOPAJR @@ -413,6 +529,8 @@ 1.0 2.0 1.8 + 1.125 + 4.0 DUCKHUNT @@ -420,6 +538,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 RYU @@ -427,6 +547,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 KEN @@ -434,6 +556,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 CLOUD @@ -441,6 +565,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 KAMUI @@ -448,6 +574,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 BAYONETTA @@ -455,6 +583,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 INKLING @@ -462,6 +592,8 @@ 0.9 1.5 1.8 + 1.125 + 4.0 RIDLEY @@ -469,6 +601,8 @@ 0.95 1.5 1.8 + 1.125 + 4.0 SIMON @@ -476,6 +610,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 RICHTER @@ -483,6 +619,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 KROOL @@ -490,6 +628,8 @@ 1.0 2.5 1.8 + 1.125 + 4.0 SHIZUE @@ -497,6 +637,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 GAOGAEN @@ -504,6 +646,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 MIIFIGHTER @@ -511,6 +655,8 @@ 0.8 1.5 1.8 + 1.125 + 4.0 MIISWORDSMAN @@ -518,6 +664,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 MIIGUNNER @@ -525,6 +673,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 POPO @@ -532,6 +682,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 NANA @@ -539,6 +691,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 KOOPAG @@ -546,6 +700,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 MIIENEMYF @@ -553,6 +709,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 MIIENEMYS @@ -560,6 +718,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 MIIENEMYG @@ -567,6 +727,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 PACKUN @@ -574,6 +736,8 @@ 0.95 1.5 1.8 + 1.125 + 4.0 JACK @@ -581,6 +745,8 @@ 0.95 1.5 1.8 + 1.125 + 4.0 BRAVE @@ -588,6 +754,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 BUDDY @@ -595,6 +763,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 DOLLY @@ -602,6 +772,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 MASTER @@ -609,6 +781,8 @@ 0.95 1.5 1.7 + 1.125 + 4.0 TANTAN @@ -616,6 +790,8 @@ 0.95 1.5 1.8 + 1.125 + 4.0 PICKEL @@ -623,6 +799,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 EDGE @@ -630,6 +808,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 EFLAME @@ -637,6 +817,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 ELIGHT @@ -644,6 +826,8 @@ 1.0 1.5 1.7 + 1.125 + 4.0 DEMON @@ -651,6 +835,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 TRAIL @@ -658,6 +844,8 @@ 1.0 1.5 1.8 + 1.125 + 4.0 \ No newline at end of file diff --git a/romfs/source/fighter/common/param/battle_object.prcxml b/romfs/source/fighter/common/param/battle_object.prcxml index aaf15d77aa..09ae116190 100644 --- a/romfs/source/fighter/common/param/battle_object.prcxml +++ b/romfs/source/fighter/common/param/battle_object.prcxml @@ -25,18 +25,19 @@ 1.0 1.0 1 - 999 + 99 + 99 0.3 2.0 6.0 - 0.025 - 0.32 - 0.3 - 0.625 - 0.025 - 0.37 - 0.4 - 0.875 + 0.025 + 0.32 + 0.3 + 0.625 + 0.025 + 0.37 + 0.4 + 0.875 0.3 0.785398 1.22173 diff --git a/romfs/source/fighter/common/param/common.prcxml b/romfs/source/fighter/common/param/common.prcxml index 3e4963add2..d2e2189877 100644 --- a/romfs/source/fighter/common/param/common.prcxml +++ b/romfs/source/fighter/common/param/common.prcxml @@ -2,12 +2,12 @@ - 3 + 5 0 4 1 -0.2 - 0.716 + 0.73 4 6 2 @@ -16,26 +16,26 @@ -1 17 1 - 0.59 - -0.3178 + 0.62 + -0.38 4 1 999 - -0.5959 + -0.625 0.7 - 0.2248 - 0.6244 + 0.3 + 0.65 4 5 2 - 0.607 - -0.6415 + 0.635 + -0.665 0 8 - 72 + 64 4 - 0.375 - 0.09 + 0.333 + 0.08 1.0 0.55 0.5156 @@ -46,18 +46,18 @@ 1 14 14 - 6 + 5 8 0.00 - 30 + 24 10 0.85 1 30 3 - -0.7386 + -0.75 3 - 0.7386 + 0.75 4 2 5.25 @@ -97,19 +97,19 @@ -0.2 0.2 -0.2 - 0.716 - -0.716 + 0.73 + -0.73 1 0.2 - 0.5673 - 0.51 + 0.6 + 0.55 13 7 14 1 0 - 1 - -0.6358 + 6 + -0.66 0 0.2 25 @@ -126,7 +126,7 @@ 999 7 25 - -0.8786 + -0.872665 0.2 0.2 @@ -145,11 +145,11 @@ 1 1 - -0.6929 + -0.71 20 40 999 - 0.7957 + 0.8 0.75 0.7 6 @@ -174,13 +174,18 @@ 150 0 0.5 + 60 + 0 + 0 + 3 + 45 1.15 1.8 1 15 0.7 - -0.2248 - -0.6244 + -0.31 + -0.65 0.18 0.872665 5 diff --git a/romfs/source/fighter/common/param/fighter_param.prcxml b/romfs/source/fighter/common/param/fighter_param.prcxml index 6222c6af1f..ff8948cf72 100644 --- a/romfs/source/fighter/common/param/fighter_param.prcxml +++ b/romfs/source/fighter/common/param/fighter_param.prcxml @@ -88,7 +88,7 @@ 1 1.3 9.9385 - 12.58 + 11.7 25 0.02 1 @@ -135,7 +135,7 @@ 2.24 108 7 - 12 + 7 9 10 5 @@ -250,7 +250,7 @@ 3.4 75 15 - 10 + 9 10 10 4 @@ -575,19 +575,19 @@ - 1.108 - 0.0385 + 0.95 + 0.035 1.4 - 0.06 + 0.05 0.02 - 1.545 + 1.4 4 0.6 9.7132 14.75 - 0.03105 + 0.027 0.02 - 0.87375 + 0.83 0.02 0.1 1.61 @@ -605,8 +605,8 @@ 1 1 1 - 8.25 - 11 + 9 + 12 @@ -791,7 +791,7 @@ 7 9 10 - 9 + 11 10 4 3 @@ -857,16 +857,18 @@ 1 1.2 12.03345 - 12.6 + 34.0 + 33.66 + 11.8 1 0.005 - 0.11 - 2.16 - 2.9 + 0.13 + 2.4 + 3.1 85 8 9 - 9 + 7 12 16 4 @@ -875,6 +877,7 @@ 2 0.8 0.8 + 2.65 1.1 1 1 @@ -923,10 +926,10 @@ 0.05 - 1.45 + 1.5 0.05 0.1 - 1.66 + 1.667 5 1.4 11.12183 @@ -940,12 +943,12 @@ 93 9 12 - 9 + 10 4 5 false 2 - 20 + 22 1 0.825 0.825 @@ -1266,11 +1269,11 @@ 1.25 - 0.055 + 0.0425 1.75 0.15 0.01 - 1.625 + 1.675 4 0.72 0.8 @@ -1280,22 +1283,22 @@ 35.0 12.0 37.0 - 0.0375 - 0.01 + 0.06 + 0.02 1.05 0.006 - 0.128 + 0.13 2.25 2.9 80 - 9 + 8 8 9 - 7 - 8 + 9 + 7 4 5 - 1.067 + 1.0185 9.2 0.81 0.81 @@ -1689,7 +1692,7 @@ 0.11 2.06 2.831 - 85 + 82 9 7 11 @@ -1832,12 +1835,12 @@ - 1.244 - 0.0835 - 1.815 + 1.3995 + 0.087 + 1.88 0.08584 0.02 - 1.89 + 1.97 3 1 1.45 @@ -1845,10 +1848,10 @@ 13.18 0.066 0.01 - 0.977 - 0.113 - 1.816 - 2.414 + 1.04 + 0.1215 + 1.953 + 2.596 96 7 9 @@ -2024,10 +2027,10 @@ 0.07 - 1.625 + 1.7 0.08584 0.02 - 1.62 + 1.64 4 1 1.5 @@ -2036,7 +2039,7 @@ 15.48 28 0.065 - 0.015 + 0.02 1.095 0.0125 0.085 @@ -2076,7 +2079,7 @@ 14.52 0.04 0.01 - 1.03 + 1.009 0.008 0.099 2.25 @@ -2159,7 +2162,7 @@ 2.238 3.007 110 - 8 + 9 10 10 7 @@ -2348,20 +2351,21 @@ 1 1.5 13.9425 - 12.5 + 13.0 0.065 0.015 1.03 0.007 0.132 2.35 + 0.016 2.9 84 8 - 10 + 11 10 8 - 20 + 18 4 4 1.03 @@ -2577,13 +2581,13 @@ 0.08 1.6 0.05571 - 1.45 + 1.43 5 - 0.96 + 0.98 0.8 1.45 11.297 - 31.6 + 32.3 11 32.8 0.05 @@ -2593,7 +2597,7 @@ 2.2 2.953 112 - 9 + 8 11 13 10 @@ -2636,7 +2640,7 @@ 8 8 14 - 7 + 8 11 5 2 @@ -2865,10 +2869,10 @@ 0.012 1.815 100 - 8 + 9 11 10 - 7 + 8 13 4 2 @@ -2938,7 +2942,7 @@ 110 8 9 - 22 + 30 5 4 1.067 @@ -3042,7 +3046,7 @@ 78 9 9 - 9 + 8 11 4 2 @@ -3181,7 +3185,7 @@ - 0.076 + 0.068 1.8 0.08584 0.02 @@ -3192,7 +3196,7 @@ 11.0468 14 29.3 - 0.035 + 0.0375 0.01 0.99 0.01 @@ -3210,6 +3214,7 @@ 9.5 0.81 0.81 + false 1.1 1 1 @@ -3245,7 +3250,7 @@ 9 12 10 - 13 + 11 4 6 0.96 @@ -3349,16 +3354,16 @@ 1.9 4 0.9 - 1.4 - 11.0718 - 29.0 + 1.55 + 11.44 + 32.0 14.5 29.0 0.03 - 0.01 + 0.03 1.11 - 0.16 - 2.6 + 0.15 + 2.5 3.3 90 8 @@ -3373,7 +3378,7 @@ true 0.815 0.815 - 2.4 + 2.5 1.1 1 1 @@ -3394,15 +3399,15 @@ 11.0825 33 13.96 - 0.06 + 0.05 0.96 0.015 0.11 2.42 3.146 - 82 + 78 9 - 11 + 12 10 11 10 diff --git a/romfs/source/fighter/common/param/fighter_param_motion.prcxml b/romfs/source/fighter/common/param/fighter_param_motion.prcxml index ec4c045a11..66c3ea080b 100644 --- a/romfs/source/fighter/common/param/fighter_param_motion.prcxml +++ b/romfs/source/fighter/common/param/fighter_param_motion.prcxml @@ -17,7 +17,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -30,7 +30,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -50,7 +50,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -63,7 +63,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -83,7 +83,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -96,7 +96,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -116,7 +116,7 @@ 4 26 500 - 62 + 999 4 26 4 @@ -129,7 +129,7 @@ 25 0.4 500 - 62 + 999 10 1 @@ -149,7 +149,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -162,7 +162,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -182,7 +182,7 @@ 4 26 500 - 60 + 999 4 26 4 @@ -195,7 +195,7 @@ 25 0.4 500 - 60 + 999 10 1 @@ -215,7 +215,7 @@ 4 26 500 - 47 + 999 4 26 4 @@ -228,7 +228,7 @@ 25 0.4 500 - 47 + 999 10 1 @@ -248,7 +248,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -261,7 +261,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -281,7 +281,7 @@ 4 26 500 - 59 + 999 4 26 4 @@ -294,7 +294,7 @@ 25 0.4 500 - 59 + 999 10 1 @@ -314,7 +314,7 @@ 4 26 500 - 58 + 999 4 26 4 @@ -327,7 +327,7 @@ 25 0.4 500 - 58 + 999 10 1 @@ -347,7 +347,7 @@ 4 26 500 - 52 + 999 4 26 4 @@ -360,7 +360,7 @@ 25 0.4 500 - 52 + 999 10 1 @@ -380,7 +380,7 @@ 4 26 500 - 63 + 999 4 26 4 @@ -393,7 +393,7 @@ 25 0.4 500 - 63 + 999 10 1 @@ -413,7 +413,7 @@ 4 26 500 - 60 + 999 4 26 4 @@ -426,7 +426,7 @@ 25 0.4 500 - 60 + 999 10 1 @@ -446,7 +446,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -459,7 +459,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -479,7 +479,7 @@ 4 26 500 - 58 + 999 4 26 4 @@ -492,7 +492,7 @@ 25 0.4 500 - 58 + 999 10 1 @@ -512,7 +512,7 @@ 4 26 500 - 58 + 999 4 26 4 @@ -525,7 +525,7 @@ 25 0.4 500 - 58 + 999 10 1 @@ -545,7 +545,7 @@ 4 26 500 - 53 + 999 4 26 4 @@ -558,7 +558,7 @@ 25 0.4 500 - 53 + 999 10 1 @@ -578,7 +578,7 @@ 4 26 500 - 61 + 999 4 26 4 @@ -591,7 +591,7 @@ 25 0.4 500 - 61 + 999 10 1 @@ -611,7 +611,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -624,7 +624,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -644,7 +644,7 @@ 4 26 500 - 51 + 999 4 26 4 @@ -657,7 +657,7 @@ 25 0.4 500 - 51 + 999 10 1 @@ -677,7 +677,7 @@ 4 26 500 - 49 + 999 4 26 4 @@ -690,7 +690,7 @@ 25 0.4 500 - 49 + 999 10 1 @@ -710,7 +710,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -723,7 +723,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -743,7 +743,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -756,7 +756,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -776,7 +776,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -789,7 +789,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -809,7 +809,7 @@ 4 26 500 - 60 + 999 4 26 4 @@ -822,7 +822,7 @@ 25 0.4 500 - 60 + 999 10 1 @@ -842,7 +842,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -855,7 +855,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -875,7 +875,7 @@ 4 26 500 - 58 + 999 4 26 4 @@ -888,7 +888,7 @@ 25 0.4 500 - 58 + 999 10 1 @@ -908,7 +908,7 @@ 4 26 500 - 52 + 999 4 26 4 @@ -921,7 +921,7 @@ 25 0.4 500 - 52 + 999 10 1 @@ -941,7 +941,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -954,7 +954,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -974,7 +974,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -987,7 +987,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -1007,7 +1007,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1020,7 +1020,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1040,7 +1040,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -1053,7 +1053,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -1073,7 +1073,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -1086,7 +1086,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -1106,7 +1106,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1119,7 +1119,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1139,7 +1139,7 @@ 4 26 500 - 59 + 999 4 26 4 @@ -1152,7 +1152,7 @@ 25 0.4 500 - 59 + 999 10 1 @@ -1172,7 +1172,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -1185,7 +1185,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -1205,7 +1205,7 @@ 4 26 500 - 53 + 999 4 26 4 @@ -1218,7 +1218,7 @@ 25 0.4 500 - 53 + 999 10 1 @@ -1238,7 +1238,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -1251,7 +1251,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -1271,7 +1271,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -1284,7 +1284,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -1304,7 +1304,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1317,7 +1317,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1337,7 +1337,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -1350,7 +1350,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -1370,7 +1370,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -1383,7 +1383,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -1403,7 +1403,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -1416,7 +1416,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -1436,7 +1436,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1449,7 +1449,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1469,7 +1469,7 @@ 4 26 500 - 51 + 999 4 26 4 @@ -1482,7 +1482,7 @@ 25 0.4 500 - 51 + 999 10 1 @@ -1502,7 +1502,7 @@ 4 26 500 - 59 + 999 4 26 4 @@ -1515,7 +1515,7 @@ 25 0.4 500 - 59 + 999 10 1 @@ -1535,7 +1535,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1548,7 +1548,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1568,7 +1568,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -1581,7 +1581,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -1601,7 +1601,7 @@ 4 26 500 - 60 + 999 4 26 4 @@ -1614,7 +1614,7 @@ 25 0.4 500 - 60 + 999 10 1 @@ -1634,7 +1634,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1647,7 +1647,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1667,7 +1667,7 @@ 4 26 500 - 52 + 999 4 26 4 @@ -1680,7 +1680,7 @@ 25 0.4 500 - 52 + 999 10 1 @@ -1700,7 +1700,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1713,7 +1713,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1733,7 +1733,7 @@ 4 26 500 - 59 + 999 4 26 4 @@ -1746,7 +1746,7 @@ 25 0.4 500 - 59 + 999 10 1 @@ -1766,7 +1766,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1779,7 +1779,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1799,7 +1799,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1812,7 +1812,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1832,7 +1832,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1845,7 +1845,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1865,7 +1865,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -1878,7 +1878,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -1898,7 +1898,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -1911,7 +1911,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -1931,7 +1931,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -1944,7 +1944,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -1964,7 +1964,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -1977,7 +1977,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -1997,7 +1997,7 @@ 8 22 500 - 53 + 999 8 22 8 @@ -2010,7 +2010,7 @@ 25 0.4 500 - 53 + 999 10 1 @@ -2030,7 +2030,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -2043,7 +2043,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -2063,7 +2063,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -2076,7 +2076,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -2096,7 +2096,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -2109,7 +2109,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -2129,7 +2129,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -2142,7 +2142,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -2162,7 +2162,7 @@ 4 26 500 - 58 + 999 4 26 4 @@ -2175,7 +2175,7 @@ 25 0.4 500 - 58 + 999 10 1 @@ -2195,7 +2195,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -2208,7 +2208,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -2228,7 +2228,7 @@ 4 26 500 - 53 + 999 4 26 4 @@ -2241,7 +2241,7 @@ 25 0.4 500 - 53 + 999 10 1 @@ -2261,7 +2261,7 @@ 4 26 500 - 52 + 999 4 26 4 @@ -2274,7 +2274,7 @@ 25 0.4 500 - 52 + 999 10 1 @@ -2294,7 +2294,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -2307,7 +2307,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -2327,7 +2327,7 @@ 4 26 500 - 53 + 999 4 26 4 @@ -2340,7 +2340,7 @@ 25 0.4 500 - 53 + 999 10 1 @@ -2360,7 +2360,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -2373,7 +2373,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -2393,7 +2393,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -2406,7 +2406,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -2426,7 +2426,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -2439,7 +2439,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -2459,7 +2459,7 @@ 4 26 500 - 58 + 999 4 26 4 @@ -2472,7 +2472,7 @@ 25 0.4 500 - 58 + 999 10 1 @@ -2492,7 +2492,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -2505,7 +2505,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -2525,7 +2525,7 @@ 4 26 500 - 56 + 999 4 26 4 @@ -2538,7 +2538,7 @@ 25 0.4 500 - 56 + 999 10 1 @@ -2558,7 +2558,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -2571,7 +2571,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -2591,7 +2591,7 @@ 4 26 500 - 52 + 999 4 26 4 @@ -2604,7 +2604,7 @@ 25 0.4 500 - 52 + 999 10 1 @@ -2624,7 +2624,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -2637,7 +2637,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -2657,7 +2657,7 @@ 4 26 500 - 52 + 999 4 26 4 @@ -2670,7 +2670,7 @@ 25 0.4 500 - 52 + 999 10 1 @@ -2690,7 +2690,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -2703,7 +2703,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -2723,7 +2723,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -2736,7 +2736,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -2756,7 +2756,7 @@ 4 26 500 - 57 + 999 4 26 4 @@ -2769,7 +2769,7 @@ 25 0.4 500 - 57 + 999 10 1 @@ -2789,7 +2789,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -2802,7 +2802,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -2822,7 +2822,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -2835,7 +2835,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -2855,7 +2855,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -2868,7 +2868,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -2888,7 +2888,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -2901,7 +2901,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -2921,7 +2921,7 @@ 4 26 500 - 54 + 999 4 26 4 @@ -2934,7 +2934,7 @@ 25 0.4 500 - 54 + 999 10 1 @@ -2954,7 +2954,7 @@ 4 26 500 - 55 + 999 4 26 4 @@ -2967,7 +2967,7 @@ 25 0.4 500 - 55 + 999 10 1 @@ -2987,7 +2987,7 @@ 4 26 500 - 51 + 999 4 26 4 @@ -3000,7 +3000,7 @@ 25 0.4 500 - 51 + 999 10 1 diff --git a/romfs/source/fighter/daisy/motion/body/motion_patch.yaml b/romfs/source/fighter/daisy/motion/body/motion_patch.yaml index 5396328732..081b8f196c 100644 --- a/romfs/source/fighter/daisy/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/daisy/motion/body/motion_patch.yaml @@ -183,10 +183,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -242,7 +242,7 @@ special_air_n: xlu_end: 0 special_air_s_end: extra: - cancel_frame: 43 + cancel_frame: 39 special_n: extra: xlu_start: 0 @@ -284,6 +284,99 @@ special_s_end: special_s_hit_end: extra: cancel_frame: 23 +special_air_hi_end: + flags: + move: true +special_air_lw: + game_script: game_specialairlw + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03specialairlw.nuanmb + unk: 0 + scripts: + - expression_specialairlw + - sound_specialairlw + - effect_specialairlw + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 20 + no_stop_intp: false +special_lw_throw: + game_script: game_speciallwthrow + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: h01lightthrowf.nuanmb + unk: 0 + scripts: + - expression_speciallwthrow + - sound_speciallwthrow + - effect_speciallwthrow + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 25 + no_stop_intp: false +special_air_lw_throw: + game_script: game_speciallwthrow + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: h02lightthrowairf.nuanmb + unk: 0 + scripts: + - expression_speciallwthrow + - sound_speciallwthrow + - effect_speciallwthrow + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 25 + no_stop_intp: false step_pose_back: extra: cancel_frame: 6 diff --git a/romfs/source/fighter/daisy/param/hdr.xml b/romfs/source/fighter/daisy/param/hdr.xml index a68cb2a0d3..9118d24413 100644 --- a/romfs/source/fighter/daisy/param/hdr.xml +++ b/romfs/source/fighter/daisy/param/hdr.xml @@ -16,16 +16,27 @@ 20 - 0.8 - 0.25 - 0.75 - 0.75 - 0.9 + 3.0 + 1.5 + 0.4 + 0.125 + 0.015 + 0.56 + 1.65 + 0.5 + 1.6 + 4 + 24.0 + 0.5 + 0.8 1 0.6 + + 0.5 + 1.2 0.02 diff --git a/romfs/source/fighter/daisy/param/vl.prcxml b/romfs/source/fighter/daisy/param/vl.prcxml index 7cb9e7fd0f..096116c065 100644 --- a/romfs/source/fighter/daisy/param/vl.prcxml +++ b/romfs/source/fighter/daisy/param/vl.prcxml @@ -37,7 +37,9 @@ 2.9 2.9 - 0.15 + 1.1 + 0.4 + 1.1 -0.25 2.0 0.4 @@ -52,7 +54,7 @@ - 0.1 + 0.2 30 0.8 0 diff --git a/romfs/source/fighter/dedede/motion/body/motion_patch.yaml b/romfs/source/fighter/dedede/motion/body/motion_patch.yaml index 646cabe4ec..448a58aa10 100644 --- a/romfs/source/fighter/dedede/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/dedede/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/demon/motion/body/motion_patch.yaml b/romfs/source/fighter/demon/motion/body/motion_patch.yaml index 5af068575c..669c7c535b 100644 --- a/romfs/source/fighter/demon/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/demon/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -77,19 +77,6 @@ guard_off: blend_frames: 4 extra: cancel_frame: 12 -attack_rage_drive: - extra: - xlu_start: 0 - xlu_end: 0 -attack_air_rage_drive: - extra: - xlu_start: 0 - xlu_end: 0 -landing_air_lw: - flags: - move: true - extra: - cancel_frame: 0 catch: extra: cancel_frame: 38 @@ -109,4 +96,148 @@ step_pose_back: extra: cancel_frame: 6 cliff_wait: - blend_frames: 2 \ No newline at end of file + blend_frames: 2 + +attack_dash: + animations: + - name: c06attackstand1.nuanmb + extra: + cancel_frame: 40 + +attack_s3_hi: + game_script: game_attackstand5 + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: false + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: c06attackstand5.nuanmb + unk: 0 + scripts: + - expression_attackstand5 + - sound_attackstand5 + - effect_attackstand5 + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 34 + no_stop_intp: false + +attack_s3_lw: + game_script: game_attackstand4 + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: false + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: c06attackstand4.nuanmb + unk: 0 + scripts: + - expression_attackstand4 + - sound_attackstand4 + - effect_attackstand4 + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 39 + no_stop_intp: false + +attack_lw3: + extra: + xlu_start: 0 + xlu_end: 0 +attack_lw3_cancel: + extra: + cancel_frame: 14 +attack_step: + extra: + xlu_start: 0 + xlu_end: 0 +attack_step_2f: + extra: + xlu_start: 0 + xlu_end: 0 +attack_step_2s: + extra: + xlu_start: 0 + xlu_end: 0 + +attack_squat_1: + extra: + xlu_start: 9 + xlu_end: 14 + +landing_air_lw: + flags: + move: true + extra: + cancel_frame: 0 + +attack_rage_drive: + extra: + xlu_start: 0 + xlu_end: 0 +attack_air_rage_drive: + extra: + xlu_start: 0 + xlu_end: 0 + +special_s: + extra: + xlu_start: 0 + xlu_end: 0 + +cancel_step: + game_script: game_cancelstep + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: false + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: c08attackstep.nuanmb + unk: 0 + scripts: + - expression_cancelstep + - sound_cancelstep + - effect_cancelstep + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false \ No newline at end of file diff --git a/romfs/source/fighter/demon/param/vl.prcxml b/romfs/source/fighter/demon/param/vl.prcxml index 758e2f262f..3962592d1c 100644 --- a/romfs/source/fighter/demon/param/vl.prcxml +++ b/romfs/source/fighter/demon/param/vl.prcxml @@ -8,6 +8,50 @@ 0 + + + 50 + 50 + 50 + 1 + + + 50 + 50 + 50 + 1 + + + 50 + 50 + 50 + 1 + + + 50 + 50 + 50 + 1 + + + 50 + 50 + 50 + 1 + + + 50 + 50 + 50 + 1 + + + 50 + 50 + 50 + 1 + + 1.3 diff --git a/romfs/source/fighter/diddy/motion/body/motion_patch.yaml b/romfs/source/fighter/diddy/motion/body/motion_patch.yaml index 042bfd727f..3d010198cc 100644 --- a/romfs/source/fighter/diddy/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/diddy/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -171,6 +171,8 @@ special_air_n_cancel: intangible_end_frame: 0 cancel_frame: 35 freeze_during_hitstop: false +special_air_s_fall: + blend_frames: 8 catch_dash: extra: cancel_frame: 42 diff --git a/romfs/source/fighter/dolly/motion/body/motion_patch.yaml b/romfs/source/fighter/dolly/motion/body/motion_patch.yaml index 7ed84ef252..ff61d5585a 100644 --- a/romfs/source/fighter/dolly/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/dolly/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/dolly/param/hdr.xml b/romfs/source/fighter/dolly/param/hdr.xml index 808e1d4d70..fb482b1f21 100644 --- a/romfs/source/fighter/dolly/param/hdr.xml +++ b/romfs/source/fighter/dolly/param/hdr.xml @@ -10,6 +10,10 @@ 9.5 + + 1.7 + 1.0 + 0.9 diff --git a/romfs/source/fighter/donkey/motion/body/motion_patch.yaml b/romfs/source/fighter/donkey/motion/body/motion_patch.yaml index 7c6b71b0e1..d3ef664566 100644 --- a/romfs/source/fighter/donkey/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/donkey/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -94,7 +94,10 @@ attack_lw3: cancel_frame: 23 throw_f_hi: extra: - cancel_frame: 38 + cancel_frame: 41 +throw_hi: + extra: + cancel_frame: 46 throw_lw: extra: cancel_frame: 45 diff --git a/romfs/source/fighter/duckhunt/motion/body/motion_patch.yaml b/romfs/source/fighter/duckhunt/motion/body/motion_patch.yaml index 64dba5504a..6526dca311 100644 --- a/romfs/source/fighter/duckhunt/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/duckhunt/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -142,7 +142,7 @@ special_hi: flags: loop: false extra: - cancel_frame: 35 + cancel_frame: 32 special_hi_2: game_script: game_specialhi2 flags: @@ -211,6 +211,9 @@ attack_air_b: attack_air_f: extra: cancel_frame: 37 +attack_air_lw: + extra: + cancel_frame: 46 attack_s3_hi: extra: cancel_frame: 29 diff --git a/romfs/source/fighter/duckhunt/param/hdr.xml b/romfs/source/fighter/duckhunt/param/hdr.xml index 8df4018cc5..38f0f631ff 100644 --- a/romfs/source/fighter/duckhunt/param/hdr.xml +++ b/romfs/source/fighter/duckhunt/param/hdr.xml @@ -11,8 +11,8 @@ 0.9 0.25 0.044 - 2.75 - 0.088 + 3.025 + 0.1056 0.9 0.9 0.15 @@ -20,5 +20,6 @@ 0.8 72 80 + 14 \ No newline at end of file diff --git a/romfs/source/fighter/duckhunt/param/vl.prcxml b/romfs/source/fighter/duckhunt/param/vl.prcxml index 2f127d7a58..0e352d3918 100644 --- a/romfs/source/fighter/duckhunt/param/vl.prcxml +++ b/romfs/source/fighter/duckhunt/param/vl.prcxml @@ -13,9 +13,37 @@ + 17 + 10 + + + + 15 22 + -9 + 10 + + + + 15 + 18 + -9 10 + + + 15 + 19 + -9 + 10 + + + + 15 + 19 + -9 + 8 + diff --git a/romfs/source/fighter/edge/motion/body/motion_patch.yaml b/romfs/source/fighter/edge/motion/body/motion_patch.yaml index a1274cfcd5..f756897105 100644 --- a/romfs/source/fighter/edge/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/edge/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/eflame/motion/body/motion_patch.yaml b/romfs/source/fighter/eflame/motion/body/motion_patch.yaml index 02de86d03a..16035f1e6f 100644 --- a/romfs/source/fighter/eflame/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/eflame/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/elight/motion/body/motion_patch.yaml b/romfs/source/fighter/elight/motion/body/motion_patch.yaml index bf00b929de..0148964d15 100644 --- a/romfs/source/fighter/elight/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/elight/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/elight/param/hdr.xml b/romfs/source/fighter/elight/param/hdr.xml new file mode 100644 index 0000000000..f183756ec7 --- /dev/null +++ b/romfs/source/fighter/elight/param/hdr.xml @@ -0,0 +1,6 @@ + + + + 14 + + \ No newline at end of file diff --git a/romfs/source/fighter/falco/motion/body/motion_patch.yaml b/romfs/source/fighter/falco/motion/body/motion_patch.yaml index a3d85b3571..e6c0422339 100644 --- a/romfs/source/fighter/falco/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/falco/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -119,7 +119,7 @@ attack_lw3: cancel_frame: 28 attack_hi4: extra: - cancel_frame: 53 + cancel_frame: 45 attack_lw4: extra: cancel_frame: 51 @@ -140,7 +140,7 @@ attack_air_n: cancel_frame: 43 attack_air_f: extra: - cancel_frame: 43 + cancel_frame: 36 attack_air_b: extra: cancel_frame: 37 diff --git a/romfs/source/fighter/fox/motion/body/motion_patch.yaml b/romfs/source/fighter/fox/motion/body/motion_patch.yaml index 5523468838..06186bb072 100644 --- a/romfs/source/fighter/fox/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/fox/motion/body/motion_patch.yaml @@ -110,10 +110,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/gamewatch/motion/body/motion_patch.yaml b/romfs/source/fighter/gamewatch/motion/body/motion_patch.yaml index be6aa0d8d0..f1b48dfaa1 100644 --- a/romfs/source/fighter/gamewatch/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/gamewatch/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/gamewatch/param/hdr.xml b/romfs/source/fighter/gamewatch/param/hdr.xml index dbef4a339e..e02beb439d 100644 --- a/romfs/source/fighter/gamewatch/param/hdr.xml +++ b/romfs/source/fighter/gamewatch/param/hdr.xml @@ -3,5 +3,6 @@ 1 0.8 + 14 \ No newline at end of file diff --git a/romfs/source/fighter/ganon/motion/body/motion_patch.yaml b/romfs/source/fighter/ganon/motion/body/motion_patch.yaml index a29c330f4a..ec8bc997b0 100644 --- a/romfs/source/fighter/ganon/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/ganon/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -118,10 +118,10 @@ throw_f: cancel_frame: 29 throw_b: extra: - cancel_frame: 40 + cancel_frame: 33 throw_lw: extra: - cancel_frame: 35 + cancel_frame: 37 throw_hi: extra: cancel_frame: 40 @@ -167,7 +167,7 @@ attack_hi4: cancel_frame: 66 attack_lw4: extra: - cancel_frame: 66 + cancel_frame: 60 attack_hi3: extra: cancel_frame: 38 @@ -331,6 +331,9 @@ float_air_start: special_hi_throw: extra: cancel_frame: 37 +catch: + extra: + cancel_frame: 38 catch_dash: extra: cancel_frame: 45 diff --git a/romfs/source/fighter/ganon/param/hdr.xml b/romfs/source/fighter/ganon/param/hdr.xml index a820bf1e31..a661a27573 100644 --- a/romfs/source/fighter/ganon/param/hdr.xml +++ b/romfs/source/fighter/ganon/param/hdr.xml @@ -14,4 +14,7 @@ 12 + + 1.5 + \ No newline at end of file diff --git a/romfs/source/fighter/gaogaen/motion/body/motion_patch.yaml b/romfs/source/fighter/gaogaen/motion/body/motion_patch.yaml index 1260383111..f53573c9b3 100644 --- a/romfs/source/fighter/gaogaen/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/gaogaen/motion/body/motion_patch.yaml @@ -13,12 +13,24 @@ attack_13_hit: attack_air_b: extra: cancel_frame: 37 -attack_air_f: +attack_air_n: extra: cancel_frame: 42 +attack_air_f: + extra: + cancel_frame: 41 attack_air_hi: extra: cancel_frame: 31 +attack_s3_hi: + extra: + cancel_frame: 35 +attack_s3_lw: + extra: + cancel_frame: 35 +attack_s3_s: + extra: + cancel_frame: 35 attack_hi3: extra: cancel_frame: 32 @@ -30,7 +42,7 @@ attack_hi4_hit: cancel_frame: 33 attack_lw3: extra: - cancel_frame: 29 + cancel_frame: 28 attack_lw4: extra: cancel_frame: 65 @@ -85,10 +97,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -135,6 +147,15 @@ jump_squat: shield_break_fly: animations: - name: f03downspotu.nuanmb +special_air_s_start: + extra: + cancel_frame: 57 +special_s_shoulder: + extra: + cancel_frame: 43 +special_air_s_shoulder: + extra: + cancel_frame: 43 special_air_hi_turn: blend_frames: 10 special_air_lw: @@ -146,9 +167,6 @@ special_air_lw_start: special_air_lw_turn: extra: cancel_frame: 27 -special_air_s_start: - extra: - cancel_frame: 57 special_lw: extra: cancel_frame: 27 diff --git a/romfs/source/fighter/gaogaen/param/vl.prcxml b/romfs/source/fighter/gaogaen/param/vl.prcxml index cc8029ff1d..8a7f0fda76 100644 --- a/romfs/source/fighter/gaogaen/param/vl.prcxml +++ b/romfs/source/fighter/gaogaen/param/vl.prcxml @@ -32,6 +32,13 @@ dummy dummy + + + 20 + 4 + 999 + + 0.87 @@ -50,8 +57,9 @@ 999 0.1 0.2 - 5 - 5 + 0.05 + 3.5 + 3.5 dummy dummy diff --git a/romfs/source/fighter/gekkouga/motion/body/motion_patch.yaml b/romfs/source/fighter/gekkouga/motion/body/motion_patch.yaml index 91bf39c71c..052cc8ef5a 100644 --- a/romfs/source/fighter/gekkouga/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/gekkouga/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -98,6 +98,9 @@ attack_dash: attack_hi3: extra: cancel_frame: 31 +attack_lw3: + extra: + cancel_frame: 25 fall_aerial: blend_frames: 3 attack_s4_s: diff --git a/romfs/source/fighter/gekkouga/param/vl.prcxml b/romfs/source/fighter/gekkouga/param/vl.prcxml index e069f260e4..b588a8c5d2 100644 --- a/romfs/source/fighter/gekkouga/param/vl.prcxml +++ b/romfs/source/fighter/gekkouga/param/vl.prcxml @@ -1,5 +1,32 @@ + + dummy + dummy + dummy + dummy + dummy + dummy + dummy + dummy + dummy + dummy + dummy + + 0.0 + 0.0 + 0.0 + 2.0 + 0.0 + 0.0 + 2.1 + s_tongue5 + collision_part_head + hit_height_center + hit_status_off + collision_shape_type_capsule + + 24 @@ -39,6 +66,7 @@ 3.15 100 + 0.3 0.5 0.75 diff --git a/romfs/source/fighter/ike/motion/body/motion_patch.yaml b/romfs/source/fighter/ike/motion/body/motion_patch.yaml index acf3cd88ab..3aa3559016 100644 --- a/romfs/source/fighter/ike/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/ike/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/inkling/motion/body/motion_patch.yaml b/romfs/source/fighter/inkling/motion/body/motion_patch.yaml index c72842296e..39016e6129 100644 --- a/romfs/source/fighter/inkling/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/inkling/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -124,6 +124,9 @@ attack_air_lw: attack_100_end: extra: cancel_frame: 42 +special_s_end: + extra: + cancel_frame: 20 special_s_jump_end: extra: cancel_frame: 15 @@ -133,6 +136,9 @@ item_light_throw_f: special_ink_charge_end: extra: cancel_frame: 30 +special_air_s_end: + extra: + cancel_frame: 20 special_air_s_jump_end: extra: cancel_frame: 45 diff --git a/romfs/source/fighter/inkling/param/vl.prcxml b/romfs/source/fighter/inkling/param/vl.prcxml index 3cf74ea9ab..3cbaee2c04 100644 --- a/romfs/source/fighter/inkling/param/vl.prcxml +++ b/romfs/source/fighter/inkling/param/vl.prcxml @@ -38,9 +38,14 @@ + 0.0 2.0 1.7 - 2.0 + 1.0 + 1.0 + 1 + 1 + 2.2 dummy dummy diff --git a/romfs/source/fighter/jack/motion/body/motion_patch.yaml b/romfs/source/fighter/jack/motion/body/motion_patch.yaml index ebd580a29f..064596e168 100644 --- a/romfs/source/fighter/jack/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/jack/motion/body/motion_patch.yaml @@ -30,10 +30,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -92,13 +92,13 @@ throw_f: cancel_frame: 26 throw_b: extra: - cancel_frame: 33 + cancel_frame: 40 throw_lw: extra: cancel_frame: 44 throw_hi: extra: - cancel_frame: 35 + cancel_frame: 38 attack_12: extra: cancel_frame: 18 @@ -183,15 +183,16 @@ attack_dash: attack_s4_s: extra: cancel_frame: 57 -special_hi2: - extra: - intangible_end_frame: 0 attack_air_f: extra: cancel_frame: 41 attack_air_n: extra: cancel_frame: 51 +special_n_jump: + extra: + xlu_start: 0 + xlu_end: 0 special_lw: extra: xlu_start: 0 @@ -206,6 +207,9 @@ special_air_hi: special_air_hi_throw: extra: cancel_frame: 15 +special_hi2: + extra: + intangible_end_frame: 0 special_hi2_f: extra: intangible_start_frame: 0 diff --git a/romfs/source/fighter/jack/param/hdr.xml b/romfs/source/fighter/jack/param/hdr.xml index cf0de7b04c..b68e272a33 100644 --- a/romfs/source/fighter/jack/param/hdr.xml +++ b/romfs/source/fighter/jack/param/hdr.xml @@ -1,5 +1,12 @@ + + 3.0 + 5.0 + 5.0 + 3.0 + 5.0 + 1 0.6 diff --git a/romfs/source/fighter/jack/param/vl.prcxml b/romfs/source/fighter/jack/param/vl.prcxml index a3ff3ae139..32a850b5fd 100644 --- a/romfs/source/fighter/jack/param/vl.prcxml +++ b/romfs/source/fighter/jack/param/vl.prcxml @@ -2,6 +2,7 @@ + -9.6 24 @@ -17,7 +18,7 @@ 20 85 - -5 + -9.6 18 @@ -45,33 +46,45 @@ 1 0.5 0.05 - 1.2 + 2.45 14 12 12 - 4 + 6 1.0 - 3 - 10 1.0 - 4 - 10 - 4 - 12 1.0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 1 9 1.0 - 3 - 10 1.0 - 4 - 10 - 4 - 12 1.0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 dummy dummy diff --git a/romfs/source/fighter/kamui/motion/body/motion_patch.yaml b/romfs/source/fighter/kamui/motion/body/motion_patch.yaml index 18a227c693..3d4d480049 100644 --- a/romfs/source/fighter/kamui/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/kamui/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/ken/motion/body/motion_patch.yaml b/romfs/source/fighter/ken/motion/body/motion_patch.yaml index bf51dff05f..3227c389d3 100644 --- a/romfs/source/fighter/ken/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/ken/motion/body/motion_patch.yaml @@ -111,10 +111,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/kirby/motion/body/motion_patch.yaml b/romfs/source/fighter/kirby/motion/body/motion_patch.yaml index e694f91b7b..1a2c6af2d3 100644 --- a/romfs/source/fighter/kirby/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/kirby/motion/body/motion_patch.yaml @@ -102,8 +102,8 @@ brave_special_air_n_jump_cancel: brave_special_n_cancel: extra: cancel_frame: 8 -buddy_attack_s3_hi: - game_script: game_buddyattacks3hi +buddy_special_n_attack_hi: + game_script: game_buddyspecialnattack flags: turn: false loop: false @@ -121,19 +121,47 @@ buddy_attack_s3_hi: unk_2000: false blend_frames: 0 animations: - - name: buddyc01attacks3hi.nuanmb - unk: 0 + - name: buddyd00specialnattackhi.nuanmb scripts: - - expression_buddyattacks3hi - - sound_buddyattacks3hi - - effect_buddyattacks3hi + - expression_buddyspecialnattack + - sound_buddyspecialnattack + - effect_buddyspecialnattack extra: - xlu_start: 0 - xlu_end: 0 - cancel_frame: 38 - no_stop_intp: false -buddy_attack_s3_lw: - game_script: game_buddyattacks3lw + intangible_start_frame: 0 + intangible_hi_frame: 0 + cancel_frame: 31 + freeze_during_hitstop: false +buddy_special_n_attack_s: + game_script: game_buddyspecialnattack + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: buddyd00specialnattacks.nuanmb + scripts: + - expression_buddyspecialnattack + - sound_buddyspecialnattack + - effect_buddyspecialnattack + extra: + intangible_start_frame: 0 + intangible_s_frame: 0 + cancel_frame: 31 + freeze_during_hitstop: false +buddy_special_n_attack_lw: + game_script: game_buddyspecialnattack flags: turn: false loop: false @@ -192,6 +220,35 @@ buddy_attack_s3_s: xlu_end: 0 cancel_frame: 38 no_stop_intp: false +buddy_special_n_attack_end: + game_script: game_buddyspecialnattackend + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 5 + animations: + - name: buddyd00specialnstart.nuanmb + scripts: + - expression_buddyspecialnattackend + - sound_buddyspecialnattackend + - effect_buddyspecialnattackend + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 31 + freeze_during_hitstop: false buddy_special_air_n_shoot_end: extra: cancel_frame: 8 @@ -256,6 +313,12 @@ cliff_jump_quick1: xlu_end: 17 cliff_wait: blend_frames: 2 +cloud_special_n: + extra: + cancel_frame: 45 +cloud_special_air_n: + extra: + cancel_frame: 45 daisy_special_air_n: extra: xlu_start: 0 @@ -364,10 +427,10 @@ donkey_special_n_cancel: cancel_frame: 9 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_back_d: extra: cancel_frame: 36 @@ -585,6 +648,126 @@ koopajr_special_air_n_shoot: koopajr_special_n_shoot: extra: cancel_frame: 32 +krool_special_n_fire_hi: + game_script: game_kroolspecialnfirehi + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: false + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: kroold00specialnfirehi.nuanmb + unk: 0 + scripts: + - expression_kroolspecialnfirehi + - sound_kroolspecialnfirehi + - effect_kroolspecialnfirehi + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 45 + no_stop_intp: false +krool_special_air_n_fire_hi: + game_script: game_kroolspecialairnfirehi + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: false + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: kroold00specialairnfirehi.nuanmb + unk: 0 + scripts: + - expression_kroolspecialairnfirehi + - sound_kroolspecialairnfirehi + - effect_kroolspecialairnfirehi + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 45 + no_stop_intp: false +krool_special_n_fire_b: + game_script: game_kroolspecialnfireb + flags: + turn: true + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: kroold00specialnfireb.nuanmb + unk: 0 + scripts: + - expression_kroolspecialnfireb + - sound_kroolspecialnfireb + - effect_kroolspecialnfireb + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 50 + no_stop_intp: false +krool_special_air_n_fire_b: + game_script: game_kroolspecialairnfireb + flags: + turn: true + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: kroold00specialairnfireb.nuanmb + unk: 0 + scripts: + - expression_kroolspecialairnfireb + - sound_kroolspecialairnfireb + - effect_kroolspecialairnfireb + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 50 + no_stop_intp: false link_special_n_start: flags: move: false @@ -877,6 +1060,66 @@ mewtwo_special_n_cancel: mewtwo_special_n_shoot: extra: cancel_frame: 28 +miifighter_special_n1_bowl: + game_script: game_miifighterspecialn1bowl + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: miifighterd00specialn1bowl.nuanmb + unk: 0 + scripts: + - expression_miifighterspecialn1bowl + - sound_miifighterspecialn1bowl + - effect_miifighterspecialn1bowl + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 80 + no_stop_intp: false +miifighter_special_air_n1_bowl: + game_script: game_miifighterspecialairn1bowl + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: miifighterd00specialairn1bowl.nuanmb + unk: 0 + scripts: + - expression_miifighterspecialairn1bowl + - sound_miifighterspecialairn1bowl + - effect_miifighterspecialairn1bowl + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 67 + no_stop_intp: false miigunner_special_air_n1_cancel: extra: cancel_frame: 9 @@ -963,10 +1206,10 @@ pacman_special_n_shoot: cancel_frame: 42 palutena_special_air_n: extra: - cancel_frame: 63 + cancel_frame: 64 palutena_special_n: extra: - cancel_frame: 63 + cancel_frame: 64 passive: extra: xlu_end: 21 @@ -1336,7 +1579,7 @@ special_air_hi_h: unk_800: false unk_1000: false unk_2000: false - blend_frames: 0 + blend_frames: 5 animations: - name: d02specialairhih.nuanmb scripts: @@ -1368,7 +1611,7 @@ special_hi_h: unk_800: false unk_1000: false unk_2000: false - blend_frames: 0 + blend_frames: 5 animations: - name: d02specialhih.nuanmb scripts: @@ -1382,7 +1625,7 @@ special_hi_h: freeze_during_hitstop: false special_lw2: extra: - cancel_frame: 28 + cancel_frame: 32 special_s: extra: cancel_frame: 60 @@ -1437,4 +1680,4 @@ zelda_special_n: extra: intangible_start_frame: 5 intangible_end_frame: 13 - cancel_frame: 64 + cancel_frame: 64 \ No newline at end of file diff --git a/romfs/source/fighter/kirby/param/hdr.xml b/romfs/source/fighter/kirby/param/hdr.xml index 8501f73e87..8f1236dd3a 100644 --- a/romfs/source/fighter/kirby/param/hdr.xml +++ b/romfs/source/fighter/kirby/param/hdr.xml @@ -4,6 +4,7 @@ 0.015 0.4 0.75 + 0.1 1 0.8 diff --git a/romfs/source/fighter/koopa/motion/body/motion_patch.yaml b/romfs/source/fighter/koopa/motion/body/motion_patch.yaml index f77090451e..da48709f5d 100644 --- a/romfs/source/fighter/koopa/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/koopa/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -125,7 +125,16 @@ attack_lw3_2: freeze_during_hitstop: false attack_dash: extra: - cancel_frame: 44 + cancel_frame: 56 +attack_s3_hi: + extra: + cancel_frame: 35 +attack_s3_s: + extra: + cancel_frame: 35 +attack_s3_lw: + extra: + cancel_frame: 35 attack_s4_s: extra: cancel_frame: 85 @@ -141,6 +150,9 @@ attack_air_n: attack_air_f: extra: cancel_frame: 38 +attack_air_b: + extra: + cancel_frame: 41 attack_air_hi: extra: cancel_frame: 44 @@ -202,11 +214,15 @@ special_air_n_max: cancel_frame: 65 no_stop_intp: false special_s_catch: + flags: + move: true extra: - cancel_frame: 50 + cancel_frame: 60 special_s_air_catch: + flags: + move: true extra: - cancel_frame: 50 + cancel_frame: 60 special_s_landing: extra: cancel_frame: 25 @@ -355,70 +371,12 @@ special_s_throwlw: intangible_end_frame: 0 cancel_frame: 40 freeze_during_hitstop: false -special_s_throw_lw_jump: - game_script: game_specialsjump - flags: - turn: false - loop: false - move: true - fix_trans: false - fix_rot: false - fix_scale: false - unk_40: false - unk_80: true - unk_100: false - unk_200: false - unk_400: false - unk_800: false - unk_1000: false - unk_2000: false - blend_frames: 0 - animations: - - name: d01specialsthrowlwjump.nuanmb - scripts: - - expression_specialsjump - - sound_specialsjump - - effect_specialsjump - extra: - intangible_start_frame: 0 - intangible_end_frame: 0 - cancel_frame: 0 - freeze_during_hitstop: false -special_s_throw_lw_fall: - game_script: game_specialsfall +special_air_s_throwlw: + game_script: game_specialairsthrowlw flags: - turn: false - loop: false - move: true - fix_trans: false - fix_rot: false - fix_scale: false - unk_40: false - unk_80: true - unk_100: false - unk_200: false - unk_400: false - unk_800: false - unk_1000: false - unk_2000: false - blend_frames: 0 - animations: - - name: d01specialsthrowlwfall.nuanmb - scripts: - - expression_specialsfall - - sound_specialsfall - - effect_specialsfall - extra: - intangible_start_frame: 0 - intangible_end_frame: 0 - cancel_frame: 0 - freeze_during_hitstop: false -special_s_throw_lw_landing: - game_script: game_specialsthrowlwlanding - flags: - turn: false + turn: true loop: false - move: true + move: false fix_trans: false fix_rot: false fix_scale: false @@ -432,15 +390,15 @@ special_s_throw_lw_landing: unk_2000: false blend_frames: 0 animations: - - name: d01specialsthrowlwlanding.nuanmb + - name: d01specialairsthrowlw.nuanmb scripts: - - expression_specialsthrowlwlanding - - sound_specialsthrowlwlanding - - effect_specialsthrowlwlanding + - expression_specialairsthrowlw + - sound_specialairsthrowlw + - effect_specialairsthrowlw extra: intangible_start_frame: 0 intangible_end_frame: 0 - cancel_frame: 49 + cancel_frame: 40 freeze_during_hitstop: false catch: extra: diff --git a/romfs/source/fighter/koopa/param/vl.prcxml b/romfs/source/fighter/koopa/param/vl.prcxml index 9001f8f3db..6972a08374 100644 --- a/romfs/source/fighter/koopa/param/vl.prcxml +++ b/romfs/source/fighter/koopa/param/vl.prcxml @@ -59,7 +59,7 @@ 0.07 1.0 1.8 - 0.95 + 0.925 1 50 5 diff --git a/romfs/source/fighter/koopajr/motion/body/motion_patch.yaml b/romfs/source/fighter/koopajr/motion/body/motion_patch.yaml index aa50302589..b82b5bcbbf 100644 --- a/romfs/source/fighter/koopajr/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/koopajr/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -117,7 +117,7 @@ attack_13: freeze_during_hitstop: true attack_lw3: extra: - cancel_frame: 40 + cancel_frame: 42 special_lw: extra: cancel_frame: 40 @@ -144,7 +144,7 @@ attack_air_b: cancel_frame: 35 attack_air_f: extra: - cancel_frame: 41 + cancel_frame: 44 attack_air_n: extra: cancel_frame: 36 @@ -156,10 +156,10 @@ attack_s3_hi: cancel_frame: 29 attack_air_lw: extra: - cancel_frame: 60 + cancel_frame: 62 attack_air_hi: extra: - cancel_frame: 29 + cancel_frame: 31 special_air_lw: extra: cancel_frame: 45 @@ -172,6 +172,12 @@ special_n_shoot: special_air_n_shoot: extra: cancel_frame: 32 +special_s_spin: + extra: + cancel_frame: 40 +special_air_s_spin: + extra: + cancel_frame: 40 special_s_wall_clash: extra: cancel_frame: 1 @@ -187,6 +193,9 @@ catch_turn: catch_attack: extra: cancel_frame: 0 +throw_b: + extra: + cancel_frame: 58 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/krool/motion/body/motion_patch.yaml b/romfs/source/fighter/krool/motion/body/motion_patch.yaml index bcbc96a722..feed20e751 100644 --- a/romfs/source/fighter/krool/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/krool/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -150,7 +150,7 @@ special_n_fire_hi: unk_2000: false blend_frames: 0 animations: - - name: d00specialnspitf.nuanmb + - name: d00specialnspithi.nuanmb unk: 0 scripts: - expression_specialnfirehi @@ -180,7 +180,7 @@ special_air_n_fire_hi: unk_2000: false blend_frames: 0 animations: - - name: d00specialairnspitf.nuanmb + - name: d00specialairnspithi.nuanmb unk: 0 scripts: - expression_specialairnfirehi @@ -189,7 +189,67 @@ special_air_n_fire_hi: extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 70 + cancel_frame: 45 + no_stop_intp: false +special_n_fire_b: + game_script: game_specialnfireb + flags: + turn: true + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialnspitb.nuanmb + unk: 0 + scripts: + - expression_specialnfireb + - sound_specialnfireb + - effect_specialnfireb + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 50 + no_stop_intp: false +special_air_n_fire_b: + game_script: game_specialairnfireb + flags: + turn: true + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialairnspitb.nuanmb + unk: 0 + scripts: + - expression_specialairnfireb + - sound_specialairnfireb + - effect_specialairnfireb + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 50 no_stop_intp: false special_s_throw: extra: @@ -272,7 +332,7 @@ throw_hi: cancel_frame: 75 throw_lw: extra: - cancel_frame: 54 + cancel_frame: 56 item_light_throw_f: flags: move: false diff --git a/romfs/source/fighter/krool/param/hdr.xml b/romfs/source/fighter/krool/param/hdr.xml index e573d722d4..3cef841d5e 100644 --- a/romfs/source/fighter/krool/param/hdr.xml +++ b/romfs/source/fighter/krool/param/hdr.xml @@ -19,7 +19,7 @@ 0.5 - 12 + 8 8 0.04 1.3 @@ -28,7 +28,7 @@ 1.0 2.0 0.0 - 0.02 + 0.03 2.5 0.03 0.042 diff --git a/romfs/source/fighter/krool/param/vl.prcxml b/romfs/source/fighter/krool/param/vl.prcxml index dd1b8d35f7..2de5e62e08 100644 --- a/romfs/source/fighter/krool/param/vl.prcxml +++ b/romfs/source/fighter/krool/param/vl.prcxml @@ -2,14 +2,17 @@ + 16 32 -16 + 10 - 12 + 18 28 - -16 + -14 + 10 @@ -35,7 +38,7 @@ 0.85 1.0 - 10 + 30 dummy dummy @@ -44,6 +47,7 @@ 150 + 0.075 dummy dummy @@ -68,7 +72,7 @@ 1.0 1.0 25 - 0.75 + 1.0 0.118 2.3 26 diff --git a/romfs/source/fighter/link/motion/body/motion_patch.yaml b/romfs/source/fighter/link/motion/body/motion_patch.yaml index e1321b25f7..f4b2613cc4 100644 --- a/romfs/source/fighter/link/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/link/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -88,7 +88,7 @@ throw_lw: cancel_frame: 48 throw_hi: extra: - cancel_frame: 55 + cancel_frame: 53 attack_11: extra: cancel_frame: 21 @@ -100,7 +100,7 @@ attack_13: cancel_frame: 31 attack_lw3: extra: - cancel_frame: 32 + cancel_frame: 33 special_hi: extra: cancel_frame: 80 @@ -109,7 +109,7 @@ attack_s4_s2: cancel_frame: 49 attack_hi4: extra: - cancel_frame: 78 + cancel_frame: 72 attack_lw4: extra: cancel_frame: 53 @@ -127,13 +127,13 @@ attack_dash: cancel_frame: 42 attack_s3_s: extra: - cancel_frame: 38 + cancel_frame: 39 appeal_hi_r: extra: cancel_frame: 90 attack_air_n: extra: - cancel_frame: 38 + cancel_frame: 39 attack_air_b: extra: cancel_frame: 26 diff --git a/romfs/source/fighter/link/param/vl.prcxml b/romfs/source/fighter/link/param/vl.prcxml index 604ba0f74c..7561132122 100644 --- a/romfs/source/fighter/link/param/vl.prcxml +++ b/romfs/source/fighter/link/param/vl.prcxml @@ -53,6 +53,10 @@ dummy dummy + + 30 + 99 + 1.0 diff --git a/romfs/source/fighter/littlemac/motion/body/motion_patch.yaml b/romfs/source/fighter/littlemac/motion/body/motion_patch.yaml index c499522fd0..a8b4f7c121 100644 --- a/romfs/source/fighter/littlemac/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/littlemac/motion/body/motion_patch.yaml @@ -87,10 +87,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -174,7 +174,7 @@ special_n_dash_turn: extra: cancel_frame: 54 special_n_min: - game_script: game_specialn2 + game_script: game_specialn flags: turn: false loop: false @@ -194,16 +194,16 @@ special_n_min: animations: - name: d00specialn2.nuanmb scripts: - - expression_specialn2 - - sound_specialn2 - - effect_specialn2 + - expression_specialn + - sound_specialn + - effect_specialn extra: intangible_start_frame: 0 intangible_end_frame: 0 cancel_frame: 60 freeze_during_hitstop: false special_n_med: - game_script: game_specialn2 + game_script: game_specialn flags: turn: false loop: false @@ -223,16 +223,16 @@ special_n_med: animations: - name: d00specialn2.nuanmb scripts: - - expression_specialn2 - - sound_specialn2 - - effect_specialn2 + - expression_specialn + - sound_specialn + - effect_specialn extra: intangible_start_frame: 0 intangible_end_frame: 0 cancel_frame: 60 freeze_during_hitstop: false special_n_max: - game_script: game_specialn2 + game_script: game_specialn flags: turn: false loop: false @@ -252,16 +252,16 @@ special_n_max: animations: - name: d00specialn2.nuanmb scripts: - - expression_specialn2 - - sound_specialn2 - - effect_specialn2 + - expression_specialn + - sound_specialn + - effect_specialn extra: intangible_start_frame: 0 intangible_end_frame: 0 cancel_frame: 60 freeze_during_hitstop: false special_air_n_min: - game_script: game_specialairn2 + game_script: game_specialairn flags: turn: false loop: false @@ -281,16 +281,16 @@ special_air_n_min: animations: - name: d00specialairn2.nuanmb scripts: - - expression_specialairn2 - - sound_specialairn2 - - effect_specialairn2 + - expression_specialairn + - sound_specialairn + - effect_specialairn extra: intangible_start_frame: 0 intangible_end_frame: 0 cancel_frame: 60 freeze_during_hitstop: false special_air_n_med: - game_script: game_specialairn2 + game_script: game_specialairn flags: turn: false loop: false @@ -310,16 +310,16 @@ special_air_n_med: animations: - name: d00specialairn2.nuanmb scripts: - - expression_specialairn2 - - sound_specialairn2 - - effect_specialairn2 + - expression_specialairn + - sound_specialairn + - effect_specialairn extra: intangible_start_frame: 0 intangible_end_frame: 0 cancel_frame: 60 freeze_during_hitstop: false special_air_n_max: - game_script: game_specialairn2 + game_script: game_specialairn flags: turn: false loop: false @@ -339,9 +339,9 @@ special_air_n_max: animations: - name: d00specialairn2.nuanmb scripts: - - expression_specialairn2 - - sound_specialairn2 - - effect_specialairn2 + - expression_specialairn + - sound_specialairn + - effect_specialairn extra: intangible_start_frame: 0 intangible_end_frame: 0 diff --git a/romfs/source/fighter/littlemac/param/vl.prcxml b/romfs/source/fighter/littlemac/param/vl.prcxml index b53aa44b60..ec1ae7e019 100644 --- a/romfs/source/fighter/littlemac/param/vl.prcxml +++ b/romfs/source/fighter/littlemac/param/vl.prcxml @@ -25,7 +25,7 @@ 1.85 1.5 - 1.8 + 1.65 dummy dummy diff --git a/romfs/source/fighter/lucario/motion/body/motion_patch.yaml b/romfs/source/fighter/lucario/motion/body/motion_patch.yaml index 4e6aab6318..68066a14eb 100644 --- a/romfs/source/fighter/lucario/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/lucario/motion/body/motion_patch.yaml @@ -83,10 +83,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/lucario/param/hdr.xml b/romfs/source/fighter/lucario/param/hdr.xml index 51ad5faed3..b6ed051d60 100644 --- a/romfs/source/fighter/lucario/param/hdr.xml +++ b/romfs/source/fighter/lucario/param/hdr.xml @@ -25,4 +25,10 @@ 5.0 5.0 + + 0.5 + + + 12 + \ No newline at end of file diff --git a/romfs/source/fighter/lucas/motion/body/motion_patch.yaml b/romfs/source/fighter/lucas/motion/body/motion_patch.yaml index 95f86d75a3..3da628e5d4 100644 --- a/romfs/source/fighter/lucas/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/lucas/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -124,6 +124,9 @@ attack_s3_hi: attack_air_hi: extra: cancel_frame: 28 +attack_air_lw: + extra: + cancel_frame: 0 special_n_end: extra: cancel_frame: 20 @@ -178,6 +181,9 @@ air_catch_landing: throw_f: extra: cancel_frame: 43 +throw_lw: + extra: + cancel_frame: 60 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/lucina/motion/body/motion_patch.yaml b/romfs/source/fighter/lucina/motion/body/motion_patch.yaml index 0d35b0ca72..973e4bbe1a 100644 --- a/romfs/source/fighter/lucina/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/lucina/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -79,7 +79,7 @@ guard_off: cancel_frame: 12 throw_f: extra: - cancel_frame: 24 + cancel_frame: 26 throw_lw: extra: cancel_frame: 40 diff --git a/romfs/source/fighter/lucina/param/vl.prcxml b/romfs/source/fighter/lucina/param/vl.prcxml index 84d5ca7ac5..5745c2f79a 100644 --- a/romfs/source/fighter/lucina/param/vl.prcxml +++ b/romfs/source/fighter/lucina/param/vl.prcxml @@ -37,7 +37,7 @@ 0.9 30 - 29 + 34 0.9 dummy diff --git a/romfs/source/fighter/luigi/motion/body/motion_patch.yaml b/romfs/source/fighter/luigi/motion/body/motion_patch.yaml index fcc50418ca..053ce35ab5 100644 --- a/romfs/source/fighter/luigi/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/luigi/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/luigi/param/hdr.xml b/romfs/source/fighter/luigi/param/hdr.xml index 490a30b5ba..22cb73e5a4 100644 --- a/romfs/source/fighter/luigi/param/hdr.xml +++ b/romfs/source/fighter/luigi/param/hdr.xml @@ -1,8 +1,7 @@ - 2 - 13 + 7 0.95 0.8 diff --git a/romfs/source/fighter/mario/motion/body/motion_patch.yaml b/romfs/source/fighter/mario/motion/body/motion_patch.yaml index 0999c2dc2a..978bf12179 100644 --- a/romfs/source/fighter/mario/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/mario/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -85,7 +85,7 @@ attack_12: cancel_frame: 18 attack_13: extra: - cancel_frame: 25 + cancel_frame: 24 attack_s3_s: flags: move: false @@ -219,7 +219,7 @@ special_s: turn: false loop: false move: false - blend_frames: 5 + blend_frames: 0 animations: - name: d01specials.nuanmb scripts: @@ -234,7 +234,7 @@ special_air_s: turn: false loop: false move: false - blend_frames: 5 + blend_frames: 0 animations: - name: d01specialairs.nuanmb scripts: diff --git a/romfs/source/fighter/mario/param/hdr.xml b/romfs/source/fighter/mario/param/hdr.xml index 34dd0c683a..862f0f6e34 100644 --- a/romfs/source/fighter/mario/param/hdr.xml +++ b/romfs/source/fighter/mario/param/hdr.xml @@ -9,8 +9,8 @@ - 1.0 - 1.0 + 0.8 + 0.8 0.01 0.065 1.125 @@ -31,9 +31,9 @@ -9.0 0.6 0.4 - 6 - 12 - 8 + 8 + 10 + 6 4.0 diff --git a/romfs/source/fighter/mariod/motion/body/motion_patch.yaml b/romfs/source/fighter/mariod/motion/body/motion_patch.yaml index f6563a80c8..fc4ea9ca95 100644 --- a/romfs/source/fighter/mariod/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/mariod/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -85,7 +85,7 @@ attack_12: cancel_frame: 18 attack_13: extra: - cancel_frame: 25 + cancel_frame: 24 attack_s3_s: flags: move: false @@ -126,13 +126,9 @@ attack_air_lw: extra: cancel_frame: 43 special_n: - animations: - - name: d00specialntoss.nuanmb extra: cancel_frame: 47 special_air_n: - animations: - - name: d00specialairntoss.nuanmb extra: cancel_frame: 47 special_n_chill: diff --git a/romfs/source/fighter/marth/motion/body/motion_patch.yaml b/romfs/source/fighter/marth/motion/body/motion_patch.yaml index dcfca08791..7c0123fa7a 100644 --- a/romfs/source/fighter/marth/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/marth/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -121,7 +121,7 @@ attack_dash: cancel_frame: 40 attack_s4_s: extra: - cancel_frame: 48 + cancel_frame: 49 attack_s3_s: attack_air_b: extra: diff --git a/romfs/source/fighter/master/motion/body/motion_patch.yaml b/romfs/source/fighter/master/motion/body/motion_patch.yaml index f30610218b..bdd4edc045 100644 --- a/romfs/source/fighter/master/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/master/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/master/param/vl.prcxml b/romfs/source/fighter/master/param/vl.prcxml index e2aae59c5d..e82aa04e04 100644 --- a/romfs/source/fighter/master/param/vl.prcxml +++ b/romfs/source/fighter/master/param/vl.prcxml @@ -17,7 +17,7 @@ 30 70 - -5 + -9.6 20 diff --git a/romfs/source/fighter/metaknight/motion/body/motion_patch.yaml b/romfs/source/fighter/metaknight/motion/body/motion_patch.yaml index 242712a703..3312e6964d 100644 --- a/romfs/source/fighter/metaknight/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/metaknight/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -93,7 +93,7 @@ fall_aerial: blend_frames: 3 attack_dash: extra: - cancel_frame: 42 + cancel_frame: 40 attack_s4_s: extra: cancel_frame: 46 diff --git a/romfs/source/fighter/metaknight/param/vl.prcxml b/romfs/source/fighter/metaknight/param/vl.prcxml index a78d77d69c..8e5506a01b 100644 --- a/romfs/source/fighter/metaknight/param/vl.prcxml +++ b/romfs/source/fighter/metaknight/param/vl.prcxml @@ -22,6 +22,7 @@ 1.87 1.70 + 21 diff --git a/romfs/source/fighter/mewtwo/motion/body/motion_patch.yaml b/romfs/source/fighter/mewtwo/motion/body/motion_patch.yaml index b4aa3ad7bb..93490e800f 100644 --- a/romfs/source/fighter/mewtwo/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/mewtwo/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -85,7 +85,7 @@ attack_dash: cancel_frame: 42 attack_11: extra: - cancel_frame: 18 + cancel_frame: 19 attack_12: game_script: game_attack12 flags: @@ -105,7 +105,7 @@ attack_12: unk_2000: false blend_frames: 0 animations: - - name: c00attackend.nuanmb + - name: c00attack12.nuanmb scripts: - expression_attack12 - sound_attack12 @@ -113,7 +113,7 @@ attack_12: extra: intangible_start_frame: 0 intangible_end_frame: 0 - cancel_frame: 33 + cancel_frame: 31 freeze_during_hitstop: true attack_lw3: extra: @@ -130,7 +130,7 @@ special_lw: intangible_end_frame: 0 attack_hi3: extra: - cancel_frame: 31 + cancel_frame: 33 fall_aerial: blend_frames: 3 attack_s4_s: @@ -168,7 +168,35 @@ fall_aerial_b: blend_frames: 5 attack_air_hi: extra: - cancel_frame: 33 + cancel_frame: 34 +special_s: + extra: + cancel_frame: 45 +special_air_s: + extra: + cancel_frame: 45 +special_s_throw: + game_script: game_specialsthrow + scripts: + - expression_specialsthrow + - sound_specialsthrow + - effect_specialsthrow + animations: + - name: d01specialsthrow.nuanmb + extra: + cancel_frame: 59 + freeze_during_hitstop: false +special_air_s_throw: + game_script: game_specialsthrow + scripts: + - expression_specialsthrow + - sound_specialsthrow + - effect_specialsthrow + animations: + - name: d01specialairsthrow.nuanmb + extra: + cancel_frame: 59 + freeze_during_hitstop: false special_air_lw: extra: intangible_start_frame: 0 @@ -189,6 +217,35 @@ item_light_throw_f: special_air_n_cancel: extra: cancel_frame: 9 +special_air_hi_cancel: + game_script: game_specialairhi + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d02specialairhicancel.nuanmb + scripts: + - expression_specialairhi + - sound_specialairhi + - effect_specialairhi + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 10 + freeze_during_hitstop: false catch: flags: move: false diff --git a/romfs/source/fighter/mewtwo/param/hdr.xml b/romfs/source/fighter/mewtwo/param/hdr.xml index a7c6bb8c3b..3eddc2b82c 100644 --- a/romfs/source/fighter/mewtwo/param/hdr.xml +++ b/romfs/source/fighter/mewtwo/param/hdr.xml @@ -1,5 +1,14 @@ + + 0.27 + 43.0 + 25.0 + + + 0.9 + 14.0 + 60 1.2 diff --git a/romfs/source/fighter/mewtwo/param/vl.prcxml b/romfs/source/fighter/mewtwo/param/vl.prcxml index 9aff5f92c2..a90fc99073 100644 --- a/romfs/source/fighter/mewtwo/param/vl.prcxml +++ b/romfs/source/fighter/mewtwo/param/vl.prcxml @@ -13,9 +13,7 @@ dummy dummy dummy - - hit_status_off - + dummy hit_status_off @@ -33,7 +31,19 @@ 1 - 0.2 + 0.3 + + dummy + dummy + dummy + + + + 9 + 14 + 9 + 14 + 9.15 dummy dummy @@ -41,9 +51,10 @@ + 0.082 0 - 1.0 - 5.0 + 6.0 + 0.0 1.0 8 30 @@ -52,9 +63,19 @@ dummy dummy + + + 1.25 + 2.4 + + dummy + dummy + dummy + - 5 + 7 + 2.55 dummy dummy diff --git a/romfs/source/fighter/miifighter/motion/body/motion_patch.yaml b/romfs/source/fighter/miifighter/motion/body/motion_patch.yaml index d781d2ee8c..e4d3450e0e 100644 --- a/romfs/source/fighter/miifighter/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/miifighter/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -139,12 +139,319 @@ attack_air_hi: attack_air_lw: extra: cancel_frame: 46 +special_n1_bowl: + game_script: game_specialn1bowl + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialn1bowl.nuanmb + unk: 0 + scripts: + - expression_specialn1bowl + - sound_specialn1bowl + - effect_specialn1bowl + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 80 + no_stop_intp: false +special_air_n1_bowl: + game_script: game_specialairn1bowl + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialairn1bowl.nuanmb + unk: 0 + scripts: + - expression_specialairn1bowl + - sound_specialairn1bowl + - effect_specialairn1bowl + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 67 + no_stop_intp: false +special_n2_start: + game_script: game_specialn2start + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialn2start.nuanmb + unk: 0 + scripts: + - expression_specialn2start + - sound_specialn2start + - effect_specialn2start + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_air_n2_start: + game_script: game_specialairn2start + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialairn2start.nuanmb + unk: 0 + scripts: + - expression_specialairn2start + - sound_specialairn2start + - effect_specialairn2start + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_n2_hold: + game_script: game_specialn2hold + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialn2hold.nuanmb + unk: 0 + scripts: + - expression_specialn2hold + - sound_specialn2hold + - effect_specialn2hold + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_air_n2_hold: + game_script: game_specialairn2hold + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialairn2hold.nuanmb + unk: 0 + scripts: + - expression_specialairn2hold + - sound_specialairn2hold + - effect_specialairn2hold + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_n2_end: + game_script: game_specialn2end + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialn2end.nuanmb + unk: 0 + scripts: + - expression_specialn2end + - sound_specialn2end + - effect_specialn2end + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_air_n2_end: + game_script: game_specialairn2end + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialairn2end.nuanmb + unk: 0 + scripts: + - expression_specialairn2end + - sound_specialairn2end + - effect_specialairn2end + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_n2_attack: + game_script: game_specialn2attack + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialn2attack.nuanmb + unk: 0 + scripts: + - expression_specialn2attack + - sound_specialn2attack + - effect_specialn2attack + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_n2_landing: + game_script: game_specialn2landing + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialn2landing.nuanmb + unk: 0 + scripts: + - expression_specialn2landing + - sound_specialn2landing + - effect_specialn2landing + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 13 + no_stop_intp: false +# moved to special_n3 +special_air_lw3_throw: + extra: + cancel_frame: 37 +special_s1_end: + extra: + cancel_frame: 57 special_air_s1_end: extra: cancel_frame: 60 special_lw1: extra: - cancel_frame: 42 + cancel_frame: 70 special_lw1_landing: extra: cancel_frame: 33 @@ -170,9 +477,180 @@ special_air_lw3: extra: xlu_start: 0 xlu_end: 0 -special_air_lw3_throw: +special_lw3_1g: + game_script: game_speciallw31g + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw31g.nuanmb + scripts: + - expression_speciallw31g + - sound_speciallw31g + - effect_speciallw31g extra: - cancel_frame: 37 + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 46 + freeze_during_hitstop: true +special_lw3_1a: + game_script: game_speciallw31a + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw31a.nuanmb + scripts: + - expression_speciallw31a + - sound_speciallw31a + - effect_speciallw31a + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 31 + freeze_during_hitstop: true +special_lw3_2g: + game_script: game_speciallw32g + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw31g.nuanmb + scripts: + - expression_speciallw32g + - sound_speciallw32g + - effect_speciallw32g + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 46 + freeze_during_hitstop: true +special_lw3_2a: + game_script: game_speciallw32a + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw31a.nuanmb + scripts: + - expression_speciallw32a + - sound_speciallw32a + - effect_speciallw32a + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 31 + freeze_during_hitstop: true +special_lw3_3g: + game_script: game_speciallw33g + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialn3.nuanmb + scripts: + - expression_speciallw33g + - sound_speciallw33g + - effect_speciallw33g + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 0 + freeze_during_hitstop: true +special_lw3_3a: + game_script: game_speciallw33a + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw33a.nuanmb + scripts: + - expression_speciallw33a + - sound_speciallw33a + - effect_speciallw33a + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 40 + freeze_during_hitstop: true catch_dash: extra: cancel_frame: 41 @@ -184,7 +662,7 @@ throw_b: cancel_frame: 30 throw_lw: extra: - cancel_frame: 40 + cancel_frame: 43 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/miifighter/param/hdr.xml b/romfs/source/fighter/miifighter/param/hdr.xml index bced9e4fa7..b2d8c4ff1e 100644 --- a/romfs/source/fighter/miifighter/param/hdr.xml +++ b/romfs/source/fighter/miifighter/param/hdr.xml @@ -14,14 +14,40 @@ 8.9 + + 2.75 + 2.25 + 30.0 + + + 140 + 0.7 + 0.85 + + + 1.8 + 1.2 + 0.4 + 1.2 + 0.5 + 0.03 + 0.4 + - 0.7 + 0.8 0.5 - 6.0 - 7.0 - 25.0 + 35.0 + 25.0 80.0 + + 14.0 + 0.8 + -2.0 + 0.0 + -0.3 + 1.5 + \ No newline at end of file diff --git a/romfs/source/fighter/miifighter/param/vl.prcxml b/romfs/source/fighter/miifighter/param/vl.prcxml index 5636e4e164..58aeae2c8e 100644 --- a/romfs/source/fighter/miifighter/param/vl.prcxml +++ b/romfs/source/fighter/miifighter/param/vl.prcxml @@ -35,13 +35,13 @@ - 1.2 - 1.2 - 0.5 - 26 + 1.0 + 1.0 + 0.6 + 25 - 2.22 + 2.02 0.4 diff --git a/romfs/source/fighter/miigunner/motion/body/motion_patch.yaml b/romfs/source/fighter/miigunner/motion/body/motion_patch.yaml index af1aa77a1a..80c5114311 100644 --- a/romfs/source/fighter/miigunner/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/miigunner/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -97,7 +97,7 @@ attack_air_n: cancel_frame: 39 attack_air_f: extra: - cancel_frame: 41 + cancel_frame: 39 attack_air_f_boost: game_script: game_attackairfboost flags: @@ -313,10 +313,10 @@ special_air_n1_neon: no_stop_intp: false special_s2_end: extra: - cancel_frame: 32 + cancel_frame: 25 special_air_s2_end: extra: - cancel_frame: 32 + cancel_frame: 25 special_hi2_squat: extra: xlu_start: 0 @@ -329,10 +329,10 @@ special_air_lw2: cancel_frame: 47 special_lw3_end: extra: - cancel_frame: 18 + cancel_frame: 17 special_air_lw3_end: extra: - cancel_frame: 18 + cancel_frame: 17 catch_dash: extra: cancel_frame: 41 @@ -342,6 +342,9 @@ catch_attack: throw_b: extra: cancel_frame: 52 +throw_hi: + extra: + cancel_frame: 53 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/miigunner/motion/stealthbomb/motion_patch.yaml b/romfs/source/fighter/miigunner/motion/stealthbomb/motion_patch.yaml new file mode 100644 index 0000000000..9d809710bc --- /dev/null +++ b/romfs/source/fighter/miigunner/motion/stealthbomb/motion_patch.yaml @@ -0,0 +1,23 @@ +turn: + game_script: game_turn + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: [] + scripts: + - sound_turn + - effect_turn + extra: ~ \ No newline at end of file diff --git a/romfs/source/fighter/miigunner/param/hdr.xml b/romfs/source/fighter/miigunner/param/hdr.xml index 0fe9cb5481..bab87ea0ae 100644 --- a/romfs/source/fighter/miigunner/param/hdr.xml +++ b/romfs/source/fighter/miigunner/param/hdr.xml @@ -13,7 +13,15 @@ 8.0 13.0 14.0 - 25.0 + 20.0 18.0 + + 3.5 + 2.7 + 29.0 + + + 140 + \ No newline at end of file diff --git a/romfs/source/fighter/miigunner/param/vl.prcxml b/romfs/source/fighter/miigunner/param/vl.prcxml index 56bdb544d0..eec0ca4419 100644 --- a/romfs/source/fighter/miigunner/param/vl.prcxml +++ b/romfs/source/fighter/miigunner/param/vl.prcxml @@ -10,6 +10,12 @@ 15 + + + 2.75 + 0.85 + + 64.0 @@ -22,7 +28,7 @@ 0.08 20 - 6 + 12 dummy dummy @@ -30,18 +36,21 @@ 25 + 0.01 + 0.5 - 4.0 + 1.75 1.5 - 0.05 - 6.0 + 1.5 + 1.0 + 2.75 0.5 - 3 - 90 - 150 + 5.0 + 85 + 60 @@ -63,7 +72,8 @@ 0.1 - 22 + 28 + 1.0 6 @@ -71,7 +81,13 @@ 1.0 - 1.6 + 140 + 2.0 + 20 + 2 + 15 + 0.0 + 0.0 dummy @@ -82,7 +98,7 @@ 20 0.85 0.8 - 0.05 + 0.048 bust 0.0 11.5 @@ -92,6 +108,7 @@ 150 + 2 1.0 45 4 diff --git a/romfs/source/fighter/miiswordsman/motion/body/motion_patch.yaml b/romfs/source/fighter/miiswordsman/motion/body/motion_patch.yaml index fbf3bf3a76..3575e18065 100644 --- a/romfs/source/fighter/miiswordsman/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/miiswordsman/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -77,96 +77,201 @@ guard_off: blend_frames: 4 extra: cancel_frame: 12 -throw_hi: - extra: - cancel_frame: 46 attack_12: extra: cancel_frame: 22 attack_13: extra: cancel_frame: 36 -attack_11: -attack_hi4: - extra: - cancel_frame: 55 -special_n2: - flags: - move: true - extra: - cancel_frame: 47 -special_n3_end: - extra: - cancel_frame: 80 -special_n3_end_turn: - extra: - cancel_frame: 80 -special_n3_end_max: - extra: - cancel_frame: 80 -special_n3_end_max_turn: - extra: - cancel_frame: 80 -special_air_n3_end: +attack_hi3: extra: - cancel_frame: 80 -special_air_n3_end_turn: + cancel_frame: 31 +attack_lw3: extra: - cancel_frame: 80 -special_air_n3_end_max: + cancel_frame: 22 +attack_s4_s: extra: - cancel_frame: 80 -special_air_n3_end_max_turn: + cancel_frame: 54 +attack_hi4: extra: - cancel_frame: 80 + cancel_frame: 55 attack_lw4: extra: cancel_frame: 49 -attack_hi3: - extra: - cancel_frame: 31 -attack_s4_s: +attack_air_n: extra: - cancel_frame: 54 + cancel_frame: 43 attack_air_f: extra: cancel_frame: 41 -attack_air_n: +attack_air_hi: extra: cancel_frame: 43 -special_s3_1: - extra: - cancel_frame: 41 attack_air_lw: extra: cancel_frame: 52 -attack_air_hi: +special_n2: + flags: + move: true extra: - cancel_frame: 43 + cancel_frame: 47 special_air_n2: flags: move: true extra: cancel_frame: 47 -attack_s4_hold: -special_s3_1_hi: +special_s2_attack: + extra: + cancel_frame: 30 +special_air_s2_attack: + extra: + cancel_frame: 40 +# Now maps to special_lw3 +special_n3_end: + extra: + cancel_frame: 40 +special_air_n3_end: + extra: + cancel_frame: 40 +special_lw3_end2: + game_script: game_speciallw3end2 + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw3end2.nuanmb + scripts: + - expression_speciallw3end2 + - sound_speciallw3end2 + - effect_speciallw3end2 + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 56 + freeze_during_hitstop: true +special_air_lw3_end2: + game_script: game_specialairlw3end2 + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03specialairlw3end2.nuanmb + scripts: + - expression_specialairlw3end2 + - sound_specialairlw3end2 + - effect_specialairlw3end2 + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 56 + freeze_during_hitstop: true +special_n3_end_max: + extra: + cancel_frame: 40 +special_air_n3_end_max: + extra: + cancel_frame: 40 +special_lw3_end2_max: + game_script: game_speciallw3end2max + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw3end2.nuanmb + scripts: + - expression_speciallw3end2max + - sound_speciallw3end2max + - effect_speciallw3end2max + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 56 + freeze_during_hitstop: true +special_air_lw3_end2_max: + game_script: game_specialairlw3end2max + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03specialairlw3end2.nuanmb + scripts: + - expression_specialairlw3end2max + - sound_specialairlw3end2max + - effect_specialairlw3end2max + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 56 + freeze_during_hitstop: true +# Now maps to special_n3 +special_s3_1: extra: cancel_frame: 41 -special_s3_1_lw: +special_air_s3_1: extra: cancel_frame: 41 -special_lw1: +special_s3_1_hi: extra: - xlu_start: 0 - xlu_end: 0 -special_air_lw1: + cancel_frame: 41 +special_air_s3_1_hi: extra: - xlu_start: 0 - xlu_end: 0 -special_lw1_hit: + cancel_frame: 41 +special_s3_1_lw: extra: - cancel_frame: 47 -special_air_s3_1: + cancel_frame: 41 +special_air_s3_1_lw: extra: cancel_frame: 41 special_hi1_start: @@ -177,9 +282,137 @@ special_air_hi1_start: extra: xlu_start: 0 xlu_end: 0 -special_air_s3_1_hi: +special_lw1: + flags: + move: true extra: - cancel_frame: 41 + xlu_start: 0 + xlu_end: 0 + cancel_frame: 30 +special_air_lw1: + flags: + move: true + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 30 +special_lw1_flourish: + game_script: game_speciallw1flourish + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw1flourish.nuanmb + scripts: + - expression_speciallw1flourish + - sound_speciallw1flourish + - effect_speciallw1flourish + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 34 + freeze_during_hitstop: true +special_air_lw1_flourish: + game_script: game_specialairlw1flourish + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03specialairlw1flourish.nuanmb + scripts: + - expression_specialairlw1flourish + - sound_specialairlw1flourish + - effect_specialairlw1flourish + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 34 + freeze_during_hitstop: true +special_lw1_mordschlag: + game_script: game_speciallw1mordschlag + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03speciallw1mordschlag.nuanmb + scripts: + - expression_speciallw1mordschlag + - sound_speciallw1mordschlag + - effect_speciallw1mordschlag + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 54 + freeze_during_hitstop: true +special_air_lw1_mordschlag: + game_script: game_specialairlw1mordschlag + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03specialairlw1mordschlag.nuanmb + scripts: + - expression_specialairlw1mordschlag + - sound_specialairlw1mordschlag + - effect_specialairlw1mordschlag + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 54 + freeze_during_hitstop: true +# Now maps to special_s3 special_air_lw3_end_air: blend_frames: 5 catch: @@ -188,6 +421,9 @@ catch: catch_attack: extra: cancel_frame: 0 +throw_hi: + extra: + cancel_frame: 46 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/miiswordsman/motion/tornadoshot/motion_patch.yaml b/romfs/source/fighter/miiswordsman/motion/tornadoshot/motion_patch.yaml new file mode 100644 index 0000000000..7694148a95 --- /dev/null +++ b/romfs/source/fighter/miiswordsman/motion/tornadoshot/motion_patch.yaml @@ -0,0 +1,23 @@ +shock_spell: + game_script: game_shockspell + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: [] + scripts: + - sound_shockspell + - effect_shockspell + extra: ~ \ No newline at end of file diff --git a/romfs/source/fighter/miiswordsman/param/hdr.xml b/romfs/source/fighter/miiswordsman/param/hdr.xml index be40e25952..8f7a7337c8 100644 --- a/romfs/source/fighter/miiswordsman/param/hdr.xml +++ b/romfs/source/fighter/miiswordsman/param/hdr.xml @@ -8,6 +8,17 @@ 8.9 + + 0.35 + 0.25 + 0.85 + 0.75 + 1.0 + 12.0 + + + 1.5 + 0.5 diff --git a/romfs/source/fighter/miiswordsman/param/vl.prcxml b/romfs/source/fighter/miiswordsman/param/vl.prcxml index 4905d4bba6..4cfa86d991 100644 --- a/romfs/source/fighter/miiswordsman/param/vl.prcxml +++ b/romfs/source/fighter/miiswordsman/param/vl.prcxml @@ -11,30 +11,50 @@ 2.0 9.0 2.0 + 0.8 + 0.02 + 50 + 1.8 + 1.0 + + + 0.8 + 0.02 + 50 + 1.8 + 1.0 - dummy - 2.0 + 0.8 + 0.02 + 50 + 1.8 + 1.0 dummy 1.5 + 0.1 + 30 - 18 - 3.15 + 9 + 3.5 0.083 0.125 0.3 - 2.6 + 3.0 0.047 100000 100000 0 + 0.1 + 30 + 0.1 30 dummy @@ -69,7 +89,8 @@ - 0.7 + 1.0 + 0.65 2.4 @@ -90,10 +111,31 @@ 2 0.1 1 + 0.66 + 4 + 1.0 + 1.0 + 0.1 + 0.154 + 30 + + + 0.66 + 4 + 1.0 + 1.0 + 0.1 + 0.154 + 30 - dummy + 0.66 + 4 + 1.0 + 1.0 + 0.1 0.154 + 30 dummy diff --git a/romfs/source/fighter/murabito/motion/body/motion_patch.yaml b/romfs/source/fighter/murabito/motion/body/motion_patch.yaml index 586fae0339..beb2068dd3 100644 --- a/romfs/source/fighter/murabito/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/murabito/motion/body/motion_patch.yaml @@ -46,10 +46,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -107,6 +107,7 @@ guard_off: extra: cancel_frame: 12 throw_b: + blend_frames: 6 extra: cancel_frame: 30 throw_f: diff --git a/romfs/source/fighter/murabito/param/hdr.xml b/romfs/source/fighter/murabito/param/hdr.xml new file mode 100644 index 0000000000..f183756ec7 --- /dev/null +++ b/romfs/source/fighter/murabito/param/hdr.xml @@ -0,0 +1,6 @@ + + + + 14 + + \ No newline at end of file diff --git a/romfs/source/fighter/nana/motion/body/motion_patch.yaml b/romfs/source/fighter/nana/motion/body/motion_patch.yaml index 4ddfc64488..8c7ace4d61 100644 --- a/romfs/source/fighter/nana/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/nana/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/nana/param/vl.prcxml b/romfs/source/fighter/nana/param/vl.prcxml index f94edf53df..a541ac91f4 100644 --- a/romfs/source/fighter/nana/param/vl.prcxml +++ b/romfs/source/fighter/nana/param/vl.prcxml @@ -10,8 +10,10 @@ 1 1 - 40 - 40 + 45 + 0.05 + 5 + 0.0025 100 100 100 @@ -22,6 +24,7 @@ + 45 0.05 0.8 1.2 @@ -34,8 +37,8 @@ + 60 25 - 50 dummy dummy diff --git a/romfs/source/fighter/ness/motion/body/motion_patch.yaml b/romfs/source/fighter/ness/motion/body/motion_patch.yaml index 1409a58d2c..cdd47452e7 100644 --- a/romfs/source/fighter/ness/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/ness/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -163,6 +163,9 @@ catch_turn: catch_attack: extra: cancel_frame: 0 +throw_hi: + extra: + cancel_frame: 57 throw_lw: extra: cancel_frame: 52 diff --git a/romfs/source/fighter/ness/param/hdr.xml b/romfs/source/fighter/ness/param/hdr.xml index 4b5ebc46f1..44dd329736 100644 --- a/romfs/source/fighter/ness/param/hdr.xml +++ b/romfs/source/fighter/ness/param/hdr.xml @@ -8,6 +8,9 @@ 8 + + 0.81 + 1 0.8 diff --git a/romfs/source/fighter/packun/motion/body/motion_patch.yaml b/romfs/source/fighter/packun/motion/body/motion_patch.yaml index cbd1cbdbae..d4c6c7f4cf 100644 --- a/romfs/source/fighter/packun/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/packun/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -83,9 +83,18 @@ passive_stand_f: passive_stand_b: extra: xlu_end: 24 +throw_b: + extra: + cancel_frame: 33 +throw_f: + extra: + cancel_frame: 55 +throw_hi: + extra: + cancel_frame: 42 throw_lw: extra: - cancel_frame: 45 + cancel_frame: 55 attack_12: extra: cancel_frame: 17 @@ -96,12 +105,14 @@ attack_lw3: extra: cancel_frame: 29 attack_hi4: + extra: + cancel_frame: 50 special_lw_end: extra: cancel_frame: 19 special_lw_fall_end: extra: - cancel_frame: 24 + cancel_frame: 19 special_air_lw_end: extra: cancel_frame: 19 @@ -116,7 +127,7 @@ appeal_s_r: cancel_frame: 17 attack_lw4: extra: - cancel_frame: 52 + cancel_frame: 48 appeal_lw_r: extra: cancel_frame: 17 @@ -125,39 +136,15 @@ appeal_hi_l: cancel_frame: 17 attack_s4_s: extra: - cancel_frame: 63 + cancel_frame: 58 attack_s3_s: flags: move: false -appeal_hi_r: - extra: - cancel_frame: 17 -appeal_lw_l: +attack_s3_s2: extra: - cancel_frame: 17 -attack_air_b: - extra: - cancel_frame: 41 -attack_air_f: - extra: - cancel_frame: 38 -attack_air_lw: - extra: - cancel_frame: 41 -attack_air_hi: - extra: - cancel_frame: 33 -attack_100_end: - extra: - cancel_frame: 38 -item_light_throw_f: - flags: - move: false -catch_attack: - extra: - cancel_frame: 0 -attack_s4_s_2: - game_script: game_attacks42 + cancel_frame: 28 +attack_s3_s_a: + game_script: game_attacks3a flags: turn: false loop: false @@ -175,23 +162,23 @@ attack_s4_s_2: unk_2000: false blend_frames: 0 animations: - - name: c03attacks4s2.nuanmb + - name: c01attacks3sa.nuanmb unk: 0 scripts: - - expression_attacks42 - - sound_attacks42 - - effect_attacks42 + - expression_attacks3a + - sound_attacks3a + - effect_attacks3a extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 70 + cancel_frame: 33 no_stop_intp: false -attack_s4_hold_2: - game_script: game_attacks4charge2 +attack_s3_s_s: + game_script: game_attacks3ss flags: turn: false loop: false - move: false + move: true fix_trans: false fix_rot: false fix_scale: false @@ -205,17 +192,44 @@ attack_s4_hold_2: unk_2000: false blend_frames: 0 animations: - - name: c03attacks4charge2.nuanmb + - name: c01attacks3ss.nuanmb unk: 0 scripts: - - expression_attacks4charge2 - - sound_attacks4charge2 - - effect_attacks4charge2 + - expression_attacks3ss + - sound_attacks3ss + - effect_attacks3ss extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 0 + cancel_frame: 30 no_stop_intp: false +appeal_hi_r: + extra: + cancel_frame: 17 +appeal_lw_l: + extra: + cancel_frame: 17 +attack_air_b: + extra: + cancel_frame: 41 +attack_air_f: + extra: + cancel_frame: 38 +attack_air_lw: + extra: + cancel_frame: 41 +attack_air_hi: + extra: + cancel_frame: 33 +attack_100_end: + extra: + cancel_frame: 38 +item_light_throw_f: + flags: + move: false +catch_attack: + extra: + cancel_frame: 0 attack_air_b_s: game_script: game_attackairbs flags: @@ -274,7 +288,7 @@ special_s_shoot_s: extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 56 + cancel_frame: 47 no_stop_intp: false special_air_s_shoot_s: game_script: game_specialairsshoots @@ -304,43 +318,25 @@ special_air_s_shoot_s: extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 56 + cancel_frame: 47 no_stop_intp: false -attack_s3_s_a: - game_script: game_attacks3a - flags: - turn: false - loop: false - move: true - fix_trans: false - fix_rot: false - fix_scale: false - unk_40: false - unk_80: true - unk_100: false - unk_200: false - unk_400: false - unk_800: false - unk_1000: false - unk_2000: false - blend_frames: 0 - animations: - - name: c01attacks3sa.nuanmb - unk: 0 - scripts: - - expression_attacks3 - - sound_attacks3a - - effect_attacks3a +special_s_cancel: extra: - xlu_start: 0 - xlu_end: 0 - cancel_frame: 33 - no_stop_intp: false + cancel_frame: 9 +special_air_s_cancel: + extra: + cancel_frame: 9 +special_s_jump_cancel: + extra: + cancel_frame: 9 +special_air_s_jump_cancel: + extra: + cancel_frame: 9 furafura_end: extra: cancel_frame: 34 -appeal_hi_2: - game_script: game_appealhi2 +appeal_s_2: + game_script: game_appeals2 flags: turn: false loop: false @@ -358,12 +354,12 @@ appeal_hi_2: unk_2000: false blend_frames: 0 animations: - - name: j01appealhi2.nuanmb + - name: j01appeals2.nuanmb unk: 0 scripts: - - expression_appealhi2 - - sound_appealhi2 - - effect_appealhi2 + - expression_appeals2 + - sound_appeals2 + - effect_appeals2 extra: xlu_start: 0 xlu_end: 0 diff --git a/romfs/source/fighter/packun/param/vl.prcxml b/romfs/source/fighter/packun/param/vl.prcxml index 355acddaa1..5f84ff9b05 100644 --- a/romfs/source/fighter/packun/param/vl.prcxml +++ b/romfs/source/fighter/packun/param/vl.prcxml @@ -70,4 +70,15 @@ dummy dummy + + + 4.0 + 15.0 + 10.0 + 20.0 + + dummy + dummy + dummy + \ No newline at end of file diff --git a/romfs/source/fighter/pacman/motion/body/motion_patch.yaml b/romfs/source/fighter/pacman/motion/body/motion_patch.yaml index 1efa0fc0ba..71cdb0ac4c 100644 --- a/romfs/source/fighter/pacman/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pacman/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -156,6 +156,9 @@ catch_attack: throw_f: extra: cancel_frame: 33 +throw_b: + extra: + cancel_frame: 38 throw_lw: extra: cancel_frame: 56 diff --git a/romfs/source/fighter/palutena/motion/body/motion_patch.yaml b/romfs/source/fighter/palutena/motion/body/motion_patch.yaml index 8e1a66590a..712bec11e6 100644 --- a/romfs/source/fighter/palutena/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/palutena/motion/body/motion_patch.yaml @@ -1,6 +1,6 @@ landing_fall_special: animations: - - name: a05landingheavy.nuanmb + - name: a04landingfallspecial.nuanmb landing_heavy: animations: - name: a04landingfallspecial.nuanmb @@ -26,10 +26,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -85,7 +85,7 @@ guard_off: cancel_frame: 12 throw_f: extra: - cancel_frame: 38 + cancel_frame: 47 throw_b: extra: cancel_frame: 50 @@ -97,7 +97,7 @@ throw_hi: cancel_frame: 44 special_s: extra: - cancel_frame: 63 + cancel_frame: 64 attack_lw3: flags: move: false @@ -123,16 +123,45 @@ attack_air_n: cancel_frame: 48 special_air_s: extra: - cancel_frame: 63 + cancel_frame: 64 attack_air_lw: extra: cancel_frame: 43 special_n: extra: - cancel_frame: 26 + cancel_frame: 54 special_air_n: extra: - cancel_frame: 26 + cancel_frame: 54 +special_air_hi_cancel: + game_script: game_specialairhi + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d02specialairhicancel.nuanmb + scripts: + - expression_specialairhi + - sound_specialairhi + - effect_specialairhi + extra: + intangible_start_frame: 0 + intangible_end_frame: 0 + cancel_frame: 9 + freeze_during_hitstop: false special_lw_l: extra: xlu_start: 0 @@ -286,7 +315,7 @@ special_n_y: extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 43 + cancel_frame: 54 no_stop_intp: false special_air_n_y: game_script: game_specialairny @@ -313,7 +342,7 @@ special_air_n_y: extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 43 + cancel_frame: 54 no_stop_intp: false special_n_p: game_script: game_specialnp @@ -423,8 +452,62 @@ special_air_n_o: xlu_end: 0 cancel_frame: 43 no_stop_intp: false -special_n_g: - game_script: game_specialng +special_n_g_start: + game_script: game_specialngstart + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + blend_frames: 0 + animations: + - name: d00specialngstart.nuanmb + unk: 0 + scripts: + - expression_specialngstart + - sound_specialngstart + - effect_specialngstart + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_n_g_loop: + game_script: game_specialngloop + flags: + turn: false + loop: false + move: true + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + blend_frames: 0 + animations: + - name: d00specialngloop.nuanmb + unk: 0 + scripts: + - expression_specialngloop + - sound_specialngloop + - effect_specialngloop + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 0 + no_stop_intp: false +special_n_g_end: + game_script: game_specialngend flags: turn: false loop: false @@ -439,19 +522,19 @@ special_n_g: unk_400: false blend_frames: 0 animations: - - name: d00specialng.nuanmb + - name: d00specialngend.nuanmb unk: 0 scripts: - - expression_specialng - - sound_specialng - - effect_specialng + - expression_specialngend + - sound_specialngend + - effect_specialngend extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 65 + cancel_frame: 45 no_stop_intp: false -special_air_n_g: - game_script: game_specialairng +special_air_n_g_end: + game_script: game_specialairngend flags: turn: false loop: false @@ -466,16 +549,16 @@ special_air_n_g: unk_400: false blend_frames: 0 animations: - - name: d00specialairng.nuanmb + - name: d00specialairngend.nuanmb unk: 0 scripts: - - expression_specialairng - - sound_specialairng - - effect_specialairng + - expression_specialairngend + - sound_specialairngend + - effect_specialairngend extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 65 + cancel_frame: 45 no_stop_intp: false catch: extra: diff --git a/romfs/source/fighter/palutena/param/hdr.xml b/romfs/source/fighter/palutena/param/hdr.xml new file mode 100644 index 0000000000..16a1048110 --- /dev/null +++ b/romfs/source/fighter/palutena/param/hdr.xml @@ -0,0 +1,7 @@ + + + + 0.9 + 14.0 + + \ No newline at end of file diff --git a/romfs/source/fighter/palutena/param/vl.prcxml b/romfs/source/fighter/palutena/param/vl.prcxml index 1b26f9a950..c15924dedd 100644 --- a/romfs/source/fighter/palutena/param/vl.prcxml +++ b/romfs/source/fighter/palutena/param/vl.prcxml @@ -63,12 +63,24 @@ -1 1 + + + 0.7 + + dummy + dummy + dummy + - 3.25 - 0.75 + 0.124 + 0.0 + 3.25 + 1.0 + 1.3 0.8 34 + 2.0 dummy dummy diff --git a/romfs/source/fighter/peach/motion/body/motion_patch.yaml b/romfs/source/fighter/peach/motion/body/motion_patch.yaml index c3e2c22e55..dab41acaa0 100644 --- a/romfs/source/fighter/peach/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/peach/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -96,7 +96,7 @@ attack_lw3: flags: move: false extra: - cancel_frame: 28 + cancel_frame: 29 attack_hi4: extra: cancel_frame: 47 @@ -163,6 +163,9 @@ special_air_n: throw_hi: extra: cancel_frame: 42 +throw_lw: + extra: + cancel_frame: 67 special_n_hit: extra: cancel_frame: 55 @@ -173,6 +176,105 @@ special_air_n_hit: cancel_frame: 55 xlu_start: 0 xlu_end: 0 +special_s_hit_end: + extra: + cancel_frame: 29 +special_s_end: + extra: + cancel_frame: 30 +special_air_s_end: + extra: + cancel_frame: 47 +special_air_lw: + game_script: game_specialairlw + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d03specialairlw.nuanmb + unk: 0 + scripts: + - expression_specialairlw + - sound_specialairlw + - effect_specialairlw + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 20 + no_stop_intp: false +special_lw_throw: + game_script: game_speciallwthrow + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: h01lightthrowf.nuanmb + unk: 0 + scripts: + - expression_speciallwthrow + - sound_speciallwthrow + - effect_speciallwthrow + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 25 + no_stop_intp: false +special_air_lw_throw: + game_script: game_speciallwthrow + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: true + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: h02lightthrowairf.nuanmb + unk: 0 + scripts: + - expression_speciallwthrow + - sound_speciallwthrow + - effect_speciallwthrow + extra: + xlu_start: 0 + xlu_end: 0 + cancel_frame: 25 + no_stop_intp: false furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/peach/param/hdr.xml b/romfs/source/fighter/peach/param/hdr.xml index 92e3d4ba06..3cfec7760a 100644 --- a/romfs/source/fighter/peach/param/hdr.xml +++ b/romfs/source/fighter/peach/param/hdr.xml @@ -1,5 +1,23 @@ + + 2.65 + 0.85 + 0.4 + 0.1 + 0.02 + 0.5 + 1.5 + 0.3 + 1.2 + 4 + 28.0 + 0.5 + 0.8 + + + 0.5 + 1.0 0.01 diff --git a/romfs/source/fighter/peach/param/vl.prcxml b/romfs/source/fighter/peach/param/vl.prcxml index da64788c8e..448a673f8c 100644 --- a/romfs/source/fighter/peach/param/vl.prcxml +++ b/romfs/source/fighter/peach/param/vl.prcxml @@ -36,9 +36,9 @@ 8 - 0.7 - 0.035 - 0.7 + 0.75 + 0.04 + 1.0 -6.0 3.2 @@ -58,8 +58,11 @@ 2.4 2.8 + 0.7 + 0.5 + 0.7 0.025 - -0.5 + -0.4 dummy dummy diff --git a/romfs/source/fighter/pfushigisou/motion/body/motion_patch.yaml b/romfs/source/fighter/pfushigisou/motion/body/motion_patch.yaml index 8fd4e8c762..ec05d55607 100644 --- a/romfs/source/fighter/pfushigisou/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pfushigisou/motion/body/motion_patch.yaml @@ -35,7 +35,7 @@ attack_13: freeze_during_hitstop: true attack_air_b: extra: - cancel_frame: 37 + cancel_frame: 34 attack_air_f: extra: cancel_frame: 43 @@ -93,10 +93,10 @@ cliff_wait: blend_frames: 2 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_back_d: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/pfushigisou/param/vl.prcxml b/romfs/source/fighter/pfushigisou/param/vl.prcxml index 72de0e90d4..f9e54e9f49 100644 --- a/romfs/source/fighter/pfushigisou/param/vl.prcxml +++ b/romfs/source/fighter/pfushigisou/param/vl.prcxml @@ -8,7 +8,7 @@ 50 60 - -5 + -9.6 -25 diff --git a/romfs/source/fighter/pichu/motion/body/motion_patch.yaml b/romfs/source/fighter/pichu/motion/body/motion_patch.yaml index c59b695066..77ac5f918f 100644 --- a/romfs/source/fighter/pichu/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pichu/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/pichu/param/hdr.xml b/romfs/source/fighter/pichu/param/hdr.xml index bcb581c550..55b729fcba 100644 --- a/romfs/source/fighter/pichu/param/hdr.xml +++ b/romfs/source/fighter/pichu/param/hdr.xml @@ -5,4 +5,7 @@ 1.25 0.5 0.75 + + 0.4 + \ No newline at end of file diff --git a/romfs/source/fighter/pickel/motion/body/motion_patch.yaml b/romfs/source/fighter/pickel/motion/body/motion_patch.yaml index c99f624524..ac9693f1ba 100644 --- a/romfs/source/fighter/pickel/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pickel/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/pikachu/motion/body/motion_patch.yaml b/romfs/source/fighter/pikachu/motion/body/motion_patch.yaml index 50797b1a31..db44d570ac 100644 --- a/romfs/source/fighter/pikachu/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pikachu/motion/body/motion_patch.yaml @@ -61,10 +61,10 @@ cliff_wait: blend_frames: 2 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_back_d: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/pikachu/param/vl.prcxml b/romfs/source/fighter/pikachu/param/vl.prcxml index 78af584f1a..4100738a5f 100644 --- a/romfs/source/fighter/pikachu/param/vl.prcxml +++ b/romfs/source/fighter/pikachu/param/vl.prcxml @@ -7,8 +7,8 @@ - 5 - 5 + 5.5 + 5.5 dummy dummy @@ -17,6 +17,8 @@ 60 + 4.0 + 29.0 1.4 2.25 @@ -34,4 +36,22 @@ dummy dummy + + + 17.0 + + dummy + dummy + dummy + + + + -6.48 + 48.6 + 12.96 + + dummy + dummy + dummy + \ No newline at end of file diff --git a/romfs/source/fighter/pikmin/motion/body/motion_patch.yaml b/romfs/source/fighter/pikmin/motion/body/motion_patch.yaml index b444a128a5..f47fab98fa 100644 --- a/romfs/source/fighter/pikmin/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pikmin/motion/body/motion_patch.yaml @@ -25,6 +25,9 @@ attack_lw3: attack_s3_s: flags: move: false +attack_s4_s: + extra: + cancel_frame: 50 catch: flags: move: false @@ -66,10 +69,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/pikmin/param/hdr.xml b/romfs/source/fighter/pikmin/param/hdr.xml index d83a6e0152..8b5e7c7960 100644 --- a/romfs/source/fighter/pikmin/param/hdr.xml +++ b/romfs/source/fighter/pikmin/param/hdr.xml @@ -11,4 +11,87 @@ 0.5 + + + + + 1.05 + 1.05 + 0.25 + 0 + 1.05 + collision_attr_fire + collision_attr_fire + 8 + 1.0 + 0.05 + 0.0 + 4 + + + + + + 0.8 + 0.9 + -0.25 + 6 + 1.25 + collision_attr_elec + collision_attr_paralyze + 7 + 1.0 + 1.0 + 0.14 + 7 + + + + + 1.0 + 1.0 + 0.0 + 0 + 1.0 + collision_attr_water + collision_attr_water + 9 + 0.2 + 0.8 + 2.0 + 4 + + + + + 1.2 + 1.0 + 0.5 + 0 + 1.0 + collision_attr_purple + collision_attr_flower + 8 + 1.0 + 1.0 + 1.0 + 3 + + + + + 1.0 + 1.1 + 0.0 + 0 + 1.1 + collision_attr_normal + collision_attr_normal + 2 + 0.36 + 0.0 + 1.0 + 999 + + \ No newline at end of file diff --git a/romfs/source/fighter/pikmin/param/vl.prcxml b/romfs/source/fighter/pikmin/param/vl.prcxml index ce0e62e036..3f61ad42d5 100644 --- a/romfs/source/fighter/pikmin/param/vl.prcxml +++ b/romfs/source/fighter/pikmin/param/vl.prcxml @@ -11,7 +11,8 @@ 10 0 0 - 0.06 + 0.05 + 1.2 0.12 0 0 diff --git a/romfs/source/fighter/pit/motion/body/motion_patch.yaml b/romfs/source/fighter/pit/motion/body/motion_patch.yaml index 02b7f69523..34a6586623 100644 --- a/romfs/source/fighter/pit/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pit/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/pitb/motion/body/motion_patch.yaml b/romfs/source/fighter/pitb/motion/body/motion_patch.yaml index baac59e330..4b68072194 100644 --- a/romfs/source/fighter/pitb/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pitb/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -119,7 +119,7 @@ attack_air_n: cancel_frame: 48 attack_air_f: extra: - cancel_frame: 39 + cancel_frame: 40 attack_air_b: extra: cancel_frame: 38 @@ -128,10 +128,13 @@ attack_air_hi: cancel_frame: 40 attack_air_lw: extra: - cancel_frame: 35 + cancel_frame: 38 special_air_s_start: extra: cancel_frame: 0 +special_s_end: + extra: + cancel_frame: 52 special_hi_start: extra: intangible_start_frame: 0 @@ -148,7 +151,7 @@ catch_attack: cancel_frame: 0 throw_lw: extra: - cancel_frame: 30 + cancel_frame: 36 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/pitb/param/hdr.xml b/romfs/source/fighter/pitb/param/hdr.xml index 1b799062e9..a3431e8a63 100644 --- a/romfs/source/fighter/pitb/param/hdr.xml +++ b/romfs/source/fighter/pitb/param/hdr.xml @@ -21,6 +21,6 @@ - 27 + 20 \ No newline at end of file diff --git a/romfs/source/fighter/pitb/param/vl.prcxml b/romfs/source/fighter/pitb/param/vl.prcxml index 852eed19fc..d88670921d 100644 --- a/romfs/source/fighter/pitb/param/vl.prcxml +++ b/romfs/source/fighter/pitb/param/vl.prcxml @@ -21,12 +21,24 @@ 25 + + + 40 + + dummy + dummy + dummy + - 0.115 - 1.5 - 6 - 0.1717 + 4.8 + 0.12 + 1.2 + 4 + 0.2 + 45 + 0.0 + 0 dummy dummy @@ -44,7 +56,7 @@ 2.75 - 12 + 8 0.15 0.15 40 diff --git a/romfs/source/fighter/plizardon/motion/body/motion_patch.yaml b/romfs/source/fighter/plizardon/motion/body/motion_patch.yaml index 07c7cfbb82..eca72dad14 100644 --- a/romfs/source/fighter/plizardon/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/plizardon/motion/body/motion_patch.yaml @@ -102,10 +102,10 @@ cliff_wait: blend_frames: 2 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_back_d: extra: cancel_frame: 36 @@ -182,7 +182,7 @@ special_n_start: cancel_frame: 60 special_s_end: extra: - cancel_frame: 53 + cancel_frame: 44 step_pose_back: extra: cancel_frame: 6 diff --git a/romfs/source/fighter/plizardon/param/vl.prcxml b/romfs/source/fighter/plizardon/param/vl.prcxml index 7ca02692ac..fd9639aefc 100644 --- a/romfs/source/fighter/plizardon/param/vl.prcxml +++ b/romfs/source/fighter/plizardon/param/vl.prcxml @@ -16,8 +16,15 @@ 1 - 2.5 + 16.0 + 8.0 + 0.0 + 3.0 0.04 + 0.085 + 0.04 + 2.0 + 0.15 dummy dummy diff --git a/romfs/source/fighter/popo/motion/body/motion_patch.yaml b/romfs/source/fighter/popo/motion/body/motion_patch.yaml index 4ddfc64488..8c7ace4d61 100644 --- a/romfs/source/fighter/popo/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/popo/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/popo/param/vl.prcxml b/romfs/source/fighter/popo/param/vl.prcxml index f94edf53df..a541ac91f4 100644 --- a/romfs/source/fighter/popo/param/vl.prcxml +++ b/romfs/source/fighter/popo/param/vl.prcxml @@ -10,8 +10,10 @@ 1 1 - 40 - 40 + 45 + 0.05 + 5 + 0.0025 100 100 100 @@ -22,6 +24,7 @@ + 45 0.05 0.8 1.2 @@ -34,8 +37,8 @@ + 60 25 - 50 dummy dummy diff --git a/romfs/source/fighter/purin/motion/body/motion_patch.yaml b/romfs/source/fighter/purin/motion/body/motion_patch.yaml index 4137c8f292..c6c96c62ec 100644 --- a/romfs/source/fighter/purin/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/purin/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/pzenigame/motion/body/motion_patch.yaml b/romfs/source/fighter/pzenigame/motion/body/motion_patch.yaml index 2bc6817e24..b273ff0aa2 100644 --- a/romfs/source/fighter/pzenigame/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/pzenigame/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -160,9 +160,9 @@ step_pose_back: cancel_frame: 6 throw_lw: extra: - cancel_frame: 46 + cancel_frame: 52 throw_f: extra: - cancel_frame: 55 + cancel_frame: 59 cliff_wait: blend_frames: 2 \ No newline at end of file diff --git a/romfs/source/fighter/reflet/motion/body/motion_patch.yaml b/romfs/source/fighter/reflet/motion/body/motion_patch.yaml index 2a9eb957b1..f4fe1f1a8f 100644 --- a/romfs/source/fighter/reflet/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/reflet/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -86,12 +86,12 @@ attack_12: attack_13: extra: cancel_frame: 30 -special_s: - flags: - move: false +attack_100_end: extra: - cancel_frame: 52 + cancel_frame: 40 attack_lw3: + extra: + cancel_frame: 26 attack_lw4: flags: move: false @@ -103,12 +103,21 @@ attack_s3_s: move: false extra: cancel_frame: 30 -special_air_s: +attack_air_n: + extra: + cancel_frame: 50 +attack_air_f: + extra: + cancel_frame: 34 +attack_air_b: extra: - cancel_frame: 52 + cancel_frame: 40 attack_air_hi: extra: cancel_frame: 44 +attack_air_lw: + extra: + cancel_frame: 60 attack_s4_hold: special_n_start: flags: @@ -123,9 +132,14 @@ special_air_n_cancel: special_n_tron_end: extra: cancel_frame: 48 -catch_attack: +special_s: + flags: + move: false extra: - cancel_frame: 0 + cancel_frame: 55 +special_air_s: + extra: + cancel_frame: 55 special_lw_start: extra: xlu_start: 0 @@ -143,6 +157,9 @@ catch_dash: catch_turn: extra: cancel_frame: 42 +catch_attack: + extra: + cancel_frame: 0 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/reflet/param/hdr.xml b/romfs/source/fighter/reflet/param/hdr.xml index 7f4620ebe6..5e32faf9db 100644 --- a/romfs/source/fighter/reflet/param/hdr.xml +++ b/romfs/source/fighter/reflet/param/hdr.xml @@ -5,4 +5,7 @@ 0.01 0.04 + + 14 + \ No newline at end of file diff --git a/romfs/source/fighter/reflet/param/vl.prcxml b/romfs/source/fighter/reflet/param/vl.prcxml index f9e2785501..5397d3ce2e 100644 --- a/romfs/source/fighter/reflet/param/vl.prcxml +++ b/romfs/source/fighter/reflet/param/vl.prcxml @@ -6,13 +6,14 @@ + 6 8 - 5 + 4 20 3 600 - 540 - 540 + 600 + 480 480 780 0 @@ -24,7 +25,7 @@ 4 8 12 - 16 + 18 dummy dummy @@ -32,8 +33,18 @@ - 20 - 26 + 4.5 + 16 + 31 + 6.0 + + dummy + dummy + dummy + + + + 1.0 dummy dummy @@ -41,7 +52,8 @@ - 15 + 21 + 0.1 dummy dummy @@ -63,6 +75,7 @@ 2.8 1.0875 0.4 + 15 25 dummy @@ -73,8 +86,12 @@ 90 0.03 - 0.5 - 0.8 + 0.45 + 0.55 + 29.5 + -0.5 + 6 + 0.1 0.0 0.0 0.0 diff --git a/romfs/source/fighter/richter/motion/body/motion_patch.yaml b/romfs/source/fighter/richter/motion/body/motion_patch.yaml index f4c428748f..748753e14c 100644 --- a/romfs/source/fighter/richter/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/richter/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -108,7 +108,7 @@ attack_lw3: cancel_frame: 36 attack_lw4: extra: - cancel_frame: 50 + cancel_frame: 56 attack_hi4: extra: cancel_frame: 52 @@ -180,7 +180,7 @@ attack_s3_s: flags: move: false extra: - cancel_frame: 30 + cancel_frame: 35 attack_squat_s3: game_script: game_attacksquats3 flags: @@ -208,7 +208,7 @@ attack_squat_s3: extra: intangible_start_frame: 0 intangible_end_frame: 0 - cancel_frame: 30 + cancel_frame: 32 freeze_during_hitstop: false fall_leaning_c: extra: @@ -269,6 +269,15 @@ special_air_lw: attack_air_n: extra: cancel_frame: 36 +attack_air_f: + extra: + cancel_frame: 40 +attack_air_f_hi: + extra: + cancel_frame: 40 +attack_air_f_lw: + extra: + cancel_frame: 40 attack_air_hi: extra: cancel_frame: 28 @@ -278,7 +287,7 @@ attack_air_lw2: cancel_frame: 25 throw_hi: extra: - cancel_frame: 35 + cancel_frame: 33 special_hi: flags: move: true diff --git a/romfs/source/fighter/richter/param/hdr.xml b/romfs/source/fighter/richter/param/hdr.xml index fff4b128f4..3ea114089f 100644 --- a/romfs/source/fighter/richter/param/hdr.xml +++ b/romfs/source/fighter/richter/param/hdr.xml @@ -20,4 +20,7 @@ 9.5 + + 0.2 + \ No newline at end of file diff --git a/romfs/source/fighter/ridley/motion/body/motion_patch.yaml b/romfs/source/fighter/ridley/motion/body/motion_patch.yaml index 89a6773ef2..670687eaf4 100644 --- a/romfs/source/fighter/ridley/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/ridley/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -76,6 +76,9 @@ fall_b: throw_f: extra: cancel_frame: 36 +throw_hi: + extra: + cancel_frame: 48 attack_12: extra: cancel_frame: 20 @@ -121,6 +124,9 @@ fall_aerial_f: blend_frames: 5 fall_aerial_b: blend_frames: 5 +jump_aerial_f2: + animations: + - name: a03jumpaerialf.nuanmb jump_aerial_f3: game_script: game_jumpaerialf2 flags: @@ -140,7 +146,7 @@ jump_aerial_f3: unk_2000: false blend_frames: 0 animations: - - name: a03jumpaerialf3.nuanmb + - name: a03jumpaerialf2.nuanmb scripts: - expression_jumpaerialf2 - sound_jumpaerialf2 diff --git a/romfs/source/fighter/robot/motion/body/motion_patch.yaml b/romfs/source/fighter/robot/motion/body/motion_patch.yaml index bdde2c1b1e..6a6bd9364a 100644 --- a/romfs/source/fighter/robot/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/robot/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -89,6 +89,15 @@ attack_11: attack_dash: extra: cancel_frame: 34 +attack_s3_s: + flags: + move: true +attack_s3_hi: + flags: + move: true +attack_s3_lw: + flags: + move: true attack_lw3: extra: cancel_frame: 19 @@ -114,93 +123,13 @@ attack_s4_lw: extra: cancel_frame: 58 attack_air_lw: - game_script: game_attackairlw - flags: - turn: false - loop: false - move: false - fix_trans: false - fix_rot: false - fix_scale: false - unk_40: false - unk_80: true - unk_100: false - unk_200: false - unk_400: false - unk_800: false - unk_1000: false - unk_2000: false - blend_frames: 0 - animations: - - name: c05attackairlw.nuanmb - unk: 0 - scripts: - - expression_attackairlw - - sound_attackairlw - - effect_attackairlw extra: - xlu_start: 0 - xlu_end: 0 cancel_frame: 40 - no_stop_intp: false landing_air_lw: - game_script: game_landingairlw - flags: - turn: false - loop: false - move: false - fix_trans: false - fix_rot: false - fix_scale: false - unk_40: false - unk_80: true - unk_100: false - unk_200: false - unk_400: false - unk_800: false - unk_1000: false - unk_2000: false - blend_frames: 0 - animations: - - name: c05landingairlw.nuanmb - unk: 0 - scripts: - - expression_landingairlw - - sound_landingairlw - - effect_landingairlw extra: - xlu_start: 0 - xlu_end: 0 cancel_frame: 12 - no_stop_intp: false special_s: - game_script: game_specials - flags: - turn: false - loop: false - move: false - fix_trans: false - fix_rot: false - fix_scale: false - unk_40: false - unk_80: false - unk_100: false - unk_200: false - unk_400: false - unk_800: false - unk_1000: false - unk_2000: false - blend_frames: 0 - animations: - - name: d01specials.nuanmb - unk: 0 - scripts: - - expression_specials - - sound_specials - - effect_specials extra: - xlu_start: 0 - xlu_end: 0 cancel_frame: 32 no_stop_intp: false special_s_hi: @@ -264,33 +193,7 @@ special_s_lw: cancel_frame: 32 no_stop_intp: false special_air_s: - game_script: game_specialairs - flags: - turn: false - loop: false - move: false - fix_trans: false - fix_rot: false - fix_scale: false - unk_40: false - unk_80: false - unk_100: false - unk_200: false - unk_400: false - unk_800: false - unk_1000: false - unk_2000: false - blend_frames: 0 - animations: - - name: d01specialairs.nuanmb - unk: 0 - scripts: - - expression_specialairs - - sound_specialairs - - effect_specialairs extra: - xlu_start: 0 - xlu_end: 0 cancel_frame: 32 no_stop_intp: false special_air_s_lw: @@ -441,9 +344,8 @@ special_hi_rise: extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 18 - no_stop_intp: false - cancel_frame: 0 + cancel_frame: 47 + no_stop_intp: true special_hi_end: extra: cancel_frame: 20 diff --git a/romfs/source/fighter/robot/param/hdr.xml b/romfs/source/fighter/robot/param/hdr.xml index 39422eda04..6e5c34a7e4 100644 --- a/romfs/source/fighter/robot/param/hdr.xml +++ b/romfs/source/fighter/robot/param/hdr.xml @@ -2,6 +2,21 @@ 12 - 0.01 + 0.0225 + 0.25 + 0.5 + 0.25 + 0.125 + 60.0 + 2.5 + 4.25 + 8.0 + 25.0 + 42.0 + 60.0 + 1.25 + 0.065 + 2.0 + 20.0 \ No newline at end of file diff --git a/romfs/source/fighter/rockman/motion/body/motion_patch.yaml b/romfs/source/fighter/rockman/motion/body/motion_patch.yaml index c2bef852ff..23f8607ffd 100644 --- a/romfs/source/fighter/rockman/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/rockman/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -915,4 +915,7 @@ step_pose_back: extra: cancel_frame: 6 cliff_wait: - blend_frames: 2 \ No newline at end of file + blend_frames: 2 +attack_hi4: + extra: + cancel_frame: 75 \ No newline at end of file diff --git a/romfs/source/fighter/rockman/param/hdr.xml b/romfs/source/fighter/rockman/param/hdr.xml new file mode 100644 index 0000000000..33eb3904be --- /dev/null +++ b/romfs/source/fighter/rockman/param/hdr.xml @@ -0,0 +1,6 @@ + + + + 0.5 + + \ No newline at end of file diff --git a/romfs/source/fighter/rockman/param/vl.prcxml b/romfs/source/fighter/rockman/param/vl.prcxml index 24c90a1bc9..1d60431ae0 100644 --- a/romfs/source/fighter/rockman/param/vl.prcxml +++ b/romfs/source/fighter/rockman/param/vl.prcxml @@ -48,6 +48,7 @@ 0.85 0.85 5 + 14 dummy dummy diff --git a/romfs/source/fighter/rosetta/motion/body/motion_patch.yaml b/romfs/source/fighter/rosetta/motion/body/motion_patch.yaml index 9bf2eef673..4d81c6cd88 100644 --- a/romfs/source/fighter/rosetta/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/rosetta/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/rosetta/motion/tico/motion_patch.yaml b/romfs/source/fighter/rosetta/motion/tico/motion_patch.yaml new file mode 100644 index 0000000000..693a59196a --- /dev/null +++ b/romfs/source/fighter/rosetta/motion/tico/motion_patch.yaml @@ -0,0 +1,25 @@ +free_recall: + game_script: game_freerecall + flags: + turn: false + loop: false + move: false + fix_trans: false + fix_rot: false + fix_scale: false + unk_40: false + unk_80: false + unk_100: false + unk_200: false + unk_400: false + unk_800: false + unk_1000: false + unk_2000: false + blend_frames: 0 + animations: + - name: d00specialnrecall.nuanmb + unk: 0 + scripts: + - sound_freerecall + - effect_freerecall + extra: ~ \ No newline at end of file diff --git a/romfs/source/fighter/rosetta/param/vl.prcxml b/romfs/source/fighter/rosetta/param/vl.prcxml index 909818366d..94146b5fa9 100644 --- a/romfs/source/fighter/rosetta/param/vl.prcxml +++ b/romfs/source/fighter/rosetta/param/vl.prcxml @@ -41,6 +41,14 @@ 26 + + + 100 + + dummy + dummy + dummy + 3.06 @@ -56,9 +64,27 @@ dummy dummy + + + 10 + 10 + 22 + 22 + + dummy + dummy + dummy + - 35 + 25 + 480 + 360 + 360 + 240 + 240 + 240 + 240 0.075 45 0.15 diff --git a/romfs/source/fighter/roy/motion/body/motion_patch.yaml b/romfs/source/fighter/roy/motion/body/motion_patch.yaml index 0e06fa5515..be267491a2 100644 --- a/romfs/source/fighter/roy/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/roy/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -85,7 +85,7 @@ throw_f: cancel_frame: 31 throw_b: extra: - cancel_frame: 40 + cancel_frame: 35 throw_lw: extra: cancel_frame: 41 @@ -182,7 +182,7 @@ attack_s3_lw: no_stop_intp: false attack_air_f: extra: - cancel_frame: 37 + cancel_frame: 38 catch: flags: move: false diff --git a/romfs/source/fighter/roy/param/hdr.xml b/romfs/source/fighter/roy/param/hdr.xml new file mode 100644 index 0000000000..69eb71e96d --- /dev/null +++ b/romfs/source/fighter/roy/param/hdr.xml @@ -0,0 +1,6 @@ + + + + 0.3 + + \ No newline at end of file diff --git a/romfs/source/fighter/roy/param/vl.prcxml b/romfs/source/fighter/roy/param/vl.prcxml index 41b45b46a0..d590e3dba8 100644 --- a/romfs/source/fighter/roy/param/vl.prcxml +++ b/romfs/source/fighter/roy/param/vl.prcxml @@ -19,6 +19,7 @@ 36 8 999 + 9 dummy dummy diff --git a/romfs/source/fighter/ryu/motion/body/motion_patch.yaml b/romfs/source/fighter/ryu/motion/body/motion_patch.yaml index ade3874738..a68aa9ea45 100644 --- a/romfs/source/fighter/ryu/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/ryu/motion/body/motion_patch.yaml @@ -171,10 +171,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/samus/motion/body/motion_patch.yaml b/romfs/source/fighter/samus/motion/body/motion_patch.yaml index 040e61a131..3771afc790 100644 --- a/romfs/source/fighter/samus/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/samus/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -83,7 +83,7 @@ attack_lw3: cancel_frame: 37 attack_hi4: extra: - cancel_frame: 62 + cancel_frame: 55 attack_lw4: extra: cancel_frame: 52 @@ -124,7 +124,7 @@ attack_air_b: cancel_frame: 37 attack_air_f: extra: - cancel_frame: 53 + cancel_frame: 50 attack_air_n: extra: cancel_frame: 42 diff --git a/romfs/source/fighter/samus/param/vl.prcxml b/romfs/source/fighter/samus/param/vl.prcxml index f10d5301fa..627fe312b1 100644 --- a/romfs/source/fighter/samus/param/vl.prcxml +++ b/romfs/source/fighter/samus/param/vl.prcxml @@ -1,5 +1,33 @@ + + dummy + dummy + dummy + dummy + dummy + dummy + + clavicler + 0 + 0 + 0 + + + + dummy + dummy + dummy + dummy + dummy + dummy + + clavicler + 0 + 0 + 0 + + 20 @@ -37,7 +65,7 @@ - 100 + 140 dummy dummy diff --git a/romfs/source/fighter/samusd/motion/body/motion_patch.yaml b/romfs/source/fighter/samusd/motion/body/motion_patch.yaml index 28b2f1052f..966db806bc 100644 --- a/romfs/source/fighter/samusd/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/samusd/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -96,13 +96,13 @@ attack_hi4: cancel_frame: 63 attack_lw4: extra: - cancel_frame: 50 + cancel_frame: 60 special_lw: extra: cancel_frame: 47 attack_hi3: extra: - cancel_frame: 48 + cancel_frame: 49 special_n_c: extra: cancel_frame: 9 @@ -287,7 +287,7 @@ special_hi_landing_f: extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 26 + cancel_frame: 31 no_stop_intp: false special_hi_landing_lw: game_script: game_specialhilandinglw diff --git a/romfs/source/fighter/samusd/param/vl.prcxml b/romfs/source/fighter/samusd/param/vl.prcxml index 271ea38254..a8d3a674d2 100644 --- a/romfs/source/fighter/samusd/param/vl.prcxml +++ b/romfs/source/fighter/samusd/param/vl.prcxml @@ -1,5 +1,33 @@ + + dummy + dummy + dummy + dummy + dummy + dummy + + clavicler + 0 + 0 + 0 + + + + dummy + dummy + dummy + dummy + dummy + dummy + + clavicler + 0 + 0 + 0 + + 21 diff --git a/romfs/source/fighter/sheik/motion/body/motion_patch.yaml b/romfs/source/fighter/sheik/motion/body/motion_patch.yaml index 90fcc8aa60..d0db749085 100644 --- a/romfs/source/fighter/sheik/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/sheik/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -86,6 +86,9 @@ throw_f: throw_b: extra: cancel_frame: 35 +throw_hi: + extra: + cancel_frame: 53 throw_lw: extra: cancel_frame: 51 @@ -139,7 +142,7 @@ attack_s4_s: cancel_frame: 49 attack_s3_s: extra: - cancel_frame: 27 + cancel_frame: 29 attack_air_f: extra: cancel_frame: 33 diff --git a/romfs/source/fighter/sheik/param/hdr.xml b/romfs/source/fighter/sheik/param/hdr.xml index 702daf8245..17beedfa33 100644 --- a/romfs/source/fighter/sheik/param/hdr.xml +++ b/romfs/source/fighter/sheik/param/hdr.xml @@ -1,5 +1,9 @@ + + 20.0 + 0.5 + 0.8 diff --git a/romfs/source/fighter/sheik/param/vl.prcxml b/romfs/source/fighter/sheik/param/vl.prcxml index d918e05ed6..6a2db12d01 100644 --- a/romfs/source/fighter/sheik/param/vl.prcxml +++ b/romfs/source/fighter/sheik/param/vl.prcxml @@ -31,7 +31,8 @@ - 4.0 + 30.0 + 3.5 0 dummy @@ -52,7 +53,8 @@ 3.0 - 1 + 2 + 0 30 dummy diff --git a/romfs/source/fighter/shizue/motion/body/motion_patch.yaml b/romfs/source/fighter/shizue/motion/body/motion_patch.yaml index 16a8be1d5e..19b990129f 100644 --- a/romfs/source/fighter/shizue/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/shizue/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -112,12 +112,12 @@ attack_air_f: cancel_frame: 38 special_n: extra: - xlu_start: 5 - xlu_end: 8 + xlu_start: 0 + xlu_end: 0 special_air_n: extra: - xlu_start: 5 - xlu_end: 8 + xlu_start: 0 + xlu_end: 0 special_s_throw_lw: extra: cancel_frame: 31 diff --git a/romfs/source/fighter/shizue/param/hdr.xml b/romfs/source/fighter/shizue/param/hdr.xml new file mode 100644 index 0000000000..f183756ec7 --- /dev/null +++ b/romfs/source/fighter/shizue/param/hdr.xml @@ -0,0 +1,6 @@ + + + + 14 + + \ No newline at end of file diff --git a/romfs/source/fighter/shulk/motion/body/motion_patch.yaml b/romfs/source/fighter/shulk/motion/body/motion_patch.yaml index deebac5e15..083d10396c 100644 --- a/romfs/source/fighter/shulk/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/shulk/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/shulk/param/hdr.xml b/romfs/source/fighter/shulk/param/hdr.xml index ffa07c5728..6a3d2788f6 100644 --- a/romfs/source/fighter/shulk/param/hdr.xml +++ b/romfs/source/fighter/shulk/param/hdr.xml @@ -8,4 +8,7 @@ 11 + + 0.01 + \ No newline at end of file diff --git a/romfs/source/fighter/simon/motion/body/motion_patch.yaml b/romfs/source/fighter/simon/motion/body/motion_patch.yaml index 242e5c4d0a..9db729dec0 100644 --- a/romfs/source/fighter/simon/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/simon/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -83,6 +83,12 @@ attack_12: special_n: extra: cancel_frame: 60 +special_lw: + extra: + cancel_frame: 40 +special_air_lw: + extra: + cancel_frame: 40 attack_11: extra: cancel_frame: 19 diff --git a/romfs/source/fighter/simon/param/vl.prcxml b/romfs/source/fighter/simon/param/vl.prcxml index 0aa0c7da60..ce72a3a889 100644 --- a/romfs/source/fighter/simon/param/vl.prcxml +++ b/romfs/source/fighter/simon/param/vl.prcxml @@ -94,6 +94,7 @@ -43 + 1.8 dummy dummy diff --git a/romfs/source/fighter/snake/motion/body/motion_patch.yaml b/romfs/source/fighter/snake/motion/body/motion_patch.yaml index 47df80aea9..354f58a09d 100644 --- a/romfs/source/fighter/snake/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/snake/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/sonic/motion/body/motion_patch.yaml b/romfs/source/fighter/sonic/motion/body/motion_patch.yaml index 5507922981..58de9a0dbd 100644 --- a/romfs/source/fighter/sonic/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/sonic/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/sonic/param/hdr.xml b/romfs/source/fighter/sonic/param/hdr.xml index 45ee642a2a..2053b6366a 100644 --- a/romfs/source/fighter/sonic/param/hdr.xml +++ b/romfs/source/fighter/sonic/param/hdr.xml @@ -1,5 +1,15 @@ + + 3.5 + 1.85 + 0.7 + 0.1 + 0.1 + 0.1 + 0.05 + 0.5 + 1 0.6 diff --git a/romfs/source/fighter/szerosuit/motion/body/motion_patch.yaml b/romfs/source/fighter/szerosuit/motion/body/motion_patch.yaml index 8810be7fff..6e191cdd40 100644 --- a/romfs/source/fighter/szerosuit/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/szerosuit/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/tantan/motion/body/motion_patch.yaml b/romfs/source/fighter/tantan/motion/body/motion_patch.yaml index 63af11255b..dd9a8b20c7 100644 --- a/romfs/source/fighter/tantan/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/tantan/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -85,10 +85,10 @@ throw_f: cancel_frame: 27 throw_b: extra: - cancel_frame: 47 + cancel_frame: 55 throw_lw: extra: - cancel_frame: 40 + cancel_frame: 42 throw_hi: extra: cancel_frame: 31 @@ -252,7 +252,7 @@ attack_air_b: extra: intangible_start_frame: 0 intangible_end_frame: 0 - cancel_frame: 40 + cancel_frame: 38 freeze_during_hitstop: false attack_air_f: extra: @@ -812,7 +812,7 @@ special_air_hi_short_end: extra: xlu_start: 0 xlu_end: 0 - cancel_frame: 21 + cancel_frame: 20 no_stop_intp: false catch_attack: extra: diff --git a/romfs/source/fighter/tantan/param/hdr.xml b/romfs/source/fighter/tantan/param/hdr.xml index b616413ea5..6f5ab51459 100644 --- a/romfs/source/fighter/tantan/param/hdr.xml +++ b/romfs/source/fighter/tantan/param/hdr.xml @@ -6,6 +6,7 @@ 0.3 1 0.85 + 14 32 \ No newline at end of file diff --git a/romfs/source/fighter/tantan/param/vl.prcxml b/romfs/source/fighter/tantan/param/vl.prcxml index 7af4ff1426..7b1c29b5ae 100644 --- a/romfs/source/fighter/tantan/param/vl.prcxml +++ b/romfs/source/fighter/tantan/param/vl.prcxml @@ -17,7 +17,7 @@ 31 70 - -5 + -9.6 18 @@ -178,7 +178,8 @@ - 5 + 13 + 10 dummy dummy diff --git a/romfs/source/fighter/toonlink/motion/body/motion_patch.yaml b/romfs/source/fighter/toonlink/motion/body/motion_patch.yaml index f709e8feeb..3200999003 100644 --- a/romfs/source/fighter/toonlink/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/toonlink/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -82,13 +82,13 @@ attack_12: cancel_frame: 17 attack_13: extra: - cancel_frame: 34 + cancel_frame: 36 attack_11: extra: cancel_frame: 20 attack_hi4: extra: - cancel_frame: 46 + cancel_frame: 48 attack_lw3: extra: cancel_frame: 25 @@ -106,10 +106,13 @@ attack_s4_s: cancel_frame: 54 attack_air_b: extra: - cancel_frame: 23 + cancel_frame: 30 attack_air_hi: extra: - cancel_frame: 58 + cancel_frame: 57 +special_hi: + extra: + cancel_frame: 81 item_light_throw_b: extra: cancel_frame: 21 @@ -133,7 +136,7 @@ catch_attack: cancel_frame: 0 air_catch_landing: extra: - cancel_frame: 16 + cancel_frame: 17 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/toonlink/param/hdr.xml b/romfs/source/fighter/toonlink/param/hdr.xml index 8f07f1fb97..fd97ed77a6 100644 --- a/romfs/source/fighter/toonlink/param/hdr.xml +++ b/romfs/source/fighter/toonlink/param/hdr.xml @@ -11,5 +11,10 @@ 25 0.5 + 0.75 + 0.667 + + + 0.6 \ No newline at end of file diff --git a/romfs/source/fighter/toonlink/param/vl.prcxml b/romfs/source/fighter/toonlink/param/vl.prcxml index 783c03752d..1346c95201 100644 --- a/romfs/source/fighter/toonlink/param/vl.prcxml +++ b/romfs/source/fighter/toonlink/param/vl.prcxml @@ -34,7 +34,9 @@ - 0.53 + 1.75 + 1.94 + 0.44 0.01 0.6 30 @@ -49,7 +51,8 @@ - 0.95 + 1.0 + 0.75 dummy dummy diff --git a/romfs/source/fighter/trail/motion/body/motion_patch.yaml b/romfs/source/fighter/trail/motion/body/motion_patch.yaml index 42ee23079b..114bc189e9 100644 --- a/romfs/source/fighter/trail/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/trail/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -128,15 +128,15 @@ special_lw_start: cancel_frame: 64 special_air_lw_start: extra: - cancel_frame: 64 -special_lw: - extra: - xlu_start: 0 - xlu_end: 0 -special_air_lw: + cancel_frame: 85 +special_lw_start: + flags: + move: true +special_air_lw_rebound: extra: xlu_start: 0 xlu_end: 0 + cancel_frame: 38 furafura_end: extra: cancel_frame: 34 diff --git a/romfs/source/fighter/trail/param/hdr.xml b/romfs/source/fighter/trail/param/hdr.xml new file mode 100644 index 0000000000..af4d9dc298 --- /dev/null +++ b/romfs/source/fighter/trail/param/hdr.xml @@ -0,0 +1,7 @@ + + + + 1.7 + 1.0 + + \ No newline at end of file diff --git a/romfs/source/fighter/trail/param/vl.prcxml b/romfs/source/fighter/trail/param/vl.prcxml index add9b2cdf5..e1a241bc3d 100644 --- a/romfs/source/fighter/trail/param/vl.prcxml +++ b/romfs/source/fighter/trail/param/vl.prcxml @@ -37,13 +37,9 @@ - - attack_num is set to 3.5 due to how we force the game to allow Sonic Blade to be angleable. - We simply pretend that Sora is already on the second Sonic Blade. - 0.23 - 4 - 4.5 + 1 + 3.7 0.82 dummy diff --git a/romfs/source/fighter/wario/motion/body/motion_patch.yaml b/romfs/source/fighter/wario/motion/body/motion_patch.yaml index 6f98e977b3..1a3bce06f2 100644 --- a/romfs/source/fighter/wario/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/wario/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/wario/param/vl.prcxml b/romfs/source/fighter/wario/param/vl.prcxml index f6440ac820..4dfa499805 100644 --- a/romfs/source/fighter/wario/param/vl.prcxml +++ b/romfs/source/fighter/wario/param/vl.prcxml @@ -24,7 +24,7 @@ 1.25 - 1.25 + 2.0 dummy dummy diff --git a/romfs/source/fighter/wiifit/motion/body/motion_patch.yaml b/romfs/source/fighter/wiifit/motion/body/motion_patch.yaml index 85a34c10dd..5ec07b5a6d 100644 --- a/romfs/source/fighter/wiifit/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/wiifit/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/wiifit/param/vl.prcxml b/romfs/source/fighter/wiifit/param/vl.prcxml index 9c7f644118..7db35c88f4 100644 --- a/romfs/source/fighter/wiifit/param/vl.prcxml +++ b/romfs/source/fighter/wiifit/param/vl.prcxml @@ -13,12 +13,23 @@ 8 + + + 20 + 10 + + dummy + dummy + dummy + - 30 - 0.88 + 32 + 0.7 0.1 + 32 0.3 + 8 0.08 26 @@ -28,22 +39,22 @@ - 1.1 + 1.15 1.0 - 1.1 - 1.1 - 1.1 - 1.1 - 1.2 - 1.2 - 1.1 - 1.0 - 1.1 - 1.1 - 1.1 - 1.1 - 1.2 - 1.2 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.15 + 1.15 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 dummy dummy diff --git a/romfs/source/fighter/wolf/motion/body/motion_patch.yaml b/romfs/source/fighter/wolf/motion/body/motion_patch.yaml index c8198bbd49..64cfa044c1 100644 --- a/romfs/source/fighter/wolf/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/wolf/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/yoshi/motion/body/motion_patch.yaml b/romfs/source/fighter/yoshi/motion/body/motion_patch.yaml index 4332e374b9..0405d9139b 100644 --- a/romfs/source/fighter/yoshi/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/yoshi/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/yoshi/param/vl.prcxml b/romfs/source/fighter/yoshi/param/vl.prcxml index f25706aaf2..58ba59e642 100644 --- a/romfs/source/fighter/yoshi/param/vl.prcxml +++ b/romfs/source/fighter/yoshi/param/vl.prcxml @@ -16,8 +16,11 @@ + 0.7 + 1.0 + 1.4 0 - 59 + 90 0.5 0.3 @@ -38,7 +41,7 @@ dummy dummy - + 52 diff --git a/romfs/source/fighter/younglink/motion/body/motion_patch.yaml b/romfs/source/fighter/younglink/motion/body/motion_patch.yaml index 743c728986..7f29c36ee3 100644 --- a/romfs/source/fighter/younglink/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/younglink/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 @@ -77,18 +77,27 @@ guard_off: blend_frames: 4 extra: cancel_frame: 12 +catch: + extra: + cancel_frame: 58 +catch_dash: + extra: + cancel_frame: 63 +catch_turn: + extra: + cancel_frame: 61 throw_lw: extra: - cancel_frame: 45 + cancel_frame: 48 throw_hi: extra: - cancel_frame: 42 + cancel_frame: 41 throw_f: extra: cancel_frame: 32 throw_b: extra: - cancel_frame: 36 + cancel_frame: 32 attack_13: extra: cancel_frame: 32 @@ -112,13 +121,16 @@ attack_lw3: cancel_frame: 22 attack_hi4: extra: - cancel_frame: 60 + cancel_frame: 59 attack_lw4: extra: cancel_frame: 56 attack_air_hi: extra: cancel_frame: 50 +attack_air_b: + extra: + cancel_frame: 29 special_s1: extra: cancel_frame: 43 diff --git a/romfs/source/fighter/younglink/param/vl.prcxml b/romfs/source/fighter/younglink/param/vl.prcxml index 0f1137bd04..68b4f3ecb7 100644 --- a/romfs/source/fighter/younglink/param/vl.prcxml +++ b/romfs/source/fighter/younglink/param/vl.prcxml @@ -58,7 +58,7 @@ 1 2.5 - 0.7 + 0.582 0.025 0.8 26 diff --git a/romfs/source/fighter/zelda/motion/body/motion_patch.yaml b/romfs/source/fighter/zelda/motion/body/motion_patch.yaml index 64b8d54476..fccae38985 100644 --- a/romfs/source/fighter/zelda/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/zelda/motion/body/motion_patch.yaml @@ -20,10 +20,10 @@ down_stand_d: cancel_frame: 31 down_attack_u: extra: - cancel_frame: 50 + cancel_frame: 54 down_attack_d: extra: - cancel_frame: 50 + cancel_frame: 54 down_forward_u: extra: cancel_frame: 36 diff --git a/romfs/source/fighter/zelda/param/vl.prcxml b/romfs/source/fighter/zelda/param/vl.prcxml index b115bdf85c..91a27e0b37 100644 --- a/romfs/source/fighter/zelda/param/vl.prcxml +++ b/romfs/source/fighter/zelda/param/vl.prcxml @@ -51,8 +51,8 @@ 0.077 - 2 - 1.2 + 0.0 + 3.2 0.45 0.6 35 diff --git a/romfs/source/item/common/param/param.prcxml b/romfs/source/item/common/param/param.prcxml index 9807c678c1..0d194da44e 100644 --- a/romfs/source/item/common/param/param.prcxml +++ b/romfs/source/item/common/param/param.prcxml @@ -152,7 +152,9 @@ item_shield_kind_hop - dummy + + 2.5 + dummy dummy dummy @@ -171,8 +173,12 @@ 0.04 false - dummy - dummy + + 0.85 + + + 0.85 + dummy dummy dummy diff --git a/romfs/source/ui/docs/airdash.webp b/romfs/source/ui/docs/airdash.webp deleted file mode 100644 index bf9091b8d0..0000000000 Binary files a/romfs/source/ui/docs/airdash.webp and /dev/null differ diff --git a/romfs/source/ui/docs/common.css b/romfs/source/ui/docs/common.css new file mode 100644 index 0000000000..891eaa6090 --- /dev/null +++ b/romfs/source/ui/docs/common.css @@ -0,0 +1,240 @@ +* { + margin: 0; + padding: 0; +} + +:root { + --var-body-width: 1280px; + --var-body-height: 720px; + --var-abstract-outgame-fighting-mii-team: url("../../../help/img/abstract_outgame_fighting_mii_team.webp"); + --var-bg-collection: url("../../../help/img/bg_collection.webp"); + --var-bg-default: url("../../../help/img/bg_default.webp"); + --var-bg-detail-collection: url("../../../help/img/bg_detail_collection.webp"); + --var-bg-detail-outgame: url("../../../help/img/bg_detail_outgame.webp"); + --var-bg-detail-palette: url("../../../help/img/bg_detail_palette.webp"); + --var-bg-detail-scuffle: url("../../../help/img/bg_detail_scuffle.webp"); + --var-bg-detail-spirits: url("../../../help/img/bg_detail_spirits.webp"); + --var-bg-dot-collection: url("../../../help/img/bg_dot_collection.webp"); + --var-bg-dot-outgame: url("../../../help/img/bg_dot_outgame.webp"); + --var-bg-dot-palette: url("../../../help/img/bg_dot_palette.webp"); + --var-bg-dot-scuffle: url("../../../help/img/bg_dot_scuffle.webp"); + --var-bg-dot-spirits: url("../../../help/img/bg_dot_spirits.webp"); + --var-bg-outgame: url("../../../help/img/bg_outgame.webp"); + --var-bg-palette: url("../../../help/img/bg_palette.webp"); + --var-bg-scuffle: url("../../../help/img/bg_scuffle.webp"); + --var-bg-spirits: url("../../../help/img/bg_spirits.webp"); + --var-collection-texture: url("../../../help/img/collection_texture.webp"); + --var-collection-texture-dark: url("../../../help/img/collection_texture_dark.webp"); + --var-detail-outgame-amiibo-balloon: url("../../../help/img/detail_outgame_amiibo_balloon.webp"); + --var-detail-outgame-amiibo-lv-up: url("../../../help/img/detail_outgame_amiibo_lv_up.webp"); + --var-detail-outgame-amiibo-nfc: url("../../../help/img/detail_outgame_amiibo_nfc.webp"); + --var-detail-scuffle-group-okawari: url("../../../help/img/detail_scuffle_group_okawari.webp"); + --var-detail-spirits-adventure-broken-bridge: url("../../../help/img/detail_spirits_adventure_broken_bridge.webp"); + --var-detail-spirits-adventure-fix-bridge: url("../../../help/img/detail_spirits_adventure_fix_bridge.webp"); + --var-detail-spirits-adventure-switch: url("../../../help/img/detail_spirits_adventure_switch.webp"); + --var-keyword-texture-dark: url("../../../help/img/keyword_texture_dark.webp"); + --var-outgame-texture: url("../../../help/img/outgame_texture.webp"); + --var-outgame-texture-dark: url("../../../help/img/outgame_texture_dark.webp"); + --var-palette-texture: url("../../../help/img/palette_texture.webp"); + --var-palette-texture-dark: url("../../../help/img/palette_texture_dark.webp"); + --var-qa-battlefield-after: url("../../../help/img/qa_battlefield_after.webp"); + --var-qa-battlefield-before: url("../../../help/img/qa_battlefield_before.webp"); + --var-qa-last-stop-after: url("../../../help/img/qa_last_stop_after.webp"); + --var-qa-last-stop-before: url("../../../help/img/qa_last_stop_before.webp"); + --var-qa-orekyoku-stage-select-zoom-in: url("../../../help/img/qa_orekyoku_stage_select_zoom_in.webp"); + --var-qa-spirits-attribute-relation: url("../../../help/img/qa_spirits_attribute_relation.webp"); + --var-qa-texture-dark: url("../../../help/img/qa_texture_dark.webp"); + --var-scuffle-texture: url("../../../help/img/scuffle_texture.webp"); + --var-scuffle-texture-dark: url("../../../help/img/scuffle_texture_dark.webp"); + --var-spirits-texture: url("../../../help/img/spirits_texture.webp"); +} + +html, +body { + width: var(--var-body-width); + height: var(--var-body-height); + background-color: black; + position: relative; +} + +#bg { + position: fixed; + width: var(--var-body-width); + height: var(--var-body-height); + background-color: white; + background-size: 125%; + background-position-y: center; + background-position-x: -50px; + z-index: 0; +} + +#header { + position: fixed; + top: 0px; + left: 0px; + width: 100%; + z-index: 1; + box-shadow: none; +} + +#header > div { + display: flex; + align-items: center; + height: 65px; +} + +#ret-button { + width: 100px; + padding-left: 20px; + -webkit-clip-path: polygon(0 0, 100% 0, 66% 99%, 0 81%); + clip-path: polygon(0 0, 100% 0, 66% 99%, 0 81%); +} + +.background-clip { + -webkit-clip-path: polygon(100% 0%, 0 0, 0 100%); + clip-path: polygon(100% 0%, 0 0, 0 100%); + background-color: black; + position: absolute; + min-width: 400px; + min-height: 85px; + z-index: -1; + top: 0; +} + +.breadcrumb-list { + margin-left: 25px; + font-size: 30px; +} + +.breadcrumb-list p { + display: inline-block; +} + +.header-decoration { + display: inline-flex; + align-items: center; + width: 101px; + height: 65px; + padding-left: 21px; + /* -29px */ + -webkit-clip-path: polygon(0% 0%, 100% 0%, 93px 100%, 0% 100%); +} + +.ret-icon-wrapper { + position: relative; + margin-left: -4px; + will-change: transform; +} + +@keyframes ret-icon-animation { + 0% { + transform: translate3d(-10px, 0px, 0); + } + 100% { + transform: translate3d(0px, 0px, 0); + } +} + +.is-focus .ret-icon-wrapper { + animation: ret-icon-animation 50ms linear 0ms 1 normal; +} + +.ret-icon-shadow svg { + position: absolute; + z-index: -1; + top: 3px; + left: 2px; + display: inline-block; + width: 58px; + height: 58px; + opacity: 0; +} + +.ret-icon svg { + display: inline-block; + width: 58px; + height: 58px; + transition: opacity 0.2s ease; +} + +.ret-icon path { + fill: #4cc0f1; +} + +.ret-icon-shadow path { + fill: #003145; +} + +.is-appear { + opacity: 1; +} + +.scrollbar::-webkit-scrollbar { + background: none; +} + +.scrollbar::-webkit-scrollbar-track { + margin-top: 0px; + margin-bottom: 50px; + border-radius: 10px; + background-color: #b5b5b5; +} + +.scrollbar::-webkit-scrollbar { + width: 12px; +} + +.scrollbar::-webkit-scrollbar-thumb { + border-radius: 10px; + border: 3px solid; + border-color: #b5b5b5; + background-color: #e3e3e3; +} + +.scrollbar-desc { + overflow-y: overlay; + max-height: 150px; + width: 100%; +} + +.scrollbar-desc::-webkit-scrollbar { + background: none; + padding-left: 5px; +} + +.scrollbar-desc::-webkit-scrollbar-track { + border-radius: 10px; + background-color: #b5b5b5; +} + +.scrollbar-desc::-webkit-scrollbar { + width: 12px; +} + +.scrollbar-desc::-webkit-scrollbar-thumb { + border-radius: 10px; + border: 3px solid; + border-color: #b5b5b5; + background-color: #e3e3e3; +} + +.primary-button { + width: 400px; + height: 80px; + box-sizing: border-box; +} + +img, +svg { + opacity: 1 !important; +} + +#footer { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 36px; + text-align: right; + margin-left: -10px; +} diff --git a/romfs/source/ui/docs/common.js b/romfs/source/ui/docs/common.js new file mode 100644 index 0000000000..891414e3d6 --- /dev/null +++ b/romfs/source/ui/docs/common.js @@ -0,0 +1,129 @@ +const UP = 38; +const DOWN = 40; +var isNx = typeof window.nx !== "undefined"; + +// Example of checkGamepad Function +// function checkGamepad(gamepad) { +// //#region UI Input Check + +// var axisX = gamepad.axes[0]; +// var axisY = gamepad.axes[1]; + +// // Check A button +// if (gamepad.buttons[1].pressed) { +// console.log("A Button Pressed"); +// } + +// // Check if D-pad Left pressed or Left Stick X Axis less than -0.7 +// if (gamepad.buttons[14].pressed || axisX < -0.7) { +// console.log("D-pad left pressed"); +// } +// // Check if D-pad Up pressed or Y-Axis +// else if (gamepad.buttons[12].pressed || axisY < -0.7) { +// console.log("D-pad up pressed"); +// } +// // Check if D-pad Right pressed or X Axis > 0.7 +// else if (gamepad.buttons[15].pressed || axisX > 0.7) { +// console.log("D-pad Right pressed"); +// } +// // Check if D-pad Down pressed or Y Axis > 0.7 +// else if (gamepad.buttons[13].pressed || axisY > 0.7) { +// console.log("D-pad Down pressed"); +// }; +// //#endregion + +// //#region + Button Pressed Check (Save) +// if (gamepad.buttons[9].pressed) { +// console.log("+ (Plus) button pressed"); +// } +// //#endregion + +// //#region R-Stick Y Value Calculation (Description scroll) +// var RStickYValue = gamepad.axes[3].toFixed(2); +// //#endregion + +// //#region L and R button Pressed Checkd (Category Switching) +// if (gamepad.buttons[4].pressed) { +// console.log("L Button Pressed"); +// } + +// if (gamepad.buttons[5].pressed) { +// console.log("R Button Pressed"); +// } +// //#endregion +// } + +function loadSVG() { + $(".svg-container").each(function () { + var $thisObj = $(this); + $(this).load($thisObj.attr("ref")); + $(this).addClass("is-appear"); + }); +} + +window.addEventListener("DOMContentLoaded", (e) => { + window.addEventListener("NXFirstPaintEndAfterLoad", function () { + setTimeout(loadSVG, 0); + }); + + // Listen to the gamepadconnected event + window.addEventListener("gamepadconnected", function (e) { + // Once a gamepad has connected, start an interval function that will run every 100ms to check for input + setInterval(function () { + var gpl = navigator.getGamepads(); + if (gpl[0] != null || gpl[0] != undefined) { + checkGamepad(0, gpl[0]); + } + }, 150); + }); + + $(function () { + if (!isNx) { + setTimeout(loadSVG, 0); + } + }); +}); + +function scroll(target, offset, activeContainer) { + // Check to see if mod is completely in view + var fully = + checkInView(target, false, activeContainer) == undefined ? false : true; + + // If so, then just focus and dip + if (fully) { + target.focus(); + } else { + // Remove focus from currently focused one + $(".is-focused").focusout(); + // Stop any animation going on in the container + activeContainer.stop(); + // Animate the mod container scrolling with a speed of 0 (fastest) + activeContainer.animate( + { + scrollTop: offset, + }, + 0 + ); + // Focus on the previous mod + target.focus(); + } +} + +// yonked from here https://stackoverflow.com/questions/16308037/detect-when-elements-within-a-scrollable-div-are-out-of-view +function checkInView(elem, partial, activeContainer) { + var container = $(activeContainer); + var contHeight = container.height(); + var contTop = container.scrollTop(); + var contBottom = contTop + contHeight; + + var elemTop = $(elem).offset().top - container.offset().top; + var elemBottom = elemTop + $(elem).height(); + + var isTotal = elemTop >= 0 && elemBottom <= contHeight; + var isPart = + ((elemTop < 0 && elemBottom > 0) || + (elemTop > 0 && elemTop <= container.height())) && + partial; + + return isTotal || isPart; +} diff --git a/romfs/source/ui/docs/element.webp b/romfs/source/ui/docs/element.webp deleted file mode 100644 index 8af745c660..0000000000 Binary files a/romfs/source/ui/docs/element.webp and /dev/null differ diff --git a/romfs/source/ui/docs/gamemodes.html b/romfs/source/ui/docs/gamemodes.html index c28d0697e9..2c9c7305ac 100644 --- a/romfs/source/ui/docs/gamemodes.html +++ b/romfs/source/ui/docs/gamemodes.html @@ -1,229 +1,645 @@ - - - - - - - - - - - - - - - - - - - - -
- - -
- - - - - - - - -
- - - + + + + + + + + Menu + + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + + + Game Mode Preview + + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+
+ +
+ + + diff --git a/romfs/source/ui/docs/gamemodes.js b/romfs/source/ui/docs/gamemodes.js deleted file mode 100644 index 490688b9e7..0000000000 --- a/romfs/source/ui/docs/gamemodes.js +++ /dev/null @@ -1,38 +0,0 @@ -var enabled_modes = new Map(); -enabled_modes.set('tag', false); -enabled_modes.set('turbo', false); -enabled_modes.set('hitfall', false); -enabled_modes.set('airdash', false); -enabled_modes.set('smash64', false); -enabled_modes.set('magicseries', false); -enabled_modes.set('element', false); - -function toggle_mode(mode_name, self) { - if (event && event.keyCode !== 13) return - //alert("toggling: " + mode_name); - var is_now_enabled = !enabled_modes.get(mode_name.replace(/\s+/g, '').toLowerCase()); - enabled_modes.set(mode_name.replace(/\s+/g, '').toLowerCase(), is_now_enabled); - var button_text = mode_name + " Mode (" + (is_now_enabled ? "ON" : "OFF") + ")"; - var element = document.getElementById(mode_name.replace(/\s+/g, '').toLowerCase() + "-text-field"); - element.innerHTML = button_text; - self.blur(); - self.focus(); -} - -function exit_with_id() { - if (event && event.keyCode !== 13) return - var str = ""; - enabled_modes.forEach((v, k) => { - if (v === true) { - str += k + '-'; - } - }); - if (str.endsWith('-')) { - str = str.substring(0, str.length - 1); - } - if (str.length == 0) { - str = "none"; - } - //alert("exiting with str: " + str); - location.href = "http://localhost/" + str; -} \ No newline at end of file diff --git a/romfs/source/ui/docs/gridmenu.js b/romfs/source/ui/docs/gridmenu.js new file mode 100644 index 0000000000..f1f37cb51b --- /dev/null +++ b/romfs/source/ui/docs/gridmenu.js @@ -0,0 +1,77 @@ +var AButtonHeld = false; +var buttonCount = 0; +var rows = 0; +var currPos = 0; +var currRow = 0; +var last = 0; + +window.addEventListener("DOMContentLoaded", (e) => { + var buttons = document.querySelectorAll("button"); + buttonCount = buttons.length; + last = buttonCount - 1; + rows = (buttonCount - 2) % 3; + [].forEach.call(buttons, function (btn) { + btn.addEventListener("focus", () => { + btn.classList.add("is-focused"); + }); + + btn.addEventListener("focusout", () => { + btn.classList.remove("is-focused"); + }); + }); + + // Listen to the keydown event and prevent the default + window.addEventListener("keydown", function (e) { + if (e.keyCode == UP) { + var target = document.querySelector(".is-focused").previousElementSibling; + if (target != undefined) { + getCurrentActiveContainer()[0].scrollTop = target.offsetTop + 50; + target.focus(); + currPos--; + currRow--; + } + } else if (e.keyCode == DOWN) { + var target = document.querySelector(".is-focused").nextElementSibling; + if (currRow == rows) { + target = buttons[last]; + } + if (target != undefined) { + getCurrentActiveContainer()[0].scrollTop = target.offsetTop - 50; + target.focus(); + currPos++; + currRow++; + } + } else if (e.keyCode == RIGHT) { + var target = + document.querySelector(".is-focused").nextElementSibling + .nextElementSibling.nextElementSibling; + if (target != undefined) { + getCurrentActiveContainer()[0].scrollTop = target.offsetTop - 50; + target.focus(); + currPos += 3; + } + } else if (e.keyCode == LEFT) { + var target = + document.querySelector(".is-focused").previousElementSibling + .previousElementSibling.previousElementSibling; + if (target != undefined) { + getCurrentActiveContainer()[0].scrollTop = target.offsetTop - 50; + target.focus(); + currPos -= 3; + } + } + }); + + window.nx.footer.setAssign("A", "", () => { + $(".is-focused").last().click(); + }); + window.nx.footer.setAssign("B", "", () => { + window.location.href = "http://localhost/"; + }); + window.nx.footer.setAssign("X", "", () => {}); + window.nx.footer.setAssign("Y", "", () => {}); + + if ($(".is-focused").length <= 0) { + $("#list").find("button").get(0).focus(); + } +}); diff --git a/romfs/source/ui/docs/hitfall.webp b/romfs/source/ui/docs/hitfall.webp deleted file mode 100644 index d097439a42..0000000000 Binary files a/romfs/source/ui/docs/hitfall.webp and /dev/null differ diff --git a/romfs/source/ui/docs/magicseries.webp b/romfs/source/ui/docs/magicseries.webp deleted file mode 100644 index 4ca1b230a1..0000000000 Binary files a/romfs/source/ui/docs/magicseries.webp and /dev/null differ diff --git a/romfs/source/ui/docs/menu.css b/romfs/source/ui/docs/menu.css new file mode 100644 index 0000000000..5461fe6069 --- /dev/null +++ b/romfs/source/ui/docs/menu.css @@ -0,0 +1,211 @@ +@keyframes cursor-anim { + 0% { + background-position: 200% 0%; + } + + 100% { + background-position: 0% 0%; + } +} + + +* { + font-family: Arial, Helvetica, sans-serif; + font-weight: bold; +} + +body { + width: 1280px; + margin: 0; + background-color: black; +} + +.main { + margin: 0 auto; + width: 90%; + position: relative; + top: 84px; +} + +.header table { + display: block; + border-collapse: separate; +} + +.flex-container { + width: 100%; + display: flex; + flex-direction: column; + background-color: transparent; +} + +.flex-item { + position: relative; + display: flex; + margin-bottom: 1%; + height: 80px; + border: 3px solid black; + text-align: center; + background-color: transparent; + padding: 0; + position: relative; + box-sizing: border-box; +} + +.flex-item>.item-container { + width: 100%; + display: flex; + background-color: white; + padding: 20px; + padding-bottom: 22px; +} + +.flex-item>.icon-background::before { + content: ''; +} + +.icon-background { + background-color: black; + position: absolute; + height: 74px; + width: 76px; + clip-path: polygon(0 0, 100% 0, 73% 100%, 0% 100%); + -webkit-clip-path: polygon(0 0, 100% 0, 73% 100%, 0% 100%); +} + +.arc { + background-color: skyblue; +} + +.umm { + background-color: magenta; +} + +.both { + background-color: #AF89F2; +} + +.is-focused { + outline: none; + background: linear-gradient(90deg, rgb(255, 109, 0) 0%, rgb(255, 255, 0) 65%, rgb(255, 109, 0) 70%); + background-size: 200% 1px; + animation: cursor-anim 650ms linear infinite normal; + border: 3px solid transparent; +} + +.flex-item img { + z-index: 0; + width: 52px; + position: absolute; + left: 7px; + top: 10px; +} + +.flex-item h2 { + margin: 0; + line-height: 1.6; + margin-left: 56px; +} + +.l-header { + position: absolute; + box-shadow: none !important; +} + +.header { + display: flex; + align-items: center; + height: 65px; + background-color: transparent !important; + border: none !important; +} + +#bg { + position: absolute; + width: 1280px; + height: 720px; + z-index: -100; + background-image: url("./help/img/bg_detail_scuffle.webp"); + background-size: 125%; + background-position-y: center; + background-position-x: -50px; + background-attachment: scroll; +} + +.scrollbar { + position: absolute; + margin-left: 20px; + overflow-y: overlay; + max-height: 626px; + width: 90%; + padding-right: 25px; +} + +.scrollbar::-webkit-scrollbar { + background: none; + margin-left: 17px; +} + +.scrollbar::-webkit-scrollbar-track { + margin-top: 0px; + margin-bottom: 50px; + border-radius: 10px; + background-color: #B5B5B5; +} + +.scrollbar::-webkit-scrollbar { + width: 12px; +} + +.scrollbar::-webkit-scrollbar-thumb { + border-radius: 10px; + border: 3px solid; + border-color: #B5B5B5; + background-color: #e3e3e3; +} + +.header-decoration { + background: orangered; + padding-left: 20px; + -webkit-clip-path: polygon(0 0, 100% 0, 66% 99%, 0 81%) !important; + clip-path: polygon(0 0, 100% 0, 66% 99%, 0 81%) !important; +} + +.background-clip { + -webkit-clip-path: polygon(100% 0%, 0 0, 0 100%); + clip-path: polygon(100% 0%, 0 0, 0 100%); + background-color: black; + position: absolute; + min-width: 400px; + min-height: 85px; + z-index: -1; + top: 0; +} + +.ret-icon path { + fill: #f14c4c; +} + +.ret-icon-shadow path { + fill: #450000; +} + +.hidden{ + visibility: hidden; +} + +#region { + display: none; +} + +#logging { + display: none; +} + +#workspaces { + display: block; +} + +img, svg{ + opacity: 1 !important; +} \ No newline at end of file diff --git a/romfs/source/ui/docs/placeholder.png b/romfs/source/ui/docs/placeholder.png new file mode 100644 index 0000000000..e22ab7d6b3 Binary files /dev/null and b/romfs/source/ui/docs/placeholder.png differ diff --git a/romfs/source/ui/docs/smash64.webp b/romfs/source/ui/docs/smash64.webp deleted file mode 100644 index 40c737f369..0000000000 Binary files a/romfs/source/ui/docs/smash64.webp and /dev/null differ diff --git a/romfs/source/ui/docs/tag.webp b/romfs/source/ui/docs/tag.webp deleted file mode 100644 index d7010e05c8..0000000000 Binary files a/romfs/source/ui/docs/tag.webp and /dev/null differ diff --git a/romfs/source/ui/docs/toggles.js b/romfs/source/ui/docs/toggles.js new file mode 100644 index 0000000000..2c068bf156 --- /dev/null +++ b/romfs/source/ui/docs/toggles.js @@ -0,0 +1,169 @@ +const maxModes = 3; +var selectedOverhaul = ''; +/** + * @type {string[]} + */ +const enabledModes = []; + +/** + * @param {string} mode_name + * @param {{ blur: () => void; focus: () => void; }} self + * @param {string} elementID + */ +function toggle(mode_name, self, elementID) { + // Enforce maximum number of enabled modes + if (enabledModes.length >= maxModes && !enabledModes.includes(mode_name)) { + textFocus('Too many modes selected!\nDisable another mode to enable this one.'); // Update focus text + return; + } + + // Toggle mode + if (enabledModes.includes(mode_name)) { + enabledModes.splice(enabledModes.indexOf(mode_name), 1); + } else { + enabledModes.push(mode_name); + } + const x = document.getElementById(elementID); + if (x.style.display === "none") { + x.style.display = "block"; + } else { + x.style.display = "none"; + } + self.blur(); + self.focus(); +} + +/** + * @param {string} text + */ +function textFocus(text) { + document.getElementById("focus-text").innerHTML = text; +} + +/** + * @param {string} imageSrc + */ +function updatePreview(imageSrc) { + const preview = document.getElementById("gamemode-preview"); + if (preview) { + preview.src = imageSrc; + } +} + +var currentModeIndex = 0; +const overhauls = [ + { id: '', name: 'Select Game Overhaul', desc: 'Click to toggle various alternate system mechanics!', image: 'placeholder.png' }, + { id: 'smash64', name: 'Smash 64 Mode', desc: 'Clash in classic fashion! Removes DI, airdodges, walltechs, and landing lag. Also raises hitstun and shieldstun, and alters character physics.', image: 'placeholder.png' }, + { id: 'rivalsofaether', name: 'Rivals of Aether Mode', desc: 'Removes shields, grabs, ledges, & spotdodges, and walljump from specials, hitfalling, and improved movement!', image: 'placeholder.png' } +]; + +/** + * @param {string} elementID + */ +function cycleOverhaul(elementID) { + // Cycle to next mode + currentModeIndex = (currentModeIndex + 1) % overhauls.length; + const currOverhaul = overhauls[currentModeIndex]; + + // Update button text + const button = document.getElementById('gamemode-cycle-button'); + if (button) { + button.querySelector('h2').textContent = currOverhaul.name; + } + + textFocus(currOverhaul.desc); // Update focus text + updatePreview(currOverhaul.image); // Update preview image + + // Remove all game modes from enabled array + overhauls.forEach(mode => { + // Hide checkmark + if (mode.id) { + const checkmark = document.getElementById(mode.id); + if (checkmark) { + checkmark.style.display = "none"; + } + } + }); + + // If a valid mode was selected, enable it + const x = document.getElementById(elementID); + if (currOverhaul.id && currOverhaul.id !== "") { + selectedOverhaul = currOverhaul.id; + x.style.display = "block"; // Show checkmark + } else { + selectedOverhaul = ''; + x.style.display = "none"; + } +} + +var startColumnIndex = 0; +const columnsPerPage = 2; + +function updateColumnVisibility() { + // Get all columns (excluding column-left) + const allColumns = []; + var i = 1; + while (document.getElementById('column-' + i)) { + allColumns.push(document.getElementById('column-' + i)); + i++; + } + + // Calculate which columns should be visible + const endIndex = startColumnIndex + columnsPerPage; + + // Hide all columns, then show only the current page + allColumns.forEach(function(col, index) { + if (index >= startColumnIndex && index < endIndex) { + col.style.display = 'block'; + } else { + col.style.display = 'none'; + } + }); +} + +function nextPage() { + const allColumns = []; + var i = 1; + while (document.getElementById('column-' + i)) { + allColumns.push(document.getElementById('column-' + i)); + i++; + } + + const maxStartIndex = allColumns.length - columnsPerPage; + startColumnIndex++; + if (startColumnIndex > maxStartIndex) { + startColumnIndex = 0; + } + updateColumnVisibility(); +} + +function previousPage() { + const allColumns = []; + var i = 1; + while (document.getElementById('column-' + i)) { + allColumns.push(document.getElementById('column-' + i)); + i++; + } + + startColumnIndex--; + if (startColumnIndex < 0) { + startColumnIndex = allColumns.length - columnsPerPage; + } + updateColumnVisibility(); +} + +function saveAndExit() { + if (enabledModes === undefined || enabledModes.length == 0) { + location.href = "http://localhost/"; + } + + var str = ""; + if (!!selectedOverhaul && selectedOverhaul !== '') { + var allModes = [selectedOverhaul].concat(enabledModes); + str = allModes.join("-"); + } else { + str = enabledModes.join("-"); + } + + location.href = "http://localhost/" + str; +} diff --git a/romfs/source/ui/docs/turbo.webp b/romfs/source/ui/docs/turbo.webp deleted file mode 100644 index 0159565e93..0000000000 Binary files a/romfs/source/ui/docs/turbo.webp and /dev/null differ diff --git a/romfs/source/ui/script_patch/common/stage_select_actor3.lua b/romfs/source/ui/script_patch/common/stage_select_actor3.lua index 8e5fc89ec7..2cf9625178 100644 --- a/romfs/source/ui/script_patch/common/stage_select_actor3.lua +++ b/romfs/source/ui/script_patch/common/stage_select_actor3.lua @@ -194,7 +194,8 @@ local StagePanel = { -- R46 frame_ = 0, target_scale_ = 0.0, scale_value_ = 0.0, - is_striked_ = false + is_striked_ = false, + is_perma_striked_ = false, } end } @@ -486,7 +487,6 @@ local set_tab_form_text = function(stage_form) } tab_layout:play_animation(string.format("stage_%s", form_names[stage_form + 1]), 1.0) - tab_form_button_pane:set_text_message(string.format("mel_stage_select_%s", form_names[stage_form + 1])) end -- Plays the looping long-cancel sound effect (when you are holding B to exit) @@ -1030,6 +1030,22 @@ local change_sub_page = function(target_page) local current_page_ = pages[current_page + 1] local target_page_ = pages[target_page + 1] + local page_back = target_page + if target_page < 1 then + page_back = #pages + end + + local page_current = target_page + 1 + + local page_forward = target_page + 2 + if page_forward > #pages then + page_forward = 1 + end + + root_view:get_pane("txt_page_back"):set_text_string("Page " .. page_back) + root_view:get_pane("txt_page_forward"):set_text_string("Page " .. page_forward) + tab_form_button_pane:set_text_string("Page " .. page_current) + local positions = {} for i = 1, PANELS_PER_PAGE, 1 do @@ -1069,7 +1085,16 @@ local setup = function() stage_panels[i] = StagePanel.new() local strike_panel = root_view:get_parts(get_stage_panel_name(i - 1)):get_pane("set_rep_strike") + local perma_strike_panel = root_view:get_parts(get_stage_panel_name(i - 1)):get_pane("set_rep_perma") strike_panel:set_visible(false) + perma_strike_panel:set_visible(false) + + local is_perma_strike = HDR.is_perma_strike_stage(i) + if is_perma_strike then + stage_panels[i].is_striked_ = true + stage_panels[i].is_perma_striked_ = true + perma_strike_panel:set_visible(true) + end end for i = 0, USE_STAGE_NUM - 1, 1 do @@ -1332,6 +1357,23 @@ local setup_from_environment = function() end UiScriptPlayer.invoke("setup_bgm") + + local selected_panel_id = HDR.get_selected_panel() + local selected_preview_id = HDR.get_selected_preview() + + local page = 0 + local panel = 0 + local preview = 0 + + if selected_panel_id ~= UI_INVALID_INDEX then + page = selected_panel_id // PANELS_PER_PAGE + panel = selected_panel_id + preview = selected_preview_id + end + + change_sub_page(page) + set_stage_preview_from_stage_panel(preview, panel) + set_alt_panel_textures(nil) end -- Cancels, presumably a part of the exit sequence @@ -1492,12 +1534,43 @@ local check_for_cancel = function() end local strike_stage = function(panel_id, is_strike) - if panel_id ~= UI_INVALID_INDEX and stage_panels[panel_id + 1].is_striked_ ~= is_strike then - stage_panels[panel_id + 1].is_striked_ = is_strike + if panel_id ~= UI_INVALID_INDEX then UiSoundManager.play_se_label("se_system_plate_catch") - local parts = root_view:get_parts(get_stage_panel_name(panel_id)) - local strike_pane = parts:get_pane("set_rep_strike") - strike_pane:set_visible(is_strike) + if is_strike then + if stage_panels[panel_id + 1].is_perma_striked_ then + stage_panels[panel_id + 1].is_striked_ = false + stage_panels[panel_id + 1].is_perma_striked_ = false + local parts = root_view:get_parts(get_stage_panel_name(panel_id)) + local strike_pane = parts:get_pane("set_rep_strike") + local perma_strike_pane = parts:get_pane("set_rep_perma") + strike_pane:set_visible(false) + perma_strike_pane:set_visible(false) + HDR.set_perma_strike_stage(panel_id + 1, false) + elseif stage_panels[panel_id + 1].is_striked_ then + stage_panels[panel_id + 1].is_perma_striked_ = true + local parts = root_view:get_parts(get_stage_panel_name(panel_id)) + local strike_pane = parts:get_pane("set_rep_strike") + local perma_strike_pane = parts:get_pane("set_rep_perma") + strike_pane:set_visible(false) + perma_strike_pane:set_visible(true) + HDR.set_perma_strike_stage(panel_id + 1, true) + else + stage_panels[panel_id + 1].is_striked_ = true + local parts = root_view:get_parts(get_stage_panel_name(panel_id)) + local strike_pane = parts:get_pane("set_rep_strike") + strike_pane:set_visible(true) + HDR.set_perma_strike_stage(panel_id + 1, false) + end + else + stage_panels[panel_id + 1].is_striked_ = false + stage_panels[panel_id + 1].is_perma_striked_ = false + local parts = root_view:get_parts(get_stage_panel_name(panel_id)) + local strike_pane = parts:get_pane("set_rep_strike") + local perma_strike_pane = parts:get_pane("set_rep_perma") + strike_pane:set_visible(false) + perma_strike_pane:set_visible(false) + HDR.set_perma_strike_stage(panel_id + 1, false) + end end end @@ -1652,6 +1725,8 @@ local decide_normal_stage = function() return false end + HDR.set_selected_panel_and_preview(current_selected_panel, current_selected_preview) + UiScriptPlayer.invoke("set_medal_visible", current_selected_preview, true) UiScriptPlayer.invoke("set_medal_collect_range_from_panel", current_selected_preview, current_selected_panel) if UiScriptPlayer.invoke("is_hand_interpolated_moving") == false then @@ -1752,9 +1827,16 @@ local handle_panel_decide = function() UiScriptPlayer.invoke("play_rumble_input_device") end - UiSoundManager.play_se_label("se_system_plate_off_stageselect") - if IS_DECIDE_SE_AUDIENCE == true then + if IS_MY_MUSIC == false and HDR.is_css_first() then + -- the CSS used to play these when going to a match, so now + -- the SSS does + UiSoundManager.play_se_label("se_system_r2f_fixed") UiSoundManager.play_se_label("se_audience_suddendeath") + else + UiSoundManager.play_se_label("se_system_plate_off_stageselect") + if IS_DECIDE_SE_AUDIENCE then + UiSoundManager.play_se_label("se_audience_suddendeath") + end end if check_all_previews_enabled() == true then @@ -2007,6 +2089,7 @@ end -- CLOSURE_74, R134 local update_stage_previews = function() + ENABLE_STAGE_FORM_TYPE = false prev_highlighed_preview = highlighed_preview highlighed_preview = UiScriptPlayer.invoke("get_hand_on_stage_preview_id") @@ -2371,6 +2454,7 @@ local try_handle_exiting_scene = function() update_panel_scalings() if scene_state == SCENE_STATE_SHOULD_EXIT then + HDR.stage_loading(); next_scene_animation:play(1.0) scene_state = SCENE_STATE_EXITING elseif scene_state == SCENE_STATE_EXITING then @@ -2573,7 +2657,14 @@ local regular_main_update = function() end end if is_valid_stage == true and prepare_scene_exit() == true then - UiSoundManager.play_se_label("se_system_fixed_s") + if IS_MY_MUSIC == false and HDR.is_css_first() then + -- the CSS used to play these when going to a match, so now + -- the SSS does + UiSoundManager.play_se_label("se_system_r2f_fixed") + UiSoundManager.play_se_label("se_audience_suddendeath") + else + UiSoundManager.play_se_label("se_system_fixed_s") + end local off_preview_index = -1 if check_all_previews_enabled() == false then play_off_preview_animation(current_selected_preview) @@ -2686,7 +2777,9 @@ main = function() stage_select_bgm:setup() setup_from_environment() root_view:play_animation("in", 1.0) + IS_SIMPLE_CANCEL = IS_SIMPLE_CANCEL or HDR.is_css_first() if IS_SIMPLE_CANCEL == true then + BACK_POPUP_ID = nil local parts = root_view:get_parts("set_parts_txt_head_00") if IS_RETURN_MENU == false then parts:play_animation("in", 1.0) @@ -2765,4 +2858,4 @@ end -- here begins The Great Buffer of empty string data, so that -- arcropolis will correctly allocate the necessary space for -- loading the (larger) tourney mode version of this file. --- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- +-- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- padding -- diff --git a/romfs/source/ui/script_patch/common/stage_select_actor3.tourney.lua b/romfs/source/ui/script_patch/common/stage_select_actor3.tourney.lua index d6063df31b..c63179b239 100644 --- a/romfs/source/ui/script_patch/common/stage_select_actor3.tourney.lua +++ b/romfs/source/ui/script_patch/common/stage_select_actor3.tourney.lua @@ -194,7 +194,8 @@ local StagePanel = { -- R46 frame_ = 0, target_scale_ = 0.0, scale_value_ = 0.0, - is_striked_ = false + is_striked_ = false, + is_perma_striked_ = false, } end } @@ -292,6 +293,9 @@ end -- this is basically a map local training_stages = {} +-- all of the (1 indexed) IDs which are actually Random +local random_stages = {} + -- Performs interpolation of a value using a sin wave for a more natural curve than just linear -- CLOSURE_4, R64 local sin_interpolate = function(progress, total) @@ -402,7 +406,6 @@ local set_tab_form_text = function(stage_form) } tab_layout:play_animation(string.format("stage_%s", form_names[stage_form + 1]), 1.0) - tab_form_button_pane:set_text_message(string.format("mel_stage_select_%s", form_names[stage_form + 1])) end -- Plays the looping long-cancel sound effect (when you are holding B to exit) @@ -634,6 +637,7 @@ local set_stage_preview_from_stage_panel = function(preview_index, panel_index) UiScriptPlayer.invoke("set_stage_preview_from_panel", preview_index, panel_index) set_stage_preview_form(preview_index, stage_previews[preview_index + 1].form_type_) + Alts.write_alt_field_to_bgm_id(preview_index, stage_previews[preview_index + 1].selected_alt_) end -- Sets the stage preview based on the selected custom stage panel @@ -1049,6 +1053,45 @@ local change_page = function(should_play_page_change) end local change_sub_page = function(target_page) + local back_page = target_page - 1 + if back_page < 0 then + back_page = total_pages - 1 + end + + local forward_page = target_page + 1 + if forward_page >= total_pages then + forward_page = 0 + end + + local back_page_name = HDR.get_page_name(back_page) + local forward_page_name = HDR.get_page_name(forward_page) + local current_page_name = HDR.get_page_name(target_page) + root_view:get_pane("txt_page_back"):set_text_string(back_page_name) + root_view:get_pane("txt_page_forward"):set_text_string(forward_page_name) + tab_form_button_pane:set_text_string(current_page_name) + + local bans = HDR.get_bans(target_page) + local dsr = HDR.get_dsr(target_page) + + local ban_dsr_string = "" + if bans > 1 then + ban_dsr_string = bans .. " Bans" + elseif bans > 0 then + ban_dsr_string = bans .. " Ban" + else + ban_dsr_string = "No Bans" + end + + if dsr == "None" or string.len(dsr) == 0 then + ban_dsr_string = ban_dsr_string .. " - No DSR" + else + ban_dsr_string = ban_dsr_string .. " - " .. dsr + end + + if string.len(ban_dsr_string) > 0 then + root_view:get_parts("set_parts_rule"):get_pane("set_txt_00"):set_text_string(ban_dsr_string) + end + -- Page is actually all the parts of the set_parts_n_stage_XXX local current_page_ = pages[current_page + 1] local target_page_ = pages[target_page + 1] @@ -1073,22 +1116,25 @@ local change_sub_page = function(target_page) -- reposition and show the new page's panels for i, panel in ipairs(target_page_) do -- dont reposition or show any invalid stages - if i > STAGE_PANEL_LIST_NUM then + if target_page * PANELS_PER_PAGE + i > STAGE_PANEL_LIST_NUM then break end -- set the preview UiScriptPlayer.invoke("set_stage_preview_from_panel", 0, target_page * PANELS_PER_PAGE + i - 1) - -- use the set preview to check if this preview is the training stage - local is_random = UiScriptPlayer.invoke("is_training_stage_preview", 0) + -- use the set preview to check if this preview is the training or random stage + local is_training = UiScriptPlayer.invoke("is_training_stage_preview", 0) + local is_random = UiScriptPlayer.invoke("is_random_stage_preview", 0) + + random_stages[target_page * PANELS_PER_PAGE + i] = is_random -- if its the training stage (which we are using as a buffer to align the stages), -- then hide the stage, and record whether its the training stage or not - print("is random: " .. tostring(is_random)) - if is_random == true then + print("is training: " .. tostring(is_training)) + if is_training == true then -- save that this is the training stage - training_stages[i] = true - print("found the random stage: " .. i) + training_stages[target_page * PANELS_PER_PAGE + i] = true + print("found the training stage: " .. target_page * PANELS_PER_PAGE + i) panel:set_visible(false) --[[ for getting reflective data about the stages @@ -1102,7 +1148,7 @@ local change_sub_page = function(target_page) ]] -- else - training_stages[i] = false + training_stages[target_page * PANELS_PER_PAGE + i] = false -- print("setting root pane parent pane position") -- panel:get_root_pane():get_parent_pane():set_position(positions[offset].x, positions[offset].y) @@ -1131,7 +1177,16 @@ local setup = function() stage_panels[i] = StagePanel.new() local strike_panel = root_view:get_parts(get_stage_panel_name(i - 1)):get_pane("set_rep_strike") + local perma_strike_panel = root_view:get_parts(get_stage_panel_name(i - 1)):get_pane("set_rep_perma") strike_panel:set_visible(false) + perma_strike_panel:set_visible(false) + + local is_perma_strike = HDR.is_perma_strike_stage(i) + if is_perma_strike then + stage_panels[i].is_striked_ = true + stage_panels[i].is_perma_striked_ = true + perma_strike_panel:set_visible(true) + end end for i = 0, USE_STAGE_NUM - 1, 1 do @@ -1258,6 +1313,8 @@ local setup_from_environment = function() current_id = i - 1 local preview = stage_previews[i] preview.enable_ = UiScriptPlayer.invoke("is_valid_entrance_param", current_id) + set_alt_texture(true, nil, current_id) + set_alt_texture(false, nil, current_id) if preview.enable_ == true then last_enabled_preview = i preview.form_type_ = UiScriptPlayer.invoke("get_stage_form_type_entrance_param", current_id) @@ -1386,8 +1443,22 @@ local setup_from_environment = function() UiScriptPlayer.invoke("setup_bgm") - change_sub_page(0) - set_stage_preview_from_stage_panel(0, 0) + local selected_panel_id = HDR.get_selected_panel() + local selected_preview_id = HDR.get_selected_preview() + + local page = 0 + local panel = 0 + local preview = 0 + + if selected_panel_id ~= UI_INVALID_INDEX then + page = selected_panel_id // PANELS_PER_PAGE + panel = selected_panel_id + preview = selected_preview_id + end + + change_sub_page(page) + set_stage_preview_from_stage_panel(preview, panel) + set_alt_panel_textures(nil) end -- Cancels, presumably a part of the exit sequence @@ -1548,11 +1619,43 @@ local check_for_cancel = function() end local strike_stage = function(panel_id, is_strike) - if panel_id ~= UI_INVALID_INDEX and stage_panels[panel_id + 1].is_striked_ ~= is_strike then - stage_panels[panel_id + 1].is_striked_ = is_strike - local parts = root_view:get_parts(get_stage_panel_name(panel_id)) - local strike_pane = parts:get_pane("set_rep_strike") - strike_pane:set_visible(is_strike) + if panel_id ~= UI_INVALID_INDEX then + UiSoundManager.play_se_label("se_system_plate_catch") + if is_strike then + if stage_panels[panel_id + 1].is_perma_striked_ then + stage_panels[panel_id + 1].is_striked_ = false + stage_panels[panel_id + 1].is_perma_striked_ = false + local parts = root_view:get_parts(get_stage_panel_name(panel_id)) + local strike_pane = parts:get_pane("set_rep_strike") + local perma_strike_pane = parts:get_pane("set_rep_perma") + strike_pane:set_visible(false) + perma_strike_pane:set_visible(false) + HDR.set_perma_strike_stage(panel_id + 1, false) + elseif stage_panels[panel_id + 1].is_striked_ then + stage_panels[panel_id + 1].is_perma_striked_ = true + local parts = root_view:get_parts(get_stage_panel_name(panel_id)) + local strike_pane = parts:get_pane("set_rep_strike") + local perma_strike_pane = parts:get_pane("set_rep_perma") + strike_pane:set_visible(false) + perma_strike_pane:set_visible(true) + HDR.set_perma_strike_stage(panel_id + 1, true) + else + stage_panels[panel_id + 1].is_striked_ = true + local parts = root_view:get_parts(get_stage_panel_name(panel_id)) + local strike_pane = parts:get_pane("set_rep_strike") + strike_pane:set_visible(true) + HDR.set_perma_strike_stage(panel_id + 1, false) + end + else + stage_panels[panel_id + 1].is_striked_ = false + stage_panels[panel_id + 1].is_perma_striked_ = false + local parts = root_view:get_parts(get_stage_panel_name(panel_id)) + local strike_pane = parts:get_pane("set_rep_strike") + local perma_strike_pane = parts:get_pane("set_rep_perma") + strike_pane:set_visible(false) + perma_strike_pane:set_visible(false) + HDR.set_perma_strike_stage(panel_id + 1, false) + end end end @@ -1707,6 +1810,8 @@ local decide_normal_stage = function() return false end + HDR.set_selected_panel_and_preview(current_selected_panel, current_selected_preview) + UiScriptPlayer.invoke("set_medal_visible", current_selected_preview, true) UiScriptPlayer.invoke("set_medal_collect_range_from_panel", current_selected_preview, current_selected_panel) if UiScriptPlayer.invoke("is_hand_interpolated_moving") == false then @@ -1807,9 +1912,16 @@ local handle_panel_decide = function() UiScriptPlayer.invoke("play_rumble_input_device") end - UiSoundManager.play_se_label("se_system_plate_off_stageselect") - if IS_DECIDE_SE_AUDIENCE == true then + if IS_MY_MUSIC == false and HDR.is_css_first() then + -- the CSS used to play these when going to a match, so now + -- the SSS does + UiSoundManager.play_se_label("se_system_r2f_fixed") UiSoundManager.play_se_label("se_audience_suddendeath") + else + UiSoundManager.play_se_label("se_system_plate_off_stageselect") + if IS_DECIDE_SE_AUDIENCE then + UiSoundManager.play_se_label("se_audience_suddendeath") + end end if check_all_previews_enabled() == true then @@ -2062,6 +2174,7 @@ end -- CLOSURE_74, R134 local update_stage_previews = function() + ENABLE_STAGE_FORM_TYPE = false prev_highlighed_preview = highlighed_preview highlighed_preview = UiScriptPlayer.invoke("get_hand_on_stage_preview_id") @@ -2121,7 +2234,7 @@ local update_stage_previews = function() end local is_striked = current_selected_panel ~= UI_INVALID_INDEX and - stage_panels[current_selected_panel + 1].is_striked_ + stage_panels[current_selected_panel + 1].is_striked_ if is_striked ~= prev_invalid_stage_2 then local anim = "on_atteintion" if not is_striked then @@ -2422,6 +2535,44 @@ local update_from_pointer = function() end end +local is_good_random_stage = function(stage_index) + return not training_stages[stage_index] and + not random_stages[stage_index] and + not stage_panels[stage_index].is_striked_ and + not stage_panels[stage_index].is_perma_striked_ +end + +-- Ult's lua engine doesn't include a random implementation, so this function +-- pushes all non-training, non-random, non-struck stage panel indexes to the HDR stage manager, +-- then pulls a random index from it. +local handle_single_page_random = function() + local random_stage_select_count = 0 + + for i, panel in ipairs(pages[current_page + 1]) do + local index = current_page * PANELS_PER_PAGE + i + + if index > STAGE_PANEL_LIST_NUM then + break + end + + -- skip training, random, and struck stages + if is_good_random_stage(index) then + HDR.set_random_stage_index(index) + random_stage_select_count = random_stage_select_count + 1 + end + end + + if random_stage_select_count > 0 then + local random_index = HDR.get_random_stage_index() + un_decide_medal() + UiScriptPlayer.invoke("set_stage_preview_from_panel", 0, random_index - 1) + UiScriptPlayer.invoke("set_hand_position_from_panel", random_index - (current_page * PANELS_PER_PAGE) - 1) + UiScriptPlayer.invoke("set_medal_position_from_panel", 0, random_index - (current_page * PANELS_PER_PAGE) - 1) + change_panel(random_index - 1) + handle_panel_decide() + end +end + -- CLOSURE_79, R138 local try_handle_exiting_scene = function() if scene_state == SCENE_STATE_REGULAR or scene_state == SCENE_STATE_EXITED then @@ -2431,6 +2582,15 @@ local try_handle_exiting_scene = function() update_panel_scalings() if scene_state == SCENE_STATE_SHOULD_EXIT then + -- intercept the random stage and check if we need to handle single page random + if UiScriptPlayer.invoke("is_random_stage_preview", current_selected_preview) then + if virtual_input:is_pressing(INPUT_ALT_L) then + scene_state = SCENE_STATE_REGULAR + handle_single_page_random() + return false + end + end + HDR.stage_loading(); next_scene_animation:play(1.0) scene_state = SCENE_STATE_EXITING elseif scene_state == SCENE_STATE_EXITING then @@ -2633,7 +2793,14 @@ local regular_main_update = function() end end if is_valid_stage == true and prepare_scene_exit() == true then - UiSoundManager.play_se_label("se_system_fixed_s") + if IS_MY_MUSIC == false and HDR.is_css_first() then + -- the CSS used to play these when going to a match, so now + -- the SSS does + UiSoundManager.play_se_label("se_system_r2f_fixed") + UiSoundManager.play_se_label("se_audience_suddendeath") + else + UiSoundManager.play_se_label("se_system_fixed_s") + end local off_preview_index = -1 if check_all_previews_enabled() == false then play_off_preview_animation(current_selected_preview) @@ -2647,7 +2814,6 @@ local regular_main_update = function() end end elseif virtual_input:is_decide() == true and get_page_button_dir() == 0 then - -- possible handle_panel_decide() elseif virtual_input:is_pressed(INPUT_BGM_SELECT) == true then local index = current_selected_preview @@ -2748,7 +2914,9 @@ main = function() stage_select_bgm:setup() xpcall(setup_from_environment, print_error_handler) root_view:play_animation("in", 1.0) + IS_SIMPLE_CANCEL = IS_SIMPLE_CANCEL or HDR.is_css_first() if IS_SIMPLE_CANCEL == true then + BACK_POPUP_ID = nil local parts = root_view:get_parts("set_parts_txt_head_00") if IS_RETURN_MENU == false then parts:play_animation("in", 1.0) @@ -2788,18 +2956,21 @@ main = function() first.alt_ = stage_previews[1].selected_alt_ first.panel_ = stage_previews[1].panel_id_ first.form_ = stage_previews[1].form_type_ + Alts.write_alt_field_to_bgm_id(0, first.alt_) end if USE_STAGE_NUM > 1 then second.alt_ = stage_previews[2].selected_alt_ second.panel_ = stage_previews[2].panel_id_ second.form_ = stage_previews[2].form_type_ + Alts.write_alt_field_to_bgm_id(1, second.alt_) end if USE_STAGE_NUM > 2 then third.alt_ = stage_previews[3].selected_alt_ third.panel_ = stage_previews[3].panel_id_ third.form_ = stage_previews[3].form_type_ + Alts.write_alt_field_to_bgm_id(2, third.alt_) end Alts.set_alts( diff --git a/scripts/full_package.py b/scripts/full_package.py index 50ccad862f..dd5f2a00d1 100644 --- a/scripts/full_package.py +++ b/scripts/full_package.py @@ -36,7 +36,7 @@ def download_and_extract(owner: str, repo: str, tag: str, asset: str, extract_di extract(asset, extract_directory) def extract(asset: str, extract_directory = None): - with zipfile.ZipFile(asset, 'r') as zip_ref: + with zipfile.ZipFile(asset, 'r') as zip_ref: if extract_directory: extract_home = extract_directory os.makedirs("switch-package" + extract_home, exist_ok=True) @@ -54,8 +54,8 @@ def extract(asset: str, extract_directory = None): if hdr_version == "devrelease": os.chdir('switch-package/ultimate/mods/') - os.rename('hdr-assets', 'hdr-assets-private') - os.rename('hdr-stages', 'hdr-stages-private') + # os.rename('hdr-assets', 'hdr-assets-private') + # os.rename('hdr-stages', 'hdr-stages-private') # move hdr files into correct dir source_dir = '../../../build/hdr-switch/ultimate/mods/hdr-private/' target_dir = 'hdr-private/' @@ -66,7 +66,7 @@ def extract(asset: str, extract_directory = None): download_and_extract("Raytwo", "ARCropolis", "latest", "release.zip") download_and_extract("skyline-dev", "skyline", "beta", "skyline.zip", "/atmosphere/contents/01006A800016E000/") -download_and_extract("HDR-Development", "exlaunch", "latest", "HID-HDR.zip", "/atmosphere/contents/0100000000000013/exefs") +# download_and_extract("HDR-Development", "exlaunch", "latest", "HID-HDR.zip", "/atmosphere/contents/0100000000000013/exefs") download_and_extract("ThatNintendoNerd", "stage_config", "latest", "release.zip") print("getting libnro_hook.nro") @@ -82,7 +82,7 @@ def extract(asset: str, extract_directory = None): shutil.move("hdr-launcher.nro", "switch-package/atmosphere/contents/01006A800016E000/romfs/skyline/plugins/") print("getting libstage_alts.nro") -urllib.request.urlretrieve("https://github.com/blu-dev/stage-alts-2/releases/latest/download/libstage_alts.nro", "libstage_alts.nro") +urllib.request.urlretrieve("https://github.com/HDR-Development/stage-alts-2/releases/latest/download/libstage_alts.nro", "libstage_alts.nro") shutil.move("libstage_alts.nro", "switch-package/atmosphere/contents/01006A800016E000/romfs/skyline/plugins/") os.makedirs("switch-package/ultimate/stage-alts") diff --git a/src/chara_select/layout.rs b/src/chara_select/layout.rs index a3e304f750..adb3bacb38 100644 --- a/src/chara_select/layout.rs +++ b/src/chara_select/layout.rs @@ -48,6 +48,11 @@ impl Default for CharaSchema { #[skyline::hook(offset = 0x19eb840, inline)] pub unsafe fn init_css_hook(ctx: &InlineCtx) { + // Change "stacked" CSS flag to "separate" + // This unstacks echo fighters + let param_4 = ctx.registers[3].x() as *mut u8; + *param_4.add(1) = 1; + // reset all stored data to default let mut chara_data = CHARA_DATA.write().unwrap(); *chara_data = CharaData::default(); @@ -84,7 +89,7 @@ pub unsafe fn init_css_hook(ctx: &InlineCtx) { } let (mut whitelist, mut blacklist) = (Vec::new(), Vec::new()); - + let schema: CharaSchema = config.schemas.get(&config.order).cloned().unwrap_or_default(); let mut chara_order = if is_tourney_mode() { CharaSchema::default().order } else { schema.order.clone() }; // aegis is a special case and is loaded with two entries @@ -105,7 +110,6 @@ pub unsafe fn init_css_hook(ctx: &InlineCtx) { let dest = if should_load { &mut whitelist } else { &mut blacklist }; dest.push(chara.to_string()); - // println!("Fighter {chara} will{} be loaded", if should_load { "" } else { " not" }); } let mut icon_count = chara_order.len(); @@ -115,16 +119,16 @@ pub unsafe fn init_css_hook(ctx: &InlineCtx) { let kill_mythra = if whitelist.contains(&"light_first".to_string()) { 1 } else { 0 }; // die let random_idx = get_random_idx(dbg!(icon_count - kill_mythra)); // println!( - // "{icon_count} icons to load ({} out of {} blacklisted).\nRandom will be placed in slot {random_idx}", + // "{icon_count} icons to load ({} out of {} blacklisted).\nRandom will be placed in slot {random_idx}", // blacklist.len(), chara_order.len() + if schema.centered_random { 1 } else { 0 } // ); - + let mut fighters = chara_order.clone(); fighters.reverse(); // convert into a stack let mut new_order = Vec::new(); let mut push = false; - let use_general_all = chara_vec.iter().any(|x| (*x & !KEY_MASK) == hash40("ui_chara_general_all").0); + let use_general_all = chara_vec.iter().any(|x| (*x & !KEY_MASK) == hash40("ui_chara_general_all").0); for i in 0..icon_count { if i == random_idx && schema.centered_random && !push { let entry = if use_general_all { "general_all" } else { "random" }; @@ -141,7 +145,7 @@ pub unsafe fn init_css_hook(ctx: &InlineCtx) { }; if whitelist.contains(&next) { fighter = next }; } - + let num = i - if push { 1 } else { 0 }; if fighter == "random" && use_general_all { new_order.push(ui_chara("general_all", num)); diff --git a/src/chara_select/mod.rs b/src/chara_select/mod.rs index 65439e54ad..54f6a6f701 100644 --- a/src/chara_select/mod.rs +++ b/src/chara_select/mod.rs @@ -1,8 +1,9 @@ use std::{ collections::HashMap, + ffi::c_char, fs::*, path::{ Path, PathBuf }, - sync::{ LazyLock, RwLock } + sync::{ LazyLock, RwLock, atomic::Ordering } }; use skyline::hooks::InlineCtx; use smash2::{ @@ -11,6 +12,8 @@ use smash2::{ }; use serde::Deserialize; use utils::modules::TourneyConfig; +use utils::consts::{melee_mode, smash_mode}; +use crate::CSS_FIRST; mod layout; mod random; @@ -218,12 +221,99 @@ unsafe fn update_player_tag(arg1: u64, tag_index: *const u8) { call_original!(arg1, tag_index); } +#[skyline::hook(offset = 0x1a2d440, inline)] +unsafe fn css_advance_sfx_hook(ctx: &mut skyline::hooks::InlineCtx) { + // 0x18d72a665a = hash40("se_system_amiibo_write_2") // original sound + // 0x13d3b19adc = hash40("se_system_r2f_fixed") // original sound + let param_1 = ctx.registers[0].x() as *mut u32; + let sfx = if CSS_FIRST { 0x18d72a665a as u64 } else { 0x13d3b19adc as u64 }; + play_se(param_1, sfx); +} + +#[skyline::hook(offset = 0x1a2d594, inline)] +unsafe fn css_advance_sfx2_hook(ctx: &mut skyline::hooks::InlineCtx) { + if !CSS_FIRST { + // 0x17a3061361 = hash40("se_audience_suddendeath") + let sfx = 0x17a3061361 as u64; + let param_1 = ctx.registers[0].x() as *mut u32; + play_se(param_1, sfx); + } +} + +#[skyline::from_offset(0x2407280)] +unsafe fn play_se( + param_1: *mut u32, + sfx_hash_id: u64); + +// Tells any callers to this function that no echos are available +#[skyline::hook(offset = 0x1a1fa30)] +unsafe fn echo_swap_hook( + _param_1: i32, _param_2: u64, _param_3: u64, _param_4: u64, + _param_5: u64, _param_6: u64, _param_7: u64, _param_8: u64 +) -> u64 { + 1 +} + +// Kills the "Rules" button on the CSS when the CSS is first because it +// actually goes all the way to the main menu +#[skyline::hook(offset = 0x3771220)] +unsafe fn register_panel_button( + panel: *mut u64, + event_code: i32, + name: *const c_char, + arg4: u64, + arg5: u64, + arg6: u64, + arg7: u64, + arg8: u64, +) { + if CSS_FIRST && !name.is_null() && skyline::from_c_str(name as *const u8) == "set_btn_03_rule" { + return; + } + call_original!(panel, event_code, name, arg4, arg5, arg6, arg7, arg8); +} + +#[skyline::hook(offset = 0x1a2fecc, inline)] +fn override_min_players(ctx: &mut InlineCtx) { + let param_1 = ctx.registers[24].x() as *const u8; + let game_mode = unsafe { *(param_1.add(0x16c) as *const u32) } as i32; + let ruleset = unsafe { *(param_1.add(0x158) as *const u8) } as i32; + + // Set rule type for 1P mode + utils::one_player::IS_RULE_TIME.store(ruleset == smash_mode::TIME, Ordering::Relaxed); + + // set minimum required "ready" players to 1 + if game_mode == melee_mode::SMASH { + ctx.registers[11].set_w(1); + } +} + pub fn install() { skyline::install_hooks!( - update_player_tag + update_player_tag, + css_advance_sfx_hook, + css_advance_sfx2_hook, + echo_swap_hook, + register_panel_button, + override_min_players, ); + // Prevent the game from playing any CSS advance sound effects by default + skyline::patching::Patch::in_text(0x1a2d43c).nop(); + skyline::patching::Patch::in_text(0x1a2d590).nop(); + + layout::install(); random::install(); player_port::install(); + + // These patches are required to "undo" a stacked CSS + + // 1. Force the CSS to always use the "separate" fighter list instead of "stacked". + // This fixes the echo portraits on the character cards. + skyline::patching::Patch::in_text(0x1a20260).data(0x52800028u32); + + // 2. Force the singleton character vector builder (0x1a0a3e0) to always store separate=1 + // into inner_data+0x258. This fixes the miis. + skyline::patching::Patch::in_text(0x1a0a410).data(0x52800028u32); } \ No newline at end of file diff --git a/src/chara_select/player_port.rs b/src/chara_select/player_port.rs index 0843fad662..79be9485f8 100644 --- a/src/chara_select/player_port.rs +++ b/src/chara_select/player_port.rs @@ -1,7 +1,7 @@ use super::*; use ninput::*; use parking_lot::RwLock; -use crate::vsync::SsbuSync; +// use crate::vsync::SsbuSync; static ID_LIST: &[u32] = &[0, 1, 2, 3, 4, 5, 6, 7, 0x20]; @@ -188,10 +188,21 @@ unsafe fn count_active_players(instance: CharaSelect) -> i32 { active_players } +static mut IS_UNPRESSED : bool = false; // this function loops while the css is active, allowing for runtime operations #[skyline::hook(offset = 0x1a2b570)] unsafe fn css_main_loop(arg: *const CharaSelect) { { + if ninput::any::is_down(ninput::Buttons::MINUS) { + if !IS_UNPRESSED { + println!("Minus Pressed!"); + utils::open_modes_session(); + } + IS_UNPRESSED = true; + } else { + IS_UNPRESSED = false; + } + let instance = *arg; let mut data = PORT_DATA.write(); @@ -218,10 +229,10 @@ unsafe fn css_main_loop(arg: *const CharaSelect) { // } // TODO: is this really the best way to check for online gamemodes? - let is_online = (instance.max_players_allowed != 8 || instance.local_wireless != 0); - if SsbuSync::SyncEnv::online_only() { - SsbuSync::online::ToggleOnlineFix(is_online); - } + // let is_online = (instance.max_players_allowed != 8 || instance.local_wireless != 0); + // if SsbuSync::SyncEnv::online_only() { + // SsbuSync::online::ToggleOnlineFix(is_online); + // } if !data.enable_swap || instance.ready_state != 0 { return original!()(arg); diff --git a/src/controls.rs b/src/controls.rs index ed0f88990d..d7a7f19ea1 100644 --- a/src/controls.rs +++ b/src/controls.rs @@ -1,6 +1,5 @@ use skyline::hooks::InlineCtx; -use std::sync::atomic::{AtomicBool, Ordering}; -use ssbusync::*; +// use ssbusync::*; mod css; mod submenu; @@ -131,10 +130,27 @@ unsafe fn add_more_buttons(ctx: &mut skyline::hooks::InlineCtx) { ctx.registers[25].set_x(input_list_vector.len() as u64); } +// The function this hook replaces gets the number of missing required buttons +// (or some other type of error code) +// Returning 0 bypasses the check entirely +#[skyline::hook(offset = 0x1d2c8d0)] +unsafe fn get_missing_button_count_hook( + _context: u64, + mode: i32, + _p3: u64, + _p4: u64, + _p5: u64, + _p6: u64, + _p7: u64, + _p8: u64 +) -> i32 { + 0 +} + pub fn install() { unsafe { - skyline::patching::Patch::in_text(0x1D3594C).nop(); - css::install(); + skyline::patching::Patch::in_text(0x1D3594C).nop(); + css::install(); } skyline::install_hooks!( @@ -142,6 +158,7 @@ pub fn install() { add_footstool_to_gc, add_footstool_to_fk, add_footstool_to_jc, - add_more_buttons + add_more_buttons, + get_missing_button_count_hook, ); } diff --git a/src/controls/css.rs b/src/controls/css.rs index c7350fac36..65f2eb5e40 100644 --- a/src/controls/css.rs +++ b/src/controls/css.rs @@ -211,7 +211,7 @@ unsafe fn check_virtual_inputs(ctx: &mut InlineCtx) { if let Some(controls_id) = get_controls_id_from_button_id(root_layout, currently_pressing) { - if virt.pressed_y { + if virt.pressed_y && get_ptr_to_controls(controls_id).tag_len() != 0 { *submenu = Some(Box::new(TopLevel { controls_id })); true // } else if virt.pressed_x { diff --git a/src/lib.rs b/src/lib.rs index 2c95789d68..8c2c7b7358 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -42,9 +42,13 @@ mod matchup; pub mod vsync; use skyline::libc::c_char; +use std::os::raw::c_void; #[cfg(feature = "main_nro")] use skyline_web::*; use std::{fs, path::Path}; +use utils::STAGE_MANAGER; +use std::sync::atomic::Ordering; +use dynamic::util::MATCH_EXITING; #[cfg(not(feature = "main_nro"))] #[no_mangle] @@ -237,72 +241,98 @@ unsafe fn push_hash(game_state: u64, hash: u64) { *game_state.add(0xe8 / 8) += 1; } -// let this code stay dormant but this is an example of how to abuse the game state, -// this will exit the game without going to results at the end. +// game_end handles the normal end of game flow #[skyline::hook(offset = 0x14d6590)] unsafe fn game_end(game_state: u64) { - let one = - *(skyline::hooks::getRegionAddress(skyline::hooks::Region::Text) as *mut u8).add(0x52c41b2); - let mode = (skyline::hooks::getRegionAddress(skyline::hooks::Region::Text) as u64 + 0x53040f0) - as *const u64; - if one == 0 && *mode != 0x4040000 { - push_something(game_state, 2); - // push_hash(game_state, smash::hash40("statewaitforruletofinish")); - // push_hash(game_state, smash::hash40("statewaitendproduction")); - push_hash(game_state, smash::hash40("stateapplyparameters")); - // push_hash(game_state, smash::hash40("statewaitforsyncwhenending")); - push_hash(game_state, smash::hash40("statefadeoutwhenending")); - push_hash(game_state, smash::hash40("stateexit")); + if utils::one_player::one_player_entry() { + skip_results(game_state); return; } call_original!(game_state); } +// game_exit handles player-initiated end of game flow #[skyline::hook(offset = 0x14d7ef0)] unsafe fn game_exit(game_state: u64, arg: u64) { - let one = - *(skyline::hooks::getRegionAddress(skyline::hooks::Region::Text) as *mut u8).add(0x52c41b2); - let mode = (skyline::hooks::getRegionAddress(skyline::hooks::Region::Text) as u64 + 0x53040f0) - as *const u64; - if one == 0 && *mode != 0x4040000 { - push_something(game_state, 2); - // push_hash(game_state, smash::hash40("statewaitforruletofinish")); - // push_hash(game_state, smash::hash40("statewaitendproduction")); - push_hash(game_state, smash::hash40("stateapplyparameters")); - // push_hash(game_state, smash::hash40("statewaitforsyncwhenending")); - push_hash(game_state, smash::hash40("statefadeoutwhenending")); - push_hash(game_state, smash::hash40("stateexit")); + if utils::one_player::one_player_entry() { + skip_results(game_state); return; } - call_original!(game_state, arg); } -#[repr(C)] -pub struct FuckingAssStringStructureShit { - pub fuck_if_i_know: u32, - pub len: u32, - pub shit_ass_string: [u8; 40], +// Skips the results screen at the end of a game +unsafe fn skip_results(game_state: u64) { + push_something(game_state, 2); + // push_hash(game_state, smash::hash40("statewaitforruletofinish")); + // push_hash(game_state, smash::hash40("statewaitendproduction")); + push_hash(game_state, smash::hash40("stateapplyparameters")); + // push_hash(game_state, smash::hash40("statewaitforsyncwhenending")); + push_hash(game_state, smash::hash40("statefadeoutwhenending")); + push_hash(game_state, smash::hash40("stateexit")); } -impl FuckingAssStringStructureShit { +impl HashedString { pub fn set(&mut self, replacement: &str) { - self.len = replacement.len() as u32; - self.shit_ass_string[..replacement.len()].copy_from_slice(replacement.as_bytes()); - self.shit_ass_string[replacement.len()] = b'\0'; + self.length = replacement.len() as u32; + self.string[..replacement.len()].copy_from_slice(replacement.as_bytes()); + self.string[replacement.len()] = b'\0'; + } + + pub fn as_str(&self) -> &str { + let len = self.string.iter().position(|&c| c == 0).unwrap_or(self.string.len()); + std::str::from_utf8(&self.string[..len]).unwrap_or("") } } +pub static mut CSS_FIRST: bool = false; +pub static mut SSS_CANCEL_TO_CSS: bool = false; +pub static mut CSS_CANCEL_TO_LOCAL: bool = false; +pub static mut IN_LOCAL_WIRELESS: bool = false; + #[skyline::hook(offset = 0x23357f8, inline)] unsafe fn sss_to_css(ctx: &InlineCtx) { - let thing = ctx.registers[1].x() as *mut FuckingAssStringStructureShit; - (*thing).set("CharaSelectScene"); + let hashed_string = ctx.registers[1].x() as *mut HashedString; + let current_scene = (*hashed_string).as_str(); + + if current_scene == "StageSelectScene" { + CSS_FIRST = true; + (*hashed_string).set("CharaSelectScene"); + CSS_CANCEL_TO_LOCAL = IN_LOCAL_WIRELESS; + } } #[skyline::hook(offset = 0x2335184, inline)] unsafe fn css_to_sss(ctx: &InlineCtx) { - let thing = ctx.registers[1].x() as *mut FuckingAssStringStructureShit; - (*thing).set("StageSelectScene"); + let hashed_string = ctx.registers[1].x() as *mut HashedString; + let current_scene = (*hashed_string).as_str(); + + if current_scene == "CharaSelectScene" { + let text = skyline::hooks::getRegionAddress(skyline::hooks::Region::Text) as u64; + let flag_ptr = (text + 0x530996c) as *const u8; + + let flag = *flag_ptr.add(3); + + // This is something to pay attention to when this goes to prerelease + // flag == 0 is the standard mode and flag == 4 is random stage select + // Unsure if there are more modes, but I'm checking for standard mode just + // to be safe. If there are more modes we need to apply this to, we can + // add them as they're found. + if flag == 0 { + (*hashed_string).set("StageSelectScene"); + SSS_CANCEL_TO_CSS = IN_LOCAL_WIRELESS; + } + else { + CSS_FIRST = false; + } + } +} + +#[repr(C)] +pub struct HashedString { + pub length: u32, + pub hash: u32, + pub string: [u8; 64], } #[repr(C)] @@ -348,11 +378,75 @@ unsafe fn copy_fighter_info( call_original!(dst, src); } +// This is a hook on the main scene transition function +// key_str is the scene name +// Add anything requiring a scene transition check here +#[skyline::hook(offset = 0x3726120)] +unsafe fn scene_transition( + list_ptr: *mut c_void, + key_struct: *const HashedString, + context_struct: *const HashedString, + factory: *mut c_void +) { + if !key_struct.is_null() { + let str_ptr = (key_struct as *const u8).add(8) as *const c_char; + let initial_key = skyline::from_c_str(str_ptr); + println!("Transitioning to scene: '{}'", initial_key); + + // Catch Local Wireless transitions + if SSS_CANCEL_TO_CSS && initial_key == "MeleeRuleScene" { + (*(key_struct as *mut HashedString)).set("CharaSelectScene"); + SSS_CANCEL_TO_CSS = false; + } else if CSS_CANCEL_TO_LOCAL && initial_key == "MeleeRuleScene" { + (*(key_struct as *mut HashedString)).set("LocalTopScene"); + CSS_CANCEL_TO_LOCAL = false; + } + + let key_str = skyline::from_c_str((key_struct as *const u8).add(8) as *const c_char); + + if key_str == "MeleeRuleScene" || key_str == "MainMenuScene" { + // Clear perma-strikes when going to main menu or the rules screen + let mut mgr = STAGE_MANAGER.lock().unwrap(); + mgr.perma_striked_stages.clear(); + + // Make sure CSS-first state doesn't carry over to other modes unintentionally + CSS_FIRST = false; + + // Clear custom game modes so they don't carry over accidentally + utils::game_modes::reset_custom_mode(); + } + + // Set Local Wireless (because get_match_mode doesn't always work in some scenes) + if key_str.starts_with("Local") { + IN_LOCAL_WIRELESS = true; + } else if key_str == "MainMenuScene" || key_str == "MenuSequenceScene" { + IN_LOCAL_WIRELESS = false; + } + + if key_str != "StageSelectScene" && key_str != "CharaSelectScene" && key_str != "MeleeRuleScene" { + SSS_CANCEL_TO_CSS = false; + CSS_CANCEL_TO_LOCAL = false; + } + } + + MATCH_EXITING.store(false, Ordering::Relaxed); + + call_original!(list_ptr, key_struct, context_struct, factory); +} + +extern "C" { + #[link_name = "_ZN2nn5prepo10PlayReport4SaveERKNS_7account3UidE"] + fn save_report(uid: *mut u8); +} + +#[skyline::hook(replace = save_report)] +fn save_report_stub(uid: *mut u8) { } + #[skyline::main(name = "hdr")] pub fn main() { #[cfg(feature = "main_nro")] { - vsync::setup_ssbu_sync(); + // vsync::setup_ssbu_sync(); quick_validate_install(); skyline::install_hooks!(change_version_string_hook); chara_select::install(); @@ -362,18 +456,21 @@ pub fn main() { matchup::install(); skyline::patching::Patch::in_text(0x14f99cc).nop().unwrap(); skyline::patching::Patch::in_text(0x1509fd4).nop().unwrap(); + unlock_menu_music(); skyline::install_hooks!( training_reset_music1, training_reset_music2, main_menu_quick, title_screen_play, - //sss_to_css, - //css_to_sss, + sss_to_css, + css_to_sss, + scene_transition, + save_report_stub, //copy_fighter_info, //load_ingame_call_sequence_scene, //load_melee_scene, - //game_end, - //game_exit + game_end, + game_exit ); } @@ -382,12 +479,12 @@ pub fn main() { utils::init(); } - #[cfg(feature = "main_nro")] - { - if !is_on_ryujinx() { - setup_hid_hdr(); - } - } + // #[cfg(feature = "main_nro")] + // { + // if !is_on_ryujinx() { + // setup_hid_hdr(); + // } + // } fighters::install(); @@ -403,34 +500,34 @@ pub fn main() { } } -#[cfg(feature = "main_nro")] -pub fn setup_hid_hdr() { - let status = hid_hdr::get_hid_hdr_status().unwrap(); - match status { - hid_hdr::Status::NotConnected => { - if !hid_hdr::connect_to_hid_hdr() { - hid_hdr::warn_unable_to_connect("troubleshooting", "HDR", "discord.gg/hdr"); - return; - } - - let status = hid_hdr::get_hid_hdr_status().unwrap(); - match status { - hid_hdr::Status::Ok => { - hid_hdr::configure_stick_gate_changes(true).unwrap(); - } - other => { - hid_hdr::warn_status(other, "troubleshooting", "HDR", "discord.gg/hdr"); - } - } - } - hid_hdr::Status::Ok => { - panic!("Should not be possible yet"); - } - other => { - hid_hdr::warn_status(other, "troubleshooting", "HDR", "discord.gg/hdr"); - } - } -} +// #[cfg(feature = "main_nro")] +// pub fn setup_hid_hdr() { +// let status = hid_hdr::get_hid_hdr_status().unwrap(); +// match status { +// hid_hdr::Status::NotConnected => { +// if !hid_hdr::connect_to_hid_hdr() { +// hid_hdr::warn_unable_to_connect("troubleshooting", "HDR", "discord.gg/hdr"); +// return; +// } + +// let status = hid_hdr::get_hid_hdr_status().unwrap(); +// match status { +// hid_hdr::Status::Ok => { +// hid_hdr::configure_stick_gate_changes(true).unwrap(); +// } +// other => { +// hid_hdr::warn_status(other, "troubleshooting", "HDR", "discord.gg/hdr"); +// } +// } +// } +// hid_hdr::Status::Ok => { +// panic!("Should not be possible yet"); +// } +// other => { +// hid_hdr::warn_status(other, "troubleshooting", "HDR", "discord.gg/hdr"); +// } +// } +// } #[cfg(feature = "main_nro")] pub fn quick_validate_install() { @@ -544,3 +641,15 @@ pub fn quick_validate_install() { println!("simple validation complete."); } + +fn unlock_menu_music() { + if std::path::Path::new("sd:/ultimate/hdr-config/unlock_menu_music").exists() { + println!("WARNING: potentially bannable operation in effect!"); + // Patch the My Music UI to always show menu music as selectable + skyline::patching::Patch::in_text(0x184de0c).nop().unwrap(); + skyline::patching::Patch::in_text(0x184de10).data(0x390bbb9fu32).unwrap(); + // Patch the BGM playback function to always use the player's My Music selection + // instead of defaulting to the standard menu theme. + skyline::patching::Patch::in_text(0x3311f94).data(0x320003e8u32).unwrap(); + } +} \ No newline at end of file diff --git a/src/lua.rs b/src/lua.rs index 3de07eaae9..c47fa338b3 100644 --- a/src/lua.rs +++ b/src/lua.rs @@ -1,3 +1,12 @@ +#![allow(improper_ctypes)] + +use rand::{seq::SliceRandom, thread_rng}; +use rlua_lua53_sys as lua; +use std::ffi::CString; +use utils::modules::stage_mgr::STAGE_MANAGER; + +use crate::CSS_FIRST; + macro_rules! lua_gettop { ($state:ident) => {{ let top = *($state as *const u64).add(2); @@ -431,6 +440,317 @@ unsafe fn set_parry_button_taunt_text(ctx: &skyline::hooks::InlineCtx) { } } +// Borrowed a ton of this logic from stage-alts-2 +// Thanks Blujay!! +unsafe fn push_new_singleton( + lua_state: *mut lua::lua_State, + name: &'static str, + registry: &[lua::luaL_Reg], +) { + let real_name = format!("{}\0", name); + let meta_name = format!("Metatable{}\0", name); + lua::luaL_newmetatable(lua_state, meta_name.as_ptr() as _); + lua::lua_pushvalue(lua_state, -1); + lua::lua_setfield(lua_state, -2, "__index\0".as_ptr() as _); + + lua::luaL_setfuncs(lua_state, registry.as_ptr(), 0); + lua::lua_pop(lua_state, 1); + + lua::lua_newtable(lua_state); + lua::lua_getfield(lua_state, lua::LUA_REGISTRYINDEX, meta_name.as_ptr() as _); + lua::lua_setmetatable(lua_state, -2); + + let global_table = lua::bindings::index2addr(lua_state, lua::LUA_REGISTRYINDEX); + let table = (*global_table).value.ptr; + let value = if *(table as *mut u32).add(3) < 2 { + todo!() + } else { + (*(table as *mut *mut lua::bindings::TValue).add(2)).add(1) + }; + lua::bindings::auxsetstr(lua_state, value, real_name.as_ptr() as _); +} + +extern "C" { + fn add_to_key_context(ctx: &skyline::hooks::InlineCtx); +} + +#[skyline::hook(replace = add_to_key_context)] +unsafe fn add_to_key_context_hook(ctx: &skyline::hooks::InlineCtx) { + call_original!(ctx); + + let lua_state: *mut lua::lua_State = ctx.registers[19].x() as _; + + let registry = &[ + lua::luaL_Reg { + name: "send_message\0".as_ptr() as _, + func: Some(send_message), + }, + lua::luaL_Reg { + name: "set_selected_panel_and_preview\0".as_ptr() as _, + func: Some(set_selected_panel_and_preview), + }, + lua::luaL_Reg { + name: "get_selected_panel\0".as_ptr() as _, + func: Some(get_selected_panel), + }, + lua::luaL_Reg { + name: "get_selected_preview\0".as_ptr() as _, + func: Some(get_selected_preview), + }, + lua::luaL_Reg { + name: "set_perma_strike_stage\0".as_ptr() as _, + func: Some(set_perma_strike_stage), + }, + lua::luaL_Reg { + name: "is_perma_strike_stage\0".as_ptr() as _, + func: Some(is_perma_strike_stage), + }, + lua::luaL_Reg { + name: "get_page_name\0".as_ptr() as _, + func: Some(get_page_name), + }, + lua::luaL_Reg { + name: "set_random_stage_index\0".as_ptr() as _, + func: Some(set_random_stage_index), + }, + lua::luaL_Reg { + name: "get_random_stage_index\0".as_ptr() as _, + func: Some(get_random_stage_index), + }, + lua::luaL_Reg { + name: "stage_loading\0".as_ptr() as _, + func: Some(stage_loading), + }, + lua::luaL_Reg { + name: "get_bans\0".as_ptr() as _, + func: Some(get_bans), + }, + lua::luaL_Reg { + name: "get_dsr\0".as_ptr() as _, + func: Some(get_dsr), + }, + lua::luaL_Reg { + name: "is_css_first\0".as_ptr() as _, + func: Some(is_css_first), + }, + lua::luaL_Reg { + name: std::ptr::null(), + func: None, + }, + ]; + + push_new_singleton(lua_state, "HDR", registry); +} + +extern "C" fn send_message(state: *mut lua::lua_State) -> i32 { + unsafe { + let value = skyline::from_c_str(lua::lua_tostring(state, -1) as _); + println!("HDR Lua says: {}", value); + lua::lua_pop(state, 1); + 0 + } +} + +extern "C" fn set_selected_panel_and_preview(state: *mut lua::lua_State) -> i32 { + unsafe { + let preview_id = lua::lua_tointegerx(state, -1, std::ptr::null_mut()) as i32; + lua::lua_pop(state, 1); + + let panel_id = lua::lua_tointegerx(state, -1, std::ptr::null_mut()) as i32; + lua::lua_pop(state, 1); + + let mut mgr = STAGE_MANAGER.lock().unwrap(); + + mgr.selected_panel = Some(panel_id); + mgr.selected_preview = Some(preview_id); + + println!("selected_panel set to: {}", panel_id); + println!("selected_preview set to: {}", preview_id); + + 0 + } +} + +extern "C" fn get_selected_panel(state: *mut lua::lua_State) -> i32 { + unsafe { + let mgr = STAGE_MANAGER.lock().unwrap(); + if let Some(panel_id) = mgr.selected_panel { + lua::lua_pushinteger(state, panel_id as i64); + return 1; + } + + lua::lua_pushinteger(state, -1); + 1 + } +} + +extern "C" fn get_selected_preview(state: *mut lua::lua_State) -> i32 { + unsafe { + let mgr = STAGE_MANAGER.lock().unwrap(); + if let Some(preview_id) = mgr.selected_preview { + lua::lua_pushinteger(state, preview_id as i64); + return 1; + } + + lua::lua_pushinteger(state, -1); + 1 + } +} + +extern "C" fn set_perma_strike_stage(state: *mut lua::lua_State) -> i32 { + unsafe { + let is_strike = lua::lua_toboolean(state, -1) > 0; + lua::lua_pop(state, 1); + + let panel_id = lua::lua_tointegerx(state, -1, std::ptr::null_mut()) as i32; + lua::lua_pop(state, 1); + + let mut mgr = STAGE_MANAGER.lock().unwrap(); + + if is_strike { + mgr.perma_striked_stages.insert(panel_id); + } else { + mgr.perma_striked_stages.remove(&panel_id); + } + + 0 + } +} + +extern "C" fn is_perma_strike_stage(state: *mut lua::lua_State) -> i32 { + unsafe { + let panel_id = lua::lua_tointegerx(state, -1, std::ptr::null_mut()) as i32; + lua::lua_pop(state, 1); + + let mut mgr = STAGE_MANAGER.lock().unwrap(); + if mgr.perma_striked_stages.contains(&panel_id) { + lua::lua_pushboolean(state, 1); + } else { + lua::lua_pushboolean(state, 0); + } + + 1 + } +} + +extern "C" fn get_page_name(state: *mut lua::lua_State) -> i32 { + unsafe { + let page_num = lua::lua_tointegerx(state, -1, std::ptr::null_mut()) as usize; + lua::lua_pop(state, 1); + + let mut mgr = STAGE_MANAGER.lock().unwrap(); + let stages = mgr.stage_pages.as_ref().unwrap(); + let mut c_str = CString::new("").expect(""); + if page_num < stages.len() { + c_str = CString::new(stages[page_num].name.clone()).expect("String contained null byte"); + } + + lua::lua_pushstring(state, c_str.as_ptr()); + + 1 + } +} + +extern "C" fn set_random_stage_index(state: *mut lua::lua_State) -> i32 { + unsafe { + let index = lua::lua_tointegerx(state, -1, std::ptr::null_mut()) as i32; + lua::lua_pop(state, 1); + + let mut mgr = STAGE_MANAGER.lock().unwrap(); + + mgr.random_stage_indexes.get_or_insert(Vec::new()).push(index); + + 0 + } +} + +extern "C" fn get_random_stage_index(state: *mut lua::lua_State) -> i32 { + unsafe { + let mut rng = thread_rng(); + let mut mgr = STAGE_MANAGER.lock().unwrap(); + + if let Some(indexes) = &mgr.random_stage_indexes { + let index = indexes.choose(&mut rng); + match index { + Some(value) => lua::lua_pushinteger(state, *value as i64), + None => lua::lua_pushinteger(state, -1), + } + } + + mgr.random_stage_indexes = None; + + 1 + } +} + +extern "C" fn stage_loading(state: *mut lua::lua_State) -> i32 { + unsafe { + let mut mgr = STAGE_MANAGER.lock().unwrap(); + mgr.stage_loading = Some(true); + 0 + } +} + +extern "C" fn get_bans(state: *mut lua::lua_State) -> i32 { + unsafe { + let page_num = lua::lua_tointegerx(state, -1, std::ptr::null_mut()) as usize; + lua::lua_pop(state, 1); + let mut mgr = STAGE_MANAGER.lock().unwrap(); + + if let Some(pages) = &mgr.stage_pages { + if page_num < pages.len() { + let page = &pages[page_num]; + match page.bans { + Some(bans) => lua::lua_pushinteger(state, bans as i64), + None => lua::lua_pushinteger(state, -1), + } + } + else { + lua::lua_pushinteger(state, -1); + } + } + + 1 + } +} + +extern "C" fn get_dsr(state: *mut lua::lua_State) -> i32 { + unsafe { + let page_num = lua::lua_tointegerx(state, -1, std::ptr::null_mut()) as usize; + lua::lua_pop(state, 1); + let mut mgr = STAGE_MANAGER.lock().unwrap(); + + if let Some(pages) = &mgr.stage_pages { + if page_num < pages.len() { + let page = &pages[page_num]; + match &page.dsr { + Some(dsr) => { + let c_str = CString::new(dsr.clone()).expect("String contained null byte"); + lua::lua_pushstring(state, c_str.as_ptr()); + }, + None => { + let c_str = CString::new("").expect(""); + lua::lua_pushstring(state, c_str.as_ptr()); + }, + } + } + else { + let c_str = CString::new("").expect(""); + lua::lua_pushstring(state, c_str.as_ptr()); + } + } + + 1 + } +} + +extern "C" fn is_css_first(state: *mut lua::lua_State) -> i32 { + unsafe { + lua::lua_pushboolean(state, if CSS_FIRST { 1 } else { 0 }); + 1 + } +} + pub fn install() { unsafe { skyline::patching::Patch::in_text(0x5292c70).data((lua_print_impl as *const ())); @@ -460,6 +780,7 @@ pub fn install() { exit_jc, set_pane_text_values, set_parry_button_shield_text, - set_parry_button_taunt_text + set_parry_button_taunt_text, + add_to_key_context_hook ); } diff --git a/src/matchup.rs b/src/matchup.rs index bc1127dca3..1dc75418a9 100644 --- a/src/matchup.rs +++ b/src/matchup.rs @@ -1,9 +1,10 @@ mod containers; mod types; +use self::types::FilesystemInfo; use skyline::hooks::InlineCtx; use smash_arc::SearchLookup; -use self::types::FilesystemInfo; +use utils::STAGE_MANAGER; fn get_pane_from_layout(layout_data: u64, name: &str) -> Option { unsafe { @@ -25,6 +26,8 @@ unsafe fn get_filepath_index_by_hash40(index: &mut u32, hash40: u64); #[skyline::hook(offset = 0x1ee9edc, inline)] unsafe fn among_us_baby(ctx: &InlineCtx) { let layout_view = ctx.registers[0].x(); + let mut mgr = STAGE_MANAGER.lock().unwrap(); + let stage_loading = mgr.stage_loading.unwrap_or(false); let pane = get_pane_from_layout(layout_view, "perry\0").unwrap(); let mut index = 0u32; @@ -37,7 +40,11 @@ unsafe fn among_us_baby(ctx: &InlineCtx) { hash40::hash40(".bntx") }; - let stage_hash = hash40::Hash40(STAGE_HASH).concat(file_suffix); + let mut stage_hash = if stage_loading { + hash40::hash40("ui/replace_patch/stage/stage_2/stage_2_randomnormal.bntx") + } else { + hash40::Hash40(STAGE_HASH).concat(file_suffix) + }; get_filepath_index_by_hash40(&mut index, stage_hash.0); replace_texture(pane, &index); @@ -88,6 +95,8 @@ unsafe fn incoming_stage_load(ctx: &InlineCtx) { } else { STAGE_HASH = hash40::hash40(root_path).concat(file_name).0; } + let mut mgr = STAGE_MANAGER.lock().unwrap(); + mgr.stage_loading = Some(false); } static mut SHOULD_PLAY: bool = false; diff --git a/src/vsync.rs b/src/vsync.rs index ea39388129..1cd18140b1 100644 --- a/src/vsync.rs +++ b/src/vsync.rs @@ -1,28 +1,28 @@ -pub use ssbusync as SsbuSync; -use SsbuSync::*; +// pub use ssbusync as SsbuSync; +// use SsbuSync::*; -pub fn setup_ssbu_sync() { - println!("[HDR] installing custom ssbusync path via Main \n"); - let mut sync_config = SsbuSyncConfig::default(); - sync_config.disable_vsync = true; - sync_config.disable_pacer = false; - sync_config.slow_pacer_bias = false; - sync_config.enable_triple_buffer = false; - sync_config.allow_buffer_swap = false; - sync_config.smooth_ffa = false; - sync_config.online_only = false; +// pub fn setup_ssbu_sync() { +// println!("[HDR] installing custom ssbusync path via Main \n"); +// let mut sync_config = SsbuSyncConfig::default(); +// sync_config.disable_vsync = true; +// sync_config.disable_pacer = false; +// sync_config.slow_pacer_bias = false; +// sync_config.enable_triple_buffer = false; +// sync_config.allow_buffer_swap = false; +// sync_config.smooth_ffa = false; +// sync_config.online_only = false; - // create a profile with ssbusync config - // but we don't actually use the options that are stored in that profile if they are changed by the user - SsbuSync::Get_Init_SsbuSync_Profile("HDR", &sync_config, 1.0); - ssbusync::Install_SSBU_Sync(sync_config); +// // create a profile with ssbusync config +// // but we don't actually use the options that are stored in that profile if they are changed by the user +// SsbuSync::Get_Init_SsbuSync_Profile("HDR", &sync_config, 1.0); +// ssbusync::Install_SSBU_Sync(sync_config); - // if ssbusync::render::buffer_swap::subscribe_buffer_mode_change(on_buffer_switch) { - // println!("[HDR] Subscribed to buffer switch \n"); - // } else { - // println!("[HDR] Failed to subscribe to buffer switch \n"); - // } -} +// // if ssbusync::render::buffer_swap::subscribe_buffer_mode_change(on_buffer_switch) { +// // println!("[HDR] Subscribed to buffer switch \n"); +// // } else { +// // println!("[HDR] Failed to subscribe to buffer switch \n"); +// // } +// } // Work-around for setting input delay during doubles/FFAs // pub fn set_doubles_delay(playercount: i32) -> bool { diff --git a/utils/Cargo.toml b/utils/Cargo.toml index e5e02e631f..e38f9511bc 100644 --- a/utils/Cargo.toml +++ b/utils/Cargo.toml @@ -7,22 +7,23 @@ edition = "2018" [dependencies] skyline = { git = "https://github.com/ultimate-research/skyline-rs" } -skyline_smash = { git = "https://github.com/blu-dev/skyline-smash", features = ["weak_l2cvalue"] } +skyline_smash = { git = "https://github.com/ultimate-research/skyline-smash", features = ["weak_l2cvalue"] } lazy_static = "1.4.0" arcropolis-api = { git = "https://github.com/Raytwo/arcropolis_api" } prc-rs = { git = "https://github.com/ultimate-research/prc-rs", features = ["indexmap-std", "xml-feat"] } parking_lot = "0.11.2" hdr-macros = { path = "../hdr-macros" } utils-dyn = { package = "dynamic", path = "../dynamic" } -ninput = { git = "https://github.com/blu-dev/ninput" } +ninput = { git = "https://github.com/HDR-Development/ninput" } skyline-web = { git = "https://github.com/skyline-rs/skyline-web" } -smash_script = { git = "https://github.com/blu-dev/smash-script", branch = "development" } +smash_script = { git = "https://github.com/WuBoytH/smash-script", branch = "development" } once_cell = "1.15.0" colorgrad = "0.6.2" serde = { version = "1", features = ["derive"] } serde_json = "1" bitflags = "2" interpolation = "0.2.0" +smash2 = { git = "https://github.com/WuBoytH/smash-rs", package = "smash"} [features] default = ["no-offset-search"] diff --git a/utils/src/game_modes.rs b/utils/src/game_modes.rs index 62a799525d..4bf6664b9f 100644 --- a/utils/src/game_modes.rs +++ b/utils/src/game_modes.rs @@ -7,15 +7,14 @@ use std::str::FromStr; pub mod tag; lazy_static! { - static ref GAME_MODE_HTML: Vec = std::fs::read("mods:/ui/docs/gamemodes.html").unwrap(); - static ref GAME_MODE_JS: Vec = std::fs::read("mods:/ui/docs/gamemodes.js").unwrap(); - static ref TAG_WEBP: Vec = std::fs::read("mods:/ui/docs/tag.webp").unwrap(); - static ref TURBO_WEBP: Vec = std::fs::read("mods:/ui/docs/turbo.webp").unwrap(); - static ref HITFALL_WEBP: Vec = std::fs::read("mods:/ui/docs/hitfall.webp").unwrap(); - static ref AIRDASH_WEBP: Vec = std::fs::read("mods:/ui/docs/airdash.webp").unwrap(); - static ref SMASH64_WEBP: Vec = std::fs::read("mods:/ui/docs/smash64.webp").unwrap(); - static ref MAGICSERIES_WEBP: Vec = std::fs::read("mods:/ui/docs/magicseries.webp").unwrap(); - static ref ELEMENT_WEBP: Vec = std::fs::read("mods:/ui/docs/element.webp").unwrap(); + static ref COMMON_CSS: Vec = std::fs::read("mods:/ui/docs/common.css").unwrap(); + static ref COMMON_JS: Vec = std::fs::read("mods:/ui/docs/common.js").unwrap(); + static ref GAMEMODES_HTML: Vec = std::fs::read("mods:/ui/docs/gamemodes.html").unwrap(); + static ref GRIDMENU_JS: Vec = std::fs::read("mods:/ui/docs/gridmenu.js").unwrap(); + static ref MENU_CSS: Vec = std::fs::read("mods:/ui/docs/menu.css").unwrap(); + static ref TOGGLES_JS: Vec = std::fs::read("mods:/ui/docs/toggles.js").unwrap(); + // Images + static ref PLACEHOLDER_PNG: Vec = std::fs::read("mods:/ui/docs/placeholder.png").unwrap(); } static mut CURRENT_CUSTOM_MODES: Option> = None; @@ -35,6 +34,13 @@ pub extern "Rust" fn get_custom_mode() -> Option> { } } +#[export_name = "hdr__game_modes__reset_custom_mode"] +pub extern "Rust" fn reset_custom_mode() { + unsafe { + CURRENT_CUSTOM_MODES = None; + } +} + #[export_name = "hdr__game_modes__signal_new_game"] pub extern "Rust" fn signal_new_game() { unsafe { @@ -82,18 +88,16 @@ unsafe fn on_rule_select_hook(_: &skyline::hooks::InlineCtx) { } pub unsafe fn open_modes_session() { - let response = Webpage::new() + let response = skyline_web::Webpage::new() .htdocs_dir("contents") - .file("help/html/USen/gamemodes.html", GAME_MODE_HTML.as_slice()) - .file("hdr/gamemodes.js", GAME_MODE_JS.as_slice()) - .file("hdr/tag.webp", TAG_WEBP.as_slice()) - .file("hdr/turbo.webp", TURBO_WEBP.as_slice()) - .file("hdr/hitfall.webp", HITFALL_WEBP.as_slice()) - .file("hdr/airdash.webp", AIRDASH_WEBP.as_slice()) - .file("hdr/smash64.webp", SMASH64_WEBP.as_slice()) - .file("hdr/magicseries.webp", MAGICSERIES_WEBP.as_slice()) - .file("hdr/element.webp", ELEMENT_WEBP.as_slice()) - .start_page("help/html/USen/gamemodes.html") + .file("index.html", GAMEMODES_HTML.as_slice()) + .file("menu.css", MENU_CSS.as_slice()) + .file("gridmenu.js", GRIDMENU_JS.as_slice()) + .file("common.js", COMMON_JS.as_slice()) + .file("toggles.js", TOGGLES_JS.as_slice()) + .file("placeholder.png", PLACEHOLDER_PNG.as_slice()) + .background(skyline_web::Background::Default) + .boot_display(skyline_web::BootDisplay::Default) .open() .unwrap(); @@ -125,12 +129,13 @@ pub unsafe fn open_modes_session() { unsafe fn once_per_game_frame(game_state_ptr: u64) { // check the current match mode - let match_mode = utils_dyn::util::get_match_mode().0; - - // 1 is regular smash, 45 is online arena match, 58 is local wireless - if match_mode != 1 - && match_mode != 45 - && match_mode != 58 { + let match_mode: u32 = utils_dyn::util::get_match_mode().0; + if ![ + 1, // regular smash + 18, // training mode + 45, // online arena smash + 58 // local wireless smash + ].contains(&match_mode) { //println!("mode is {}, so not running custom game modes.", utils_dyn::util::get_match_mode().0); CURRENT_CUSTOM_MODES = None; } @@ -163,15 +168,6 @@ unsafe fn once_per_game_frame(game_state_ptr: u64) { tag::update(); } } - // if modes.contains(&CustomMode::TurboMode) { - // turbo::update(); - // } - // if modes.contains(&CustomMode::HitfallMode) { - // hitfall::update(); - // } - // if modes.contains(&CustomMode::AirdashMode) { - // airdash::update(); - // } }, _ => {} } diff --git a/utils/src/lib.rs b/utils/src/lib.rs index 322226b569..f547c3a26a 100644 --- a/utils/src/lib.rs +++ b/utils/src/lib.rs @@ -5,12 +5,14 @@ #![feature(simd_ffi)] #[macro_use] extern crate lazy_static; +extern crate smash2; pub mod offsets; pub mod modules; -mod game_modes; +pub mod game_modes; mod ui; +pub mod one_player; pub use utils_dyn::ext; pub use utils_dyn::consts; @@ -28,6 +30,7 @@ pub fn init() { singletons::init(); game_modes::install(); ui::install(); + one_player::install(); std::panic::set_hook(Box::new(|info| { let location = info.location().unwrap(); diff --git a/utils/src/modules.rs b/utils/src/modules.rs index 685395de7a..bc3cd5f64d 100644 --- a/utils/src/modules.rs +++ b/utils/src/modules.rs @@ -2,6 +2,7 @@ mod input; mod meter; mod param; mod var; +pub mod stage_mgr; use std::sync::Once; @@ -9,6 +10,7 @@ pub use input::*; pub use meter::*; pub use param::*; pub use var::*; +pub use stage_mgr::*; use skyline::hooks::*; use crate::offsets; diff --git a/utils/src/modules/input.rs b/utils/src/modules/input.rs index fd6637157e..f0e9a8b397 100644 --- a/utils/src/modules/input.rs +++ b/utils/src/modules/input.rs @@ -417,6 +417,21 @@ impl InputModule { return cats[category as usize].lifetimes_mut()[flag.trailing_zeros() as usize]; } + #[export_name = "InputModule__set_command_life"] + pub fn set_command_life(object: *mut BattleObject, category: i32, flag: i32, life: u8) { + if category == 4 { + require_input_module!(object).hdr_cat.valid_frames[(flag.trailing_zeros() as usize)] = life; + return; + } + + let cats = unsafe { + let control_module = *((*object).module_accessor as *const u64).add(0x48 / 8); + std::slice::from_raw_parts_mut((control_module + 0x568) as *mut CommandFlagCat, 4) + }; + cats[category as usize].lifetimes_mut()[flag.trailing_zeros() as usize] = life; + return + } + /// Sets the global tap buffer lifetime /// # Arguments /// * `object` - Owning `BattleObject` instance @@ -647,8 +662,20 @@ fn exec_internal(input_module: &mut InputModule, control_module: u64, call_origi // Parry cat flag let parry_input = unsafe { - ControlModule::check_button_on((*input_module.owner).module_accessor, 0x3) // CONTROL_PAD_BUTTON_GUARD - && triggered_buttons.intersects(Buttons::Parry) + let mut parry_input = ControlModule::check_button_on((*input_module.owner).module_accessor, 0x3) // CONTROL_PAD_BUTTON_GUARD + && triggered_buttons.intersects(Buttons::Parry); + + // guard always triggers parry for RoA mode + match super::super::game_modes::get_custom_mode() { + Some(modes) => { + if modes.contains(&utils_dyn::game_modes::CustomMode::RivalsOfAetherMode) { + parry_input = parry_input || triggered_buttons.intersects(Buttons::Guard); + } + }, + _ => {} + } + + parry_input }; let parry_offset = CatHdr::Parry.bits().trailing_zeros() as usize; diff --git a/utils/src/modules/meter.rs b/utils/src/modules/meter.rs index 0e0fce5ff2..112da3afb5 100644 --- a/utils/src/modules/meter.rs +++ b/utils/src/modules/meter.rs @@ -438,9 +438,19 @@ unsafe fn fighter_handle_damage_hook(fighter: *mut smash::app::BattleObject, arg if let Some(object_id) = crate::util::get_active_battle_object_id_from_entry_id(x) { let object = crate::util::get_battle_object_from_id(object_id); if !object.is_null() && super::is_hdr_object((*object).vtable as _) { + + let damage_dealt_this_stock = VarModule::get_float(object, vars::common::instance::DAMAGE_DEALT_THIS_STOCK); + VarModule::set_float(object, vars::common::instance::DAMAGE_DEALT_THIS_STOCK, damage_dealt_this_stock + damage_received); + VarModule::set_float(object, vars::common::instance::LAST_ATTACK_DAMAGE_DEALT, damage_received); VarModule::set_int(object, vars::common::instance::LAST_ATTACK_RECEIVER_ENTRY_ID, (*fighter).battle_object_id as i32); MeterModule::signal_hit(object); + + // vampirism mode healing + if utils_dyn::game_modes::check_custom_mode(utils_dyn::game_modes::CustomMode::VampirismMode) { + let attacker_boma = (&mut *(*object).module_accessor); + DamageModule::heal(attacker_boma, damage_received * -0.25, 0); + } } } } diff --git a/utils/src/modules/param.rs b/utils/src/modules/param.rs index 7b046ae3e9..8eca503d03 100644 --- a/utils/src/modules/param.rs +++ b/utils/src/modules/param.rs @@ -11,6 +11,8 @@ use prc::{hash40::Hash40, ParamKind}; use smash::phx::Hash40 as Hash40_2; use smash::{app::BattleObject, hash40}; +use crate::STAGE_MANAGER; + use super::PARAM_MODULE_OFFSET; macro_rules! get_param_module { @@ -320,14 +322,16 @@ pub struct TourneyConfig { #[serde(default)] #[repr(C)] pub struct StagePage { - name: String, - useOfficial: bool, + pub name: String, + pub useOfficial: bool, /// the ordered list of starters stages which should be enabled, /// or `None` if there are no starters - starters: Option>, + pub starters: Option>, /// the ordered list of counterpick stages which should be enabled, /// or `None` if there are no counterpicks - counterpicks: Option> + pub counterpicks: Option>, + pub bans: Option, + pub dsr: Option, } impl Default for TourneyConfig { @@ -345,7 +349,9 @@ impl Default for StagePage { name: String::new(), useOfficial: false, starters: None, - counterpicks: None + counterpicks: None, + bans: None, + dsr: None, } } } @@ -495,6 +501,8 @@ impl MiddleOutExt for [T] { /// all Training stages, and makes them non-interactable, so that the UI looks as expected. #[arc_callback] fn ui_stage_db_prc_callback(hash: u64, mut data: &mut [u8]) -> Option { + println!("modifying ui_stage_db_prc"); + // ensure this is the file data it should be assert_eq!(hash, hash40(STAGE_DB_PRC)); @@ -542,7 +550,7 @@ fn ui_stage_db_prc_callback(hash: u64, mut data: &mut [u8]) -> Option { let stage_struct = entry .try_into_ref::() .expect("Failed to get struct from PRC entry"); - + // Find the name_id for the key let name_id = stage_struct.0 .iter() @@ -554,10 +562,29 @@ fn ui_stage_db_prc_callback(hash: u64, mut data: &mut [u8]) -> Option { .clone(); stage_map.insert(name_id.clone(), entry.clone()); - used_stages.insert(name_id.clone(), false); + used_stages.insert(name_id, false); } + if let Some(entry) = stage_map.get("Random") { + let mut new_entry = entry.clone(); + let stage_struct = new_entry.try_into_mut::().unwrap(); + let disp_order = stage_struct.0 + .iter_mut() + .find(|param| param.0 == prc::hash40::Hash40(hash40("disp_order"))) + .unwrap() + .1 + .try_into_mut::() + .unwrap(); + + *disp_order = stage_order; + out_list.push(new_entry); + used_stages.insert("Random".to_string(), true); + } + + let mut pages: Vec = Vec::new(); for n in 0..num_pages { + pages.push(stage_pages[n].clone()); + let starters = stage_pages[n].starters.as_ref().unwrap(); let counterpicks = stage_pages[n].counterpicks.as_ref().unwrap(); @@ -574,9 +601,35 @@ fn ui_stage_db_prc_callback(hash: u64, mut data: &mut [u8]) -> Option { .unwrap(); *disp_order = stage_order; // Set starter display order - stage_order += 1; out_list.push(new_entry); used_stages.insert(starter_name.clone(), true); + + // If the stage is RandomNormal (standard Random panel), add Random in the same spot. + // Standard SSS will ignore Random entirely and display RandomNormal. + // Likewise, Training Mode and My Music ignore RandomNormal entirely and layout Random correctly, + // Albeit, with a weird icon sometimes. Still, this preserves the correct layout in both + // Training Mode and My Music, and *also* allows people to change the Menu Music, since + // My Music replaces the Random stage with the MenuMusic "stage" + // This of course assumes the user has put "Random" on one of their stage pages + if starter_name == "RandomNormal" { + if let Some(entry) = stage_map.get("Random") { + let mut new_entry = entry.clone(); + let stage_struct = new_entry.try_into_mut::().unwrap(); + let disp_order = stage_struct.0 + .iter_mut() + .find(|param| param.0 == prc::hash40::Hash40(hash40("disp_order"))) + .unwrap() + .1 + .try_into_mut::() + .unwrap(); + + *disp_order = stage_order; + out_list.push(new_entry); + used_stages.insert("Random".to_string(), true); + } + } + + stage_order += 1; } } @@ -617,9 +670,28 @@ fn ui_stage_db_prc_callback(hash: u64, mut data: &mut [u8]) -> Option { .unwrap(); *disp_order = stage_order; // Set counterpick display order - stage_order += 1; out_list.push(new_entry); - used_stages.insert(counterpick_name.clone(), true); + used_stages.insert(counterpick_name.clone(), true); + + if counterpick_name == "RandomNormal" { + if let Some(entry) = stage_map.get("Random") { + let mut new_entry = entry.clone(); + let stage_struct = new_entry.try_into_mut::().unwrap(); + let disp_order = stage_struct.0 + .iter_mut() + .find(|param| param.0 == prc::hash40::Hash40(hash40("disp_order"))) + .unwrap() + .1 + .try_into_mut::() + .unwrap(); + + *disp_order = stage_order; + out_list.push(new_entry); + used_stages.insert("Random".to_string(), true); + } + } + + stage_order += 1; } } @@ -646,6 +718,9 @@ fn ui_stage_db_prc_callback(hash: u64, mut data: &mut [u8]) -> Option { } } + let mut mgr = STAGE_MANAGER.lock().unwrap(); + mgr.stage_pages = Some(pages); + // Add all the unused stages back into the prc with a disp_order of -1 // This is important so that main menu music and random stage selection work for used_stage in used_stages.iter() { @@ -661,7 +736,7 @@ fn ui_stage_db_prc_callback(hash: u64, mut data: &mut [u8]) -> Option { .try_into_mut::() .unwrap(); - *disp_order = -1; + *disp_order = -1; out_list.push(new_entry); } } diff --git a/utils/src/modules/stage_mgr.rs b/utils/src/modules/stage_mgr.rs new file mode 100644 index 0000000000..1c34fddd4f --- /dev/null +++ b/utils/src/modules/stage_mgr.rs @@ -0,0 +1,30 @@ +use std::{ + collections::HashSet, + sync::{LazyLock, Mutex}, +}; + +use crate::StagePage; + +pub static STAGE_MANAGER: LazyLock> = LazyLock::new(|| Mutex::new(StageManager::new())); + +pub struct StageManager { + pub selected_panel: Option, + pub selected_preview: Option, + pub stage_pages: Option>, + pub random_stage_indexes: Option>, + pub stage_loading: Option, + pub perma_striked_stages: HashSet, +} + +impl StageManager { + pub fn new() -> Self { + Self { + selected_panel: None, + selected_preview: None, + stage_pages: None, + random_stage_indexes: None, + stage_loading: None, + perma_striked_stages: HashSet::new(), + } + } +} diff --git a/utils/src/one_player.rs b/utils/src/one_player.rs new file mode 100644 index 0000000000..bd2c9f2de4 --- /dev/null +++ b/utils/src/one_player.rs @@ -0,0 +1,106 @@ +use skyline::hooks::InlineCtx; +use smash2::app::FighterManager; +use smash::app::{self, lua_bind::{PostureModule, WorkModule, FighterInformation}}; +use smash::lib::lua_const::*; +use std::sync::atomic::{AtomicBool, Ordering}; +use utils_dyn::util::MATCH_EXITING; + +pub static IS_RULE_TIME: AtomicBool = AtomicBool::new(false); + +#[skyline::hook(offset = 0x1b7b814, inline)] +unsafe fn match_load(ctx: &mut InlineCtx) { + if !one_player_entry() { + return; + } + + let result_ptr = ctx.registers[22].x() as *const u64; + let pane = *result_ptr.add(1); + if pane == 0 { + return; + } + + let internal = *(pane as *const u64); + if internal == 0 { + return; + } + + let parent = *((internal as *const u8).add(0x18) as *const u64); + if parent == 0 { + return; + } + + // hide timer + *(parent as *mut u8).add(0x58) &= 0xFE; +} + +// Set the match timer to 99 minutes every frame in 1P mode so it never expires. +#[skyline::hook(offset = 0x15812b8, inline)] +unsafe fn once_per_frame(ctx: &mut InlineCtx) { + if !one_player_entry() { + return; + } + + let match_state = ctx.registers[0].x() as *mut u8; + // 99 minutes in frames + *(match_state.add(0x3d4) as *mut i32) = 99 * 60 * 60; +} + +// Prevent the match state from transitioning to the ending sequence in 1P mode, +// unless the player has lost all stocks. +#[skyline::hook(offset = 0x1585a5c, inline)] +unsafe fn prevent_match_end_transition(ctx: &mut InlineCtx) { + if MATCH_EXITING.load(Ordering::Relaxed) || !one_player_entry() || is_last_stock() { + return; + } + + let base = skyline::hooks::getRegionAddress(skyline::hooks::Region::Text) as u64; + let normal_update = base + 0x1581270; + ctx.registers[8].set_x(normal_update); +} + +// Prevent the game-over declaration from executing in 1P mode, unless the +// player has lost all stocks. The game calls this on every death in 1P. +// When stocks remain, block it until stock count hits 0. +#[skyline::hook(offset = 0x1585b20)] +unsafe fn game_over_declare(param_1: u64) { + if !MATCH_EXITING.load(Ordering::Relaxed) && one_player_entry() && !is_last_stock() { + return; + } + call_original!(param_1); +} + +/// Returns true when the player's stock count has reached 0 (last stock lost). +unsafe fn is_last_stock() -> bool { + if let Some(object) = crate::util::get_battle_object_from_entry_id(0) { + let entry_id = WorkModule::get_int((*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID); + let info = app::lua_bind::FighterManager::get_fighter_information(crate::singletons::FighterManager(), app::FighterEntryID(entry_id)); + if !info.is_null() { + return FighterInformation::stock_count(info) == 0; + } + } + false +} + +pub fn one_player_entry() -> bool { + if let Some(fighter_manager) = FighterManager::instance() { + return fighter_manager.entry_count() == 1; + } + false +} + +pub fn install() { + skyline::install_hooks!( + game_over_declare, + prevent_match_end_transition, + once_per_frame, + match_load, + ); + + // Allow 0 CPUs in Training Mode menu + // Allow UI to decrement to 0 + skyline::patching::Patch::in_text(0x1bb46a4).data(0xb907fa7fu32).unwrap(); + // Change set-value handler clamp to 0 + skyline::patching::Patch::in_text(0x1bbad14).data(0x7100011fu32).unwrap(); + // Fix clamp logic to clamp underflow to 0 instead of 1 + skyline::patching::Patch::in_text(0x1bbad18).data(0x1a9fa114u32).unwrap(); +}