diff options
Diffstat (limited to 'world/map/npc/commands')
-rw-r--r-- | world/map/npc/commands/_atcommand_local.txt.example | 12 | ||||
-rw-r--r-- | world/map/npc/commands/_import.txt | 4 | ||||
-rw-r--r-- | world/map/npc/commands/_procedures.txt | 53 | ||||
-rw-r--r-- | world/map/npc/commands/marry.txt | 69 | ||||
-rw-r--r-- | world/map/npc/commands/zeny.txt | 77 |
5 files changed, 215 insertions, 0 deletions
diff --git a/world/map/npc/commands/_atcommand_local.txt.example b/world/map/npc/commands/_atcommand_local.txt.example new file mode 100644 index 00000000..a195d580 --- /dev/null +++ b/world/map/npc/commands/_atcommand_local.txt.example @@ -0,0 +1,12 @@ +-|script|GM|32767 +{ + end; + +OnInit: + // define permissions here + set .zeny, G_ADMIN; + + // permissions for events + set .killthegm, G_EVENT; + end; +} diff --git a/world/map/npc/commands/_import.txt b/world/map/npc/commands/_import.txt new file mode 100644 index 00000000..7efe4111 --- /dev/null +++ b/world/map/npc/commands/_import.txt @@ -0,0 +1,4 @@ +npc: npc/commands/_procedures.txt +npc: npc/commands/_atcommand_local.txt +npc: npc/commands/zeny.txt +npc: npc/commands/marry.txt diff --git a/world/map/npc/commands/_procedures.txt b/world/map/npc/commands/_procedures.txt new file mode 100644 index 00000000..77c1c7e9 --- /dev/null +++ b/world/map/npc/commands/_procedures.txt @@ -0,0 +1,53 @@ +// ARGV Splitter +// takes @args$ and splits it properly so that '@cmd "foo bar" baz' is ['foo bar','baz'] instead of ['foo','bar','baz'] +// input: @args$ (string) +// output: @argv$ (array) and @argv (array) +function|script|argv_splitter +{ + explode .@fragments$, @args$, " "; + set .@e, 0; + set .@total, getarraysize(.@fragments$); + set .@NULL$, chr(3); // HACK: we use .@NULL$ as a workaround because we can't do "\0" + goto L_Check; + +L_Check: + setarray .@check$[0], "", .@NULL$, .@NULL$; + explode .@check$, .@fragments$[.@e], "\""; // check if the fragment contains a quote + if (.@check$[0] == "" && .@check$[1] != .@NULL$ && .@check$[1] != "" && .@check$[2] == .@NULL$) + set .@string$, .@check$[1]; // begin substring + elif (.@check$[0] != "" && .@check$[1] == "" && .@check$[2] == .@NULL$) + goto L_EndSubString; // end substring + elif (.@string$ != "" && .@check$[0] != "" && .@check$[1] == .@NULL$ && .@check$[2] == .@NULL$) + set .@string$, .@string$ +" "+ .@check$[0]; // part of the substring + elif (.@check$[2] != .@NULL$) goto L_Set2; // the the argument is quoted but there is no space + else goto L_Set; + goto L_CheckAfter; + +L_Set: + setarray @argv$[.@t], .@check$[0]; // not in a substring so push right away + setarray @argv[.@t], .@check$[0]; // not in a substring so push right away + set .@t, .@t + 1; + goto L_CheckAfter; + +L_Set2: + setarray @argv$[.@t], .@check$[1]; // not in a substring so push right away + setarray @argv[.@t], .@check$[1]; // not in a substring so push right away + set .@t, .@t + 1; + goto L_CheckAfter; + +L_EndSubString: + set .@string$, .@string$ + " " + .@check$[0]; + setarray @argv$[.@t], .@string$; // push in the array + setarray @argv[.@t], .@string$; // push in the array + set .@t, .@t + 1; + set .@string$, ""; // clean + goto L_CheckAfter; + +L_CheckAfter: + set .@e, .@e + 1; + if (.@e > .@total) goto L_Done; // the @argv$ array is built + goto L_Check; // not done yet + +L_Done: + return; +} diff --git a/world/map/npc/commands/marry.txt b/world/map/npc/commands/marry.txt new file mode 100644 index 00000000..39efe6b8 --- /dev/null +++ b/world/map/npc/commands/marry.txt @@ -0,0 +1,69 @@ +-|script|special-marry|32767 +{ + set .@target_id, getcharid(3, @args$); + if (.@target_id < 1 || !(isloggedin(.@target_id)) || .@target_id == BL_ID) goto L_NotFound; + if (PARTNER || get(PARTNER, .@target_id)) goto L_AlreadyMarried; + if (isin("014-1",29,36,34,39) == 0 && isin("001-1",20,27,22,27) == 0) goto L_NotInArea; + if (distance(BL_ID, .@target_id) != 1) goto L_AwayFromPartner; + if (BaseLevel < WEDDING_MIN_LEVEL || get(BaseLevel, .@target_id) < WEDDING_MIN_LEVEL) goto L_TooYoung; + if (getequipid(equip_shield) != 702 || getequipid(equip_shield, @args$) != 702) goto L_NoRing; + + if (get(@marriage[0], .@target_id) == BL_ID) goto L_Proceed; + + setarray @marriage[0], .@target_id, gettimetick(2); + addtimer (.timeout * 1000), strnpcinfo(0) + "::OnTimeout"; + announce strcharinfo(0) + " is asking " + strcharinfo(0, .@target_id) + " for marriage.", 2; + message strcharinfo(0, .@target_id), "Marriage : ##3##B" + strcharinfo(0) + " wishes to marry you. To accept, write `##1#marry "+strcharinfo(0)+"##3` within the next "+.timeout+" seconds."; + end; + +L_NotFound: + message strcharinfo(0), "Marriage : ##3##BThe target player is either not found or yourself."; + end; + +L_TooYoung: + message strcharinfo(0), "Marriage : ##3##BYou and your partner need to be at least level "+ WEDDING_MIN_LEVEL +"."; + end; + +L_NoRing: + message strcharinfo(0), "Marriage : ##3##BYou and your partner need to have ["+ getitemlink("WeddingRing") +"] equipped."; + end; + +L_AwayFromPartner: + message strcharinfo(0), "Marriage : ##3##BYou and your partner need to be standing next to each other."; + end; + +L_NotInArea: + message strcharinfo(0), "Marriage : ##3##BYou are not standing in a designated marriage area."; + end; + +L_Proceed: + if ((gettimetick(2) - .timeout) > get(@marriage[1], .@target_id)) goto L_TooLate; + set PARTNER, CHAR_ID, .@target_id; + if (PARTNER == get(CHAR_ID, .@target_id)) goto L_Success; + set PARTNER, 0, .@target_id; + set PARTNER, 0; + end; + +L_Success: + announce strcharinfo(0) + " and " + strcharinfo(0, .@target_id) + " are now married.", 2; + end; + +OnTimeout: + goto L_TooLate; + +L_TooLate: + message strcharinfo(0), "Marriage : ##3##BThe proposal expired. Please try again."; + message strcharinfo(0, @marriage[0]), "Marriage : ##3##BThe proposal expired. Please try again."; + set @marriage[0], 0, @marriage[0]; + set @marriage[0], 0; + end; + +L_AlreadyMarried: + message strcharinfo(0), "Marriage : ##3##BYou"+ if_then_else(PARTNER, " are", "r partner is") +" already married."; + end; + +OnInit: + set .timeout, 30; // timeout for proposal + registercmd "#marry", strnpcinfo(0); // we NEED to use a # before `marry` because otherwise manaplus does not strip colors + end; +} diff --git a/world/map/npc/commands/zeny.txt b/world/map/npc/commands/zeny.txt new file mode 100644 index 00000000..9215637a --- /dev/null +++ b/world/map/npc/commands/zeny.txt @@ -0,0 +1,77 @@ +-|script|@zeny|32767 +{ + if (GM < get(.zeny, "GM") && GM < G_SYSOP) goto L_GM; + callfunc "argv_splitter"; + set .@target_id, BL_ID; + if (@argv$[1] != "") set .@target_id, getcharid(3, @argv$[1]); + if (@argv$[1] != "" && !(isloggedin(.@target_id))) goto L_Failed; // do NOT fallback to self + if (@argv$[0] == "--") goto L_Remove; + if (@argv$[0] == "---") goto L_RemoveAll; + if (@argv$[0] == "++") goto L_Max; + if (@argv$[0] == "+++") goto L_MaxAll; + set .@delta, @argv[0]; // ± zeny + set .@zeny, get(Zeny, .@target_id); // get the number of zeny in char + set .@bank, get(#BankAccount, .@target_id); // get number of zeny in (world) account + set .@new_zeny, .@zeny + .@delta; // new balance in char + if (.@new_zeny < 0) goto L_MaybeRemoveBank; // zeny would be below 0 so check if we can take from bank + if (.@new_zeny > .max_zeny) goto L_MaybeAddBank; // zeny would be over the limit so check if we can store in bank + set Zeny, (.@zeny + .@delta), .@target_id; + goto L_Success; + +L_Remove: + set Zeny, 0, .@target_id; + goto L_Success; + +L_RemoveAll: + set Zeny, 0, .@target_id; + set #BankAccount, 0, .@target_id; + goto L_Success; + +L_Max: + set Zeny, .max_zeny, .@target_id; + goto L_Success; + +L_MaxAll: + set Zeny, .max_zeny, .@target_id; + set #BankAccount, .max_int, .@target_id; + goto L_Success; + +L_MaybeAddBank: + set .@new_bank, (.@bank + (.@new_zeny - .max_zeny)); + if (.@new_bank > .max_int || .@new_bank < 0) goto L_OutOfBounds; + set Zeny, .max_zeny, .@target_id; + set #BankAccount, .@new_bank, .@target_id; + goto L_Success; + +L_MaybeRemoveBank: + if ((.@bank + .@new_zeny) < 0) goto L_OutOfBounds; + set Zeny, 0, .@target_id; + set #BankAccount, (.@bank + .@new_zeny), .@target_id; + goto L_Success; + +L_OutOfBounds: + // XXX: maybe we could also take from other chars from the same accout? + message strcharinfo(0), "zeny : Impossible to proceed! This would cause the player to have less than 0 zeny or more than " + .max_int + "."; + end; + +L_Failed: + // XXX: should we allow GMs to change zeny of users that are not logged in? + message strcharinfo(0), "zeny : Impossible to attach to the target player."; + end; + +L_Success: + gmlog "@zeny " + @args$; + message strcharinfo(0), "zeny : The operation succeeded."; + end; + +L_GM: + message strcharinfo(0), "zeny : GM command is level "+ get(.zeny, "GM") +", but you are level " + GM; + end; + +OnInit: + set .max_zeny, 1000000000; // hardcoded in tmwa + set .max_int, 2147483647; // max int32 value + registercmd chr(ATCMD_SYMBOL) + "zeny", strnpcinfo(0); + registercmd chr(ATCMD_SYMBOL) + "charzeny", strnpcinfo(0); + end; +} |