Merge JS Restarted into SoDOff master

This commit is contained in:
Robert Paciorek 2024-03-15 00:28:53 +00:00
commit f768020ede
34 changed files with 7463 additions and 3662 deletions

25
.dockerignore Normal file
View File

@ -0,0 +1,25 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md

18
docker-compose.yml Normal file
View File

@ -0,0 +1,18 @@
version: '3.8'
services:
sodoff:
build:
context: .
dockerfile: src/Dockerfile
# ports:
# - 5000:5000
networks:
sodoff_network:
ipv4_address: 172.16.99.10
networks:
sodoff_network:
driver: bridge
ipam:
config:
- subnet: "172.16.99.0/24"

View File

@ -39,7 +39,10 @@ public class AchievementController : Controller {
[HttpPost]
//[Produces("application/xml")]
[Route("AchievementWebService.asmx/GetAllRanks")]
public IActionResult GetAllRanks() {
public IActionResult GetAllRanks([FromForm] string apiKey) {
if (ClientVersion.GetVersion(apiKey) == ClientVersion.WoJS)
return Ok(XmlUtil.ReadResourceXmlString("allranks_wojs"));
// TODO, this is a placeholder
return Ok(XmlUtil.ReadResourceXmlString("allranks"));
}

View File

@ -17,4 +17,29 @@ public class ConfigurationController : Controller {
}
return Ok(XmlUtil.ReadResourceXmlString("mmo"));
}
[HttpPost]
[Produces("application/xml")]
[Route("ConfigurationWebService.asmx/GetContentByTypeByUser")] // used by World Of Jumpstart
public IActionResult GetContentByTypeByUser([FromForm] int contentType)
{
if (contentType == 1) return Ok(new ContentInfo
{
ContentInfoArray = XmlUtil.DeserializeXml<ContentInfoData[]>(XmlUtil.ReadResourceXmlString("content_jukebox"))
});
if (contentType == 2) return Ok(new ContentInfo
{
ContentInfoArray = XmlUtil.DeserializeXml<ContentInfoData[]>(XmlUtil.ReadResourceXmlString("content_movie"))
});
if (contentType == 3) return Ok(new ContentInfo
{
ContentInfoArray = XmlUtil.DeserializeXml<ContentInfoData[]>(XmlUtil.ReadResourceXmlString("content_arcade"))
});
if (contentType == 4) return Ok(new ContentInfo
{
ContentInfoArray = XmlUtil.DeserializeXml<ContentInfoData[]>(XmlUtil.ReadResourceXmlString("content_learning"))
});
return NotFound();
}
}

View File

