diff options
-rw-r--r-- | world/map/npc/functions/global_event_handler.txt | 6 | ||||
-rw-r--r-- | world/map/npc/functions/vault.txt | 230 |
2 files changed, 233 insertions, 3 deletions
diff --git a/world/map/npc/functions/global_event_handler.txt b/world/map/npc/functions/global_event_handler.txt index eba97ab2..91879525 100644 --- a/world/map/npc/functions/global_event_handler.txt +++ b/world/map/npc/functions/global_event_handler.txt @@ -17,8 +17,8 @@ OnPCLoginEvent: callfunc "MaybeGiveBirthday"; callfunc "MiriamExpire"; // force the speed skill quest to expire callfunc "ConvertChristmas21"; // Christmas 2021 - callfunc "VaultLogin"; // Mirror Lake Protocol biddings - callfunc "VaultLogout"; // Clean some stuff, to be safe + //callfunc "VaultLogin"; // Mirror Lake Protocol biddings + //callfunc "VaultLogout"; // Clean some stuff, to be safe // add more here set @login_event, 2; end; @@ -44,7 +44,7 @@ OnPCDieEvent: end; OnPCLogoutEvent: - callfunc "VaultLogout"; + //callfunc "VaultLogout"; end; OnInit: diff --git a/world/map/npc/functions/vault.txt b/world/map/npc/functions/vault.txt new file mode 100644 index 00000000..f2c51387 --- /dev/null +++ b/world/map/npc/functions/vault.txt @@ -0,0 +1,230 @@ +// Mirror Lake Protocol and The Mana World Vault utilities +// TMWA is hopelessy broken, so most helpers simply don't exist. +// +// Author: jesusalva + +function|script|VaultLogin +{ + if (##VAULT < 1) goto L_Return; + + // Imports & Vitals + callsub S_Exp; + callsub S_Gold; + callsub S_Preset; + + // Quest Handlers + callsub S_Quest_CR1; + + // Mirror lake + callsub S_MirrorLake; + + // Clean up + set @last_preset, 0; + return; // go back to global handler + +S_Return: // this is to end execution of a sub + return; + +L_Return: + return; + +S_Exp: + if (##ADD_LVL < 1) goto S_Return; + set #EXP_CREDIT, #EXP_CREDIT + ##ADD_LVL; + set ##ADD_LVL, 0; + return; + +S_Gold: + if (##ADD_GP < 1) goto S_Return; + set Zeny, Zeny + ##ADD_GP; + set ##ADD_GP, 0; + return; + +S_Preset: + if (##PRESET < 1) goto S_Return; + set @last_preset, (#X21 & BYTE_3_MASK) >> BYTE_3_SHIFT; + set #X21, (#X21 & ~(BYTE_3_MASK)) | (##PRESET << BYTE_3_SHIFT); + + // Each preset is 5 levels (Preset 1 = Lv 5, Preset 10 = Lv 50, Max Preset 20 - hard limit is 127) + // TODO: Give more ammo, iron powder, sulphur powder, etc. instead of equips + // Give also some bug legs and maggot slime if applicable? + /* Handle weapons */ + /* + if (##PRESET >= 1 && @last_preset < 1) + getitem "SharpKnife",1; + if (##PRESET >= 2 && @last_preset < 2) + getitem "SlingBullet",500; + if (##PRESET >= 3 && @last_preset < 3) + getitem "Bow",1; + if (##PRESET >= 3 && @last_preset < 3) + getitem "Arrow",500; + if (##PRESET >= 4 && @last_preset < 4) + getitem "Arrow",500; + if (##PRESET >= 5 && @last_preset < 5) + getitem "JeansShorts",1; + if (##PRESET >= 6 && @last_preset < 6) + getitem "IronArrow",500; + if (##PRESET >= 7 && @last_preset < 7) + getitem "IronArrow",500; + if (##PRESET >= 8 && @last_preset < 8) + getitem "IronPowder", 150; + if (##PRESET >= 9 && @last_preset < 9) + getitem "BoneArrows",150; + if (##PRESET >= 10 && @last_preset < 10) + getitem "BoneArrows",150; + if (##PRESET >= 11 && @last_preset < 11) + getitem "SilverArrow",200; + if (##PRESET >= 12 && @last_preset < 12) + getitem "ThornArrow",100; + if (##PRESET >= 13 && @last_preset < 13) + getitem "SilverArrow",200; + if (##PRESET >= 14 && @last_preset < 14) + getitem "TerraniteArrow",100; + if (##PRESET >= 15 && @last_preset < 15) + getitem "ArmorBreaker",100; + if (##PRESET >= 16 && @last_preset < 16) + getitem "ThornArrow",100; + if (##PRESET >= 17 && @last_preset < 17) + getitem "TerraniteArrow",100; + if (##PRESET >= 18 && @last_preset < 18) + getitem "IronPowder", 150; + if (##PRESET >= 19 && @last_preset < 19) + getitem "TerraniteArrow",250; + */ + set ##PRESET, 0; + return; + +//////////////////////////////// +S_Quest_CR1: + if (!(##01_CRQUEST & 1)) goto S_Return; + if (##03_TMWWORLD & MLP_CR_DEBUT) goto S_Return; + // Check if you can receive the rewards + getinventorylist; + if (@inventorylist_count >= 96) goto S_Return; + // Mark quest as done and issue rewards + set BOSS_POINTS, BOSS_POINTS + 871; + set ##03_TMWWORLD, ##03_TMWWORLD | MLP_CR_DEBUT; + getitem WhiteCake, 1; + getitem ChocolateCake, 1; + getitem OrangeCake, 1; + getitem AppleCake, 1; + message strcharinfo(0), "Mirror Lake : You gained 871 boss points."; + return; + +//////////////////////////////// +S_MirrorLake: + // Wipe any existing TMWA internal mirror lake information + set ##VAULT_GOTO, 0; + set ##VAULT_MLTO, 0; + // TODO: Put the Mirror Lake Portal into the shipwreck? (see portal #2) + set .@gto, call("get_byte", ##00_INFO, 3); + set .@mlp, call("get_nibble", ##00_INFO, 5); + // If we're moving from Mirror Lake to TMW + if (.@gto != WORLD_ID) goto S_MirrorFix; + debugmes "Vault User "+##VAULT+" moved to lake "+.@mlp; + if (.@mlp == 1) warp "013-2", 37, 23; // Hurnscald Mirror Lake + if (.@mlp == 2) warp "002-1", 30, 58; // Tulimshar Mirror Lake + // Unset the target lake/world + void call("set_byte", ##00_INFO, 3, 0); + void call("set_nibble", ##00_INFO, 5, 0); + return; + +// We've moved to the wrong world, so preserve it. +S_MirrorFix: + set ##VAULT_GOTO, call("get_byte", ##00_INFO, 3); + set ##VAULT_MLTO, call("get_nibble", ##00_INFO, 5); + return; +} + + +// Remember: ##VAULT_EXP, ##VAULT_GOTO, ##VAULT_MLTO for Mirror Lake Protocol +// However, without kick(7), it is not really worth anything - so I presumed 7 +// Remember: Quote symbols are illegal, simple or double, except for parameter +// To reset the database: +// cleararray $EXPORT_DATA$[0], "", 254; +// set $EXPORT_MAX_ID, 0; + +// Schemas: +//API_VAULT: "UID", ##VAULT, "GID", getcharid(3) +//API_SENDMAIL: "UID": ##VAULT, "MSG": "message", "TITLE": "subject line" +// +// Using the API_EXPORT hack for TMWA: +// +// set $@API_PROTOCOL, API_SENDMAIL; +// set $@API_DATA$, "'UID': 0, 'TITLE': 'About TMWA', 'MSG': 'I hate it!'"; +// callfunc "FlushAPI"; +// +// (The curly brace is added to DATA on its own) +function|script|FlushAPI +{ + // Function called improperly + // DATA cannot be null or the array order will crash + if ($@API_PROTO <= 0) goto L_Dumb; + if ($@API_DATA$ == "") goto L_Dumb; + + // Save it to mapreg + // The script will strip "##" + // and convert the part after to a JSON dict + set $EXPORT_DATA$[$EXPORT_MAX_ID], $@API_PROTO + "##" + $@API_DATA$; + set $@API_PROTO, ""; + set $@API_DATA$, ""; + + // Update TMWA tracker + set $EXPORT_MAX_ID, $EXPORT_MAX_ID + 1; + + // Keep in mind an array can only go up to 255 + // Trying to go past that, causes a SIGSEGV and map server dies + // So we periodically truncate the table when it's full + if ($EXPORT_MAX_ID > 240) goto L_Flush; + if ($EXPORT_MAX_ID == 120) goto L_Flush2; + return; + +L_Dumb: + debugmes "FlushAPI called without enough arguments"; + debugmes " - $@API_PROTO, API_* constant"; + debugmes " - $@API_DATA$, json dict without curly braces"; + return; + +L_Flush: + cleararray $EXPORT_DATA$[0], "", 220; + set $EXPORT_MAX_ID, 0; + return; + +L_Flush2: + cleararray $EXPORT_DATA$[220], "", 25; + return; +} + +function|script|VaultLogout +{ + if (##VAULT < 1) goto L_Return; + // TODO: Or #VAULT ? Which of the two is set? + set $@API_PROTOCOL, API_VAULT; + set $@API_DATA$, "'UID': "+##VAULT+", 'GID': "+getcharid(3); + callfunc "FlushAPI"; + + return; + +L_Return: + return; +} + +// MirrorLakeSendTo(World) +function|script|MirrorLakeSendTo +{ + if (##VAULT < 1) goto L_Return; + set ##VAULT_GOTO, getarg(0); + // This is TMWA - so it'll always use Lake #0 for performance reasons + set $@API_PROTOCOL, API_VAULT; + set $@API_DATA$, "'UID': "+##VAULT+", 'GID': "+getcharid(3); + callfunc "FlushAPI"; + message strcharinfo(0), "Darkness fills your vision..."; + // TODO: Misc effects + // TODO: Sleep for 10~15 seconds (for mapreg) + // TODO: Disconnect user + return; + +L_Return: + return; +} + |