Skip to content

Implement Ballista License mini-quest - #11472

Open
Lydya-nick77 wants to merge 1 commit into
LandSandBoat:basefrom
Lydya-nick77:feature/ballista-license
Open

Lydya-nick77 wants to merge 1 commit into
LandSandBoat:basefrom
Lydya-nick77:feature/ballista-license

Conversation

@Lydya-nick77

@Lydya-nick77 Lydya-nick77 commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

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?

New implementation of the Ballista License mini-quest as a hidden quest using the Interaction Framework, superseding #11466.
Thanks to @zach2good for providing his version of the file. I only had to do a few adjustments.

The quest supports all three home nations, both foreign-letter delivery orders, nation-leader approval, license issuance, and Ballista Earring acquisition and return.

The earring return and letter hand-over messages use zone-local text IDs verified against the installed retail client DATs.

Based on the following captures and also testing / validation / trial and error with sruon's site.
Ballista - Obtain license for Windurst citizen
https://youtu.be/t1njm2qnnWI
https://drive.google.com/open?id=1HpVZ6cQ7tDh7zYI-1nYRiKgTPj9KMCbO

Ballista - Obtain license for Bastok citizen
https://youtu.be/uOYIZNdd85w
https://1drv.ms/u/c/87e665e10555c452/EcIyKONktfdDnoPjhLRRCf8BiGY3TBvdLH80obCIFmQBNA?e=YqS7ZK

Ballista - Obtain license for Sandorian citizen
https://youtu.be/YnE36IgYdXw
https://1drv.ms/u/c/87e665e10555c452/EaUvnz-_JvlGmj2nEy8quHYB0CBIZAZuOPCC_9R8ys0x3A?e=PURU3O

Steps to test these changes

  1. Be rank 3 or higher and talk to your nation's Ballista director: Excenmille, Invincible Shield, or Mhabi Molkot.
  2. Accept the assignment and confirm both foreign-nation letters are received.
  3. Visit each foreign leader and deliver the corresponding letter to that nation's Ballista director, testing either delivery order.
  4. Return to your director, visit your own nation leader, then return to receive the Ballista License.
  5. Talk to your director to open the Ballista menu.
  6. Request and return the Ballista Earring.
  7. Repeat from each home nation and verify unrelated NPC and Trust interactions still work.

@Lydya-nick77
Lydya-nick77 marked this pull request as draft September 13, 2026 12:58
@Lydya-nick77
Lydya-nick77 force-pushed the feature/ballista-license branch from 4b1b6fb to 06c531e Compare September 13, 2026 13:09
@zach2good

Copy link
Copy Markdown
Contributor

In terms of what's hitting the codebase, this is neither a migration or a re-implementation; this is just the first implementation. Please adjust commits and PR info accordingly.

@Lydya-nick77 Lydya-nick77 changed the title Migrate Ballista License mini-quest to Interaction Framework New implementation Ballista License mini-quest Sep 13, 2026
@Lydya-nick77
Lydya-nick77 force-pushed the feature/ballista-license branch from 06c531e to da59e93 Compare September 13, 2026 14:14
@Lydya-nick77

Copy link
Copy Markdown
Contributor Author

I renamed them

@zach2good zach2good changed the title New implementation Ballista License mini-quest Implement Ballista License mini-quest Sep 13, 2026
Comment on lines +169 to +180
local function getProgress(player)
return quest:getVar(player, 'Prog' .. player:getNation())
end

local function setProgress(player, value)
quest:setVar(player, 'Prog' .. player:getNation(), value)
end

-- Whether a foreign leader has received the player yet, tracked per nation visited.
local function wasReceivedBy(player, npcNation)
return quest:getVar(player, 'Prog' .. player:getNation() .. npcNation) == 1
end

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 replace these .. concats with string.format(...) (and in the rest of the file)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I replaced them

Comment on lines +379 to +385
local function unlicensed(player)
return not player:hasKeyItem(xi.ki.BALLISTA_LICENSE)
end

local function isLicensed(player)
return player:hasKeyItem(xi.ki.BALLISTA_LICENSE)
end

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.

While I don't mind them, there are some other reviewers who don't like these single-line functions that don't offer much/any additional insight, if you're comparing player:hasKeyItem(xi.ki.BALLISTA_LICENSE) to isLicensed(player), etc.

Please inline them

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I changed it

end

local function letterAddressedTo(player, npcNation)
return director[player:getNation()].letters[npcNation]

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.

But for example, this is a little more complex, so it's more justified wrapping it up in a helper function, etc.

@Lydya-nick77
Lydya-nick77 force-pushed the feature/ballista-license branch from da59e93 to 4b1c425 Compare September 13, 2026 22:35
@Lydya-nick77
Lydya-nick77 force-pushed the feature/ballista-license branch from 4b1c425 to bdaf4d4 Compare September 13, 2026 22:37
@Lydya-nick77
Lydya-nick77 marked this pull request as ready for review September 14, 2026 02:45
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.

2 participants