Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 39 additions & 1 deletion agent_docs/party-quests.md
Original file line number Diff line number Diff line change
Expand Up @@ -1291,7 +1291,43 @@ the hub's mobs away (`Effect::ClearMobs`) and open its way on
`rnj3_out`/`jnr3_out` lead to x00203 only while it is open. After the
clear they open it again whenever it has shut. A member holding the files
is told to let the leader hand them in; anyone else is asked whether they
would rather retreat. The later stages can't be cleared yet.
would rather retreat.

Yulete (Zenumist 2112000, Alcadno 2112010) comes out at (252, 243) in his
office (x00203) when the first member arrives there, and the field
keeps his mood (`net::events::Yulete`, the field's `yulete`). Talked to
(`FieldMessage::Yulete`, `events::yulete_talk`, Cosmic `2112000`), he
says he is leaving if he already means to; with anyone within 310 pixels
of him he says he is being watched and means to leave; if Romeo or Juliet
never read the letter (`EventTicket::shocked`) he calls the party sneaky
and means to leave; otherwise he is caught out. Ten seconds after the
first arrival, not scaled with the event, and only while someone is in the
office, he leaves (`build_uncontrol_npc`, then REMOVE_NPC 0x102), and
everyone in the run hears why in pink (`ServerMessage::YuleteLeft`,
`EventCommand::YuleteLeft`, `magatia.yulete.disgusted` if he was caught,
`magatia.yulete.fooled` if not); the event keeps which
(`EventTicket::caught_yulete`) for the boss's room. He leaves five of each
of his guards (9300143, 9300144) at each of (-455, 135), (0, 135) and
(360, 135). The last kill clears stage 5 (`cleared_by_killing`) for
20,000 EXP each and opens the office's door (`rnj6_out`, `jnr6_out`,
2618005, state 1); until then its way on (the same names) is shut, in
pink, and then leads to the landing (x00300).

On the landing, its four ways (`rnj4_r1`-`rnj4_r4`, `jnr4_r1`-`jnr4_r4`)
each lead into one rope room (x00301-x00304) the first time, and only
then (`EventTicket::take_room`): anyone else is told, in pink, that the
room is taken (`magatia.room_taken`). In a rope room each of ten rows
has four ropes, `pt<row><rope>` (`rnj5_rp`, `jnr5_rp`), of which one is
right; it leads to the row above (portal id + 4), and from the top row to
the top (`success`); any other leads back to the bottom (`fail`). Each
room draws its right ropes the first time anyone climbs
(`events::draw_climb`, `events::climb`; the harness pins them with
`RUSTMS_MAGATIA_ROPES`). Cosmic's Zenumist script draws them so that each
row's right rope differs in each of the four rooms; ours draws each room
on its own, as Cosmic's Alcadno script does. The first to reach the top
clears stage 6 for 20,000 EXP each, with no clear effect. The rooms' way
on (`out00`, a plain portal at the top) leads to the boss's room
(x00400), which has nothing in it yet.

Inside, Romeo or Juliet asks whether a member would rather retreat
(`magatia.romeo.retreat`, `magatia.juliet.retreat`) and sends them to the
Expand Down Expand Up @@ -1366,6 +1402,8 @@ nothing yet. Its lines are placeholders (`magatia.*`).
| Juliet 2112003 | 261000021 | Runtime (`talk_about_event`): a menu of going in and what happened |
| Juliet 2112003 | 926110000-400 | Asks whether to retreat, to 926110700 |
| Juliet 2112005 | 926110200 | Runtime (`magatia_hub`): the same on the Alcadno side |
| Yulete 2112000 | 926100203 | Runtime (`FieldMessage::Yulete`): caught out, watched, sneaky or leaving |
| Yulete 2112010 | 926110203 | The same on the Alcadno side |
| Books 2112007 | 926100000 | Runtime (`BookOpened`): mesos, EXP, the letter, the switch or nothing |
| Books 2112013 | 926110000 | The same; in the hall (926110001) they hold nothing |

