Results 1 to 10 of 38

  1. PeroPero
  2. PeroPero Seduction Integration

Threaded View

  1. #4

    Join Date
    Jul 2015
    Location
    Argentina
    Posts
    157
    Credits
    179

    Lightbulb

    Well, as far as my limited ActionScript knowledge can let me trace the code from decompiling the SWF file:

    Everything you do in the app (and I really mean everything; from clicking the splash screen button to buying items in the shop) is mapped into a tuple (name, flags, data object) and sent to the server for processing.

    Be aware that the following are just my guesses, and they can be completely wrong. Without access to the server code, or debugging/tracing the code during a playthrough, I cannot be sure of anything.

    Chance Times have four possible events (not counting the roulette spin ones, where you have one for each possible response, including each color stepup):
    • Step Up Finished: This one should trigger after all the step up spins are done. It should send the step up value to the server for chance event building (as far as I can guess, normal Chance Times are just treated as Step Up Lvl 0); and return the data needed to build the selection panel.
    • Chance Selected: This one should trigger after you have selected the card to open. It should send your selection to the server, and return the data needed to show results.
    • Open Card: This one should be the event that adds the reward card to your collection (or leves up the card if not new). It shouldn't send any new data, and return the data needed for adding/fusing the card.
    • Open Card Finished: This one should trigger after you've finished the card event (adding/fusing the card to your collection).


    There's also a lot of Gacha events and constants, but they all seem to be about the Gacha Window in the main app (where you choose the gacha to use, view the card lists, etc).

    I'm currently trying to see if any data is passed to the Chance Selected event regarding chosen card. The algorithm itself will remain unreachable for us, but depending on the data passed there, we'll know a bit of how this works:
    1. If no data about the chosen card is passed, then we can easily assume the algorithm ignores our choice completely.
    2. If data about the chosen card is passed, then we'll know the choice is relevant. Now, wether the cards are pre-calculated or not won't be reflected here, but it might be heavily implied so if this data is returned to the server.


    Okay, delving a bit more,

    I've found enough panels and event notifications to confirm that there are three parts to a chance time:
    1. Chance Time Panel
    2. Get Card Panel
    3. Integrate Card Panel

    as well as a boatload of micro-events in between them:
    1. Init event for each panel
    2. View event for each panel
    3. Action events for each step:
      • Select
      • Select Result
      • Select View
      • Use Item
      • Confirm Item
      • Use Item Result
      • Open Cards


    Once again, if the selection has an impact on the algorithm is unknown to us. Each step could be there for the simple purpose of keeping track of each interaction with the player, as well as for the need of selection values.



    And, finally, because my curiosity wouldn't allow me to leave this alone, packet phishing has led me to:

    After trawling through a lot of data with WireShark, and after understanding how the app works in sync with the server, I've located the following web service path as the call from the SELECT CARD event:

    Code:
    GET /Raidboss_Event-Chancetime/choice?playerId=853603&sessionId=26BLongBase64SessionId&format=json&select=5&token=20BLongHexadecimalTokenId
    Ignoring the session and token IDs (which I have erased for security reasons), and my User ID, we can see that the selection code is actually passed (5 here meaning bottom middle card).

    After decoding the 2.8KB block of data returned by that call, you get:
    Code:
    {
        "contents":{
            "player":{
                "playerId":"853603",
                "level":"35",
                "exp":{
                    "value":"36094",
                    "max":"37165"},
                "gold":"15402",
                "friend":{
                    "value":39,
                    "max":"39"},
                "actionPoint":{
                    "value":"88",
                    "max":229,
                    "recoverFinishTime":1436559511,
                    "recoverTime":8442,
                    "recoverInterval":60},
                "battlePoint":{
                    "value":0,
                    "max":6,
                    "recoverFinishTime":1436552659,
                    "recoverTime":1590,
                    "recoverInterval":300},
                "thumbnail":{AvatarImageURLsObject}
                "boost":false},
            "answer":[
                {"cardId":"121",
                 "src":{CardImageURLsObject},
                 "name":"Yukiko Hosaka",
                 "rarity":"N",
                 "level":84,
                 "at":"220"},
                {"cardId":"108",
                 "src":{CardImageURLsObject},
                 "name":"Maiko Mikami",
                 "rarity":"R",
                 "level":25,
                 "at":"660"},
                {"cardId":"49",
                 "src":{CardImageURLsObject},
                 "name":"Yukie Takenouchi",
                 "rarity":"N",
                 "level":69,
                 "at":"340"},
                {"cardId":"14",
                 "src":{CardImageURLsObject},
                 "name":"Mayumi Hashiguchi",
                 "rarity":"N",
                 "level":100,
                 "at":"200"},
                {"cardId":"46",
                 "src":{CardImageURLsObject},
                 "name":"Iori Kodama",
                 "rarity":"N",
                 "level":100,
                 "at":"260"},
                {"cardId":"44",
                 "src":{CardImageURLsObject},
                 "name":"Rio Iguchi",
                 "rarity":"N",
                 "level":100,
                 "at":"230"}],
            "card":{
                "before":{
                    "cardId":"46".
                    "src":{CardImageURLsObject},
                    "name":"Iori Kodama",
                    "rarity":"N",
                    "level":100,
                    "at":"2590"},
                "after":{
                    "cardId":"",
                    "src":{PeroImageURLsObject},
                    "name":"300 pero",
                    "rarity":"",
                    "at":""}},
            "isItem":1},
        "header":{
            "status":"OK",
            "error_msg":null}}
    The JSON code returned is quite self explanatory. There's all the data from my account (contents.player), all the data from the response (contents.answer), and the header data (header).

    You can also see how the answer contains all six cards to show (contents.answer.[0]), as well as the before/after data for adding/integrating the selected card (contents.answer.card), and the fact the returned card is actually an item/pero (contents.answer.isItem).

    I forgot to take a screenshot, but I can say the array of returned cards is in the exact order of revealed cards (Top-Left being 1st, Bottom-Right being 6th)

    This means that the selected value does impact the result returned by the server.
    However, once again, there's no data to point to any possible choice algorithm. What's more, the way the data is returned completely negates any chance the selection value being sent to the server may mean it does impact the choice itself, as it might just be sent so that the server knows how to build that response JSON object

    Last edited by YoshiEnVerde; 07-10-2015 at 12:46 PM.
    PPS ID: 853603 (YoshiEnVerde)
    Osawari Invite: 40VRKO15D3C537UUC2F4F

Posting Permissions

  • You may post new threads
  • You may post replies
  • You may not post attachments
  • You may not edit your posts
  •