@ -1,5 +1,7 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Microsoft.EntityFrameworkCore;
using Org.BouncyCastle.Security.Certificates;
using sodoff.Attributes;
using sodoff.Model;
using sodoff.Schema;
@ -273,6 +275,15 @@ public class ContentController : Controller {
}
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetCommonInventoryByUserId")] // used by World Of Jumpstart (?)
public IActionResult GetCommonInventoryByUserId([FromForm] Guid userId, [FromForm] int ContainerId)
{
Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Uid == userId);
return GetCommonInventory(null, viking);
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/GetCommonInventory")]
@ -1371,6 +1382,185 @@ public class ContentController : Controller {
});
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetActiveParties")] // used by World Of Jumpstart
public IActionResult GetActiveParties()
{
List<Party> allParties = ctx.Parties.ToList();
List<UserParty> userParties = new List<UserParty>();
foreach(var party in allParties)
{
if(DateTime.UtcNow >= party.ExpirationDate)
{
ctx.Parties.Remove(party);
ctx.SaveChanges();
continue;
}
Viking viking = ctx.Vikings.FirstOrDefault(e => e.Id == party.VikingId);
AvatarData avatarData = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized);
UserParty userParty = new UserParty
{
DisplayName = avatarData.DisplayName,
UserName = avatarData.DisplayName,
ExpirationDate = party.ExpirationDate,
Icon = party.LocationIconAsset,
Location = party.Location,
PrivateParty = party.PrivateParty!.Value,
UserID = viking.Uid
};
if (party.Location == "MyNeighborhood") userParty.DisplayName = $"{userParty.UserName}'s Block Party";
if (party.Location == "MyVIPRoomInt") userParty.DisplayName = $"{userParty.UserName}'s VIP Party";
userParties.Add(userParty);
}
return Ok(new UserPartyData { NonBuddyParties = userParties.ToArray() });
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetPartiesByUserID")] // used by World Of Jumpstart
public IActionResult GetPartiesByUserID([FromForm] Guid userId)
{
Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Uid == userId);
List<UserPartyComplete> parties = new List<UserPartyComplete>();
if(viking != null)
{
foreach(var party in ctx.Parties)
{
if (DateTime.UtcNow >= party.ExpirationDate)
{
ctx.Parties.Remove(party);
ctx.SaveChanges();
continue;
}
AvatarData avatarData = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized);
if(party.Location == "MyNeighborhood")
{
UserPartyComplete userPartyComplete = new UserPartyComplete
{
DisplayName = avatarData.DisplayName,
UserName = avatarData.DisplayName,
ExpirationDate = party.ExpirationDate,
Icon = party.LocationIconAsset,
Location = party.Location,
PrivateParty = party.PrivateParty!.Value,
UserID = viking.Uid,
AssetBundle = "RS_DATA/PfMyNeighborhoodParty.unity3d/PfMyNeighborhoodParty"
};
parties.Add(userPartyComplete);
} else if (party.Location == "MyVIPRoomInt")
{
UserPartyComplete userPartyComplete = new UserPartyComplete
{
DisplayName = avatarData.DisplayName,
UserName = avatarData.DisplayName,
ExpirationDate = party.ExpirationDate,
Icon = party.LocationIconAsset,
Location = party.Location,
PrivateParty = party.PrivateParty!.Value,
UserID = viking.Uid,
AssetBundle = "RS_DATA/PfMyVIPRoomIntPartyGroup.unity3d/PfMyVIPRoomIntPartyGroup"
};
parties.Add(userPartyComplete);
}
}
return Ok(new ArrayOfUserPartyComplete { UserPartyComplete = parties.ToArray() });
} else
{
return Ok(new ArrayOfUserPartyComplete());
}
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/PurchaseParty")] // used by World Of Jumpstart
[VikingSession]
public IActionResult PurchaseParty(Viking viking, [FromForm] int itemId)
{
// create a party based on bought itemid
Party party = new Party
{
VikingId = viking.Id,
PrivateParty = false
};
int coinTakeaway = 0;
switch (itemId)
{
case 2761:
party.Location = "MyNeighborhood";
party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyLocationMyNeighborhood";
party.ExpirationDate = DateTime.UtcNow.AddMinutes(30);
coinTakeaway = 30;
break;
case 6259:
party.Location = "MyNeighborhood";
party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyLocationMyNeighborhood";
party.ExpirationDate = DateTime.UtcNow.AddHours(1);
coinTakeaway = 60;
break;
case 6260:
party.Location = "MyNeighborhood";
party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyLocationMyNeighborhood";
party.ExpirationDate = DateTime.UtcNow.AddHours(4);
coinTakeaway = 80;
break;
case 6261:
party.Location = "MyNeighborhood";
party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyLocationMyNeighborhood";
party.ExpirationDate = DateTime.UtcNow.AddHours(8);
coinTakeaway = 100;
break;
case 6263:
party.Location = "MyVIPRoomInt";
party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyDefault";
party.ExpirationDate = DateTime.UtcNow.AddMinutes(30);
coinTakeaway = 30;
break;
case 6264:
party.Location = "MyVIPRoomInt";
party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyDefault";
party.ExpirationDate = DateTime.UtcNow.AddHours(1);
coinTakeaway = 60;
break;
case 6265:
party.Location = "MyVIPRoomInt";
party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyDefault";
party.ExpirationDate = DateTime.UtcNow.AddHours(4);
coinTakeaway = 80;
break;
case 6266:
party.Location = "MyVIPRoomInt";
party.LocationIconAsset = "RS_DATA/PfUiPartiesList.unity3d/IcoPartyDefault";
party.ExpirationDate = DateTime.UtcNow.AddHours(8);
coinTakeaway = 100;
break;
}
// check if party already exists
if (ctx.Parties.Where(e => e.Location == party.Location).FirstOrDefault(e => e.VikingId == viking.Id) != null) return Ok(null);
// take away coins
viking.AchievementPoints.FirstOrDefault(e => e.Type == (int)AchievementPointTypes.GameCurrency)!.Value -= coinTakeaway;
ctx.Parties.Add(party);
ctx.SaveChanges();
return Ok(true);
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetUserActivityByUserID")]
@ -1405,6 +1595,18 @@ public class ContentController : Controller {
return Ok(XmlUtil.ReadResourceXmlString("displaynames"));
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetDisplayNameByUserId")] // used by World Of Jumpstart
public IActionResult GetDisplayNameByUserId([FromForm] Guid userId)
{
Viking? idViking = ctx.Vikings.FirstOrDefault(e => e.Uid == userId);
if (idViking is null) return Ok("???");
// return display name
return Ok(XmlUtil.DeserializeXml<AvatarData>(idViking.AvatarSerialized!).DisplayName);
}
[HttpPost]
//[Produces("application/xml")]
[Route("ContentWebService.asmx/SetDisplayName")] // used by World Of Jumpstart
@ -1420,9 +1622,92 @@ public class ContentController : Controller {
[HttpPost]
//[Produces("application/xml")]
[Route("ContentWebService.asmx/GetScene")] // used by World Of Jumpstart
public IActionResult GetScene() {
// TODO: This is a placeholder
return Ok("<?xml version=\"1.0\" encoding=\"utf-8\"?><SceneData xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\" />");
[VikingSession]
public IActionResult GetScene(Viking viking, [FromForm] string sceneName) {
SceneData? scene = viking.SceneData.FirstOrDefault(e => e.SceneName == sceneName);
if (scene is not null) return Ok(scene.XmlData);
else return Ok("");
}
[HttpPost]
[Route("ContentWebSerivce.asmx/GetHouse")] // used by World Of Jumpstart
[VikingSession]
public IActionResult GetHouse(Viking viking) {
if (viking.House is not null) return Ok(viking.House.XmlData);
else return Ok("");
}
[HttpPost]
[Route("ContentWebService.asmx/GetHouseByUserId")] // used by World Of Jumpstart
public IActionResult GetHouseByUserId([FromForm] Guid userId)
{
Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Uid == userId);
if (viking is not null)
{
if (viking.House is not null) return Ok(viking.House.XmlData);
else return Ok("");
}
return Ok("");
}
[HttpPost]
//[Produces("application/xml")]
[Route("ContentWebService.asmx/GetSceneByUserId")] // used by World Of Jumpstart
public IActionResult GetSceneByUserId([FromForm] Guid userId, [FromForm] string sceneName) {
SceneData? scene = ctx.Vikings.FirstOrDefault(e => e.Uid == userId)?.SceneData.FirstOrDefault(x => x.SceneName == sceneName);
if (scene is not null) return Ok(scene.XmlData);
else return Ok(null);
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/SetScene")] // used by World of Jumpstart
[VikingSession]
public IActionResult SetScene(Viking viking, [FromForm] string sceneName, [FromForm] string contentXml) {
SceneData? existingScene = viking.SceneData.FirstOrDefault(e => e.SceneName == sceneName);
if(existingScene is not null)
{
existingScene.XmlData = contentXml;
ctx.SaveChanges();
return Ok(true);
}
else
{
SceneData sceneData = new SceneData
{
SceneName = sceneName,
XmlData = contentXml
};
viking.SceneData.Add(sceneData);
ctx.SaveChanges();
return Ok(true);
}
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/SetHouse")] // used by World Of Jumpstart
[VikingSession]
public IActionResult SetHouse(Viking viking, [FromForm] string contentXml) {
HouseData? house = viking.House;
if(house is null)
{
HouseData newHouse = new HouseData{ XmlData = contentXml };
viking.House = newHouse;
ctx.SaveChanges();
return Ok(true);
} else
{
house.XmlData = contentXml;
ctx.SaveChanges();
return Ok(true);
}
}
[HttpPost]
@ -1433,7 +1718,7 @@ public class ContentController : Controller {
GetGameDataRequest request = XmlUtil.DeserializeXml<GetGameDataRequest>(gameDataRequest);
return Ok(gameDataService.GetGameDataForPlayer(viking, request));
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetUserGameCurrency")]
@ -1443,6 +1728,18 @@ public class ContentController : Controller {
return Ok(achievementService.GetUserCurrency(viking));
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/SetGameCurrency")] // used by World Of Jumpstart
[VikingSession]
public IActionResult SetUserGameCurrency(Viking viking, [FromForm] int amount)
{
achievementService.AddAchievementPoints(viking, AchievementPointTypes.GameCurrency, amount);
ctx.SaveChanges();
return Ok(achievementService.GetUserCurrency(viking).GameCurrency ?? 0);
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/RerollUserItem")]
@ -1826,17 +2123,17 @@ public class ContentController : Controller {
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetGameDataByGame")]
[VikingSession(UseLock = true)]
public IActionResult GetGameDataByGame(Viking viking, [FromForm] int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, int score, bool buddyFilter) {
return Ok(gameDataService.GetGameData(viking, gameId, isMultiplayer, difficulty, gameLevel, key, count, AscendingOrder, buddyFilter));
public IActionResult GetGameDataByGame(Viking viking, [FromForm] int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, int score, bool buddyFilter, string apiKey) {
return Ok(gameDataService.GetGameData(viking, gameId, isMultiplayer, difficulty, gameLevel, key, count, AscendingOrder, buddyFilter, apiKey));
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/GetGameDataByGameForDateRange")]
[VikingSession(UseLock = true)]
public IActionResult GetGameDataByGameForDateRange(Viking viking, [FromForm] int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, int score, string startDate, string endDate, bool buddyFilter) {
public IActionResult GetGameDataByGameForDateRange(Viking viking, [FromForm] int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, int score, string startDate, string endDate, bool buddyFilter, string apiKey) {
CultureInfo usCulture = new CultureInfo("en-US", false);
return Ok(gameDataService.GetGameData(viking, gameId, isMultiplayer, difficulty, gameLevel, key, count, AscendingOrder, buddyFilter, DateTime.Parse(startDate, usCulture), DateTime.Parse(endDate, usCulture)));
return Ok(gameDataService.GetGameData(viking, gameId, isMultiplayer, difficulty, gameLevel, key, count, AscendingOrder, buddyFilter, apiKey, DateTime.Parse(startDate, usCulture), DateTime.Parse(endDate, usCulture)));
}
[HttpPost]
@ -1863,6 +2160,15 @@ public class ContentController : Controller {
return Ok(0);
}
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetRevealIndex")] // used by World Of Jumpstart (Learning Games)
public IActionResult GetRevealIndex()
{
// TODO - figure out proper way of doing this, if any
return Ok(random.Next(1, 15));
}
private static RaisedPetData GetRaisedPetDataFromDragon (Dragon dragon, int? selectedDragonId = null) {
if (selectedDragonId is null)
selectedDragonId = dragon.Viking.SelectedDragonId;

View File

@ -27,4 +27,13 @@ public class MessagingController : Controller {
// TODO: this is a placeholder
return Ok(false);
}
[HttpPost]
[Produces("application/xml")]
[Route("MessageWebService.asmx/GetCombinedListMessage")]
public IActionResult GetCombinedListMessage()
{
// TODO - placeholder
return Ok(new ArrayOfMessageInfo());
}
}

View File

@ -77,19 +77,21 @@ public class ProfileController : Controller {
//[Produces("application/xml")]
[Route("ProfileWebService.asmx/GetProfileTagAll")] // used by Magic & Mythies
public IActionResult GetProfileTagAll() {
// TODO: This is a placeholder
return Ok("<?xml version='1.0' encoding='UTF-8'?><ArrayOfProfileTag xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"/>");
return Ok(XmlUtil.ReadResourceXmlString("profiletags"));
}
private UserProfileData GetProfileDataFromViking(Viking viking, [FromForm] string apiKey) {
// Get the avatar data
AvatarData avatarData = null;
Gender gender = Gender.Male;
Gender? gender = null;
if (viking.AvatarSerialized is not null) {
avatarData = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized);
avatarData.Id = viking.Id;
gender = avatarData.GenderType;
if (gender is null)
gender = avatarData.GenderType;
}
if (gender is null)
gender = Gender.Unknown;
if (avatarData != null && ClientVersion.GetVersion(apiKey) == 0xa3a12a0a) { // TODO adjust version number: we don't know for which versions it is required (for 3.12 it is, for 3.19 and 3.0 it's not)
if (avatarData.Part.FirstOrDefault(e => e.PartType == "Sword") is null) {
@ -119,9 +121,10 @@ public class ProfileController : Controller {
GenderID = gender,
OpenChatEnabled = true,
IsApproved = true,
RegistrationDate = new DateTime(DateTime.Now.Ticks), // placeholder
CreationDate = new DateTime(DateTime.Now.Ticks), // placeholder
FacebookUserID = 0
RegistrationDate = viking.CreationDate,
CreationDate = viking.CreationDate,
FacebookUserID = 0,
BirthDate = viking.BirthDate
},
UserSubscriptionInfo = new UserSubscriptionInfo {
UserID = viking.UserId.ToString(),
@ -149,12 +152,19 @@ public class ProfileController : Controller {
AvatarInfo = avatar,
AchievementCount = 0,
MythieCount = 0,
AnswerData = new UserAnswerData { UserID = viking.Uid.ToString(), Answers = profileService.GetUserAnswers(viking)},
AnswerData = new UserAnswerData { UserID = viking.Uid.ToString(), Answers = profileService.GetUserAnswers(viking) },
GameCurrency = currency.GameCurrency,
CashCurrency = currency.CashCurrency,
ActivityCount = 0,
BuddyCount = 0,
UserGradeData = new UserGrade { UserGradeID = 0 }
UserGradeData = new UserGrade { UserGradeID = 0 },
UserProfileTag = new UserProfileTag() {
CreateDate = new DateTime(DateTime.Now.Ticks),
ProductGroupID = 1,
ProfileTags = new List<ProfileTag>(),
UserID = viking.Uid,
UserProfileTagID = 1
}
};
}
}

View File

@ -9,6 +9,15 @@ namespace sodoff.Controllers.Common;
public class RatingController : Controller
{
[HttpPost]
[Produces("application/xml")]
[Route("ScoreWebService.asmx/SetScore")] // used by World Of Jumpstart
public IActionResult SetScore()
{
// TODO - placeholder
return Ok(true);
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/Ratingwebservice.asmx/GetAverageRatingForRoom")]

View File

@ -71,7 +71,7 @@ public class RegistrationController : Controller {
}
if (ctx.Users.Count(e => e.Username== u.Username) > 0) {
return Ok(new RegistrationResult { Status = MembershipUserStatus.DuplicateUserName });
}
}
ctx.Users.Add(u);
@ -82,7 +82,9 @@ public class RegistrationController : Controller {
User = u,
InventoryItems = new List<InventoryItem>(),
AchievementPoints = new List<AchievementPoints>(),
Rooms = new List<Room>()
Rooms = new List<Room>(),
CreationDate = DateTime.UtcNow,
BirthDate = data.ChildList[0].BirthDate
};
ctx.Vikings.Add(v);
}
@ -142,12 +144,17 @@ public class RegistrationController : Controller {
User = user,
InventoryItems = items,
AchievementPoints = new List<AchievementPoints>(),
Rooms = new List<Room>()
Rooms = new List<Room>(),
CreationDate = DateTime.Now,
BirthDate = data.BirthDate
};
uint gameVersion = ClientVersion.GetVersion(apiKey);
missionService.SetUpMissions(v, gameVersion);
if (data.Gender == "Boy") v.Gender = Gender.Male;
else if (data.Gender == "Girl") v.Gender = Gender.Female;
ctx.Vikings.Add(v);
ctx.SaveChanges();

20
src/Dockerfile Normal file
View File

@ -0,0 +1,20 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["src/sodoff.csproj", "src/"]
RUN dotnet restore "src/sodoff.csproj"
COPY . .
WORKDIR "/src/src"
RUN dotnet build "sodoff.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "sodoff.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "sodoff.dll"]

View File

@ -15,11 +15,14 @@ public class DBContext : DbContext {
public DbSet<InventoryItem> InventoryItems { get; set; } = null!;
public DbSet<MissionState> MissionStates { get; set; } = null!;
public DbSet<Room> Rooms { get; set; } = null!;
public DbSet<SceneData> SceneData { get; set; } = null!;
public DbSet<HouseData> Houses { get; set; } = null!;
public DbSet<RoomItem> RoomItems { get; set; } = null!;
public DbSet<GameData> GameData { get; set; } = null!;
public DbSet<GameDataPair> GameDataPairs { get; set; } = null!;
public DbSet<AchievementPoints> AchievementPoints { get; set; } = null!;
public DbSet<ProfileAnswer> ProfileAnswers { get; set; } = null!;
public DbSet<Party> Parties { get; set; } = null!;
private readonly IOptions<ApiServerConfig> config;
public DBContext(IOptions<ApiServerConfig> config) {
@ -93,6 +96,12 @@ public class DBContext : DbContext {
builder.Entity<Viking>().HasMany(v => v.Rooms)
.WithOne(e => e.Viking);
builder.Entity<Viking>().HasMany(v => v.SceneData)
.WithOne(e => e.Viking);
builder.Entity<Viking>().HasOne(v => v.House)
.WithOne(e => e.Viking);
builder.Entity<Viking>().HasMany(v => v.AchievementPoints)
.WithOne(e => e.Viking);
@ -118,6 +127,9 @@ public class DBContext : DbContext {
builder.Entity<Viking>().HasMany(v => v.ProfileAnswers)
.WithOne(e => e.Viking);
builder.Entity<Viking>().HasMany(v => v.Parties)
.WithOne(e => e.Viking);
// Dragons
builder.Entity<Dragon>().HasOne(d => d.Viking)
.WithMany(e => e.Dragons)
@ -214,8 +226,18 @@ public class DBContext : DbContext {
.WithMany(v => v.SavedData)
.HasForeignKey(e => e.VikingId);
builder.Entity<Party>().HasOne(i => i.Viking)
.WithMany(i => i.Parties);
builder.Entity<ProfileAnswer>().HasOne(i => i.Viking)
.WithMany(i => i.ProfileAnswers)
.HasForeignKey(e => e.VikingId);
builder.Entity<SceneData>().HasOne(i => i.Viking)
.WithMany(i => i.SceneData)
.HasForeignKey(e => e.VikingId);
builder.Entity<HouseData>().HasOne(i => i.Viking)
.WithOne(e => e.House);
}
}

13
src/Model/HouseData.cs Normal file
View File

@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
namespace sodoff.Model
{
public class HouseData
{
[Key]
public int Id { get; set; }
public int VikingId { get; set; }
public virtual Viking Viking { get; set; } = null!;
public string XmlData { get; set; } = null!;
}
}

17
src/Model/Party.cs Normal file
View File

@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace sodoff.Model
{
public class Party
{
[Key]
public int Id { get; set; }
public string Location { get; set; } = null!;
public int VikingId { get; set; }
public DateTime ExpirationDate { get; set; } = DateTime.UtcNow;
public bool? PrivateParty { get; set; }
public string LocationIconAsset { get; set; } = null!;
public virtual Viking? Viking { get; set; }
}
}

14
src/Model/SceneData.cs Normal file
View File

@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace sodoff.Model
{
public class SceneData
{
[Key]
public int Id { get; set; }
public int VikingId { get; set; }
public string SceneName { get; set; } = null!;
public string XmlData { get; set; } = null!;
public virtual Viking Viking { get; set; } = null!;
}
}

View File

@ -1,5 +1,6 @@
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using sodoff.Schema;
namespace sodoff.Model;
@ -27,11 +28,18 @@ public class Viking {
public virtual ICollection<MissionState> MissionStates { get; set; } = null!;
public virtual ICollection<TaskStatus> TaskStatuses { get; set; } = null!;
public virtual ICollection<Room> Rooms { get; set; } = null!;
public virtual ICollection<SceneData> SceneData { get; set; } = null!;
public virtual HouseData House { get; set; } = null!;
public virtual ICollection<AchievementPoints> AchievementPoints { get; set; } = null!;
public virtual ICollection<PairData> PairData { get; set; } = null!;
public virtual ICollection<InventoryItem> InventoryItems { get; set; } = null!;
public virtual ICollection<GameData> GameData { get; set; } = null!;
public virtual ICollection<ProfileAnswer> ProfileAnswers { get; set; } = null!;
public virtual ICollection<SavedData> SavedData { get; set; } = null!;
public virtual ICollection<Party> Parties { get; set; } = null!;
public virtual Dragon? SelectedDragon { get; set; }
public DateTime? CreationDate { get; set; }
public DateTime? BirthDate { get; set; }
public Gender? Gender { get; set; }
}

View File

@ -0,0 +1,234 @@
<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfUserRank xmlns="http://api.jumpstart.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<UserRank>
<RankID xmlns="">1</RankID>
<Name xmlns="">JumpStar Level 1</Name>
<Description xmlns="">JumpStar Level 1</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank01.png</Image>
<Audio xmlns="" />
<Value xmlns="">0</Value>
<IsMember xmlns="">false</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">1</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">2</RankID>
<Name xmlns="">JumpStar Level 2</Name>
<Description xmlns="">JumpStar Level 2</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank02.png</Image>
<Audio xmlns="" />
<Value xmlns="">5</Value>
<IsMember xmlns="">false</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">2</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">3</RankID>
<Name xmlns="">JumpStar Level 3</Name>
<Description xmlns="">JumpStar Level 3</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank03.png</Image>
<Audio xmlns="" />
<Value xmlns="">20</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">3</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">4</RankID>
<Name xmlns="">JumpStar Level 4</Name>
<Description xmlns="">JumpStar Level 4</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank04.png</Image>
<Audio xmlns="" />
<Value xmlns="">40</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">4</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">5</RankID>
<Name xmlns="">JumpStar Level 5</Name>
<Description xmlns="">JumpStar Level 5</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank05.png</Image>
<Audio xmlns="" />
<Value xmlns="">80</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">5</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">6</RankID>
<Name xmlns="">JumpStar Level 6</Name>
<Description xmlns="">JumpStar Level 6</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank06.png</Image>
<Audio xmlns="" />
<Value xmlns="">150</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">6</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">7</RankID>
<Name xmlns="">JumpStar Level 7</Name>
<Description xmlns="">JumpStar Level 7</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank07.png</Image>
<Audio xmlns="" />
<Value xmlns="">300</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">7</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">8</RankID>
<Name xmlns="">JumpStar Level 8</Name>
<Description xmlns="">JumpStar Level 8</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank08.png</Image>
<Audio xmlns="" />
<Value xmlns="">600</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">8</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">9</RankID>
<Name xmlns="">JumpStar Level 9</Name>
<Description xmlns="">JumpStar Level 9</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank09.png</Image>
<Audio xmlns="" />
<Value xmlns="">1200</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">9</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">10</RankID>
<Name xmlns="">JumpStar Level 10</Name>
<Description xmlns="">JumpStar Level 10</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank10.png</Image>
<Audio xmlns="" />
<Value xmlns="">1600</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">10</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">12</RankID>
<Name xmlns="">JumpStar Level 11</Name>
<Description xmlns="">JumpStar Level 11</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank11.png</Image>
<Audio xmlns="" />
<Value xmlns="">1800</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">244</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">13</RankID>
<Name xmlns="">JumpStar Level 12</Name>
<Description xmlns="">JumpStar Level 12</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank12.png</Image>
<Audio xmlns="" />
<Value xmlns="">2000</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">245</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">14</RankID>
<Name xmlns="">JumpStar Level 13</Name>
<Description xmlns="">JumpStar Level 13</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank13.png</Image>
<Audio xmlns="" />
<Value xmlns="">2200</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">246</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">15</RankID>
<Name xmlns="">JumpStar Level 14</Name>
<Description xmlns="">JumpStar Level 14</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank14.png</Image>
<Audio xmlns="" />
<Value xmlns="">2400</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">247</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">16</RankID>
<Name xmlns="">JumpStar Level 15</Name>
<Description xmlns="">JumpStar Level 15</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank15.png</Image>
<Audio xmlns="" />
<Value xmlns="">2600</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">248</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">17</RankID>
<Name xmlns="">JumpStar Level 16</Name>
<Description xmlns="">JumpStar Level 16</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank16.png</Image>
<Audio xmlns="" />
<Value xmlns="">2800</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">249</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">18</RankID>
<Name xmlns="">JumpStar Level 17</Name>
<Description xmlns="">JumpStar Level 17</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank17.png</Image>
<Audio xmlns="" />
<Value xmlns="">3000</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">250</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">19</RankID>
<Name xmlns="">JumpStar Level 18</Name>
<Description xmlns="">JumpStar Level 18</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank18.png</Image>
<Audio xmlns="" />
<Value xmlns="">3200</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">251</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">20</RankID>
<Name xmlns="">JumpStar Level 19</Name>
<Description xmlns="">JumpStar Level 19</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank19.png</Image>
<Audio xmlns="" />
<Value xmlns="">3400</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">252</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">21</RankID>
<Name xmlns="">JumpStar Level 20</Name>
<Description xmlns="">JumpStar Level 20</Description>
<Image xmlns="">RS_DATA/Content/Ranks/AniJumpStarRank20.png</Image>
<Audio xmlns="" />
<Value xmlns="">3600</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">1</PointTypeID>
<GlobalRankID xmlns="">253</GlobalRankID>
</UserRank>
<UserRank>
<RankID xmlns="">11</RankID>
<Name xmlns="">Just Starting</Name>
<Description xmlns="">Pet Point</Description>
<Image xmlns="" />
<Audio xmlns="" />
<Value xmlns="">0</Value>
<IsMember xmlns="">true</IsMember>
<PointTypeID xmlns="">4</PointTypeID>
<GlobalRankID xmlns="">166</GlobalRankID>
</UserRank>
</ArrayOfUserRank>

View File

@ -0,0 +1,98 @@
<ArrayOfContentInfoData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ContentInfoData>
<DisplayName>Punk Punk Drop</DisplayName>
<Description>Punk Punk Drop</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Arcade_PunkPunkDrop_screen_01.png</ThumbnailUrl>
<LinkUrl>Bejeweled</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/Arcade_PunkPunkDrop_01.png</TextureUrl>
<RolloverUrl />
<CategoryUrl />
<ContentType>3</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Buggy Racer</DisplayName>
<Description>Buggy Racer game inside Main Street.</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Arcade_BuggyRacer_screen_01.png</ThumbnailUrl>
<LinkUrl>DuneBuggyMenu</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/ArcadeBuggyRacer256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl />
<ContentType>3</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>GhostTown Grab</DisplayName>
<Description>GhostTown Grab game inside Main Street.</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Arcade_GhostGrab_screen_01.png</ThumbnailUrl>
<LinkUrl>WesternWorldMain</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/ArcadeGhostGrab256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl />
<ContentType>3</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Dodge n Dash</DisplayName>
<Description>Dodge Bot game inside Main Street.</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Arcade_DodgeBot_screen_01.png</ThumbnailUrl>
<LinkUrl>DgDodge</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/ArcadeDodgeBot256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl />
<ContentType>3</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Sound Bop</DisplayName>
<Description>Sound Bop game inside Main Street.</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Arcade_SoundBop_screen_01.png</ThumbnailUrl>
<LinkUrl>SsSimon</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/ArcadeSoundBop256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl />
<ContentType>3</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Dragon Playtime</DisplayName>
<Description>Dragon Playtime</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Arcade_dragon_screen_01.png</ThumbnailUrl>
<LinkUrl>JSPetMainStreet</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/ArcadeDragon256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl />
<ContentType>3</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>3</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Robo-A-Go-Go</DisplayName>
<Description>Robo-A-Go-Go</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Arcade_Robo_screen_01.png</ThumbnailUrl>
<LinkUrl>JSRoboAGoGoMainStreet</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/ArcadeRobo256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl />
<ContentType>3</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>3</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Fruit Salad Chop</DisplayName>
<Description>Fruit Salad Chop</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/FruitSaladChopScreen.png</ThumbnailUrl>
<LinkUrl>FruitSaladChop</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/FruitSaladChop.png</TextureUrl>
<RolloverUrl />
<CategoryUrl />
<ContentType>3</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
</ArrayOfContentInfoData>

View File

@ -0,0 +1,602 @@
<ArrayOfContentInfoData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ContentInfoData>
<DisplayName>The BFF Song by Miya Mackenzie</DisplayName>
<Description>The BFF Song</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_The_BFF_Song.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>The Tide is High by Miya Mackenzie</DisplayName>
<Description>The Tide is High</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_Tide_Is_High.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Won't Back Down by Miya Mackenzie</DisplayName>
<Description>Won't Back Down</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_Won't_Back_Down.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Addicted to You by Miya Mackenzie</DisplayName>
<Description>Addicted to You</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_Addcited_to_You.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Before and After by Miya Mackenzie</DisplayName>
<Description>Before and After</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_Before_And_After.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Gonna Be Alright by Miya Mackenzie</DisplayName>
<Description>Gonna Be Alright</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_Gonna_Be_Alright.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>I Feel Free by Miya Mackenzie</DisplayName>
<Description>I Feel Free</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_I_Feel_Free.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>I'm So Done by Miya Mackenzie</DisplayName>
<Description>I'm So Done</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_I'm_So_Done.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>One Wish by Miya Mackenzie</DisplayName>
<Description>One Wish</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_One_Wish.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Only You by Miya Mackenzie</DisplayName>
<Description>Only You</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Miya_Mackenzie_Only_You.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>A Fisherman</DisplayName>
<Description>A Fisherman</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Fisher.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>ABC Harmony</DisplayName>
<Description>ABC Harmony</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/AllInHarmony.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Art Friends</DisplayName>
<Description>Art Friends</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/KRFWMV1_song.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Baa-baa Black Sheep</DisplayName>
<Description>Baa-baa Black Sheep</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/SHEEP.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Barn House Rock</DisplayName>
<Description>Barn House Rock</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/ELVIS.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Be Your Best</DisplayName>
<Description>Be Your Best</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Responsiblity.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Come on Down to the Barnyard</DisplayName>
<Description>Come on Down to the Barnyard</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/RHYTHM.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Count in Spanish</DisplayName>
<Description>Count in Spanish</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/CountInEnglishAndSpanish.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Egyptian Treasure Map</DisplayName>
<Description>Egyptian Treasure Map</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Egypt.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Fire Safety Tips</DisplayName>
<Description>Fire Safety Tips</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/FireSafety.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Fish in the Pond</DisplayName>
<Description>Fish in the Pond</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Pond.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Frere Jacques, Dormez Vous?</DisplayName>
<Description>Frere Jacques, Dormez Vous?</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/SLEEP.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Get Ready for JumpStart</DisplayName>
<Description>Get Ready for JumpStart</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/WelcomeToJumpStartWorld.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Grandma's Garden</DisplayName>
<Description>Grandma's Garden</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/InGrandmasGarden.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Grandma's House</DisplayName>
<Description>Grandma's House</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Mmsong.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Help Me Find My Cat</DisplayName>
<Description>Help Me Find My Cat</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Gatito.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Home on the Range</DisplayName>
<Description>Home on the Range</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/GiveMeAHome.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>I Am a Horse</DisplayName>
<Description>I Am a Horse</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/HORSE.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Just Ask</DisplayName>
<Description>Just Ask</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/SC_RM06_Ask.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Learn Your ABCs</DisplayName>
<Description>Learn Your ABCs</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/ABCsAreFor.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Letters of the Alphabet</DisplayName>
<Description>Letters of the Alphabet</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Tssong.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Make a Collage</DisplayName>
<Description>Make a Collage</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/KRFHMV1_song.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>My Waterfall</DisplayName>
<Description>My Waterfall</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/AMusicWaterfall.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Old MacDonald Had a Farm</DisplayName>
<Description>Old MacDonald Had a Farm</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/OLDMAC.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Read to Tell a Story</DisplayName>
<Description>Read to Tell a Story</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Read.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Rhyme with Coat</DisplayName>
<Description>Rhyme with Coat</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/RainCoat_Mixed.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Rock 'N' Roll Verbs</DisplayName>
<Description>Rock 'N' Roll Verbs</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/RockNRollVerbs.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Science Is Fab</DisplayName>
<Description>Science Is Fab</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/LearningScience.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Shapes of Life</DisplayName>
<Description>Shapes of Life</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/AllTheShapes.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Sing in Spanish</DisplayName>
<Description>Sing in Spanish</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Colores.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Song About a Line</DisplayName>
<Description>Song About a Line</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/KRRRMV1_song.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Space Super Hero</DisplayName>
<Description>Space Super Hero</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Blaster.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Textures Oh Yeah</DisplayName>
<Description>Textures Oh Yeah</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/KRCSMV1_song.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Turtle Footprints</DisplayName>
<Description>Turtle Footprints</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Foot.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Two Little Mice</DisplayName>
<Description>Two Little Mice</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/CAT.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>What Is a Noun?</DisplayName>
<Description>What Is a Noun?</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/WhatIsANoun.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>What Is a Rhyme?</DisplayName>
<Description>What Is a Rhyme?</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Rhyme.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>What Is Art?</DisplayName>
<Description>What Is Art?</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/BSSNG1.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Where Are the Animals?</DisplayName>
<Description>Where Are the Animals?</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/Wdsong.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Where Did It Come From?</DisplayName>
<Description>Where Did It Come From?</Description>
<ThumbnailUrl />
<LinkUrl>RS_DATA/Content/Music/WhereDidItComeFrom.ogg</LinkUrl>
<TextureUrl />
<RolloverUrl />
<CategoryUrl />
<ContentType>1</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>0</LinkType>
</ContentInfoData>
</ArrayOfContentInfoData>

View File

@ -0,0 +1,122 @@
<ArrayOfContentInfoData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ContentInfoData>
<DisplayName>Monkey Madness</DisplayName>
<Description>Monkey Madness</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Learning_Monkey_screen_01.png</ThumbnailUrl>
<LinkUrl>PnMonkeyMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/LearnMonkey256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge3_5.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Lucky Ducky</DisplayName>
<Description>Lucky Ducky</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Learning_Duckies_screen_01.png</ThumbnailUrl>
<LinkUrl>CnDuckyMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/LearnDuckies256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge3_5.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Hops' JetPack</DisplayName>
<Description>Hops' JetPack MS</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Learning_JetPack_screen_01.png</ThumbnailUrl>
<LinkUrl>JetPackMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/LearnJetPack256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge5_8.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Bubble Trouble</DisplayName>
<Description>Bubble Trouble MS</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Learning_Bubble_screen_01.png</ThumbnailUrl>
<LinkUrl>BubbleTroubleMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/LearnBubble256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge5_8.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Bunny Hop</DisplayName>
<Description>Bunny Hop MS</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Learning_Bunny_screen_01.png</ThumbnailUrl>
<LinkUrl>PnBunnyMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/LearnBunny256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge3_5.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>True</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Ladybug Learning</DisplayName>
<Description>Ladybug Learning MS</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Learning_Ladybug_screen_01.png</ThumbnailUrl>
<LinkUrl>CnLadyBugMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/LearnLadybug256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge3_5.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>True</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Cow-abunga</DisplayName>
<Description>Cow-abunga MS</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Learning_Cow_screen_01.png</ThumbnailUrl>
<LinkUrl>PnCowMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/LearnCow256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge3_5.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>True</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Kite Delight</DisplayName>
<Description>Kite Delight MS</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/Learning_Kite_screen_01.png</ThumbnailUrl>
<LinkUrl>CnKiteMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/LearnKite256.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge3_5.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>True</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Blast Off Math</DisplayName>
<Description>Blast Off Math</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/JS_Blastoff_Math.png</ThumbnailUrl>
<LinkUrl>BlastOffMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/BlastOffMath.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge5_8.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Blast Off Reading</DisplayName>
<Description>Blast Off Reading</Description>
<ThumbnailUrl>RS_DATA/Content/MSArcade/JS_Blastoff_Reading.png</ThumbnailUrl>
<LinkUrl>BlastOffMS</LinkUrl>
<TextureUrl>RS_DATA/Content/MSArcade/BlastOffReading.png</TextureUrl>
<RolloverUrl />
<CategoryUrl>RS_DATA/Content/MSArcade/IcoAge5_8.png</CategoryUrl>
<ContentType>4</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>4</LinkType>
</ContentInfoData>
</ArrayOfContentInfoData>

View File

@ -0,0 +1,42 @@
<ArrayOfContentInfoData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ContentInfoData>
<DisplayName>JumpStart Commercial - Dragons (2009)</DisplayName>
<LinkUrl>RS_DATA/Content/MovieTheaterContent/jscom01.ogg</LinkUrl>
<RolloverUrl/>
<CategoryUrl>RS_DATA/Content/MovieTheaterContent/Thumbnails/jsshield.jpg</CategoryUrl>
<ThumbnailUrl>RS_DATA/Content/MovieTheaterContent/Thumbnails/jsshield.jpg</ThumbnailUrl>
<ContentType>2</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>2</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>JumpStart Commercial - Madagascar</DisplayName>
<LinkUrl>RS_DATA/Content/MovieTheaterContent/jscom02.ogg</LinkUrl>
<RolloverUrl/>
<CategoryUrl>RS_DATA/Content/MovieTheaterContent/Thumbnails/jsshield.jpg</CategoryUrl>
<ThumbnailUrl>RS_DATA/Content/MovieTheaterContent/Thumbnails/jsshield.jpg</ThumbnailUrl>
<ContentType>2</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>2</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>JumpStart 2009 Intro</DisplayName>
<LinkUrl>RS_DATA/Content/MovieTheaterContent/jsintro.ogg</LinkUrl>
<RolloverUrl/>
<CategoryUrl>RS_DATA/Content/MovieTheaterContent/Thumbnails/jsshield.jpg</CategoryUrl>
<ThumbnailUrl>RS_DATA/Content/MovieTheaterContent/Thumbnails/jsshield.jpg</ThumbnailUrl>
<ContentType>2</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>2</LinkType>
</ContentInfoData>
<ContentInfoData>
<DisplayName>Big Cat</DisplayName>
<LinkUrl>RS_DATA/Content/MovieTheaterContent/bigcat.ogg</LinkUrl>
<RolloverUrl/>
<CategoryUrl>RS_DATA/Content/MovieTheaterContent/Thumbnails/jsrlogo.png</CategoryUrl>
<ThumbnailUrl>RS_DATA/Content/MovieTheaterContent/Thumbnails/jsrlogo.png</ThumbnailUrl>
<ContentType>2</ContentType>
<MemberOnly>false</MemberOnly>
<LinkType>2</LinkType>
</ContentInfoData>
</ArrayOfContentInfoData>

View File

@ -1,37 +1,13 @@
<?xml version='1.0' encoding='utf-8'?>
<DefaultMissions>
<!-- list of default mission for World of Jump Start -->
<Active>
<id>1509</id>
<id>1511</id>
<id>1512</id>
<id>1513</id>
<id>1514</id>
<id>1743</id>
<id>2323</id>
<id>2374</id>
<id>2375</id>
<id>2376</id>
<id>2377</id>
<id>2378</id>
<id>2379</id>
<id>2380</id>
<id>2381</id>
<id>2382</id>
<id>2383</id>
<id>2384</id>
<id>2385</id>
<id>2386</id>
<id>2440</id>
<id>2441</id>
<id>2442</id>
<id>2446</id>
<id>2447</id>
<id>2448</id>
<id>2449</id>
<id>2451</id>
<id>2452</id>
</Active>
<Upcoming>
</Upcoming>
<Active>
<id>1509</id>
</Active>
<Upcoming>
<id>1743</id>
<id>1512</id>
<id>1513</id>
<id>1514</id>
</Upcoming>
</DefaultMissions>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfProfileTag xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ProfileTag>
<ID>1</ID>
<NA>Collection</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>2</ID>
<NA>Customize</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>3</ID>
<NA>Shopper</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>4</ID>
<NA>Social</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>5</ID>
<NA>Nurturing</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>6</ID>
<NA>Racing</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>7</ID>
<NA>Shooter</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>8</ID>
<NA>Adventure</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>9</ID>
<NA>Music</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>10</ID>
<NA>Puzzle</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>11</ID>
<NA>Education</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>12</ID>
<NA>Action</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>13</ID>
<NA>Battle</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>14</ID>
<NA>Early Learning</NA>
<VAL xsi:nil="true" />
</ProfileTag>
<ProfileTag>
<ID>15</ID>
<NA>Sports</NA>
<VAL xsi:nil="true" />
</ProfileTag>
</ArrayOfProfileTag>

View File

@ -0,0 +1,10 @@
using System;
using System.Xml.Serialization;
[XmlRoot(ElementName = "ArrayOfUserPartyComplete", Namespace = "http://api.jumpstart.com/")]
[Serializable]
public class ArrayOfUserPartyComplete
{
[XmlElement(ElementName = "UserPartyComplete")]
public UserPartyComplete[] UserPartyComplete;
}

12
src/Schema/ContentInfo.cs Normal file
View File

@ -0,0 +1,12 @@
using System.Xml.Serialization;
namespace sodoff.Schema
{
[XmlRoot(ElementName = "ArrayOfContentInfo", Namespace = "http://api.jumpstart.com/")]
[Serializable]
public class ContentInfo
{
[XmlElement("ContentInfo")]
public ContentInfoData[] ContentInfoArray;
}
}

View File

@ -0,0 +1,39 @@
using System.Xml.Serialization;
namespace sodoff.Schema
{
[XmlRoot(ElementName = "ContentInfo")]
[Serializable]
public class ContentInfoData
{
[XmlElement(ElementName = "DisplayName")]
public string? DisplayName;
[XmlElement(ElementName = "Description")]
public string? Description;
[XmlElement(ElementName = "ThumbnailUrl")]
public string? ThumbnailUrl;
[XmlElement(ElementName = "LinkUrl")]
public string? LinkUrl;
[XmlElement(ElementName = "TextureUrl")]
public string? TextureUrl;
[XmlElement(ElementName = "RolloverUrl")]
public string? RolloverUrl;
[XmlElement(ElementName = "CategoryUrl")]
public string? CategoryUrl;
[XmlElement(ElementName = "ContentType")]
public int? ContentType;
[XmlElement(ElementName = "MembersOnly")]
public bool? MembersOnly;
[XmlElement(ElementName = "LinkType")]
public ContentLinkType? LinkType;
}
}

View File

@ -0,0 +1,18 @@
using System.Xml.Serialization;
namespace sodoff.Schema
{
public enum ContentLinkType
{
[XmlEnum("0")]
Unknown,
[XmlEnum("1")]
OggSound,
[XmlEnum("2")]
OggMovie,
[XmlEnum("3")]
UnityWebPlayer,
[XmlEnum("4")]
UnityLevel
}
}

33
src/Schema/UserParty.cs Normal file
View File

@ -0,0 +1,33 @@
using System.Xml.Serialization;
namespace sodoff.Schema
{
[XmlRoot(ElementName = "Party", Namespace = "")]
[Serializable]
public class UserParty
{
[XmlElement(ElementName = "UID")]
public Guid UserID;
[XmlElement(ElementName = "UserName")]
public string UserName;
[XmlElement(ElementName = "Name")]
public string DisplayName;
[XmlElement(ElementName = "Icon")]
public string Icon;
[XmlElement(ElementName = "Loc")]
public string Location;
[XmlElement(ElementName = "LocIcon")]
public string LocationIcon;
[XmlElement(ElementName = "ExpDate")]
public DateTime ExpirationDate;
[XmlElement(ElementName = "Pvt")]
public bool PrivateParty;
}
}

View File

@ -0,0 +1,11 @@
using sodoff.Schema;
using System;
using System.Xml.Serialization;
[XmlRoot(ElementName = "PartyComplete", Namespace = "")]
[Serializable]
public class UserPartyComplete : UserParty
{
[XmlElement(ElementName = "Asset")]
public string AssetBundle;
}

View File

@ -0,0 +1,15 @@
using System.Xml.Serialization;
namespace sodoff.Schema
{
[XmlRoot(ElementName = "Party", Namespace = "")]
[Serializable]
public class UserPartyData
{
[XmlElement(ElementName = "BuddyParties")]
public UserParty[] BuddyParties;
[XmlElement(ElementName = "NonBuddyParties")]
public UserParty[] NonBuddyParties;
}
}

View File

@ -2,6 +2,7 @@
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using sodoff.Model;
using sodoff.Schema;
using sodoff.Util;
using System.Text.RegularExpressions;
namespace sodoff.Services;
@ -33,7 +34,7 @@ public class GameDataService {
return true;
}
public GameDataSummary GetGameData(Viking viking, [FromForm] int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, bool buddyFilter, DateTime? startDate = null, DateTime? endDate = null) {
public GameDataSummary GetGameData(Viking viking, int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, bool buddyFilter, string apiKey, DateTime? startDate = null, DateTime? endDate = null) {
// TODO: Buddy filter
List<GameDataResponse> selectedData;
IQueryable<Model.GameData> query = ctx.GameData.Where(x => x.GameId == gameId && x.IsMultiplayer == false && x.Difficulty == difficulty && x.GameLevel == gameLevel);
@ -44,10 +45,26 @@ public class GameDataService {
var query2 = query.SelectMany(e => e.GameDataPairs)
.Where(x => x.Name == key);
if (AscendingOrder)
selectedData = query2.OrderBy(e => e.Value).Select(e => new GameDataResponse(e.GameData.Viking.Name, e.GameData.Viking.Uid, e.GameData.DatePlayed, e.GameData.Win, e.GameData.Loss, e.Value)).Take(count).ToList();
else
selectedData = query2.OrderByDescending(e => e.Value).Select(e => new GameDataResponse(e.GameData.Viking.Name, e.GameData.Viking.Uid, e.GameData.DatePlayed, e.GameData.Win, e.GameData.Loss, e.Value)).Take(count).ToList();
if (ClientVersion.GetVersion(apiKey) == ClientVersion.WoJS) {
// use DisplayName instead of Name
if (AscendingOrder)
selectedData = query2.OrderBy(e => e.Value).Select(e => new GameDataResponse(
XmlUtil.DeserializeXml<AvatarData>(e.GameData.Viking.AvatarSerialized).DisplayName, e.GameData.Viking.Uid, e.GameData.DatePlayed, e.GameData.Win, e.GameData.Loss, e.Value)
).Take(count).ToList();
else
selectedData = query2.OrderByDescending(e => e.Value).Select(e => new GameDataResponse(
XmlUtil.DeserializeXml<AvatarData>(e.GameData.Viking.AvatarSerialized).DisplayName, e.GameData.Viking.Uid, e.GameData.DatePlayed, e.GameData.Win, e.GameData.Loss, e.Value)
).Take(count).ToList();
} else {
if (AscendingOrder)
selectedData = query2.OrderBy(e => e.Value).Select(e => new GameDataResponse(
e.GameData.Viking.Name, e.GameData.Viking.Uid, e.GameData.DatePlayed, e.GameData.Win, e.GameData.Loss, e.Value)
).Take(count).ToList();
else
selectedData = query2.OrderByDescending(e => e.Value).Select(e => new GameDataResponse(
e.GameData.Viking.Name, e.GameData.Viking.Uid, e.GameData.DatePlayed, e.GameData.Win, e.GameData.Loss, e.Value)
).Take(count).ToList();
}
return GetSummaryFromResponse(viking, isMultiplayer, difficulty, gameLevel, key, selectedData);
}

View File

@ -4,7 +4,7 @@
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
<DefineConstants>USE_SQLITE;$(DefineConstants)</DefineConstants>
<DefineConstants>USE_POSTGRESQL;$(DefineConstants)</DefineConstants>
@ -46,13 +46,19 @@
<None Remove="Resources\rewardmultiplier.xml" />
<None Remove="Resources\store.xml" />
<None Remove="Resources\allranks.xml" />
<None Remove="Resources\allranks_wojs.xml" />
<None Remove="Resources\achievementsids.xml" />
<None Remove="Resources\achievementstasks.xml" />
<None Remove="Resources\defaultmissionlist.xml" />
<None Remove="Resources\defaultmissionlistv1.xml" />
<None Remove="Resources\defaultmissionlistmam.xml" />
<None Remove="Resources\defaultmissionlist_wojs.xml" />
<None Remove="Resources\questiondata.xml" />
<None Remove="Resources\questiondata.xml" />
<None Remove="Resources\content_jukebox.xml" />
<None Remove="Resources\content_movie.xml" />
<None Remove="Resources\content_arcade.xml" />
<None Remove="Resources\content_learning.xml" />
<None Remove="Resources\profiletags.xml" />
</ItemGroup>
<ItemGroup>
<None Update="Resources\childlist.xml">
@ -61,12 +67,12 @@
<None Update="Resources\store.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\items.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\tutorialmission.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\items.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\tutorialmission.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\achievementsids.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
@ -99,6 +105,9 @@
<EmbeddedResource Include="Resources\allranks.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\allranks_wojs.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievementsids.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
@ -111,26 +120,41 @@
<EmbeddedResource Include="Resources\items.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\missions.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\missions_wojs.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\missions.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\missions_wojs.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlist.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlistv1.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlistmam.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\defaultmissionlist_wojs.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\questiondata.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\questiondata.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\content_jukebox.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\content_movie.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\content_arcade.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\content_learning.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\profiletags.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
</Project>