diff options
Diffstat (limited to 'npc/functions/main.txt')
-rw-r--r-- | npc/functions/main.txt | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/npc/functions/main.txt b/npc/functions/main.txt new file mode 100644 index 00000000..8029f3eb --- /dev/null +++ b/npc/functions/main.txt @@ -0,0 +1,445 @@ +// Evol functions. +// Authors: +// 4144 +// Jesusalva +// Travolta +// Description: +// Build in functions. + +/** + * checks whether the given argument is a char name or account id + * and tries to convert it to an account id + * + * @arg 0 - char name or account id + * @return the account id + */ +function script nameid2id { + if ((getdatatype(getarg(0, "")) & DATATYPE_STR) != 0) { + if (getarg(0, "") == "") { + return playerattached(); + } else { + return getcharid(CHAR_ID_ACCOUNT, getarg(0)); + } + } else if (getarg(0) == 0) { + return playerattached(); + } else { + return getarg(0); + } +} + +function script menuimage { + return getarg(0) + "|" + getarg(1); +} + +function script menuaction { + return "[" + getarg(0) + "]"; +} + +function script mesn { + if (getargcount() > 0) + { + .@s$ = "[" + getarg(0) + "]"; + } + else + { + .@s$ = "[" + strnpcinfo(1) + "]"; + } + mes .@s$; + return; +} + +function script mesq { + mes "\"" + getarg(0)+ "\""; + return; +} + +function script g { + consolemes(CONSOLEMES_ERROR, "Deprecated function \"g\" used, results are not reliable."); + return rand(1000) % 2 ? getarg(0) : getarg(1); +} + +function script b { + return "##B" + getarg(0) + "##b"; +} + +function script col { + .@color = getarg(1); + if (.@color < 0) .@color = 0; + if (.@color > 9) .@color = 9; + return "##" + .@color + getarg(0) + "##0"; +} + +function script mesc { + return mes(col(getarg(0, ""), getarg(1, 9))); +} + +// *showimage("<file>"); +// Displays an image in the NPC window. If no file extension is provided, it is +// assumed to be a PNG file. The image path is relative to client-data/graphics. +// example: +// showimage("guiicons/flags/fr"); +function script showimage { + .@file$ = getarg(0); + + if (!endswith(getarg(0), ".jpg") && !endswith(getarg(0), ".png")) { + .@file$ += ".png"; + } + + if (charat(getarg(0), 0) == "/") { + .@file$ = delchar(.@file$, 0); // absolute path from root of client-data + } else if (!startswith(getarg(0), "help/") && !startswith(getarg(0), "graphics/") ) { + .@file$ = "graphics/" + .@file$; // assume relative to graphics/ + } + + return mesf("~~~%s~", .@file$); +} + +function script adddefaultskills { + if (getskilllv(NV_BASIC) < 6) + { + skill NV_BASIC, 6, 0; + } + return; +} + +function script addremovemapmask { + setmapmask getarg(0), (getmapmask(getarg(0)) | (getarg(1) + getarg(2))) ^ getarg(2); + return; +} + +// Function to show narrator text. Accepts string args. +// If first arg is a number N, then it represents bit flags. +// Bit flags : +// S_FIRST_BLANK_LINE -- blank line at beginning +// S_LAST_BLANK_LINE -- blank line at the end +// S_LAST_NEXT -- use last "next();" +// S_NO_NPC_NAME -- don't use first "mesn();" +// S_LAST_CLOSE -- use last "close2(); +function script narrator { + .@start = 0; + .@argc = getargcount(); + .@flags = 0; + + if (.@argc > 1 && (getdatatype(getarg(0)) & DATATYPE_INT) != 0) { + .@start = 1; + .@flags = getarg(0); + } + + if ((.@flags & S_FIRST_BLANK_LINE) != 0) { + mes(""); + } + + if ((.@flags & S_NO_NPC_NAME) == 0) { + mesn(l("Narrator")); + } + + for (.@i = .@start; .@i < .@argc; .@i++) { + mes(col(getarg(.@i), 9)); + + if (.@i < .@argc - 1) { + next(); + } + } + + if ((.@flags & S_LAST_BLANK_LINE) != 0) { + mes(""); + } + + if ((.@flags & S_LAST_NEXT) != 0) { + next(); + } else if ((.@flags & S_LAST_CLOSE) != 0) { + close2(); + } + + return; +} + +// Function to show NPC speech. Accepts string args. +// If first arg is a number N, then it represents bit flags. +// Bit flags : +// 0x1 -- blank line at beginning +// 0x2 -- blank line at the end +// 0x4 -- use last "next;" +// 0x8 -- don't use first "mesn;" +function script speech { + .@start = 0; + .@argc = getargcount(); + .@flags = 0; + + if (.@argc > 1 && !isstr(getarg(0))) + { + .@start = 1; + .@flags = getarg(0); + } + + if (.@flags & 0x1) + mes ""; + + if (!(.@flags & 0x8)) + mesn; + + for (.@i = .@start; .@i < .@argc; .@i++) + { + mesq getarg(.@i); + + if (.@i < .@argc - 1) + next; + } + + if (.@flags & 0x4) + next; + else if (.@flags & 0x2) + mes ""; + + return; +} + +// Show debug message if .debug variable of NPC is set to 1 +function script npcdebug { + if (getvariableofnpc(.debug, strnpcinfo(3))) + consolemes(CONSOLEMES_DEBUG, strnpcinfo(3) + ": " + getarg(0)); + return; +} + +function script askyesno { + .@sel = select(menuaction(l("Yes")), + menuaction(l("No"))); + mes ""; + return .@sel; +} + +// Argument: +// 0 Quest variable +// 1 Current value +// 2 Next value +function script compareandsetq { + if (getq(getarg(0)) == getarg(1)) + { + setq getarg(0), getarg(2); + return true; + } + return false; +} + +// Use a delay to prevent spams from NPC that display text without the +// use of (a) close/next function(s). +// Argument: +// 0 Text to display +// 1 Lock delay (default = 1) +// 2 Message function: (default = 0) +// 0 = npctalk3 +// 1 = npctalk +// 2 = message +function script npctalkonce { + // lock mechanism + switch (getarg(2, 0)) + { + case 1: + if (gettimetick(2) <= getvariableofnpc(.talk_lock, strnpcinfo(NPC_NAME_UNIQUE))) + return false; + set(getvariableofnpc(.talk_lock, strnpcinfo(NPC_NAME_UNIQUE)), gettimetick(2) + getarg(1, 1)); + break; + default: + if (gettimetick(2) <= @NPC_TALK_LOCK[getnpcid()]) + return false; + @NPC_TALK_LOCK[getnpcid()] = gettimetick(2) + getarg(1, 1); + } + + // talk mechanism + switch (getarg(2, 0)) + { + case 0: npctalk3(getarg(0)); break; + case 1: npctalk(getarg(0)); break; + case 2: message(strcharinfo(0), getarg(0)); + } + + return true; +} + +function script getquestlink { + return "[@@q" + getarg(0) + "|@@]"; +} + +function script getmonsterlink { + return "[@@m" + getarg(0) + "|@@]"; +} + +function script getpetlink { + return "[@@p" + getarg(0) + "|@@]"; +} + +function script getmercenarylink { + return "[@@M" + getarg(0) + "|@@]"; +} + +function script gethomunculuslink { + return "[@@h" + getarg(0) + "|@@]"; +} + +// Returns the player race in plain text +// GETRACE_RACE - returns player race (default) +// GETRACE_SKIN - returns player skin +// GETRACE_FULL - returns player skin + race +// Can take an optional 2nd param with the class +// get_race( {Flag, {Class}} ) +function script get_race { + .@m=getarg(0, GETRACE_RACE); + .@g=getarg(1, Class); + + // We also allow this to run without player attached for... science. + if (playerattached()) + { + setarray .@allraces$, l("Human"), l("Human"), l("Human"), + l("Ukar"), l("Ukar"), + l("Tritan"), l("Tritan"), + l("Raijin"), l("Raijin"), + l("Kralog"), l("Kralog"); + setarray .@allskins$, l("Kaizei"), l("Argaes"), l("Tonori"), + l("Cave"), l("Mountain"), + l("Sea"), l("Lake"), + l("Light"), l("Dark"), + l("Fire"), l("Frost"); + } + else + { + setarray .@allraces$, ("Human"), ("Human"), ("Human"), + ("Ukar"), ("Ukar"), + ("Tritan"), ("Tritan"), + ("Raijin"), ("Raijin"), + ("Kralog"), ("Kralog"); + setarray .@allskins$, ("Kaizei"), ("Argaes"), ("Tonori"), + ("Cave"), ("Mountain"), + ("Sea"), ("Lake"), + ("Light"), ("Dark"), + ("Fire"), ("Frost"); + } + + if (.@m == GETRACE_RACE) + return .@allraces$[.@g]; + else if (.@m == GETRACE_SKIN) + return .@allskins$[.@g]; + else + return .@allskins$[.@g] + " " + .@allraces$[.@g]; +} + +// Clear output of getinventorylist() +// delinventorylist() +function script delinventorylist { + deletearray @inventorylist_id; + deletearray @inventorylist_amount; + deletearray @inventorylist_equip; + deletearray @inventorylist_refine; + deletearray @inventorylist_identify; + deletearray @inventorylist_attribute; + deletearray @inventorylist_card1; + deletearray @inventorylist_card2; + deletearray @inventorylist_card3; + deletearray @inventorylist_card4; + deletearray @inventorylist_expire; + deletearray @inventorylist_bound; + @inventorylist_count=0; + return; +} + +// isin( map, x1, y1, {[x2, y2][radius]} ) +function script isin { + if (getmapxy(.@mapName$, .@xpos, .@ypos, 0) != 0) + return false; + if (.@mapName$ != getarg(0)) + return false; + + if (getarg(4,-1) < 0) { + // Radius Based + if (.@xpos >= getarg(1)-getarg(3) && .@xpos <= getarg(1)+getarg(3) && .@ypos >= getarg(2)-getarg(3) && .@ypos <= getarg(2)+getarg(3)) + return true; + } else { + // Coordinate based + if (.@xpos >= getarg(1) && .@xpos <= getarg(3) && .@ypos >= getarg(2) && .@ypos <= getarg(4)) + return true; + } + return false; +} + +// Shortcut for getmapname() +function script getmap { + return getmapname(); +} + +// Quest Rewards +// quest_xp(maxLevel, reward, {multiplier=1}) +function script quest_xp { + //.@minLevel=getarg(0); + .@maxLevel=getarg(0); + .@reward=getarg(1); + .@mult=getarg(2, 1); + if (BaseLevel <= .@maxLevel) { + getexp .@reward*.@mult, 0; + return; + } + // You'll forsake 2% every over level + .@mult*=100; + .@mult-=((BaseLevel - .@maxLevel) * 2); + .@mult=max(10, .@mult); + getexp .@reward*.@mult/100, 0; + return; +} + +// quest_jxp(maxLevel, reward, {multiplier=1}) +function script quest_jxp { + //.@minLevel=getarg(0); + .@maxLevel=getarg(0); + .@reward=getarg(1); + .@mult=getarg(2, 1); + if (BaseLevel < .@maxLevel) { + getexp 0, .@reward*.@mult; + return; + } + // You'll forsake 2% every over level + .@mult*=100; + .@mult-=((BaseLevel - .@maxLevel) * 2); + .@mult=max(10, .@mult); + getexp 0, .@reward*.@mult/100; + return; +} + +// quest_gp(maxLevel, reward, {multiplier=1}) +function script quest_gp { + //.@minLevel=getarg(0); + .@maxLevel=getarg(0); + .@reward=getarg(1); + .@mult=getarg(2, 1); + if (BaseLevel <= .@maxLevel) { + Zeny+=.@reward*.@mult; + return; + } + // You'll forsake 2% every over level + .@mult*=100; + .@mult-=((BaseLevel - .@maxLevel) * 2); + .@mult=max(10, .@mult); + Zeny+=.@reward*.@mult/100; + return; +} + +// quest_item(maxLevel, item, {amount=1}, {bound=0}) +function script quest_item { + //.@minLevel=getarg(0); + .@maxLevel=getarg(0); + .@reward=getarg(1); + .@mult=getarg(2, 1); + .@bind=getarg(3, 0); + // Item will not be obtained if you are overlevel + if (BaseLevel > .@maxLevel && .@mult <= 1) + return; + // If it comes in pairs, you'll only get 1 + if (BaseLevel > .@maxLevel) + .@mult=1; + // Obtain item bound if needed + if (.@bind) + getitembound .@reward, .@mult, .@bind; + else + getitem .@reward, .@mult; + return; +} + + + |