summaryrefslogtreecommitdiff
path: root/world/map/npc/functions
diff options
context:
space:
mode:
Diffstat (limited to 'world/map/npc/functions')
-rw-r--r--world/map/npc/functions/announcements.txt5
-rw-r--r--world/map/npc/functions/barber.txt128
-rw-r--r--world/map/npc/functions/game_rules.txt1
-rw-r--r--world/map/npc/functions/global_event_handler.txt2
-rw-r--r--world/map/npc/functions/gm_island.txt33
-rw-r--r--world/map/npc/functions/headstyles.txt125
6 files changed, 226 insertions, 68 deletions
diff --git a/world/map/npc/functions/announcements.txt b/world/map/npc/functions/announcements.txt
index dd56eadc..0a62e144 100644
--- a/world/map/npc/functions/announcements.txt
+++ b/world/map/npc/functions/announcements.txt
@@ -178,9 +178,8 @@ function|script|getBroadcast
goto L_ReturningPlayer;
L_NewPlayer:
- // todo: show game rules on login (in another PR)
- // ... does not look like it work.. the `menu`
- // builtin behaves weirdly when on login
+ // todo: show game rules on login
+ // FIXME: needs to spawn a 32767 puppet
goto L_Return;
L_ReturningPlayer:
diff --git a/world/map/npc/functions/barber.txt b/world/map/npc/functions/barber.txt
index 2c940c33..54732418 100644
--- a/world/map/npc/functions/barber.txt
+++ b/world/map/npc/functions/barber.txt
@@ -4,13 +4,15 @@
// o11c updated it according to new scripting standards while adding pink.
// ... and added the code that shows your old color/style.
-// Note: there is a soft limit of 12 colors (0-11) and 20 styles (0-19)
+// Note: there is a soft limit of 15 colors per classes and 20 styles (0-19)
// This is the number that can be set when creating a character
// or using GM commands, but scripts (such as this one) can set
// any value 0-255
function|script|Barber
{
+ if (getequipid(equip_head) == 647)
+ goto L_Debug;
callfunc "getHeadStyles";
goto L_Main;
@@ -21,20 +23,49 @@ L_Main:
set @color$, "Unknown";
if (@style >= 1 && @style <= 20)
set @style$, @HairStyles$[(@style - 1)];
- if (Class > 1)
- set @color, (@color - (15 * Class));
+ if (@color == ((HC_WHITE - Class) + 1))
+ set @color$, "Shocked White";
+ set @color, (@color - (15 * (Class - 1)));
if (@color >= 0 && @color <= 15)
set @color$, @HairColors$[@color];
- if (@color == 127)
- set @color$, "Shocked White";
mes "Your current style is " + @style$ + " and your current color is " + @color$ + ".";
set @style$, "";
set @color$, "";
menu
"Change my style", L_Style,
"Change my color", L_Color,
+ "Change my gender", L_Gender,
+ "Nah, I'm fine", L_Done;
+
+L_Gender:
+ menu
+ "Female.", L_Female,
+ "Male.", L_Male,
+ "Non-binary.", L_NonBinary,
"Nah, I'm fine", L_Done;
+L_Female:
+ set @sex, 0;
+ goto L_Change;
+
+L_Male:
+ set @sex, 1;
+ goto L_Change;
+
+L_NonBinary:
+ set @sex, 3;
+ goto L_Change;
+
+L_Change:
+ if (Sex == @sex)
+ goto L_Already_Change;
+ set Sex, @sex;
+ return;
+
+L_Already_Change:
+ mes "\"Umm, you are that gender already.\"";
+ return;
+
L_Style:
if(!@hairOpts) set @HairStyles$[getarraysize(@HairStyles$)], "Surprise me";
if(!@hairOpts) set @HairStyles$[getarraysize(@HairStyles$)], "Nah, I'm fine";
@@ -61,24 +92,22 @@ L_Style:
@HairStyles$[18], L_MenuItems,
@HairStyles$[19], L_MenuItems,
@HairStyles$[20], L_MenuItems,
- @HairStyles$[21], L_MenuItems,
- @HairStyles$[22], L_MenuItems,
- @HairStyles$[23], L_MenuItems,
- @HairStyles$[24], L_MenuItems,
- @HairStyles$[25], L_MenuItems;
+ @HairStyles$[21], L_MenuItems;
L_MenuItems:
if (@menu == @style)
goto L_SameStyle;
if(@menu == (getarraysize(@HairStyles$) - 1)) goto L_RandomStyle;
- if(@menu == getarraysize(@HairStyles$)) goto L_Done;
+ if(@menu >= getarraysize(@HairStyles$)) goto L_Done;
setlook LOOK_HAIR_STYLE, @menu;
goto L_Main;
L_RandomStyle:
- set @randomStyle, rand(1, (getarraysize(@HairStyles$) -4));
- if(@randomStyle == @style) goto L_RandomStyle;
- setlook LOOK_HAIR_STYLE, @randomStyle;
+ setarray @randomStyle[0], rand(1, (getarraysize(@HairStyles$) - 2));
+ setarray @randomStyle[1], @randomStyle[1] + 1; // infinite loop prevention
+ if(@randomStyle[0] == @style && @randomStyle[1] < 15) goto L_RandomStyle;
+ setlook LOOK_HAIR_STYLE, @randomStyle[0];
+ setarray @randomStyle[1], 0;
menu
"Surprise me once again", L_RandomStyle,
"Go back", L_Main,
@@ -89,7 +118,6 @@ L_SameStyle:
goto L_Main;
L_Color:
- if(@style == @BaldStyle) goto L_SameColor; // last headstyle of any class is bald
if(!@colorOpts) set @HairColors$[getarraysize(@HairColors$)], "Surprise me";
if(!@colorOpts) set @HairColors$[getarraysize(@HairColors$)], "Nah, I'm fine";
if(!@colorOpts) set @colorOpts, 1;
@@ -116,24 +144,26 @@ L_MenuItems1:
if (@menu - 1 == @color)
goto L_SameColor;
if(@menu == (getarraysize(@HairColors$) - 1)) goto L_RandomColor;
- if(@menu == getarraysize(@HairColors$)) goto L_Done;
+ if(@menu >= getarraysize(@HairColors$)) goto L_Done;
setlook LOOK_HAIR_COLOR, ((@menu - 1) + (15 * (Class - 1)));
goto L_Main;
L_RandomColor:
- set @randomColor, rand((15 * (Class - 1)), ((getarraysize(@HairColors$) -4) + (15 * (Class - 1))));
- if(@randomColor == @color) goto L_RandomColor;
- setlook LOOK_HAIR_COLOR, @randomColor;
+ setarray @randomColor[0], rand((15 * (Class - 1)), ((getarraysize(@HairColors$) - 3) + (15 * (Class - 1))));
+ setarray @randomColor[1], @randomColor[1] + 1;
+ if(@randomColor[0] == @color && @randomColor[1] < 15) goto L_RandomColor;
+ setlook LOOK_HAIR_COLOR, @randomColor[0];
+ setarray @randomColor[1], 0;
menu
"Surprise me once again", L_RandomColor,
"Go back", L_Main,
"Goodbye", L_Done;
L_SameColor:
- mes "You are either bald or your hair is already that color.";
+ mes "You already have that color.";
goto L_Main;
-S_Janitor:
+L_Done:
// cleanup
set @menu, 0;
set @style, 0;
@@ -144,7 +174,57 @@ S_Janitor:
set @colorOpts, 0;
return;
-L_Done:
- callsub S_Janitor;
- return;
+L_Debug:
+ npcaction 9; // FIXME: this should become a builtin (ie `clear`)
+ mes "Class: " + Class;
+ mes "Style: " + getlook(LOOK_HAIR_STYLE);
+ mes "Color: " + getlook(LOOK_HAIR_COLOR);
+ mes "Gender: " + Sex;
+ menu
+ "edit| Set Class", L_DebugClass,
+ "edit| Set Style", L_DebugStyle,
+ "edit| Set Color", L_DebugColor,
+ "edit| Set Gender", L_DebugGender,
+ "toggle| Simulate logout", L_DebugLogout,
+ "Close", L_Done;
+
+L_DebugLogout:
+ callfunc "fixHeadStyles";
+ goto L_Debug;
+
+L_DebugClass:
+ set @dbg_class, 0;
+ mes "input class (0-32767)";
+ input @dbg_class;
+ if (@dbg_class >= 0 && @dbg_class <= 32767)
+ set Class, @dbg_class;
+ set @dbg_class, 0;
+ goto L_Debug;
+
+L_DebugStyle:
+ set @dbg_style, 0;
+ mes "input style (0-255)";
+ input @dbg_style;
+ if (@dbg_style >= 0 && @dbg_style <= 255)
+ setlook LOOK_HAIR_STYLE, @dbg_style;
+ set @dbg_style, 0;
+ goto L_Debug;
+
+L_DebugColor:
+ set @dbg_color, 0;
+ mes "input color (0-255)";
+ input @dbg_color;
+ if (@dbg_color >= 0 && @dbg_color <= 255)
+ setlook LOOK_HAIR_COLOR, @dbg_color;
+ set @dbg_color, 0;
+ goto L_Debug;
+
+L_DebugGender:
+ set @dbg_gender, 0;
+ mes "input gender (0-3)";
+ input @dbg_gender;
+ if (@dbg_gender >= 0 && @dbg_gender <= 3)
+ set Sex, @dbg_gender;
+ set @dbg_gender, 0;
+ goto L_Debug;
}
diff --git a/world/map/npc/functions/game_rules.txt b/world/map/npc/functions/game_rules.txt
index cb72dfec..e2b9df81 100644
--- a/world/map/npc/functions/game_rules.txt
+++ b/world/map/npc/functions/game_rules.txt
@@ -2,7 +2,6 @@
function|script|GameRules
{
-
mes "[Game Rules]";
mes "Please select a language:";
menu
diff --git a/world/map/npc/functions/global_event_handler.txt b/world/map/npc/functions/global_event_handler.txt
index 7d380b0c..d5c20b06 100644
--- a/world/map/npc/functions/global_event_handler.txt
+++ b/world/map/npc/functions/global_event_handler.txt
@@ -9,7 +9,7 @@
OnPCLoginEvent:
set @login_event, 1;
- callfunc "getHeadStyles"; // converts class, color and hair
+ callfunc "fixHeadStyles"; // convert headstyles
callfunc "ClearVariables"; // removes / converts old variables
callfunc "DisplayMOTD"; // send the motd to the client, if enabled
callfunc "getBroadcast"; // get the scheduled broadcast, if any
diff --git a/world/map/npc/functions/gm_island.txt b/world/map/npc/functions/gm_island.txt
index 89c0790a..1bd7b5e9 100644
--- a/world/map/npc/functions/gm_island.txt
+++ b/world/map/npc/functions/gm_island.txt
@@ -16,11 +16,12 @@ function|script|GmWarp
}
function|script|GmDebug
{
- mes "[Gm Debug]";
+ mes "[GM Debug]";
mes "What do you want to do?";
menu
- "Start Event.", L_GmStart,
- "Stop Event.", L_GmStop;
+ "Open Event Portals.", L_GmStart,
+ "Close Event Portals.", L_GmStop,
+ "Disguise.", L_Disguise;
L_GmStart:
enablenpc "Gm Event#1";
@@ -33,6 +34,32 @@ L_GmStop:
disablenpc "Gm Event#2";
disablenpc "Gm Event#3";
return;
+
+L_Disguise:
+ npcaction 9;
+ mes "[GM Debug - Disguise]";
+ mes "The Disguise function allows GMs to disguise themselves as mobs or npcs.";
+ mes "---";
+ mes "Mob IDs: [@@https://www.themanaworld.org/index.php/Monster_Reference|Monster Reference@@]";
+ mes "You can either logout or use id ##B0##b to reset.";
+ mes "---";
+ mes "Please input the mob ID:";
+ input @disguise_id;
+ if (@disguise_id < 1000 || @disguise_id > 32767)
+ goto L_ResetClass;
+ mes "Your disguise has been changed.";
+ if (Class <= 5)
+ set @old_class, Class;
+ set Class, @disguise_id;
+ mes "";
+ mes "For technical reasons, you are not able to see your own disguise, but other players will see it.";
+ return;
+
+L_ResetClass:
+ mes "Your appearance has been reset.";
+ set Class, if_then_else(@old_class, @old_class, 1);
+ callfunc "fixHeadStyles";
+ return;
}
001-1,49,68,0|script|Gm Event#1|368,0,0
{
diff --git a/world/map/npc/functions/headstyles.txt b/world/map/npc/functions/headstyles.txt
index 9645d339..1098c80c 100644
--- a/world/map/npc/functions/headstyles.txt
+++ b/world/map/npc/functions/headstyles.txt
@@ -1,46 +1,99 @@
// headstyles config file
// author: meko
+function|script|fixHeadStyles
+{
+ callfunc "getHeadStyles";
+ if ((TUT_var < 1 || QL_BEGIN < 1) && StatusPoint < 1)
+ goto L_RandomHair; // on first login
+ set @style, getlook(LOOK_HAIR_STYLE); // FIXME: this needs to be a param in the future
+ set @color, getlook(LOOK_HAIR_COLOR); // FIXME: this needs to be a param in the future
+ if (@style < 1 || @style > getarraysize(@HairStyles$)) // leftover from previous attempt at classes
+ setlook LOOK_HAIR_STYLE, 1; // FIXME: this needs to be a param in the future
+ if (@color >= 123 && @color <= HC_WHITE) // convert shock white
+ set @color, (HC_WHITE - Class) + 1;
+ if (@color < 105 && ((@color - (15 * (Class - 1))) < 0 || @color > ((15 * (Class - 1)) + (getarraysize(@HairColors$) - 1))))
+ set @color, 15 * (Class - 1); // it is possible to style color 0 but not style 0 since style is treated as an item
+ setlook LOOK_HAIR_COLOR, @color; // FIXME: this needs to be a param in the future
+ return;
+
+L_RandomHair:
+ resetstatus; // <= important! gives 48 stat points
+ setlook LOOK_HAIR_STYLE, rand(1, getarraysize(@HairStyles$));
+ setlook LOOK_HAIR_COLOR, rand((15 * (Class - 1)),((15 * (Class - 1)) + (getarraysize(@HairColors$) - 1)));
+ return;
+}
+
function|script|getHeadStyles
{
- set @HairStyles$, 0;
- set @HairColors$, 0;
- set @BaseClass, 1; // this is the default class
cleararray @HairStyles$, "", getarraysize(@HairStyles$);
cleararray @HairColors$, "", getarraysize(@HairColors$);
- cleararray @ValidClasses, "", getarraysize(@ValidClasses);
- setarray @ValidClasses, 1; // add new classes here
- set @loop, 0;
- goto L_LoopValid;
-
-L_Janitor:
- set @BaldStyle, getarraysize(@HairStyles$); // we set it as a variable because we use it with the barber
- if(getlook(LOOK_HAIR_STYLE) < 1) setlook LOOK_HAIR_STYLE, @BaldStyle; // the last head of any race has no hair/fins/whatever
+
+ if (Class == 2) goto L_Tritan;
+ elif (Class == 3) goto L_Ifriton;
+ elif (Class == 4) goto L_Gispaan;
+ elif (Class == 5) goto L_Sparron;
+ else set Class, 1; // we can not style custom classes, so reset when using the barber
+ goto L_Talpan;
+
+L_Talpan:
+ setarray @HairStyles$[0],
+ "Bald", "Flat ponytail", "Bowl cut", "Combed back", "Emo", "Mohawk",
+ "Pompadour", "Center parting/Short and slick", "Long and slick",
+ "Short and curly", "Pigtails", "Long and curly", "Parted",
+ "Perky ponytail", "Wave", "Mane", "Bun", "Shoulder Length Flick",
+ "Fizzy", "Long and Clipped";
+ setarray @HairColors$[0],
+ "Brunette", "Green", "Dark red", "Light purple", "Gray", "Blonde",
+ "Teal", "Light red", "Blue", "Dark purple", "Black", "Pink",
+ "Brown";//, "(free slot)", "(free slot)";
return;
-L_LoopValid: // here we fix non-existant classes
- if(@ValidClasses[@loop] == Class) goto L_ValidClass;
- set @loop, (@loop + 1);
- if(@loop >= getarraysize(@ValidClasses)) goto L_FixClass;
- goto L_LoopValid;
-
-L_FixClass:
- set Class, @BaseClass;
- goto L_ValidClass;
-
-L_ValidClass:
- if(Class == 1)
- setarray @HairStyles$, // TALPONIAN (human)
- "Flat ponytail", "Bowl cut", "Combed back", "Emo", "Mohawk",
- "Pompadour", "Center parting/Short and slick", "Long and slick",
- "Short and curly", "Pigtails", "Long and curly", "Parted",
- "Perky ponytail", "Wave", "Mane", "Bun", "Shoulder Length Flick",
- "Fizzy", "Long and Clipped", "Bald";
- if(Class == 1)
- setarray @HairColors$, // TALPONIAN (human)
- "Brunette", "Green", "Dark red", "Light purple", "Gray", "Blonde",
- "Teal", "Light red", "Blue", "Dark purple", "Black", "Pink",
- "Brown";//, "(free slot)", "(free slot)";
- // adding a new species is as simple as adding another if(Class == X) and adding the class to @ValidClasses
- goto L_Janitor;
+L_Tritan:
+ setarray @HairStyles$[0],
+ "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15",
+ "16", "17", "18", "19", "20";
+ setarray @HairColors$[0],
+ "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15";
+ return;
+
+L_Gispaan:
+ setarray @HairStyles$[0],
+ "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15",
+ "16", "17", "18", "19", "20";
+ setarray @HairColors$[0],
+ "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15";
+ return;
+
+L_Sparron:
+ setarray @HairStyles$[0],
+ "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15",
+ "16", "17", "18", "19", "20";
+ setarray @HairColors$[0],
+ "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15";
+ return;
+
+L_Ifriton:
+ setarray @HairStyles$[0],
+ "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15",
+ "16", "17", "18", "19", "20";
+ setarray @HairColors$[0],
+ "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15";
+ return;
}