diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json
index 99b27c2..c6e7a40 100644
--- a/DataCollection/gamedata.json
+++ b/DataCollection/gamedata.json
@@ -130,6 +130,9 @@
"venus_flytrap_format":"The Giant Venus Flytrap chomped at you!
OUCH!!
It chomped your pocket, taking $%MONEY% with it!!",
"password_input":"
^PLReply:|^PS14|ANSWER^R1",
"last_poet":"^R1^LLast Player Poet:%USERNAME% ^R1",
+ "horse":{
+ "stat_format":"%BASE%;%COMPAINON%;%TACK%;%MAX%;"
+ },
"libary":{
"main_menu":"Welcome to the Library! You can research different subjects.
^T2Search Residents: ^D30|SEARCH NPC^R1^T2Search Ranches: ^D31|SEARCH RANCH^R1^T2Research Horses: ^D4|VIEW BREEDS^R1^T2Research Tack: ^D9|VIEW TACK^R1^T2Research Companions: ^D10|VIEW COMPANIONS^R1^T2Research Mini-Games: ^D12|VIEW MINIGAMES^R1^T2Research Locations: ^D22|VIEW LOCATIONS^R1^T2Research Awards: ^D23|VIEW AWARDS^R1^T2Read Books: ^D38|READ BOOKS^R1",
"find_npc":"SEARCH FOR A RESIDENT:
Enter a resident's name below(not players). It will match on partial names.
^PLResident Locator(NPC):|NPC name^PS4|FIND RESIDENTS^R3",
@@ -138,7 +141,9 @@
"find_npc_no_results":"The following residents match closely:
None were found by that name, try looking for a partial name.",
"find_npc_limit5":"^L- Limited to 5 results. Try narrowing the search.^R1",
"horse_breed_format":"^I252^T7Horse Breed %NAME%:^D4c%ID%|VIEW^R1",
- "horse_relative_format":"^I252^T7A Horse Relative, the %NAME%:^D4c%ID%|VIEW^R1"
+ "horse_relative_format":"^I252^T7A Horse Relative, the %NAME%:^D4c%ID%|VIEW^R1",
+ "maximum_stats":"MAXIMUM STATS:
^AA",
+ "breed_preview_format":"Viewing %NAME%:
%DESCRIPTION%^D4|RETURN TO BREED LIST^R2^H"
},
"multiroom":{
"other_players_participating":"
^LThe following other players are participating:",
diff --git a/Horse Isle Server/Horse Isle Server/Game/Horse.cs b/Horse Isle Server/Horse Isle Server/Game/Horse.cs
index aee20fe..8e928e6 100644
--- a/Horse Isle Server/Horse Isle Server/Game/Horse.cs
+++ b/Horse Isle Server/Horse Isle Server/Game/Horse.cs
@@ -37,5 +37,14 @@ namespace HISP.Game
public static List Breeds = new List();
+ public static Breed GetBreedById(int id)
+ {
+ foreach(Breed breed in Breeds)
+ {
+ if (breed.Id == id)
+ return breed;
+ }
+ throw new KeyNotFoundException("No horse breed with id " + id);
+ }
}
}
diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs
index 7b591b7..f05a041 100644
--- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs
+++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs
@@ -85,6 +85,8 @@ namespace HISP.Game
public static string HorseBreedFormat;
public static string HorseRelativeFormat;
+ public static string BreedViewerFormat;
+
// Records
@@ -159,6 +161,10 @@ namespace HISP.Game
public static string MaxJewelryMessage;
public static string RemoveJewelry;
+ // Horse
+ public static string BreedViewerMaximumStats;
+ public static string StatFormat;
+
// Consume
public static string ConsumeItemFormat;
@@ -349,7 +355,14 @@ namespace HISP.Game
// Click
public static string NothingInterestingHere;
-
+ public static string FormatHorseBreedPreview(string name, string description)
+ {
+ return BreedViewerFormat.Replace("%NAME%", name).Replace("%DESCRIPTION%", description);
+ }
+ public static string FormatHorseStat(int baseStat, int companionBoost, int tackBoost, int maxStat)
+ {
+ return StatFormat.Replace("%BASE%", baseStat.ToString()).Replace("%COMPAINON%", companionBoost.ToString()).Replace("%TACK%", tackBoost.ToString()).Replace("%MAX%", maxStat.ToString());
+ }
public static string FormatHorseRelative(string name, int id)
{
return HorseRelativeFormat.Replace("%NAME%", name).Replace("%ID%", id.ToString());
diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs
index 2b41567..0599b8f 100644
--- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs
+++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs
@@ -620,13 +620,27 @@ namespace HISP.Game
return message;
}
+ public static string BuildBreedViewerLibary(Horse.Breed breed)
+ {
+ string message = Messages.FormatHorseBreedPreview(breed.Name, breed.Description);
+ message += Messages.BreedViewerMaximumStats;
+ message += Messages.FormatHorseStat(breed.BaseStats.Speed * 2, 0, 0, breed.BaseStats.Speed * 2);
+ message += Messages.FormatHorseStat(breed.BaseStats.Strength * 2, 0, 0, breed.BaseStats.Strength * 2);
+ message += Messages.FormatHorseStat(breed.BaseStats.Conformation * 2, 0, 0, breed.BaseStats.Conformation * 2);
+ message += Messages.FormatHorseStat(breed.BaseStats.Agility * 2, 0, 0, breed.BaseStats.Agility * 2);
+ message += Messages.FormatHorseStat(breed.BaseStats.Endurance * 2, 0, 0, breed.BaseStats.Endurance * 2);
+ message += Messages.FormatHorseStat(breed.BaseStats.Inteligence * 2, 0, 0, breed.BaseStats.Inteligence * 2);
+ message += Messages.FormatHorseStat(breed.BaseStats.Personality * 2, 0, 0, breed.BaseStats.Personality * 2);
+ message += Messages.BackToMap;
+ message += Messages.MetaTerminator;
+ return message;
+ }
+
public static string BuildHorseList()
{
string message = "";
foreach(Horse.Breed breed in Horse.Breeds.OrderBy(o => o.Name).ToList())
{
- if (breed.Type == "unicorn" || breed.Type == "pegasus")
- continue;
if (breed.Type == "horse")
message += Messages.FormatHorseBreed(breed.Name, breed.Id);
else
diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs
index 992bef7..f9321f0 100644
--- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs
+++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs
@@ -503,6 +503,7 @@ namespace HISP.Server
Messages.PrivateNotesSavedMessage = gameData.messages.private_notes_save;
Messages.PrivateNotesMetaFormat = gameData.messages.meta.private_notes_format;
+
// Announcements
Messages.WelcomeFormat = gameData.messages.welcome_format;
@@ -585,6 +586,9 @@ namespace HISP.Server
Messages.BankDepositedMoneyFormat = gameData.messages.bank.deposit_format;
Messages.BankWithdrewMoneyFormat = gameData.messages.bank.withdraw_format;
+ // Horses
+ Messages.StatFormat = gameData.messages.meta.horse.stat_format;
+
// Libary
Messages.LibaryMainMenu = gameData.messages.meta.libary.main_menu;
@@ -596,6 +600,8 @@ namespace HISP.Server
Messages.HorseBreedFormat = gameData.messages.meta.libary.horse_breed_format;
Messages.HorseRelativeFormat = gameData.messages.meta.libary.horse_relative_format;
+ Messages.BreedViewerFormat = gameData.messages.meta.libary.breed_preview_format;
+ Messages.BreedViewerMaximumStats = gameData.messages.meta.libary.maximum_stats;
// Chat
diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs
index 85d43d9..6d40430 100644
--- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs
+++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs
@@ -379,6 +379,31 @@ namespace HISP.Server
sender.SendPacket(metaPacket);
break;
default:
+ if(buttonIdStr.StartsWith("4c"))
+ {
+ string idStr = buttonIdStr.Substring(2);
+ int breedId = -1;
+ Horse.Breed horseBreed;
+ try
+ {
+ breedId = int.Parse(idStr);
+ horseBreed = Horse.GetBreedById(breedId);
+ }
+ catch (Exception) {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Sent invalid libary breed viewer request.");
+ break;
+ };
+ string metaTag = Meta.BuildBreedViewerLibary(horseBreed);
+ metaPacket = PacketBuilder.CreateMetaPacket(metaTag);
+ sender.SendPacket(metaPacket);
+
+ string swf = "breedviewer.swf?terrain=book&breed=" + horseBreed.Swf + "&j=";
+ byte[] loadSwf = PacketBuilder.CreateSwfModulePacket(swf, PacketBuilder.PACKET_SWF_MODULE_FORCE);
+ sender.SendPacket(loadSwf);
+
+ break;
+
+ }
if(AbuseReport.DoesReasonExist(buttonIdStr))
{
sender.LoggedinUser.MetaPriority = true;
diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs
index 6b340dd..6d3e4f7 100644
--- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs
+++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs
@@ -21,6 +21,7 @@ namespace HISP.Server
public const byte PACKET_WORLD = 0x7A;
public const byte PACKET_BASE_STATS = 0x7B;
public const byte PACKET_SWF_CUTSCENE = 0x29;
+ public const byte PACKET_SWF_MODULE_FORCE = 0x28;
public const byte PACKET_SWF_MODULE_GENTLE = 0x2A;
public const byte PACKET_PLACE_INFO = 0x1E;
public const byte PACKET_AREA_DEFS = 0x79;