TWM2/scripts/TWM2/Systems/ChallengeMenus.cs
Robert Fritzen b316f2fdbe Fixed Trevor's Internal Tags, Implemented New Challenge Menu Code
Fixed the internal tags for Lordranius Trevor, Grapple Hook balance,
round 2, implemented automenu system for challenges (No more mega files,
yay!)
2017-06-30 13:24:52 -05:00

306 lines
13 KiB
C#

//Challenge Menus
//TWM2 3.9.1
//All of the challenge menu functions are now in this file to make locating them for adjustment
// easier to maintain. Also, as of 3.9.1, I have now provided a means to automate this menu's
// creation such that new challenges can be very easily added.
function GenerateChallengesMenu(%client, %tag, %index) {
%scriptController = %client.TWM2Core;
%xp = getCurrentEXP(%client);
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:16>Select a category to view challenges:");
%index++;
//
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14><a:gamelink\tOtherTasksSub\t6>PGD Challenges (Daily/Weekly/Monthly)</a>");
%index++;
for(%i = 1; $Challenge::Category[%i] !$= ""; %i++) {
if(%i != 6) {
%categoryReq = getField($Challenge::Category[%i], 2);
if(getWord(%categoryReq, 0) $= "Officer") {
%offLevel = getWord(%categoryReq, 1);
if(%scriptController.officer >= %offLevel) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14><a:gamelink\tOtherTasksSub\t"@%i@">"@getField($Challenge::Category[%i], 0)@"</a>: "@getField($Challenge::Category[%i], 1));
%index++;
}
else {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>"@getField($Challenge::Category[%i], 0)@": Locked, Requires officer level "@%offLevel@" ("@strReplace($Prestige::Name[%offLevel], " ", "")@")");
%index++;
}
}
else {
if(%categoryReq == -1) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14><a:gamelink\tOtherTasksSub\t"@%i@">"@getField($Challenge::Category[%i], 0)@"</a>: "@getField($Challenge::Category[%i], 1));
%index++;
}
else {
if(%xp >= $Rank::MinPoints[%categoryReq]) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14><a:gamelink\tOtherTasksSub\t"@%i@">"@getField($Challenge::Category[%i], 0)@"</a>: "@getField($Challenge::Category[%i], 1));
%index++;
}
else {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>"@getField($Challenge::Category[%i], 0)@": Locked, Requires Rank of "@$Ranks::NewRank[%categoryReq]@".");
%index++;
}
}
}
}
}
return %index;
}
function GenerateChallengeSubMenu(%client, %subMenu, %tag, %index) {
if(%subMenu == 6) {
return GenerateDWMChallengeMenu(%client, %tag, %index);
}
%scriptController = %client.TWM2Core;
%xp = getCurrentEXP(%client);
for(%i = 0; $Challenge::Challenge[%subMenu, %i] !$= ""; %i++) {
%loopAndFinish = false;
%challengeInternalName = $Challenge::Challenge[%subMenu, %i];
%challengeDetails = $Challenge::Info[%challengeInternalName];
%trailing = TWM2Lib_MainControl("getStrTrailingNumber", %challengeInternalName);
if(%done[%challengeInternalName]) {
continue;
}
if(%challengeDetails !$= "") {
//Is this NOT a multi-tier challenge?
if($Challenge::IsNotMultiTier[%challengeInternalName] || %trailing $= "" || %trailing == 0) {
//Proceed to writing ;)
if(%client.CheckNWChallengeCompletion(%challengeInternalName)) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14><color:33FF00>"@getField(%challengeDetails, 0)@": "@getField(%challengeDetails, 4));
%index++;
continue;
}
else {
//Does this challenge require another challenge be completed?
if($Challenge::RequiresChallenge[%subMenu, %i] !$= "") {
%requiredChallengeName = $Challenge::RequiresChallenge[%subMenu, %i];
%requiredChallengeDetails = $Challenge::Info[%requiredChallengeName];
if(!%client.CheckNWChallengeCompletion(%requiredChallengeName)) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked: Requires Completion of "@getField(%requiredChallengeDetails, 0));
%index++;
continue;
}
}
//Does this challenge have an embedded requirement?
if($Challenge::SetRequirement[%subMenu, %i] !$= "") {
%cReq = $Challenge::SetRequirement[%subMenu, %i];
if(getWord(%cReq, 0) $= "Officer") {
%offLevel = getWord(%cReq, 1);
if(%scriptController.officer < %offLevel) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked, Requires officer level "@%offLevel@" ("@strReplace($Prestige::Name[%offLevel], " ", "")@")");
%index++;
continue;
}
}
else {
%expReq = $Rank::MinPoints[%cReq];
if(%xp < $expReq) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked, Requires "@$Ranks::NewRank[%cReq]@" rank");
%index++;
continue;
}
}
}
//Is this a "hidden" challenge?
if($Challenge::SetHidden[%subMenu, %i]) {
if($Challenge::HiddenMessage[%subMenu, %i] !$= "") {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>"@$Challenge::HiddenMessage[%subMenu, %i]);
%index++;
continue;
}
else {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>This is a hidden challenge, unlock it to learn more.");
%index++;
continue;
}
}
//All tests passed, write normally.
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>"@getField(%challengeDetails, 0)@": "@getField(%challengeDetails, 4));
%index++;
}
}
else {
//Scan for additional challenges using the same internal name..
%chStr = getSubStr(%challengeInternalName, 0, strLen(%challengeInternalName) - strLen(%trailing));
//Loop forward until the system draws a blank
%fCount = 0;
%j = %i;
while(true) {
%nextC = $Challenge::Challenge[%subMenu, %j];
%nextT = TWM2Lib_MainControl("getStrTrailingNumber", %nextC);
%nextChStr = getSubStr(%nextC, 0, strLen(%nextC) - strLen(%nextT));
if(%nextChStr $= %chStr && %nextT == %fCount+1) {
%fCount++;
%j++;
}
else {
break;
}
}
//This isn't a multi-tier, flag it internally so we can skip this code later, and push a message to the console to let the host know.
if(%fCount == 1) {
error("NOTE: Challenge menu generator has flagged a non multi-tier challenge caught inside the multi-tier loop, consider removing "@%challengeInternalName@" by adding the $Challenge::IsNotMultiTier flag to this challenge.");
if(%client.CheckNWChallengeCompletion(%challengeInternalName)) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14><color:33FF00>"@getField(%challengeDetails, 0)@": "@getField(%challengeDetails, 4));
%index++;
continue;
}
else {
//Does this challenge require another challenge be completed?
if($Challenge::RequiresChallenge[%subMenu, %i] !$= "") {
%requiredChallengeName = $Challenge::RequiresChallenge[%subMenu, %i];
%requiredChallengeDetails = $Challenge::Info[%requiredChallengeName];
if(!%client.CheckNWChallengeCompletion(%requiredChallengeName)) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked: Requires Completion of "@getField(%requiredChallengeDetails, 0));
%index++;
continue;
}
}
//Does this challenge have an embedded requirement?
if($Challenge::SetRequirement[%subMenu, %i] !$= "") {
%cReq = $Challenge::SetRequirement[%subMenu, %i];
if(getWord(%cReq, 0) $= "Officer") {
%offLevel = getWord(%cReq, 1);
if(%scriptController.officer < %offLevel) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked, Requires officer level "@%offLevel@" ("@strReplace($Prestige::Name[%offLevel], " ", "")@")");
%index++;
continue;
}
}
else {
%expReq = $Rank::MinPoints[%cReq];
if(%xp < $expReq) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked, Requires "@$Ranks::NewRank[%cReq]@" rank");
%index++;
continue;
}
}
}
//Is this a "hidden" challenge?
if($Challenge::SetHidden[%subMenu, %i]) {
if($Challenge::HiddenMessage[%subMenu, %i] !$= "") {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>"@$Challenge::HiddenMessage[%subMenu, %i]);
%index++;
continue;
}
else {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>This is a hidden challenge, unlock it to learn more.");
%index++;
continue;
}
}
//All tests passed, write normally.
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>"@getField(%challengeDetails, 0)@": "@getField(%challengeDetails, 4));
%index++;
}
}
else {
//Alright, we've got a multi-tier challenge. Now, let's process...
//Step 1: Identify the active challenge...
%j = %i;
%fCount = 1;
while(true) {
%currentC = $Challenge::Challenge[%subMenu, %j];
%currentT = TWM2Lib_MainControl("getStrTrailingNumber", %currentC);
%currentChStr = getSubStr(%currentC, 0, strLen(%currentC) - strLen(%currentT));
%cDetails = $Challenge::Info[%currentC];
if(%loopAndFinish) {
if(%currentChStr $= %chStr && %currentT == %fCount) {
%done[%currentC] = true;
%fCount++;
%j++;
continue;
}
else {
break;
}
}
//Is this challenge complete? If so, check to see if the next challenge is still contained in our "sequence"
if(%client.CheckNWChallengeCompletion(%currentC)) {
%done[%currentC] = true;
//Yes, it's complete, move to the next.
%nextC = $Challenge::Challenge[%subMenu, %j+1];
%nextT = TWM2Lib_MainControl("getStrTrailingNumber", %nextC);
%nextChStr = getSubStr(%nextC, 0, strLen(%nextC) - strLen(%nextT));
if(%nextChStr $= %currentChStr && %nextT == %fCount+1) {
%fCount++;
%j++;
continue;
}
else {
%cDetails = $Challenge::Info[%currentC];
//This is the last challenge in the sequence, and it's done... write.
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14><color:33FF00>"@getField(%cDetails, 0)@": "@getField(%cDetails, 4));
%index++;
break;
}
}
else {
//Not complete, this is the active challenge. Proceed to write, then flag the others in the chain as "done"
//Does this challenge require another challenge be completed?
if($Challenge::RequiresChallenge[%subMenu, %j] !$= "") {
%requiredChallengeName = $Challenge::RequiresChallenge[%subMenu, %j];
%requiredChallengeDetails = $Challenge::Info[%requiredChallengeName];
if(!%client.CheckNWChallengeCompletion(%requiredChallengeName)) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked: Requires Completion of "@getField(%requiredChallengeDetails, 0));
%index++;
%loopAndFinish = true;
continue;
}
}
//Does this challenge have an embedded requirement?
if($Challenge::SetRequirement[%subMenu, %j] !$= "") {
%cReq = $Challenge::SetRequirement[%subMenu, %j];
if(getWord(%cReq, 0) $= "Officer") {
%offLevel = getWord(%cReq, 1);
if(%scriptController.officer < %offLevel) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked, Requires officer level "@%offLevel@" ("@strReplace($Prestige::Name[%offLevel], " ", "")@")");
%index++;
%loopAndFinish = true;
continue;
}
}
else {
%expReq = $Rank::MinPoints[%cReq];
if(%xp < $expReq) {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>Challenge Locked, Requires "@$Ranks::NewRank[%cReq]@" rank");
%index++;
%loopAndFinish = true;
continue;
}
}
}
//Is this a "hidden" challenge?
if($Challenge::SetHidden[%subMenu, %j]) {
if($Challenge::HiddenMessage[%subMenu, %j] !$= "") {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>"@$Challenge::HiddenMessage[%subMenu, %i]);
%index++;
%loopAndFinish = true;
continue;
}
else {
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>This is a hidden challenge, unlock it to learn more.");
%index++;
%loopAndFinish = true;
continue;
}
}
//All tests passed, write normally.
messageClient( %client, 'SetLineHud', "", %tag, %index, "<font:arial:14>"@getField(%cDetails, 0)@": "@getField(%cDetails, 4));
%index++;
//Flag the rest of the chain as done.
%loopAndFinish = true;
}
}
}
}
}
else {
error("GenerateChallengeSubMenu(): Something went wrong.. Loop found challenge "@%challengeInternalName@", but this is not defined in the NWChallengeIndex.");
}
}
return %index;
}