Carefully, spoilers and art house! If you are stumped and desperate, this article should help you through the game. Plus, technical details.
It was the strangest, longest and informative hunt for achivkoy. The game code was studied, the API was recreated and the star navigator for this infinite space odyssey was implemented. All the way I cursed the developers. After all, in fact, the game lasts only 10 minutes. And further, further only emptiness and hope. But how glad I am now! Thanks to the developers and my aspiration, I learned a lot. Further, the passage itself.
Turning to side B , we begin the journey. At first, it seems, it has no purpose, but having found the first observatory, we see a circle. This is our goal. In the observatory we observe the constellations. Choosing the nearest stars, we begin to hunt them. If these stars are already open, then we can launch the navigator and calculate the target.
The names of the stars are generated from three letters and two random numbers. Letters are attached to coordinates. Find any star where the first two letters will match the desired star. Jump there and look for, directly, the star you need. She should be there. Mark the desired stars, go to the navigator.
Choose a season. Mark all the necessary stars. Being on a planet with an observatory, we turn on the OBS mode. Calculate the location of the stars, the crosshair should indicate a mysterious planet. Exit OBS mode. Turn on the orthogonal projection. Now we see the map as in the game. Go to the game and customize the view. Somewhere in the center we will find a distant star and jump there, hoping ..
MirrorMoon EP is created on Unity 3D. Therefore, it was not difficult to decompile the code. The algorithm is as follows. Open the URL - http://www.santaragione.com/NTF/MMEP/notification_1_1.php . We are interested in the last line. It is the number of seasons. This number is used to generate the hash. We also need the secret key thankyouforhackingmysecretkey1234568
. Oh no, we got to the core :)
string getHash(string text) { MD5 md5Hash = MD5.Create(); byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(text)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) sBuilder.Append(data[i].ToString("x2")); return sBuilder.ToString(); } string availableSeasons = urlopen("http://www.santaragione.com/NTF/MMEP/notification_1_1.php").Split('\n')[6]; string hash = getHash (availableSeasons + secretKey);
Now we can get a list of seasons: 1_000022,2_000077,3_000100,4_000099
... Pairs from the room and the seid, separated by commas.
string baseUrl = "http://www.mirrormoongame.com/mmphp/"; string url = string.Format ("seasons.php?Seasons={0}&hash={1}", availableSeasons, hash); string data = Utils.urlopen (baseUrl + url);
Similarly, we get the stars in the selected season:
string hash = Utils.getHash (seed + secretKey); string url = string.Format ("full_star.php?Seed={0}&hash={1}", seed, hash); string data = Utils.urlopen(baseUrl + url); foreach (string pair in data.Split(',')) { string name = pair.Substring(16, 6).Trim(); string pos = pair.Substring(22); float x = Convert.ToSingle(pos.Substring(0, 3)); float y = Convert.ToSingle(pos.Substring(3, 3)); float z = Convert.ToSingle(pos.Substring(6)); GameObject star = Instantiate(starPrefab) as GameObject; star.GetComponent<Star>().title = name; star.transform.position = new Vector3(x, y, z); stars.Add(star); }
These are pairs of coordinates and the star's name - 000022349205629_LIAMD 349205629,000022490453661_PAX4 490453661,000022570586427_RHUMB 570586427
...
Is this all ... or not? Behind the scenes was the algorithm for adding stars. This I will leave true connoisseurs of digital creativity. Do not bully.
PS: Passage is relevant only for online mode. Navigator can be downloaded here , the source there.
PPS: The events described occurred in March 2014. For more than two years, the post was in drafts, because there was no technical part in the story. Now it is fixed.
Source: https://habr.com/ru/post/216457/
All Articles