# A Friendly Disclaimer

This project was **NOT** started in retaliation to the allegations that were made against me in late February. I will not sugarcoat the fact that those allegations are for the most part true, however there was context that was left out of the story. For more information, visit [https://www.alanmoon.net/jsr/the-truth.html](https://www.alanmoon.net/jsr/the-truth.html) and form your own opinion.

# JumpStart Games Reduxed

JumpStart Games Reduxed is an attempt to bring more features and moderation to SoDOff, while still keeping up with updates from the SoDOff Team. It supports all games released by Knowledge Adventure (f.k.a JumpStart Games) with some varying degrees of success.

This is a **HEAVY WORK IN PROGRESS** and some things may break due to the new additions. JumpStart Games' releases are known to be poorly coded and buggy to begin with.

# Original Repo README.md Starts Here

On 7th June 2023, School of Dragons announced they were "sunsetting" the game, and turning the servers off on the 30th of June.
At that time, SoDOff was born. Currently, it is an almost complete implementation of the School of Dragons API server (and some other JS games).
It allows you to run SoD offline as well as host private online servers.

We also provide MMO server implementation for SoD (https://github.com/SoDOff-Project/sodoff-mmo).
It is recommended to use the MMO server even when offline, as some aspects of the single player game depend on MMO.

## License

SoDOff is open source, distributed under the [AGPL](LICENSE) license.
This license does not cover resources obtained from the game or from responses of the original API distributed with the API server, especially:
	`missions.xml`, `items.xml`, `allranks.xml` and `store.xml` files from the `src/Resources` directory and files inside the `src/assets` directory.

## Getting started

To build the API server from sources, you'll need the dotnet 6.0 SDK. Simply run the following command to build and start the server:

```
dotnet run --project src/sodoff.csproj
```

### Modifying the Client

To play the game you need to modify the game client to use `http://localhost:5001/.com/conf/` instead of `http://media.jumpstart.com/DWADragonsUnity/`.
You can use *ClientPatcher* tool form https://github.com/SoDOff-Project/sodoff-tools to do this. This tool also change correct ApiKey and 3DesKey values.
You can also do this by manually editing `DOMain_Data/resources.assets` in a hex-editor and swapping the URLs (and keys if needed).

By default we use `conf` instead of `DWADragonsUnity` for XML configuration to allow the use of a longer server name/IP address (limitation of url length in resources.assets).
Provided sample `DWADragonsMain.xml` file still requires the use of the `DWADragonsUnity` directory for assets.

### Server Configuration

Most of the server configuration is stored in `appsettings.json`.  Check out the "// ..." keys in there for descriptions of different options.

#### Supported Clients

The server support multiple versions of School of Dragons and some other JS online games (like Magic & Mythies, Math Blaster and World of JumpStart).

For each supported SoD client version, there must be a corresponding file located at `assets/conf/{PLATFORM}/{VERSION}/DWADragonsMain.xml`.
By default (modifiable in appsettings.json), files for version 2.5.0 and newer will be automatically encrypted to meet the client's requirements.

A sample file is provided for `{PLATFORM} = WIN`, `{VERSION} = 3.31.0`.
It assumes that the server address are `localhost:5000` (API) and `localhost:5001` (assets).

To use this server with games other than School of Dragons you need to change the `LoadNonSoDData` value in `appsettings.json` to `true`.

#### Asset Server

Various settings for the asset server are customizable, with the key one being `ProviderURL`, which specifies the source for downloading assets in `partial` mode. By default, it's configured to use archive.org
Please do not abuse the archive.org server, do not disable the `UseCache` option and do not delete the contents of the `asset-cache` directory.
The [SoDOff-tools](https://github.com/SoDOff-Project/sodoff-tools) repository contains an *AssetsDownloader* tool to pre-download assets (this may be needed in case of a slow connection to `ProviderURL`).

#### Listening address/port

By default, the server listens on all IPv4 and IPv6 addresses on ports 5000 (API) and 5001 (assets).
You can tweak this in `appsettings.json`, but it might also mean adjusting `DWADragonsMain.xml` and updating clients to reflect the changes in the asset server address.

### Server Side Modding

The server supports server side modifications, which includes adding new items and putting them in the store without having to modify the server source code.
For more information, check out [src/mods/README-MODDING.md](src/mods/README-MODDING.md).

## Status

### What works

Almost everything:

- register/login
- create profile
- list profiles
- tutorial
- roaming in the open world
- inventory
- store
- missions
- hideouts
- farms
- minigames
- MMO (using sodoff-mmo)
- friends
- in-game messaging system (kind of, only tested in WoJS)

### What doesn't work

- play as Guest
- clans


### Methods

#### Fully implemented
- AcceptMission
- AddBattleItems
- AuthenticateUser
- CreatePet
- DeleteAccountNotification
- DeleteProfile
- FuseItems
- GetAchievementsByUserID
- GetAllActivePetsByuserId
- GetAuthoritativeTime
- GetChildList
- GetCommonInventory (V2)
- GetDefaultNameSuggestion
- GetDetailedChildList
- GetGameData
- GetGameDataByUser
- GetImage
- GetImageByUserId
- GetItem
- GetKeyValuePair
- GetKeyValuePairByUserID
- GetMMOServerInfoWithZone (uses resource xml as response)
- GetPetAchievementsByUserID
- GetSelectedRaisedPet
- GetStore
- GetUnselectedPetByTypes
- GetUserActiveMissionState
- GetUserCompletedMissionState
- GetUserInfoByApiToken
- GetUserMissionState
- GetUserProfile
- GetUserProfileByUserID
- GetUserRoomItemPositions
- GetUserUpcomingMissionState
- IsValidApiToken_V2
- LoginChild
- LoginParent
- PurchaseItems (V1)
- PurchaseItems (V2)
- RedeemMysteryBoxItems
- RegisterChild
- RegisterParent
- RerollUserItem
- SetAchievementAndGetReward
- SetAchievementByEntityIDs
- SetAvatar
- SetCommonInventory
- SetDisplayName (V2)
- SetDragonXP (used by account import tools)
- SetImage
- SetKeyValuePair
- SetKeyValuePairByUserID
- SetPlayerXP (used by account import tools)
- SetRaisedPet
- SetSelectedPet
- SetUserRoomItemPositions
- UseInventory
- GetUserMessageQueue
- GetCombinedListMessage
- SaveMessage
- GetBuddyList
- AddBuddy
- RemoveBuddy
- ApproveBuddy

#### Implemented enough (probably)
- GetCommonInventory (V1 -  returns the viking's inventory if it is called with a viking; otherwise returns 8 viking slots)
- GetGroupsByGroupType (only useful for Eat My Dust at the moment)
- GetQuestions (doesn't return all questions, probably doesn't need to)
- GetRules (doesn't return any rules, probably doesn't need to)
- GetSubscriptionInfo (always returns member, with end date 10 years from now)
- SendRawGameData
- SetNextItemState
- SetTaskState (only the TaskCanBeDone status is supported; might contain a serious problem - see the MissionService class)
- SetUserAchievementAndGetReward (works like SetAchievementAndGetReward)
- SetUserRoom
- ValidateName

#### Partially implemented
- ApplyPayout (doesn't calculate rewards properly)
- ApplyRewards
- GetGameDataByGame (friend tab displays all players - friend filter is not yet implemented because friend lists are not implemented)
- GetGameDataByGameForDateRange (friend tab displays all players)
- GetTopAchievementPointUsers (ignores type [all, buddy, hall of fame, ...] and mode [overall, monthly, weekly] properties)
- GetUserAchievements (used by Magic & Mythies)
- GetUserRoomList (room categories are not implemented, but it's enough for SoD)
- JoinGroup (for Eat My Dust only)
- ProcessRewardedItems (gives gems, but doesn't give gold, gold is not yet implemented)
- SellItems (gives gems, but doesn't give gold, gold is not yet implemented)
- SetUserAchievementTask (returns a real reward but still use task placeholder)
- SendMessage (has manual checks for type id's, not all are accounted for probably)

#### Currently static or stubbed
- GetAchievementTaskInfo (returns a static XML)
- GetActiveChallenges (returns an empty array)
- GetAllRanks (needs to be populated with what ranks the user has)
- GetAllRewardTypeMultiplier (returns a static XML)
- GetAllRewardTypeMultiplier (returns a static XML)
- GetAnnouncementsByUser (returns no announcements, but that might be sufficient)
- GetAverageRatingForRoom (return max rating)
- GetProfileTagAll (returns an empty array - used by Magic & Mythies)
- GetRankAttributeData (returns a static XML)
- GetUserActivityByUserID (returns an empty array)
- GetUserGameCurrency (return 65536 gems and 65536 coins)
