// 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 insect legs and insect 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;
}