Expand Down
7 changes: 7 additions & 0 deletions game-data/placeholder_text.toml
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,13 @@
"magatia.juliet.hurry" = "[placeholder] Hurry, Romeo needs us."
"magatia.files" = "[placeholder] Both files! Now we can go on."
"magatia.files_leader" = "[placeholder] Let your leader hand me the files."
"magatia.yulete.leaving" = "[placeholder] You have company now; I'll take my leave."
"magatia.yulete.watched" = "[placeholder] I watched you all the way here. My helpers will see to you; I'm leaving."
"magatia.yulete.sneaky" = "[placeholder] Sneaky, but I saw you coming. My helpers will see to you; I'm leaving."
"magatia.yulete.caught" = "[placeholder] How did you get in here? Guards! I'm retreating for now."
"magatia.yulete.disgusted" = "[placeholder] Yulete: You won't stop my alchemy!"
"magatia.yulete.fooled" = "[placeholder] Yulete: Did you think I wasn't ready for you? Fools!"
"magatia.room_taken" = "[placeholder] Someone is already in this room."
"pirate.menu" = "[placeholder] The Lord Pirate has taken Wu Yang, my son, onto his ship. Will your party board it and bring him back?"
"pirate.enter" = "[placeholder] Board the Pirate Ship."
"pirate.about" = "[placeholder] What waits on the ship?"
Expand Down
7 changes: 7 additions & 0 deletions game-data/server_content.toml
Original file line number Diff line number Diff line change
Expand Up @@ -1185,6 +1185,13 @@ unsourced = [
"magatia.juliet.hurry",
"magatia.files",
"magatia.files_leader",
"magatia.yulete.leaving",
"magatia.yulete.watched",
"magatia.yulete.sneaky",
"magatia.yulete.caught",
"magatia.yulete.disgusted",
"magatia.yulete.fooled",
"magatia.room_taken",
"pirate.menu",
"pirate.enter",
"pirate.about",
Expand Down
14 changes: 14 additions & 0 deletions game-data/src/server_content.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1836,6 +1836,13 @@ pub mod keys {
pub const MAGATIA_JULIET_HURRY: &str = "magatia.juliet.hurry";
pub const MAGATIA_FILES: &str = "magatia.files";
pub const MAGATIA_FILES_LEADER: &str = "magatia.files_leader";
pub const MAGATIA_YULETE_LEAVING: &str = "magatia.yulete.leaving";
pub const MAGATIA_YULETE_WATCHED: &str = "magatia.yulete.watched";
pub const MAGATIA_YULETE_SNEAKY: &str = "magatia.yulete.sneaky";
pub const MAGATIA_YULETE_CAUGHT: &str = "magatia.yulete.caught";
pub const MAGATIA_YULETE_DISGUSTED: &str = "magatia.yulete.disgusted";
pub const MAGATIA_YULETE_FOOLED: &str = "magatia.yulete.fooled";
pub const MAGATIA_ROOM_TAKEN: &str = "magatia.room_taken";
pub const PIRATE_MENU: &str = "pirate.menu";
pub const PIRATE_ENTER: &str = "pirate.enter";
pub const PIRATE_ABOUT: &str = "pirate.about";
Expand Down Expand Up @@ -3063,6 +3070,13 @@ mod tests {
keys::MAGATIA_JULIET_HURRY,
keys::MAGATIA_FILES,
keys::MAGATIA_FILES_LEADER,
keys::MAGATIA_YULETE_LEAVING,
keys::MAGATIA_YULETE_WATCHED,
keys::MAGATIA_YULETE_SNEAKY,
keys::MAGATIA_YULETE_CAUGHT,
keys::MAGATIA_YULETE_DISGUSTED,
keys::MAGATIA_YULETE_FOOLED,
keys::MAGATIA_ROOM_TAKEN,
keys::PIRATE_MENU,
keys::PIRATE_ENTER,
keys::PIRATE_ABOUT,
Expand Down
3 changes: 3 additions & 0 deletions integration-harness/docker-compose.test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ services:
RUSTMS_OPQ_LOUNGE: "23"
RUSTMS_OPQ_TOWER: "1234123412341234"
RUSTMS_OPQ_LEVERS: "14"
# Magatia's rope rooms want ropes 0, 1, 2, 3, 0, 1, 2, 3, 0, 1 from
# the bottom up (see tests/magatia_ropes.rs).
RUSTMS_MAGATIA_ROPES: "0123012301"
# Its first jail opens to levers 1, 3 and 5 (see tests/opq_jails.rs).
RUSTMS_OPQ_JAIL1: "135"
# Every Gachapon roll is the same uncommon prize, which the world hears
Expand Down
4 changes: 4 additions & 0 deletions integration-harness/src/hunting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,8 @@ pub struct Field {
pub npcs: Vec<(i32, i32)>,
/// Where each NPC spawned.
pub npc_positions: BTreeMap<i32, (i16, i16)>,
/// Object ids of NPCs taken off the map.
pub npcs_removed: Vec<i32>,
/// Where each mob spawned.
pub mob_positions: BTreeMap<i32, (i16, i16)>,
/// Statuses put on mobs: (object id, stats, first one's value, first
Expand Down Expand Up @@ -737,6 +739,8 @@ impl Field {
self.npcs.push((object_id, npc_id));
let at = (r.read_short().unwrap(), r.read_short().unwrap());
self.npc_positions.insert(object_id, at);
} else if op == SendOpcode::RemoveNpc as i16 {
self.npcs_removed.push(r.read_int().unwrap());
} else if op == SendOpcode::ShowForeignEffect as i16 {
self.effects
.push((r.read_int().unwrap(), r.read_byte().unwrap()));
Expand Down
1 change: 1 addition & 0 deletions integration-harness/src/packets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ pub fn opcode_name(opcode: i16) -> &'static str {
x if x == SendOpcode::Whisper as i16 => "Whisper",
x if x == SendOpcode::SpawnPlayer as i16 => "SpawnPlayer",
x if x == SendOpcode::SpawnNpc as i16 => "SpawnNpc",
x if x == SendOpcode::RemoveNpc as i16 => "RemoveNpc",
x if x == SendOpcode::RemovePlayerFromMap as i16 => "RemovePlayerFromMap",
x if x == SendOpcode::ChatText as i16 => "ChatText",
x if x == SendOpcode::MovePlayer as i16 => "MovePlayer",
Expand Down
Loading
Loading