Skip to content

Add Bugard in the Clouds battlefield and Hotupuku implementation#9983

Open
Lydya-nick77 wants to merge 1 commit into
LandSandBoat:basefrom
Lydya-nick77:lsb-hotupuku-enm
Open

Add Bugard in the Clouds battlefield and Hotupuku implementation#9983
Lydya-nick77 wants to merge 1 commit into
LandSandBoat:basefrom
Lydya-nick77:lsb-hotupuku-enm

Conversation

@Lydya-nick77
Copy link
Copy Markdown

I affirm:

  • I understand that if I do not agree to the following points by completing the checkboxes my PR will be ignored.
  • I understand I should leave resolving conversations to the LandSandBoat team so that reviewers won't miss what was said.
  • I have read and understood the Contributing Guide and the Code of Conduct.
  • I have tested my code and the things my code has changed since the last commit in the PR and will test after any later commits.

What does this pull request do?

This pull request adds the ENM level capped 50 fight named: Bugard in the Clouds in Monarch Linn.
Based on videos I could find and capture taken to recreate the battle as close as possible.

The fight goes as follow:
Mob has about 5000 HP, every time it uses a TP move, it is repeated 2 more times (total 3x TP move)

After 2000 dmg, it gains a random immunity between melee, magic and ranged.

After 4000 dmg:

  • It gains enstone.
  • Uses a random 2hr ability between hundred fist, invincible and mighty strikes, then uses another 2hr every 90-210 sec
  • Gain haste, accuracy and increased double attack

Loot in chest and % taken from the information I could find online.

Adds the battlefield file, Hotupuku fight script
Also change the 3 spawn points and the orientation of the NM in mob_spawn_points.sql

Steps to test these changes

Enter the battlefield in Monarch Linn

@Lydya-nick77 Lydya-nick77 force-pushed the lsb-hotupuku-enm branch 5 times, most recently from 20a32d2 to 49a5877 Compare May 9, 2026 13:25
end

entity.onMobFight = function(mob, target)
local damageTaken = mob:getMaxHP() - mob:getHP()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe it only uses a 2 hour ability after taking 2000 of a specific type of damage is dealt, this probably needs to be a damage_taken listener that is checking for physical, ranged, or magic damage

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please do not resolve conversations. That's for us to do.
imagen

Comment thread scripts/battlefields/Monarch_Linn/bugard_in_the_clouds.lua Outdated
{
{
{ itemId = xi.item.NONE, weight = 950 }, -- Nothing
{ itemId = xi.item.CLOUD_EVOKER, weight = 50 }, -- Cloud Evoker
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For consistency:

    {
        { itemId    = xi.item.NONE,               weight  = 9500 }, -- Nothing
        { itemId    = xi.item.CLOUD_EVOKER,       weight  =  500 }, -- Cloud Evoker


{
quantity = 2,
{ itemId = xi.item.CHUNK_OF_ALUMINUM_ORE, weight = 1000 }, -- Chunk of Aluminum Ore
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, for consistency:
{ itemId = xi.item.CHUNK_OF_ALUMINUM_ORE, weight = 10000 }, -- Chunk of Aluminum Ore

Comment thread scripts/zones/Monarch_Linn/IDs.lua Outdated
OURYU = GetFirstID('Ouryu'),
RAZON = GetFirstID('Razon'),
WATCH_HIPPOGRYPH = GetFirstID('Watch_Hippogryph'),
HOTUPUKU = GetFirstID('Hotupuku'),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Place this entry in alphabetical order, please

local immunityTriggerDamage = 2000
local firstTwoHourTriggerDamage = 4000
local minTwoHourDelay = 90
local maxTwoHourDelay = 210
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please no. Use the values directly. Besides, they are only used once anyway.

mob:setMod(xi.mod.DEFP, 0)
mob:addMod(xi.mod.DEF, 150)

mob:addListener('DAMAGE_TAKEN', 'Hotupuku_DamageTracker', function(mobArg, damage, attacker, attackType, damageType)
Copy link
Copy Markdown
Contributor

@Xaver-DaRed Xaver-DaRed May 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EDITED. Ignore this concrete message. Not the one bellow.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And while we are here, proposal:

    mob:addListener('DAMAGE_TAKEN', 'Hotupuku_DamageTracker', function(mobArg, damage, attacker, attackType, damageType)
        if mobArg:getLocalVar('immunityApplied') ~= 0 then
            return
        end

        if attackType == xi.attackType.MAGICAL then
            mobArg:setLocalVar('damageTypesUsed', bit.bor(mobArg:getLocalVar('damageTypesUsed'), 2))
            return
        end

        if attackType == xi.attackType.RANGED then
            mobArg:setLocalVar('damageTypesUsed', bit.bor(mobArg:getLocalVar('damageTypesUsed'), 4))
            return
        end

        if attackType == xi.attackType.PHYSICAL then
            -- Some ranged auto-attacks can arrive as PHYSICAL.
            local attackerAction = attacker and attacker:getCurrentAction() or nil
            if
                attackerAction and
                (attackerAction == xi.action.category.RANGED_START or
                attackerAction == xi.action.category.RANGED_FINISH)
            then
                mobArg:setLocalVar('damageTypesUsed', bit.bor(mobArg:getLocalVar('damageTypesUsed'), 4))
            else
                mobArg:setLocalVar('damageTypesUsed', bit.bor(mobArg:getLocalVar('damageTypesUsed'), 1))
            end
        end
    end)


target:takeDamage(addEffectDamage, mob, xi.attackType.MAGICAL, actionDamageType)
return xi.subEffect.EARTH_DAMAGE, xi.msg.basic.ADD_EFFECT_DMG_2, addEffectDamage
end
Copy link
Copy Markdown
Contributor

@Xaver-DaRed Xaver-DaRed May 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

entity.onAdditionalEffect = function(mob, target, damage)
    if mob:getLocalVar('enstoneEnabled') == 0 then
        return 0, 0, 0
    end

    local pTable =
    {
        attackType     = xi.attackType.MAGICAL,
        magicalElement = xi.element.EARTH,
        basePower      = math.random(70, 90),
    }

    return xi.combat.action.executeAddEffectDamage(mob, target, pTable)
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants