about summary refs log tree commit diff stats
path: root/app/jobs/pokeviewer/extract_save_data_job.rb
blob: be8f64d28d9220e494309edb632547e8c857ffe8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
module Pokeviewer
  class ExtractSaveDataJob < ApplicationJob
    queue_as :default

    def perform(args)
      game = Trainer.find_or_create_by!(
        name: args["playerName"],
        number: args["playerId"]) do |r|
          case args["gameId"].to_i
          when 1
            r.game = :ruby
          when 2
            r.game = :sapphire
          when 3
            r.game = :firered
          when 4
            r.game = :leafgreen
          when 5
            r.game = :emerald
          else
            # Invalid, so just leave the field nil
          end
        end

      args["boxes"].each_with_index do |box_name,index|
        box = Box.find_or_initialize_by(trainer: game, number: index)
        box.name = box_name
        box.save!
      end

      game.pokemon.clear

      args["pokemon"].each do |param|
        pk = Pokemon.find_or_create_by!(key: param["key"]) do |r|
          r.species_id = param["species"]
          r.ot_name = param["otName"]
          r.ot_number = param["otId"]
          r.ot_gender = param["otGender"]

          if param["metLevel"] == 0
            r.met_type = :hatched
            r.met_location = param["metLocation"]
          elsif param["metLocation"] == 254
            r.met_type = :npc_trade
          elsif param["metLocation"] == 255
            r.met_type = :fateful_encounter
            r.met_level = param["metLevel"]
          else
            r.met_type = :normal
            r.met_level = param["metLevel"]
            r.met_location = param["metLocation"]
          end

          r.shiny = param["shiny"]
          r.nature = Pokemon.nature.values[param["nature"]]
          r.gender = param["gender"]
          r.second_ability = param["secondAbility"]

          # Handle Unown form
          if r.species_id == 201
            r.unown_letter = Pokemon.unown_letter.values[param["unownLetter"]]
          end
        end

        pk.trainer = game

        if param["storage"] == "party"
          pk.box = nil
        elsif param["storage"] == "box"
          pk.box = param["box"]
        end

        pk.slot = param["slot"]

        pk.save!

        rev = Revision.new(pokemon: pk)
        rev.nickname = param["nickname"]
        rev.experience = param["experience"]
        rev.level = param["level"]
        rev.hp = param["hp"]
        rev.attack = param["attack"]
        rev.defense = param["defense"]
        rev.special_attack = param["spAttack"]
        rev.special_defense = param["spDefense"]
        rev.speed = param["speed"]
        rev.coolness = param["coolness"]
        rev.beauty = param["beauty"]
        rev.cuteness = param["cuteness"]
        rev.smartness = param["smartness"]
        rev.toughness = param["toughness"]
        rev.sheen = param["sheen"]
        rev.hold_item = param["heldItem"]
        rev.move_1_id = param["moves"][0]["id"]
        rev.move_1_pp_bonuses = param["moves"][0]["ppBonuses"]

        if param["moves"].length >= 2
          rev.move_2_id = param["moves"][1]["id"]
          rev.move_2_pp_bonuses = param["moves"][1]["ppBonuses"]
        end

        if param["moves"].length >= 3
          rev.move_3_id = param["moves"][2]["id"]
          rev.move_3_pp_bonuses = param["moves"][2]["ppBonuses"]
        end

        if param["moves"].length == 4
          rev.move_4_id = param["moves"][3]["id"]
          rev.move_4_pp_bonuses = param["moves"][3]["ppBonuses"]
        end

        if pk.revisions.empty? or rev.diff?(pk.revisions.last)
          rev.save!
        end
      end
    end
  end
end