Inigo Valentin 6 жил өмнө
parent
commit
4015cb9f50
100 өөрчлөгдсөн 7839 нэмэгдсэн , 4597 устгасан
  1. 277 0
      application/Constant.php
  2. 12 0
      application/Controller.php
  3. 134 0
      application/Filter.php
  4. 56 0
      application/entity/Building.php
  5. 56 0
      application/entity/Decoration.php
  6. 120 0
      application/entity/Guild.php
  7. 115 0
      application/entity/Guild_Member.php
  8. 106 0
      application/entity/Inventory.php
  9. 76 0
      application/entity/K_Building.php
  10. 128 0
      application/entity/K_Decoration.php
  11. 30 30
      application/entity/K_Fusion.php
  12. 63 0
      application/entity/K_Guild_Skill.php
  13. 89 0
      application/entity/K_Guild_Skill_Group.php
  14. 73 0
      application/entity/K_Rune_Set.php
  15. 2 9
      application/entity/K_Skill.php
  16. 88 30
      application/entity/K_Unit.php
  17. 0 282
      application/entity/Monster.php
  18. 137 23
      application/entity/Rune.php
  19. 205 0
      application/entity/Rune_Craft.php
  20. 393 0
      application/entity/Unit.php
  21. 385 0
      application/helper/html.php
  22. 6 133
      application/helper/text.php
  23. 32 27
      application/page/Catalog_Page.php
  24. 3 3
      application/page/Fusion_Page.php
  25. 62 0
      application/page/Guild_Page.php
  26. 230 1
      application/page/Home_Page.php
  27. 23 26
      application/page/Monster_Info_Page.php
  28. 34 31
      application/page/Monster_Page.php
  29. 68 62
      application/page/Monsters_Page.php
  30. 346 0
      application/page/Report_Runecraft_Page.php
  31. 73 68
      application/page/Report_Runeupgrade_Page.php
  32. 60 64
      application/page/Report_Skillup_Page.php
  33. 11 10
      application/page/Runes_Page.php
  34. 4 86
      application/view/catalog.php
  35. 41 40
      application/view/fusion.php
  36. 287 0
      application/view/guild.php
  37. 167 0
      application/view/home.php
  38. 38 0
      application/view/inc/filter_catalog.php
  39. 63 0
      application/view/inc/filter_monsters.php
  40. 260 0
      application/view/inc/filter_report_runecraft.php
  41. 209 0
      application/view/inc/filter_report_runeupgrade.php
  42. 93 0
      application/view/inc/filter_report_skillup.php
  43. 194 0
      application/view/inc/filter_runes.php
  44. 3 0
      application/view/inc/header.php
  45. 66 373
      application/view/monster.php
  46. 14 39
      application/view/monster_info.php
  47. 30 149
      application/view/monsters.php
  48. 40 229
      application/view/report.php
  49. 93 0
      application/view/report_runecraft.php
  50. 10 973
      application/view/report_runeupgrade.php
  51. 36 155
      application/view/report_skillup.php
  52. 8 972
      application/view/runes.php
  53. 912 0
      data.sql
  54. 298 114
      install_base.py
  55. 834 311
      install_user.py
  56. 71 0
      public/css/filters.css
  57. 115 0
      public/css/guild.css
  58. 101 50
      public/css/home.css
  59. 39 3
      public/css/monster.css
  60. 1 1
      public/css/monster_info.css
  61. 2 1
      public/css/monsters.css
  62. 8 251
      public/css/report.css
  63. 54 0
      public/css/report_runecraft.css
  64. 46 0
      public/css/report_runeupgrade.css
  65. 97 0
      public/css/report_skillup.css
  66. 112 51
      public/css/ui.css
  67. BIN
      public/img/layout/currency/darkportalenergy.png
  68. BIN
      public/img/layout/essence/Fire_High.png
  69. BIN
      public/img/layout/essence/Light_High.png
  70. BIN
      public/img/layout/essence/Water_High.png
  71. BIN
      public/img/layout/essence/Wind_High.png
  72. BIN
      public/img/layout/icon/leader.png
  73. BIN
      public/img/layout/icon/lock.png
  74. BIN
      public/img/layout/icon/nok.png
  75. BIN
      public/img/layout/icon/ok.png
  76. BIN
      public/img/layout/icon/rank_beg.png
  77. BIN
      public/img/layout/icon/rank_cha1.png
  78. BIN
      public/img/layout/icon/rank_cha2.png
  79. BIN
      public/img/layout/icon/rank_cha3.png
  80. BIN
      public/img/layout/icon/rank_con1.png
  81. BIN
      public/img/layout/icon/rank_con2.png
  82. BIN
      public/img/layout/icon/rank_con3.png
  83. BIN
      public/img/layout/icon/rank_fig1.png
  84. BIN
      public/img/layout/icon/rank_fig2.png
  85. BIN
      public/img/layout/icon/rank_fig3.png
  86. BIN
      public/img/layout/icon/rank_gua1.png
  87. BIN
      public/img/layout/icon/rank_gua2.png
  88. BIN
      public/img/layout/icon/rank_gua3.png
  89. BIN
      public/img/layout/icon/rank_leg.png
  90. BIN
      public/img/layout/icon/viceleader.png
  91. BIN
      public/img/layout/rune/01.png
  92. BIN
      public/img/layout/rune/02.png
  93. BIN
      public/img/layout/rune/03.png
  94. BIN
      public/img/layout/rune/04.png
  95. BIN
      public/img/layout/rune/05.png
  96. BIN
      public/img/layout/rune/06.png
  97. BIN
      public/img/layout/rune/07.png
  98. BIN
      public/img/layout/rune/08.png
  99. BIN
      public/img/layout/rune/10.png
  100. BIN
      public/img/layout/rune/11.png

+ 277 - 0
application/Constant.php

@@ -0,0 +1,277 @@
+<?php
+
+    $DIFFICULTY = [
+        "NORMAL" => 1,
+        "HARD" => 2,
+        "HELL" => 3,
+    ];
+
+    $SOURCE = [
+        "SCROLL_UNKNOWN" => 1,
+        "SCROLL_MYSTICAL" => 2,
+        "SCROLL_LIGHT_AND_DARK" => 3,
+        "SCROLL_WATER" => 4,
+        "SCROLL_FIRE" => 5,
+        "SCROLL_WIND" => 6,
+        "SCROLL_LEGENDARY" => 7,
+        "SUMMON_EXCLUSIVE" => 8,
+        "SUMMON_LEGENDARY_PIECES" => 9,
+        "SUMMON_LIGHT_AND_DARK_PIECES" => 10,
+        "SCROLL_TRANSCENDANCE" => 11,
+        "SCROLL_LEGENDARY_WATER" => 12,
+        "SCROLL_LEGENDARY_FIRE" => 13,
+        "SCROLL_LEGENDARY_WIND" => 14,
+    ];
+
+    // TODO => Move these definitions to the models if not already done, delete this file.
+
+    $ELEMENT = [
+        "WATER" => 1,
+        "FIRE" => 2,
+        "WIND" => 3,
+        "LIGHT" => 4,
+        "DARK" => 5,
+        "PURE" => 6,
+    ];
+
+    $ARCHETYPE = [
+        "NONE" => 0,
+        "ATTACK" => 1,
+        "DEFENSE" => 2,
+        "HP" => 3,
+        "SUPPORT" => 4,
+        "MATERIAL" => 5
+    ];
+
+    $STAT = [
+        "HP" => 1,
+        "ATK" => 2,
+        "DEF" => 3,
+        "SPD" => 4,
+        "CRIT_RATE" => 5,
+        "CRIT_DMG" => 6,
+        "RESIST" => 7,
+        "ACCURACY" => 8,
+    ];
+
+    $EFFECT_AREA = [
+        "GENERAL" => 1,
+        "ARENA" => 3,
+        "DUNGEON" => 2,
+        "GUILD" => 5,
+    ];
+
+    $BUILDING = [
+        'SUMMONERS_TOWER' => 1,
+        'SUMMONHENGE' => 2,
+        'POND_OF_MANA' => 3,
+        'CRYSTAL_MINE' => 4,
+        'GATEWAY' => 8,
+        'TEMPLE_OF_WISHES' => 10,
+        'MAGIC_SHOP' => 11,
+        'ANCIENT_STONES' => 12,
+        'ARCANE_TOWER' => 14,
+        'CRYSTAL_TITAN' => 15,
+        'FUSION_HEXAGRAM' => 16,
+        'FUSE_CENTER' => 17,
+        'POWER_UP_CIRCLE' => 20,
+        'TRANQUIL_FOREST' => 22,
+        'GUSTY_CLIFFS' => 23,
+        'DEEP_FOREST_ENT' => 24,
+        'MONSTER_STORAGE' => 25,
+        'TRANSMOGRIFICATION_BUILDING' => 27,
+    ];
+
+    $DECORATION = [
+        'GUARDSTONE' => 4,
+        'MANA_FOUNTAIN' => 5,
+        'SKY_TRIBE_TOTEM' => 6,
+        'ARCANE_BOOSTER_TOWER' => 7,
+        'CRYSTAL_ALTAR' => 8,
+        'ANCIENT_SWORD' => 9,
+        'SANCTUM_OF_ENERGY' => 10,
+        'MYSTERIOUS_PLANT' => 11,
+        'FIRE_SANCTUARY' => 15,
+        'WATER_SANCTUARY' => 16,
+        'WIND_SANCTUARY' => 17,
+        'LIGHT_SANCTUARY' => 18,
+        'DARK_SANCTUARY' => 19,
+        'FALLEN_ANCIENT_GUARDIAN' => 31,
+        'CRYSTAL_ROCK' => 34,
+        'FAIRY_TREE' => 35,
+        'FLAG_OF_BATTLE' => 36,
+        'FLAG_OF_RAGE' => 37,
+        'FLAG_OF_HOPE' => 38,
+        'FLAG_OF_WILL' => 39,
+    ];
+
+    $INVENTORY_TYPE = [
+        'MONSTER' => 1,
+        'CURRENCY' => 6,
+        'RUNE' => 8,
+        'SCROLL' => 9,
+        'BOOSTER' => 10,
+        'ESSENCES' => 11,
+        'MONSTER_PIECE' => 12,
+        # '' => 15, Unknown. Appears in inventory_info with qty 0
+        'GUILD_MONSTER_PIECE' => 19,
+        'RAINBOWMON' => 25,   # Possibly material monsters in general. Appears when wish returns a rainbowmon.
+        'RUNE_CRAFT' => 27,
+        'CRAFT_STUFF' => 29,
+        'ENHANCING_MONSTER' => 61,
+    ];
+
+    $INVENTORY = [
+        "ESSENCE_MAGIC_LOW" => 11006,
+        "ESSENCE_MAGIC_MID" => 12006,
+        "ESSENCE_MAGIC_HIGH" => 13006,
+        "ESSENCE_WATER_LOW" => 11001,
+        "ESSENCE_WATER_MID" => 12001,
+        "ESSENCE_WATER_HIGH" => 13001,
+        "ESSENCE_FIRE_LOW" => 11002,
+        "ESSENCE_FIRE_MID" => 12002,
+        "ESSENCE_FIRE_HIGH" => 13002,
+        "ESSENCE_WIND_LOW" => 11003,
+        "ESSENCE_WIND_MID" => 12003,
+        "ESSENCE_WIND_HIGH" => 13003,
+        "ESSENCE_LIGHT_LOW" => 11004,
+        "ESSENCE_LIGHT_MID" => 12004,
+        "ESSENCE_LIGHT_HIGH" => 13004,
+        "ESSENCE_DARK_LOW" => 11005,
+        "ESSENCE_DARK_MID" => 12005,
+        "ESSENCE_DARK_HIGH" => 13005,
+        "WOOD" => 1001,
+        "LEATHER" => 1002,
+        "ROCK" => 1003,
+        "ORE" => 1004,
+        "MITHRIL" => 1005,
+        "CLOTH" => 1006,
+        "RUNE_PIECE" => 2001,
+        "POWDER" => 3001,
+        "SYMBOL_HARMONY" => 4001,
+        "SYMBOL_TRANSCENDANCE" => 4002,
+        "SYMBOL_CHAOS" => 4003,
+        "CRYSTAL_WATER" => 5001,
+        "CRYSTAL_FIRE" => 5002,
+        "CRYSTAL_WIND" => 5003,
+        "CRYSTAL_LIGHT" => 5004,
+        "CRYSTAL_DARK" => 5005,
+        "CRYSTAL_MAGIC" => 6001,
+        "CRYSTAL_PURE" => 7001,
+    ];
+
+    $ENHANCE_MONSTER = [
+        "WATER_ANGELMON" => 142110115,
+        "FIRE_ANGELMON" => 142120115,
+        "WIND_ANGELMON" => 142130115,
+        "LIGHT_ANGELMON" => 142140115,
+        "DARK_ANGELMON" => 142150115,
+        "WATER_KING_ANGELMON" => 182110115,
+        "FIRE_KING_ANGELMON" => 182120115,
+        "WIND_KING_ANGELMON" => 182130115,
+        "LIGHT_KING_ANGELMON" => 182140115,
+        "DARK_KING_ANGELMON" => 182150115,
+        "RAINBOWMON_2_20" => 143140220,
+        "RAINBOWMON_3_1" => 143140301,
+        "RAINBOWMON_3_25" => 143140325,
+        "RAINBOWMON_4_1" => 143140401,
+        "RAINBOWMON_4_30" => 143140430,
+        "RAINBOWMON_5_1" => 143140501,
+        "DEVILMON" => 151050101,
+        "SUPER_ANGELMON" => 217140115
+    ];
+
+    $RUNE_SET = [
+        "ENERGY" => 1,
+        "GUARD" => 2,
+        "SWIFT" => 3,
+        "BLADE" => 4,
+        "RAGE" => 5,
+        "FOCUS" => 6,
+        "ENDURE" => 7,
+        "FATAL" => 8,
+        "DESPAIR" => 10,
+        "VAMPIRE" => 11,
+        "VIOLENT" => 13,
+        "NEMESIS" => 14,
+        "WILL" => 15,
+        "SHIELD" => 16,
+        "REVENGE" => 17,
+        "DESTROY" => 18,
+        "FIGHT" => 19,
+        "DETERMINATION" => 20,
+        "ENHANCE" => 21,
+        "ACCURACY" => 22,
+        "TOLERANCE" => 23,
+    ];
+
+    $RUNE_STAT = [
+        "HP" => 1,
+        "HP%" => 2,
+        "ATK" => 3,
+        "ATK%" => 4,
+        "DEF" => 5,
+        "DEF%" => 6,
+        "SPD" => 8,
+        "CRR" => 9,
+        "CRD" => 10,
+        "RES" => 11,
+        "ACC" => 12,
+    ];
+
+    $QUALITY = [
+        "NORMAL" => 1,
+        "MAGIC" => 2,
+        "RARE" => 3,
+        "HERO" => 4,
+        "LEGEND" => 5,
+    ];
+
+    $CRAFT = [
+        "ENCHANT_GEM" => 1,
+        "GRINDSTONE" => 2,
+        "IMMEMORIAL_GEM" => 3,
+        "IMMEMORIAL_GRINDSTONE" => 4,
+    ];
+
+    $GUILD_MEMBER_GRADE = [
+        "LEADER" => 1,
+        "VICELEADER" => 3,
+        "NORMAL" => 2
+    ];
+
+    $ARENA_RANKING_POINTS = [
+        "BEGINER" => 0,
+        "CHALLENGER_1" => 900,
+        "CHALLENGER_2" => 1000,
+        "CHALLENGER_3" => 1100,
+        "FIGHTER_1" => 1200,
+        "FIGHTER_2" => 1300,
+        "FIGHTER_3" => 1400,
+        "CONQUEROR_1" => 1500,
+        "CONQUEROR_2" => 1600,
+        "CONQUEROR_3" => 1700,
+        "GUARDIAN_1" => 1700,
+        "GUARDIAN_2" => 1700,
+        "GUARDIAN_3" => 1700,
+        "LEGEND" => 1700,
+    ];
+
+    $ARENA_RANKING_RANK = [
+        "BEGINER" => null,
+        "CHALLENGER_1" => null,
+        "CHALLENGER_2" => null,
+        "CHALLENGER_3" => null,
+        "FIGHTER_1" => null,
+        "FIGHTER_2" => null,
+        "FIGHTER_3" => null,
+        "CONQUEROR_1" => 10000,
+        "CONQUEROR_2" => 3000,
+        "CONQUEROR_3" => 1000,
+        "GUARDIAN_1" => 300,
+        "GUARDIAN_2" => 100,
+        "GUARDIAN_3" => 30,
+        "LEGEND" => 1,
+    ];
+
+?>

+ 12 - 0
application/Controller.php

@@ -4,6 +4,9 @@
     require_once($path["helper"] . "db.php");
     require_once($path["helper"] . "db.php");
     require_once($path["helper"] . "text.php");
     require_once($path["helper"] . "text.php");
     require_once($path["helper"] . "net.php");
     require_once($path["helper"] . "net.php");
+    require_once($path["helper"] . "html.php");
+    require_once(__DIR__ . "/Constant.php");
+    require_once(__DIR__ . "/Filter.php");
 
 
     /**
     /**
      * Application controller.
      * Application controller.
@@ -50,6 +53,10 @@
                     require_once($path["page"] . "Runes_Page.php");
                     require_once($path["page"] . "Runes_Page.php");
                     $page = new Runes_Page($db);
                     $page = new Runes_Page($db);
                 }
                 }
+                elseif (strtoupper($pars[0]) == "GUILD"){
+                    require_once($path["page"] . "Guild_Page.php");
+                    $page = new Guild_Page($db);
+                }
                 elseif (strtoupper($pars[0]) == "MONSTERS"){
                 elseif (strtoupper($pars[0]) == "MONSTERS"){
                     if (count($pars) == 1){
                     if (count($pars) == 1){
                         require_once($path["page"] . "Monsters_Page.php");
                         require_once($path["page"] . "Monsters_Page.php");
@@ -83,6 +90,11 @@
                     require_once($path["page"] . "Report_Runeupgrade_Page.php");
                     require_once($path["page"] . "Report_Runeupgrade_Page.php");
                         $page = new Report_Runeupgrade_Page($db, $pars[1]);
                         $page = new Report_Runeupgrade_Page($db, $pars[1]);
                     }
                     }
+                    elseif (strtoupper($pars[1]) == "RUNECRAFT"){
+                    require_once($path["page"] . "Report_Runecraft_Page.php");
+                        $page = new Report_Runecraft_Page($db, $pars[1]);
+                    }
+
                 }
                 }
             }
             }
             // Load the view, or set an error code.
             // Load the view, or set an error code.

+ 134 - 0
application/Filter.php

@@ -0,0 +1,134 @@
+<?php
+
+    global $QUALITY;
+    global $RUNE_STAT;
+    
+    $a = "VARIALEA";
+
+    $FILTER_CATALOG = [
+        "element" => 0,
+        "name" => "",
+        "min_stars" => 1,
+        "max_stars" => 5
+    ];
+
+    $FILTER_FUSION = [
+        "product" => 0
+    ];
+
+    $FILTER_MONSTER = [
+        "element" => 0,
+        "name" => "",
+        "min_stars" => 1,
+        "max_stars" => 6,
+        "in_storage" => false,
+        "without_runes" => false
+    ];
+
+    $FILTER_RUNECRAFT = [
+        "monster_name" => "",
+        "monster_min_stars" => 5,
+        "monster_max_stars" => 6,
+        "monster_storage" => false,
+        "rune_min_stars" => 5,
+        "rune_max_stars" => 6,
+        "rune_min_level" => 0,
+        "rune_max_level" => 15,
+        "rune_min_quality" => $QUALITY["HERO"],
+        "rune_max_quality" => $QUALITY["LEGEND"],
+        "rune_min_original_quality" => $QUALITY["HERO"],
+        "rune_max_original_quality" => $QUALITY["LEGEND"],
+        "rune_min_efficiency" => 0,
+        "rune_max_efficiency" => 100,
+        "rune_min_max_efficiency" => 0,
+        "rune_max_max_efficiency" => 100,
+        "rune_slot" => [],
+        "grind" => 1,
+        "grind_min_quality" => $QUALITY["NORMAL"],
+        "grind_stat" => [
+            $RUNE_STAT["HP%"],
+            $RUNE_STAT["ATK%"],
+            $RUNE_STAT["DEF%"],
+            $RUNE_STAT["SPD"],
+            $RUNE_STAT["CRD"],
+            $RUNE_STAT["CRR"],
+            $RUNE_STAT["ACC"]
+        ],
+        "gem" => 1,
+        "gem_min_quality" => $QUALITY["NORMAL"],
+        "gem_stat_from" => [
+            $RUNE_STAT["HP"],
+            $RUNE_STAT["ATK"],
+            $RUNE_STAT["DEF"],
+            $RUNE_STAT["RES"]
+        ],
+        "gem_stat_to" => [
+            $RUNE_STAT["HP%"],
+            $RUNE_STAT["ATK%"],
+            $RUNE_STAT["DEF%"],
+            $RUNE_STAT["SPD"],
+            $RUNE_STAT["CRD"],
+            $RUNE_STAT["CRR"],
+            $RUNE_STAT["ACC"]
+        ]
+    ];
+
+    $FILTER_RUNEUPGRADE = [
+        "monster_min_stars" => 5,
+        "monster_max_stars" => 6,
+        "monster_name" => "",
+        "monster_in_storage" => false,
+        "rune_min_stars" => 5,
+        "rune_max_stars" => 6,
+        "rune_min_level" => 0,
+        "rune_max_level" => 15,
+        "rune_min_quality" => $QUALITY["NORMAL"],
+        "rune_max_quality" => $QUALITY["LEGEND"],
+        "rune_min_original_quality" => $QUALITY["NORMAL"],
+        "rune_max_original_quality" => $QUALITY["LEGEND"],
+        "rune_min_efficiency" => 0,
+        "rune_max_efficiency" => 100,
+        "rune_min_max_efficiency" => 0,
+        "rune_max_max_efficiency" => 100,
+        "rune_slot" => [],
+        "alternative_min_stars" => 5,
+        "alternative_min_original_quality" => 0,
+        "alternative_min_level" => 0,
+        "alternative_condition" => 3,
+        "alternative_source" => 0
+    ];
+
+    $FILTER_SKILUP = [
+        "min_stars" => 5,
+        "max_stars" => 6,
+        "min_natural_stars" => 5,
+        "max_natural_stars" => 5,
+        "in_storage" => false,
+        "without_runes" => false,
+        "family" => false,
+        "maxed" => false,
+        "2a" => false,
+        "homunculus" => false
+    ];
+
+    $FILTER_RUNE = [
+        "type" => [],
+        "main" => [],
+        "sub" => [],
+        "slot" => [],
+        "min_quality" => $QUALITY["NORMAL"],
+        "max_quality" => $QUALITY["LEGEND"],
+        "min_original_quality" => $QUALITY["NORMAL"],
+        "max_original_quality" => $QUALITY["LEGEND"],
+        "min_stars" => 1,
+        "max_stars" => 6,
+        "min_level" => 0,
+        "max_level" => 15,
+        "min_efficiency" => 0,
+        "max_efficiency" => 100,
+        "min_max_efficiency" => 0,
+        "max_max_efficiency" => 100,
+        "assigned" => 1,
+        "group" => "SLOT"
+    ];
+?>

+ 56 - 0
application/entity/Building.php

@@ -0,0 +1,56 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "K_Building.php");
+
+
+    /**
+     * A Building.
+     *
+     * Represents an object from the table 'building'.
+     */
+    class Building extends Entity{
+
+        /**
+         * Owner identifier.
+         */
+        public $uid;
+
+        /**
+         * {@see K_Building}.
+         */
+        public $building;
+
+        /**
+         * I honestly don't know what the gin is.
+         */
+        public $gain;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * building, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Building identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s = "
+                SELECT
+                  uid,
+                  building,
+                  gain
+                FROM building
+                WHERE building = $id;
+            ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            $this->uid = $r["uid"];
+            $this->building = new K_Building($this->db, $r["building"]);
+            $this->gain = $r["gain"];
+        }
+    }
+?>

+ 56 - 0
application/entity/Decoration.php

@@ -0,0 +1,56 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "K_Decoration.php");
+
+
+    /**
+     * A Decoration.
+     *
+     * Represents an object from the table 'decoration'.
+     */
+    class Decoration extends Entity{
+
+        /**
+         * Owner identifier.
+         */
+        public $uid;
+
+        /**
+         * {@see K_Decoration}.
+         */
+        public $decoration;
+
+        /**
+         * I honestly don't know what the gin is.
+         */
+        public $level;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * decoration, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Building identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s = "
+                SELECT
+                  uid,
+                  decoration,
+                  level
+                FROM decoration
+                WHERE decoration = $id;
+            ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            $this->uid = $r["uid"];
+            $this->decoration = new K_Decoration($this->db, $r["decoration"]);
+            $this->level = $r["level"];
+        }
+    }
+?>

+ 120 - 0
application/entity/Guild.php

@@ -0,0 +1,120 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "Guild_Member.php");
+
+
+    /**
+     * Guild.
+     *
+     * Represents an object from the table 'guild'.
+     */
+    class Guild extends Entity{
+
+        /**
+         * Guild identifier.
+         */
+        public $id;
+
+        /**
+         * Guild name.
+         */
+        public $name;
+
+        /**
+         * Guild level.
+         */
+        public $level;
+
+        /**
+         * Guild total experience.
+         */
+        public $experience;
+
+        /**
+         * Indicates if the guild is ecruiting.
+         */
+        public $recruiting;
+
+        /**
+         * Number of members.
+         */
+        public $total_members;
+
+        /**
+         * Leader {@see Guild_Member}.
+         */
+        public $leader;
+
+        /**
+         * Guild comment.
+         */
+        public $comment;
+
+        /**
+         * Guild notice.
+         */
+        public $notice;
+
+        /**
+         * List of {@see Guild_Member}s.
+         */
+        public $members = [];
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * guild, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Guild identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  name, " .
+              "  name, " .
+              "  level, " .
+              "  experience, " .
+              "  recruiting, " .
+              "  members, " .
+              "  leader, " .
+              "  comment, " .
+              "  notice " .
+              "FROM guild " .
+              "WHERE id = $id; ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->id = $r["id"];
+                $this->name = $r["name"];
+                $this->level = $r["level"];
+                $this->experience = $r["experience"];
+                $this->recruiting = $r["recruiting"];
+                $this->total_members = $r["members"];
+                $this->leader = $r["leader"];
+                $this->comment = $r["comment"];
+                $this->notice = $r["notice"];
+            }
+            $s =
+              "SELECT id " .
+              "FROM guild_member " .
+              "WHERE guild = $this->id " .
+              "ORDER BY " .
+              "  grade = 1 DESC, " .
+              "  grade = 3 DESC, " .
+              "  grade = 2 DESC, " .
+              "  arena_score DESC; ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->members, new Guild_Member($db, $r["id"]));
+            }
+        }
+
+
+    }
+?>

+ 115 - 0
application/entity/Guild_Member.php

@@ -0,0 +1,115 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+
+
+    /**
+     * Guild.
+     *
+     * Represents an object from the table 'guild'.
+     */
+    class Guild_Member extends Entity{
+
+        /**
+         * Member identifier.
+         */
+        public $id;
+
+        /**
+         * Guild id.
+         */
+        public $guild;
+
+        /**
+         * Member name.
+         */
+        public $name;
+
+        /**
+         * Member level.
+         */
+        public $level;
+
+        /**
+         * Member grade.
+         */
+        public $grade;
+
+        /**
+         * Memeber rating.
+         */
+        public $rating;
+
+        /**
+         * Memebr arena score.
+         */
+        public $arena_score;
+
+        /**
+         * Timestam the user joined the guild.
+         */
+        public $joined;
+
+        /**
+         * Timestamp the user last log on.
+         */
+        public $last_login;
+
+        /**
+         * Indicates if the member is included in guild wars.
+         */
+        public $in_war;
+
+        /**
+         * Indicates if the member has set guild wars defenses.
+         */
+        public $has_defense;
+
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * guild, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Guild identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  guild, " .
+              "  name, " .
+              "  level, " .
+              "  grade, " .
+              "  rating, " .
+              "  arena_score, " .
+              "  joined, " .
+              "  last_login, " .
+              "  in_war, " .
+              "  has_defense " .
+              "FROM guild_member " .
+              "WHERE id = $id; ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->id = $r["id"];
+                $this->guild = $r["guild"];
+                $this->name = $r["name"];
+                $this->level = $r["level"];
+                $this->grade = $r["grade"];
+                $this->rating = $r["rating"];
+                $this->arena_score = $r["arena_score"];
+                $this->joined = $r["joined"];
+                $this->last_login = $r["last_login"];
+                $this->in_war = $r["in_war"];
+                $this->has_defense = $r["has_defense"];
+            }
+        }
+
+
+    }
+?>

+ 106 - 0
application/entity/Inventory.php

@@ -0,0 +1,106 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "K_Unit.php");
+
+
+    /**
+     * An inventory item.
+     *
+     * Represents an object from the table 'inventory'.
+     */
+    class Inventory extends Entity{
+
+        /**
+         * Owner identifier.
+         */
+        public $uid;
+
+        /**
+         * Item identifier. If its a monster piece, a {@see K_Monster} entity.
+         */
+        public $id;
+
+        /**
+         * Item type name.
+         */
+        public $type;
+
+        /**
+         * Item type name.
+         */
+        public $ammount;
+
+        /**
+         * Indicates if the item are monster pieces.
+         */
+        public $is_monster_pices;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * building, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Building identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            global $INVENTORY_TYPE;
+            parent::__construct($db);
+            $s = "
+                SELECT
+                  inventory.id AS id,
+                  k_inventory.name AS name,
+                  k_inventory.description AS description,
+                  inventory.type AS type_ref,
+                  k_inventory_type.name AS type,
+                  inventory.amount AS amount
+                FROM
+                  inventory,
+                  k_inventory_type
+                LEFT JOIN k_inventory ON
+                   k_inventory.id = inventory.id
+                WHERE
+                  inventory.type = k_inventory_type.id AND
+                  inventory.id = $id;
+            ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            $this->type = $r["type"];
+            $this->amount = $r["amount"];
+            if ($r["type"] == $INVENTORY_TYPE["GUILD_MONSTER_PIECE"] || $r["type"] == $INVENTORY_TYPE["MONSTER_PIECE"]){
+                $this->is_monster_pices = true;
+                $this->id = new K_Unit($this->db, $r["id"]);
+                $this->name = $this->id->title . " Pieces";
+                $this->description = $this->id->title . " Pieces";
+            }
+            else{
+                $this->is_monster_pices = false;
+                $this->id = $r["id"];
+                $this->name = $r["name"];
+                $this->description = $r["description"];
+            }
+        }
+
+        /**
+         * Gets the path to the item image. The image must be in the
+         * img/content/inventory/ directory, and its name must be the monster id,
+         * padded with '0' to 9 digites, and the extension must be '.png'.
+         *
+         * @return path to the image, or a path to a fixed unknown image if it
+         *         doesn't exist.
+         */
+        public function get_image(){
+            global $base_dir;
+            global $path;
+            if (file_exists($base_dir . "img/content/inventory/" . str_pad($this->id, 9, '0', STR_PAD_LEFT) . ".png")){
+                return $path["img"]["content"] . "inventory/" . str_pad($this->id, 9, '0', STR_PAD_LEFT) . ".png";
+            }
+            else{
+                return $path["img"]["layout"] . "unknown.png";
+            }
+        }
+    }
+?>

+ 76 - 0
application/entity/K_Building.php

@@ -0,0 +1,76 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+
+
+    /**
+     * Building.
+     *
+     * Represents an object from the table 'k_building'.
+     */
+    class K_Building extends Entity{
+
+        /**
+         * Building identifier.
+         */
+        public $id;
+
+        /**
+         * Building name.
+         */
+        public $name;
+
+        /**
+         * Building description.
+         */
+        public $description;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * building, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Building identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  name, " .
+              "  description " .
+              "FROM k_building " .
+              "WHERE id = $id; ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->id = $r["id"];
+                $this->name = $r["name"];
+                $this->description = $r["description"];
+            }
+        }
+
+        /**
+         * Gets the path to the building image. The image must be in the
+         * img/content/building/ directory, and its name must be the monster id,
+         * padded with '0' to 4 digites, and the extension must be '.png'.
+         *
+         * @return path to the image, or a path to a fixed unknown image if it
+         *         doesn't exist.
+         */
+        public function get_image(){
+            global $base_dir;
+            global $path;
+            if (file_exists($base_dir . "img/content/building/" . str_pad($this->id, 4, '0', STR_PAD_LEFT) . ".png")){
+                return $path["img"]["content"] . "building/" . str_pad($this->id, 4, '0', STR_PAD_LEFT) . ".png";
+            }
+            else{
+                return $path["img"]["layout"] . "unknown.png";
+            }
+        }
+
+    }
+?>

+ 128 - 0
application/entity/K_Decoration.php

@@ -0,0 +1,128 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+
+
+    /**
+     * Decoration.
+     *
+     * Represents an object from the table 'k_decoration'.
+     */
+    class K_Decoration extends Entity{
+
+        /**
+         * Decoration identifier.
+         */
+        public $id;
+
+        /**
+         * Decoration name.
+         */
+        public $name;
+
+        /**
+         * Decoration description.
+         */
+        public $description;
+
+        /**
+         * Area of effect (if any).
+         */
+        public $area;
+
+        /**
+         * Affected stat (if any).
+         */
+        public $stat;
+
+        /**
+         * Affected element (if any).
+         */
+        public $element;
+
+        /**
+         * Max. level ().
+         */
+        public $max_level;
+
+        /**
+         * Effect bonus per level.
+         */
+        public $level_bonus = [];
+
+        /**
+         * Cost per level.
+         */
+        public $level_cost = [];
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * decoration, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Decoration identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s = "
+                SELECT
+                  id,
+                  name,
+                  description,
+                  area,
+                  affected_stat,
+                  element,
+                  max_level
+                FROM k_decoration
+                WHERE id = $id;
+            ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->id = $r["id"];
+                $this->name = $r["name"];
+                $this->description = $r["description"];
+                $this->area = $r["area"];
+                $this->stat = $r["affected_stat"];
+                $this->element = $r["element"];
+                $this->max_level = $r["max_level"];
+                $s = "
+                    SELECT
+                      level,
+                      bonus,
+                      cost
+                    FROM k_decoration_level
+                    WHERE decoration = $id
+                ";
+                $q = $this->db->query($s);
+                while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                    $this->level_bonus[$r["level"]] = $r["bonus"];
+                    $this->level_cost[$r["level"]] = $r["cost"];
+                }
+            }
+        }
+
+        /**
+         * Gets the path to the building image. The image must be in the
+         * img/content/decoration/ directory, and its name must be the monster id,
+         * padded with '0' to 4 digites, and the extension must be '.png'.
+         *
+         * @return path to the image, or a path to a fixed unknown image if it
+         *         doesn't exist.
+         */
+        public function get_image(){
+            global $base_dir;
+            global $path;
+            if (file_exists($base_dir . "img/content/decoration/" . str_pad($this->id, 4, '0', STR_PAD_LEFT) . ".png")){
+                return $path["img"]["content"] . "decoration/" . str_pad($this->id, 4, '0', STR_PAD_LEFT) . ".png";
+            }
+            else{
+                return $path["img"]["layout"] . "unknown.png";
+            }
+        }
+
+    }
+?>

+ 30 - 30
application/entity/K_Fusion.php

@@ -1,14 +1,14 @@
 <?php
 <?php
 
 
     require_once($path["entity"] . "Entity.php");
     require_once($path["entity"] . "Entity.php");
-    require_once($path["entity"] . "K_Monster.php");
-    require_once($path["entity"] . "Monster.php");
+    require_once($path["entity"] . "K_Unit.php");
+    require_once($path["entity"] . "Unit.php");
 
 
     /**
     /**
-     * Extension of {@see K_Monster} that also stores information about owned
+     * Extension of {@see K_Unit} that also stores information about owned
      * monsters.
      * monsters.
      */
      */
-    class Monster_Fusion extends K_Monster{
+    class Monster_Fusion extends K_Unit{
 
 
         /**
         /**
          * All owned {@see Monster}s of this type.
          * All owned {@see Monster}s of this type.
@@ -28,20 +28,20 @@
             global $path;
             global $path;
             parent::__construct($db, $id, false);
             parent::__construct($db, $id, false);
             $s =
             $s =
-              "SELECT monster.id AS id " .
+              "SELECT unit.id AS id " .
               "FROM " . 
               "FROM " . 
-              "  monster, " .
-              "  k_monster " .
+              "  unit, " .
+              "  k_unit " .
               "WHERE " . 
               "WHERE " . 
-              "  k_monster.id = monster.monster AND " .
+              "  k_unit.id = unit.unit AND " .
               "  ( " .
               "  ( " .
-              "    k_monster.id = $id OR " .
-              "    k_monster.awakens_from = $id OR " .
-              "    k_monster.awakens_to = $id " .
+              "    k_unit.id = $id OR " .
+              "    k_unit.awakens_from = $id OR " .
+              "    k_unit.awakens_to = $id " .
               "  ); ";
               "  ); ";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
-                array_push($this->owned, new Monster($this->db, $r["id"], false));
+                array_push($this->owned, new Unit($this->db, $r["id"], false));
             }
             }
         }
         }
     }
     }
@@ -60,17 +60,17 @@
         public $id;
         public $id;
 
 
         /**
         /**
-         * {@see K_Monster} to fuse.
+         * {@see K_Unit} to fuse.
          */
          */
         public $product;
         public $product;
 
 
         /**
         /**
-         * {@see K_Monster} to fuse (awakened).
+         * {@see K_Unit} to fuse (awakened).
          */
          */
         public $product_awaken;
         public $product_awaken;
 
 
         /**
         /**
-         * {@see K_Monster} to fuse (awakened).
+         * {@see K_Unit} to fuse (awakened).
          */
          */
         public $product_unawaken;
         public $product_unawaken;
 
 
@@ -80,12 +80,12 @@
         public $fusion = [];
         public $fusion = [];
 
 
         /**
         /**
-         * List of unfuseable {@see K_Monster} material.
+         * List of unfuseable {@see K_Unit} material.
          */
          */
         public $ingredient = [];
         public $ingredient = [];
 
 
         /**
         /**
-         * List of unfuseable {@see K_Monster} material (awakened).
+         * List of unfuseable {@see K_Unit} material (awakened).
          */
          */
         public $ingredient_unawaken = [];
         public $ingredient_unawaken = [];
 
 
@@ -120,8 +120,8 @@
               "FROM k_fusion " .
               "FROM k_fusion " .
               "WHERE " .
               "WHERE " .
               "  product = $id OR " .
               "  product = $id OR " .
-              "  product = (SELECT awakens_to FROM k_monster WHERE id = $id) OR " .
-              "  product = (SELECT awakens_from FROM k_monster WHERE id = $id); ";
+              "  product = (SELECT awakens_to FROM k_unit WHERE id = $id) OR " .
+              "  product = (SELECT awakens_from FROM k_unit WHERE id = $id); ";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             $r = $q->fetchArray(SQLITE3_ASSOC);
             $r = $q->fetchArray(SQLITE3_ASSOC);
             $this->id = $r["id"];
             $this->id = $r["id"];
@@ -136,14 +136,14 @@
               "WHERE  " .
               "WHERE  " .
               "  product = " . $this->product->id . " AND " .
               "  product = " . $this->product->id . " AND " .
               "  ingredient IN (  " .
               "  ingredient IN (  " .
-              "    SELECT DISTINCT k_monster.id  " .
+              "    SELECT DISTINCT k_unit.id  " .
               "    FROM  " .
               "    FROM  " .
               "      k_fusion,  " .
               "      k_fusion,  " .
-              "      k_monster  " .
+              "      k_unit  " .
               "    WHERE " .
               "    WHERE " .
-              "      k_fusion.product = k_monster.awakens_from OR " .
-              "      k_fusion.product = k_monster.awakens_to OR " .
-              "      k_fusion.product = k_monster.id " .
+              "      k_fusion.product = k_unit.awakens_from OR " .
+              "      k_fusion.product = k_unit.awakens_to OR " .
+              "      k_fusion.product = k_unit.id " .
               "  ); ";
               "  ); ";
             $q_f = $this->db->query($s_f);
             $q_f = $this->db->query($s_f);
             while ($r_f = $q_f->fetchArray(SQLITE3_ASSOC)){
             while ($r_f = $q_f->fetchArray(SQLITE3_ASSOC)){
@@ -153,7 +153,7 @@
               "SELECT  " .
               "SELECT  " .
               "  id, " .
               "  id, " .
               "  awakens_from " .
               "  awakens_from " .
-              "FROM k_monster " .
+              "FROM k_unit " .
               "WHERE id IN ( " .
               "WHERE id IN ( " .
               "  SELECT DISTINCT " .
               "  SELECT DISTINCT " .
               "    ingredient " .
               "    ingredient " .
@@ -161,14 +161,14 @@
               "  WHERE  " .
               "  WHERE  " .
               "    product = " . $this->product->id . " AND " .
               "    product = " . $this->product->id . " AND " .
               "    ingredient NOT IN (  " .
               "    ingredient NOT IN (  " .
-              "      SELECT DISTINCT k_monster.id  " .
+              "      SELECT DISTINCT k_unit.id  " .
               "      FROM  " .
               "      FROM  " .
               "        k_fusion,  " .
               "        k_fusion,  " .
-              "        k_monster  " .
+              "        k_unit  " .
               "      WHERE " .
               "      WHERE " .
-              "        k_fusion.product = k_monster.awakens_from OR " .
-              "        k_fusion.product = k_monster.awakens_to OR " .
-              "        k_fusion.product = k_monster.id " .
+              "        k_fusion.product = k_unit.awakens_from OR " .
+              "        k_fusion.product = k_unit.awakens_to OR " .
+              "        k_fusion.product = k_unit.id " .
               "    ) " .
               "    ) " .
               "  ); ";
               "  ); ";
             $q_m = $this->db->query($s_m);
             $q_m = $this->db->query($s_m);

+ 63 - 0
application/entity/K_Guild_Skill.php

@@ -0,0 +1,63 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+
+    /**
+     * Guild skill.
+     *
+     * Represents an object from the table 'k_guild_skill'.
+     */
+    class K_Guild_Skill extends Entity{
+
+        /**
+         * Skill identifier.
+         */
+        public $id;
+
+        /**
+         * Skill group (id).
+         */
+        public $group;
+
+        /**
+         * Level at which the skill becames available.
+         */
+        public $level;
+
+        /**
+         * Skill description.
+         */
+        public $effect;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * skill, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Skill identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  skill_group, " .
+              "  level, " .
+              "  effect " .
+              "FROM k_guild_skill " .
+              "WHERE id = $id; ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->id = $r["id"];
+                $this->group = $r["skill_group"];
+                $this->level = $r["level"];
+                $this->effect = $r["effect"];
+            }
+        }
+
+    }
+?>

+ 89 - 0
application/entity/K_Guild_Skill_Group.php

@@ -0,0 +1,89 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "K_Guild_Skill.php");
+
+    /**
+     * Guild skill group.
+     *
+     * Represents an object from the table 'k_guild_skill_group'.
+     */
+    class K_Guild_Skill_Group extends Entity{
+
+        /**
+         * Group identifier.
+         */
+        public $id;
+
+        /**
+         * Group name.
+         */
+        public $name;
+
+        /**
+         * Group description.
+         */
+        public $description;
+        
+        /**
+         * List of {@see K_Guild_Skill}s in the group.
+         */
+        public $skills = [];
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * skill group, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Skill group identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  name, " .
+              "  description " .
+              "FROM k_guild_skill_group " .
+              "WHERE id = $id; ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->id = $r["id"];
+                $this->name = $r["name"];
+                $this->description = $r["description"];
+            }
+            $s =
+              "SELECT id " .
+              "FROM k_guild_skill " .
+              "WHERE skill_group = $this->id; ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->skills, new K_Guild_Skill($db, $r["id"]));
+            }
+        }
+
+        /**
+         * Gets the pathto the monster image. The image must be in the
+         * img/content/monster/ directory, and its name must be the monster id,
+         * padded with '0' to 1 digits, and the extension must be '.png'.
+         *
+         * @return path to the image, or a path to a fixed unknown image if it
+         *         doesn't exist.
+         */
+        public function get_image(){
+            global $base_dir;
+            global $path;
+            if (file_exists($base_dir . "img/content/skill_guild/" . str_pad($this->id, 1, '0', STR_PAD_LEFT) . ".png")){
+                return $path["img"]["content"] . "skill_guild/" . str_pad($this->id, 1, '0', STR_PAD_LEFT) . ".png";
+            }
+            else{
+                return $path["img"]["layout"] . "unknown.png";
+            }
+        }
+
+    }
+?>

+ 73 - 0
application/entity/K_Rune_Set.php

@@ -0,0 +1,73 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+
+    /**
+     * A rune set.
+     *
+     * Represents an object from the table 'k_rune_set'.
+     */
+    class K_Rune_Set extends Entity{
+
+        /**
+         * Set identifier.
+         */
+        public $id;
+
+        /**
+         * Set name.
+         */
+        public $name;
+
+        /**
+         * Required number of runes to activate the set.
+         */
+        public $amount;
+
+        /**
+         * Set description.
+         */
+        public $description;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * skill level, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $skill Effect identifier.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  name, " .
+              "  amount, " .
+              "  description " .
+              "FROM k_rune_set " .
+              "WHERE id = $id;";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->id = $r["id"];
+                $this->name = $r["name"];
+                $this->amount = $r["amount"];
+                $this->description = $r["description"];
+            }
+        }
+
+        public function get_image(){
+            global $base_dir;
+            global $path;
+            if (file_exists($base_dir . "img/layout/rune/" . str_pad($this->id, 2, '0', STR_PAD_LEFT) . ".png")){
+                return $path["img"]["layout"] . "rune/" . str_pad($this->id, 2, '0', STR_PAD_LEFT) . ".png";
+            }
+            else{
+                return $path["img"]["layout"] . "unknown.png";
+            }
+        }
+    }
+?>

+ 2 - 9
application/entity/K_Skill.php

@@ -17,11 +17,6 @@
          */
          */
         public $id;
         public $id;
 
 
-        /**
-         * Skill official identifier.
-         */
-        public $com2us_id;
-
         /**
         /**
          * Skill name.
          * Skill name.
          */
          */
@@ -97,7 +92,6 @@
             $s =
             $s =
               "SELECT " .
               "SELECT " .
               "  id, " .
               "  id, " .
-              "  com2us_id, " .
               "  name, " .
               "  name, " .
               "  description, " .
               "  description, " .
               "  slot, " .
               "  slot, " .
@@ -112,7 +106,6 @@
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             $r = $q->fetchArray(SQLITE3_ASSOC);
             $r = $q->fetchArray(SQLITE3_ASSOC);
             $this->id = $r["id"];
             $this->id = $r["id"];
-            $this->com2us_id = $r["com2us_id"];
             $this->name = $r["name"];
             $this->name = $r["name"];
             $this->description = $r["description"];
             $this->description = $r["description"];
             $this->slot = $r["slot"];
             $this->slot = $r["slot"];
@@ -146,8 +139,8 @@
         public function get_image(){
         public function get_image(){
             global $base_dir;
             global $base_dir;
             global $path;
             global $path;
-            if (file_exists($base_dir . "img/content/skill/" . str_pad($this->id, 4, '0', STR_PAD_LEFT) . ".png")){
-                return $path["img"]["content"] . "skill/" . str_pad($this->id, 4, '0', STR_PAD_LEFT) . ".png";
+            if (file_exists($base_dir . "img/content/skill/" . str_pad($this->id, 8, '0', STR_PAD_LEFT) . ".png")){
+                return $path["img"]["content"] . "skill/" . str_pad($this->id, 8, '0', STR_PAD_LEFT) . ".png";
             }
             }
             else{
             else{
                 return $path["img"]["layout"] . "unknown.png";
                 return $path["img"]["layout"] . "unknown.png";

+ 88 - 30
application/entity/K_Monster.php → application/entity/K_Unit.php

@@ -11,22 +11,17 @@
      *
      *
      * Represents an object from the table 'monster'.
      * Represents an object from the table 'monster'.
      */
      */
-    class K_Monster extends Entity{
+    class K_Unit extends Entity{
 
 
         /**
         /**
          * Monster identifier.
          * Monster identifier.
          */
          */
         public $id;
         public $id;
 
 
-        /**
-         * Monster official identifier.
-         */
-        public $com2us_id;
-
         /**
         /**
          * Monster family id.
          * Monster family id.
          */
          */
-        public $family_id;
+        public $family;
 
 
         /**
         /**
          * Monster name.
          * Monster name.
@@ -38,11 +33,21 @@
          */
          */
         public $element;
         public $element;
 
 
+        /**
+         * Element name (title case)
+         */
+        public $element_name;
+
         /**
         /**
          * Monster archetype.
          * Monster archetype.
          */
          */
         public $archetype;
         public $archetype;
 
 
+        /**
+         * Archetype name (title case).
+         */
+        public $archetype_name;
+
         /**
         /**
          * Default star level.
          * Default star level.
          */
          */
@@ -81,17 +86,17 @@
         /**
         /**
          * Base HP.
          * Base HP.
          */
          */
-        public $base_hp;
+        public $hp;
 
 
         /**
         /**
          * Base ATK.
          * Base ATK.
          */
          */
-        public $base_atk;
+        public $atk;
 
 
         /**
         /**
          * Base DEF.
          * Base DEF.
          */
          */
-        public $base_defense;
+        public $defense;
 
 
         /**
         /**
          * SPD.
          * SPD.
@@ -193,6 +198,13 @@
          */
          */
         public $sources = [];
         public $sources = [];
 
 
+        /**
+         * Unit title.
+         * If awakened, it will be the awakened from name.
+         * If unawakened, it will be <element> <name>.
+         */
+        public $title;
+
         /**
         /**
          * Constructor.
          * Constructor.
          *
          *
@@ -205,12 +217,13 @@
          */
          */
         public function __construct($db, $id, $complete = true){
         public function __construct($db, $id, $complete = true){
             global $path;
             global $path;
+            global $ELEMENT;
+            global $ARCHETYPE;
             parent::__construct($db);
             parent::__construct($db);
             $s =
             $s =
               "SELECT " .
               "SELECT " .
               "  id, " .
               "  id, " .
-              "  com2us_id, " .
-              "  family_id, " .
+              "  family, " .
               "  name, " .
               "  name, " .
               "  element, " .
               "  element, " .
               "  archetype, " .
               "  archetype, " .
@@ -221,9 +234,9 @@
               "  awaken_bonus, " .
               "  awaken_bonus, " .
               "  skill_ups_to_max, " .
               "  skill_ups_to_max, " .
               "  leader_skill, " .
               "  leader_skill, " .
-              "  base_hp, " .
-              "  base_attack, " .
-              "  base_defense, " .
+              "  hp, " .
+              "  attack, " .
+              "  defense, " .
               "  speed, " .
               "  speed, " .
               "  crit_rate, " .
               "  crit_rate, " .
               "  crit_damage, " .
               "  crit_damage, " .
@@ -240,17 +253,50 @@
               "  fusion_food, " .
               "  fusion_food, " .
               "  homunculus, " .
               "  homunculus, " .
               "  craft_cost " .
               "  craft_cost " .
-              "FROM k_monster " .
+              "FROM k_unit " .
               "WHERE id = $id; ";
               "WHERE id = $id; ";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             $r = $q->fetchArray(SQLITE3_ASSOC);
             $r = $q->fetchArray(SQLITE3_ASSOC);
             if ($r){
             if ($r){
                 $this->id = $r["id"];
                 $this->id = $r["id"];
-                $this->com2us_id = $r["com2us_id"];
-                $this->family_id = $r["family_id"];
+                $this->family = $r["family"];
                 $this->name = $r["name"];
                 $this->name = $r["name"];
                 $this->element = $r["element"];
                 $this->element = $r["element"];
+                switch($this->element){
+                    case $ELEMENT["WATER"]:
+                        $this->element_name = "Water";
+                        break;
+                    case $ELEMENT["FIRE"]:
+                        $this->element_name = "Fire";
+                        break;
+                    case $ELEMENT["WIND"]:
+                        $this->element_name = "Wind";
+                        break;
+                    case $ELEMENT["LIGHT"]:
+                        $this->element_name = "Light";
+                        break;
+                    case $ELEMENT["DARK"]:
+                        $this->element_name = "Dark";
+                        break;
+                }
                 $this->archetype = $r["archetype"];
                 $this->archetype = $r["archetype"];
+                switch($this->archetype){
+                    case $ARCHETYPE["ATTACK"]:
+                        $this->archetype_name = "Attack";
+                        break;
+                    case $ARCHETYPE["DEFENSE"]:
+                        $this->archetype_name = "Defense";
+                        break;
+                    case $ARCHETYPE["HP"]:
+                        $this->archetype_name = "HP";
+                        break;
+                    case $ARCHETYPE["SUPPORT"]:
+                        $this->archetype_name = "Support";
+                        break;
+                    case $ARCHETYPE["MATERIAL"]:
+                        $this->archetype_name = "Material";
+                        break;
+                }
                 $this->base_stars = $r["base_stars"];
                 $this->base_stars = $r["base_stars"];
                 $this->natural_stars = $r["natural_stars"];
                 $this->natural_stars = $r["natural_stars"];
                 $this->obtainable = $r["obtainable"];
                 $this->obtainable = $r["obtainable"];
@@ -260,9 +306,9 @@
                 if (strlen($r["leader_skill"]) > 0){
                 if (strlen($r["leader_skill"]) > 0){
                     $this->leader_skill = new K_Leader_Skill($this->db, $r["leader_skill"]);
                     $this->leader_skill = new K_Leader_Skill($this->db, $r["leader_skill"]);
                 }
                 }
-                $this->base_hp = $r["base_hp"];
-                $this->base_attack = $r["base_attack"];
-                $this->base_defense = $r["base_defense"];
+                $this->hp = $r["hp"];
+                $this->attack = $r["attack"];
+                $this->defense = $r["defense"];
                 $this->speed = $r["speed"];
                 $this->speed = $r["speed"];
                 $this->crit_rate = $r["crit_rate"];
                 $this->crit_rate = $r["crit_rate"];
                 $this->crit_damage = $r["crit_damage"];
                 $this->crit_damage = $r["crit_damage"];
@@ -285,6 +331,18 @@
                 $this->load_skills();
                 $this->load_skills();
                 $this->load_sources();
                 $this->load_sources();
             }
             }
+            if (strlen($this->awakens_from) > 0 && $this->awakens_to == ""){
+                // No to, no from, silver monster.
+                $this->title = $this->element_name . " " . $this->name;
+            }
+            elseif (strlen($this->awakens_from) > 0 && $this->awakens_to == ""){
+                // Already awakened
+                $this->title = $this->name;
+            }
+            elseif (strlen($this->awakens_to) > 0){
+                // Awakeable.
+                $this->title = $this->element_name . " " . $this->name;
+            }
         }
         }
 
 
         /**
         /**
@@ -300,9 +358,9 @@
               "  element, " .
               "  element, " .
               "  grade, " .
               "  grade, " .
               "  amount " .
               "  amount " .
-              "FROM k_monster_essence " .
+              "FROM k_unit_essence " .
               "WHERE " .
               "WHERE " .
-              "  monster = " . $this->id . " " .
+              "  unit = " . $this->id . " " .
               "ORDER BY " .
               "ORDER BY " .
               "  element <> 'Magic', " .
               "  element <> 'Magic', " .
               "  grade <> 'Low', " .
               "  grade <> 'Low', " .
@@ -331,10 +389,10 @@
               "  skill " .
               "  skill " .
               "FROM " .
               "FROM " .
               "  k_skill, " .
               "  k_skill, " .
-              "  k_monster_skill " .
+              "  k_unit_skill " .
               "WHERE " .
               "WHERE " .
               "  id = skill AND " .
               "  id = skill AND " .
-              "  monster = " . $this->id . " " .
+              "  unit = " . $this->id . " " .
               "ORDER BY slot; ";
               "ORDER BY slot; ";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
@@ -352,8 +410,8 @@
             $this->sources = [];
             $this->sources = [];
             $s =
             $s =
               "SELECT source " .
               "SELECT source " .
-              "FROM k_monster_source " .
-              "WHERE monster = " . $this->id . ";";
+              "FROM k_unit_source " .
+              "WHERE unit = " . $this->id . ";";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
                 array_push($this->sources, new K_Source($this->db, $r["source"]));
                 array_push($this->sources, new K_Source($this->db, $r["source"]));
@@ -369,10 +427,10 @@
          *         doesn't exist.
          *         doesn't exist.
          */
          */
         public function get_image(){
         public function get_image(){
-            global $base_dir;
+            global $dir;
             global $path;
             global $path;
-            if (file_exists($base_dir . "img/content/monster/" . str_pad($this->id, 4, '0', STR_PAD_LEFT) . ".png")){
-                return $path["img"]["content"] . "monster/" . str_pad($this->id, 4, '0', STR_PAD_LEFT) . ".png";
+            if (file_exists($dir . "img/content/unit/" . str_pad($this->id, 8, '0', STR_PAD_LEFT) . ".png")){
+                return $path["img"]["content"] . "unit/" . str_pad($this->id, 8, '0', STR_PAD_LEFT) . ".png";
             }
             }
             else{
             else{
                 return $path["img"]["layout"] . "unknown.png";
                 return $path["img"]["layout"] . "unknown.png";

+ 0 - 282
application/entity/Monster.php

@@ -1,282 +0,0 @@
-<?php
-
-    require_once($path["entity"] . "Entity.php");
-    require_once($path["entity"] . "K_Monster.php");
-    require_once($path["entity"] . "Rune.php");
-
-
-    /**
-     * Monster.
-     *
-     * Represents an object from the table 'monster'.
-     */
-    class Monster extends Entity{
-
-        /**
-         * Monster identifier.
-         */
-        public $id;
-
-        /**
-         * Monster official identifier.
-         */
-        public $com2us_id;
-
-        /**
-         * {@see K_Monster}.
-         */
-        public $monster;
-
-        /**
-         * Monster stars.
-         */
-        public $stars;
-
-        /**
-         * Monster level.
-         */
-        public $level;
-
-        /**
-         * Level of skill 1
-         */
-        public $skill_1_level;
-
-        /**
-         * Level of skill 2
-         */
-        public $skill_2_level;
-
-        /**
-         * Level of skill 3
-         */
-        public $skill_3_level;
-
-        /**
-         * Level of skill 4
-         */
-        public $skill_4_level;
-
-        /**
-         * Monster base HP stat.
-         */
-        public $base_hp;
-
-        /**
-         * Monster base ATK stat.
-         */
-        public $base_attack;
-
-        /**
-         * Monster base DEF stat.
-         */
-        public $base_defense;
-
-        /**
-         * Monster base SPD stat.
-         */
-        public $base_speed;
-
-        /**
-         * Monster base CRR stat.
-         */
-        public $base_crit_rate;
-
-        /**
-         * Monster base CRD stat.
-         */
-        public $base_crit_damage;
-
-        /**
-         * Monster base RES stat.
-         */
-        public $base_resistance;
-
-        /**
-         * Monster base ACC stat.
-         */
-        public $base_accuracy;
-
-        /**
-         * Monster rune HP stat.
-         */
-        public $rune_hp;
-
-        /**
-         * Monster rune ATK stat.
-         */
-        public $rune_attack;
-
-        /**
-         * Monster rune DEF stat.
-         */
-        public $rune_defense;
-
-        /**
-         * Monster rune SPD stat.
-         */
-        public $rune_speed;
-
-        /**
-         * Monster rune CRR stat.
-         */
-        public $rune_crit_rate;
-
-        /**
-         * Monster rune CRD stat.
-         */
-        public $rune_crit_damage;
-
-        /**
-         * Monster rune RES stat.
-         */
-        public $rune_resistance;
-
-        /**
-         * Monster rune ACC stat.
-         */
-        public $rune_accuracy;
-
-        /**
-         * Average rune efficiency.
-         */
-        public $avg_rune_efficiency;
-
-        /**
-         * Indicates if the monster is fodder.
-         */
-        public $fodder;
-
-        /**
-         * Indicates if the monster is in storage.
-         */
-        public $in_storage;
-
-        /**
-         * Indicates if the monster is ignored in fusion calc.
-         */
-        public $ignore_for_fusion;
-
-        /**
-         * Monster priority.
-         */
-        public $priority;
-
-        /**
-         * Notes on the monster.
-         */
-        public $notes;
-
-        /**
-         * Equiped {@see Rune}s
-         */
-        public $rune = [];
-
-
-        /**
-         * Constructor.
-         *
-         * Searches the database and retrieves the information about the
-         * monster, populating it and it's items.
-         *
-         * @param SQLite3 $db Connection to the database.
-         * @param int $id Monster identifier.
-         * @param complete If false, query only monster and k_monster.
-         */
-        public function __construct($db, $id, $complete = true){
-            global $path;
-            parent::__construct($db);
-            $s =
-              "SELECT " .
-              "  id, " .
-              "  com2us_id, " .
-              "  monster, " .
-              "  stars, " .
-              "  level, " .
-              "  skill_1_level, " .
-              "  skill_2_level, " .
-              "  skill_3_level, " .
-              "  skill_4_level, " .
-              "  base_hp, " .
-              "  base_attack, " .
-              "  base_defense, " .
-              "  base_speed, " .
-              "  base_crit_rate, " .
-              "  base_crit_damage, " .
-              "  base_resistance, " .
-              "  base_accuracy, " .
-              "  rune_hp, " .
-              "  rune_attack, " .
-              "  rune_defense, " .
-              "  rune_speed, " .
-              "  rune_crit_rate, " .
-              "  rune_crit_damage, " .
-              "  rune_resistance, " .
-              "  rune_accuracy, " .
-              "  avg_rune_efficiency, " .
-              "  fodder, " .
-              "  in_storage, " .
-              "  ignore_for_fusion, " .
-              "  priority, " .
-              "  notes " .
-              "FROM monster " .
-              "WHERE id = '$id'; ";
-            $q = $this->db->query($s);
-            $r = $q->fetchArray(SQLITE3_ASSOC);
-            $this->id = $r["id"];
-            $this->com2us_id = $r["com2us_id"];
-            if (strlen($r["monster"]) > 0){
-                $this->monster = new K_Monster($this->db, $r["monster"], $complete);
-            }
-            $this->stars = $r["stars"];
-            $this->level = $r["level"];
-            $this->skill_1_level = $r["skill_1_level"];
-            $this->skill_2_level = $r["skill_2_level"];
-            $this->skill_3_level = $r["skill_3_level"];
-            $this->skill_4_level = $r["skill_4_level"];
-            $this->base_hp = $r["base_hp"];
-            $this->base_attack = $r["base_attack"];
-            $this->base_defense = $r["base_defense"];
-            $this->base_speed = $r["base_speed"];
-            $this->base_crit_rate = $r["base_crit_rate"];
-            $this->base_crit_damage = $r["base_crit_damage"];
-            $this->base_resistance = $r["base_resistance"];
-            $this->base_accuracy = $r["base_accuracy"];
-            $this->rune_hp = $r["rune_hp"];
-            $this->rune_attack = $r["rune_attack"];
-            $this->rune_defense = $r["rune_defense"];
-            $this->rune_speed = $r["rune_speed"];
-            $this->rune_crit_rate = $r["rune_crit_rate"];
-            $this->rune_crit_damage = $r["rune_crit_damage"];
-            $this->rune_resistance = $r["rune_resistance"];
-            $this->rune_accuracy = $r["rune_accuracy"];
-            $this->avg_rune_efficiency = $r["avg_rune_efficiency"];
-            $this->fodder = $r["fodder"];
-            $this->in_storage = $r["in_storage"];
-            $this->ignore_for_fusion = $r["ignore_for_fusion"];
-            $this->priority = $r["priority"];
-            $this->notes = $r["notes"];
-            if ($complete){
-                $this->load_runes();
-            }
-        }
-
-        /**
-         * Loads the information about the equiped runes. 
-         * It is autoatically called at construction time if the
-         * $complete parameter is true (by default). No point in calling it
-         * twice.
-         */
-        public function load_runes(){
-            $this->rune = [];
-            $s =
-              "SELECT rune " .
-              "FROM monster_rune " .
-              "WHERE monster = '$this->id'; ";
-            $q = $this->db->query($s);
-            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
-                array_push($this->rune, new Rune($this->db, $r["rune"]));
-            }
-        }
-    }
-?>

+ 137 - 23
application/entity/Rune.php

@@ -1,6 +1,7 @@
 <?php
 <?php
 
 
     require_once($path["entity"] . "Entity.php");
     require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "K_Rune_Set.php");
 
 
 
 
     /**
     /**
@@ -11,14 +12,14 @@
     class Rune extends Entity{
     class Rune extends Entity{
 
 
         /**
         /**
-         * Rune identifier.
+         * Owner identifier.
          */
          */
-        public $id;
+        public $uid;
 
 
         /**
         /**
-         * Rune official identifier.
+         * Rune identifier.
          */
          */
-        public $com2us_id;
+        public $id;
 
 
         /**
         /**
          * ID of the monster the rune is assigned to.
          * ID of the monster the rune is assigned to.
@@ -26,7 +27,7 @@
         public $assigned_to;
         public $assigned_to;
 
 
         /**
         /**
-         * Name of the set.
+         * {@see K_Rune_Set}.
          */
          */
         public $type;
         public $type;
 
 
@@ -40,6 +41,11 @@
          */
          */
         public $stars;
         public $stars;
 
 
+        /**
+         * Indicates if the rune is ancient.
+         */
+        public $ancient;
+
         /**
         /**
          * Level of the rune.
          * Level of the rune.
          */
          */
@@ -56,14 +62,19 @@
         public $original_quality;
         public $original_quality;
 
 
         /**
         /**
-         * Price of the rune.
+         * Rune quality name (uppercase).
          */
          */
-        public $value;
+        public $quality_name;
+
+        /**
+         * Rune original quality name (uppercase).
+         */
+        public $original_quality_name;
 
 
         /**
         /**
-         * Remaining substats to gain.
+         * Price of the rune.
          */
          */
-        public $substat_upgrades_remaining;
+        public $value;
 
 
         /**
         /**
          * Current efficiency of the rune.
          * Current efficiency of the rune.
@@ -80,6 +91,11 @@
          */
          */
         public $main_stat;
         public $main_stat;
 
 
+        /**
+         * Main stat name (uppercase).
+         */
+        public $main_stat_name;
+
         /**
         /**
          * Main stat value of the rune.
          * Main stat value of the rune.
          */
          */
@@ -90,6 +106,11 @@
          */
          */
         public $innate_stat;
         public $innate_stat;
 
 
+        /**
+         * Extra stat name (uppercase).
+         */
+        public $innate_stat_name;
+
         /**
         /**
          * Extra stat value of the rune.
          * Extra stat value of the rune.
          */
          */
@@ -105,6 +126,11 @@
          */
          */
         public $substat_1;
         public $substat_1;
 
 
+        /**
+         * Substat 1 name (uppercase).
+         */
+        public $substat_1_name;
+
         /**
         /**
          * Substat 1 value of the rune.
          * Substat 1 value of the rune.
          */
          */
@@ -120,6 +146,11 @@
          */
          */
         public $substat_2;
         public $substat_2;
 
 
+        /**
+         * Substat 2 name (uppercase).
+         */
+        public $substat_2_name;
+
         /**
         /**
          * Substat 2 value of the rune.
          * Substat 2 value of the rune.
          */
          */
@@ -135,6 +166,11 @@
          */
          */
         public $substat_3;
         public $substat_3;
 
 
+        /**
+         * Substat 3 name (uppercase).
+         */
+        public $substat_3_name;
+
         /**
         /**
          * Substat 3 value of the rune.
          * Substat 3 value of the rune.
          */
          */
@@ -150,6 +186,11 @@
          */
          */
         public $substat_4;
         public $substat_4;
 
 
+        /**
+         * Substat 4 name (uppercase).
+         */
+        public $substat_4_name;
+
         /**
         /**
          * Substat 4 value of the rune.
          * Substat 4 value of the rune.
          */
          */
@@ -175,16 +216,15 @@
             $s =
             $s =
               "SELECT " .
               "SELECT " .
               "  id, " .
               "  id, " .
-              "  com2us_id, " .
               "  assigned_to, " .
               "  assigned_to, " .
               "  type, " .
               "  type, " .
               "  slot, " .
               "  slot, " .
               "  stars, " .
               "  stars, " .
               "  level, " .
               "  level, " .
+              "  ancient, " .
               "  quality, " .
               "  quality, " .
               "  original_quality, " .
               "  original_quality, " .
               "  value, " .
               "  value, " .
-              "  substat_upgrades_remaining, " .
               "  efficiency, " .
               "  efficiency, " .
               "  max_efficiency, " .
               "  max_efficiency, " .
               "  main_stat, " .
               "  main_stat, " .
@@ -193,33 +233,35 @@
               "  innate_stat_value, " .
               "  innate_stat_value, " .
               "  substat_1, " .
               "  substat_1, " .
               "  substat_1_value, " .
               "  substat_1_value, " .
-              "  substat_1_craft, " .
+              "  substat_1_enchant, " .
+              "  substat_1_grind, " .
               "  substat_2, " .
               "  substat_2, " .
               "  substat_2_value, " .
               "  substat_2_value, " .
-              "  substat_2_craft, " .
+              "  substat_2_enchant, " .
+              "  substat_2_grind, " .
               "  substat_3, " .
               "  substat_3, " .
               "  substat_3_value, " .
               "  substat_3_value, " .
-              "  substat_3_craft, " .
+              "  substat_3_enchant, " .
+              "  substat_3_grind, " .
               "  substat_4, " .
               "  substat_4, " .
               "  substat_4_value, " .
               "  substat_4_value, " .
-              "  substat_4_craft " .
+              "  substat_4_enchant, " .
+              "  substat_4_grind " .
               "FROM rune " .
               "FROM rune " .
               "WHERE id = '$id'; ";
               "WHERE id = '$id'; ";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             $r = $q->fetchArray(SQLITE3_ASSOC);
             $r = $q->fetchArray(SQLITE3_ASSOC);
             if ($r){
             if ($r){
                 $this->id = $r["id"];
                 $this->id = $r["id"];
-                $this->com2us_id = $r["com2us_id"];
                 $this->assigned_to = $r["assigned_to"];
                 $this->assigned_to = $r["assigned_to"];
-                $this->type = $r["type"];
+                $this->type = new K_Rune_Set($this->db, $r["type"]);
                 $this->slot = $r["slot"];
                 $this->slot = $r["slot"];
                 $this->stars = $r["stars"];
                 $this->stars = $r["stars"];
                 $this->level = $r["level"];
                 $this->level = $r["level"];
-                //$this->runeset = $r["runeset"];
+                $this->ancient = $r["ancient"];
                 $this->quality = $r["quality"];
                 $this->quality = $r["quality"];
                 $this->original_quality = $r["original_quality"];
                 $this->original_quality = $r["original_quality"];
                 $this->value = $r["value"];
                 $this->value = $r["value"];
-                $this->substat_upgrades_remaining = $r["substat_upgrades_remaining"];
                 $this->efficiency = $r["efficiency"];
                 $this->efficiency = $r["efficiency"];
                 $this->max_efficiency = $r["max_efficiency"];
                 $this->max_efficiency = $r["max_efficiency"];
                 $this->main_stat = $r["main_stat"];
                 $this->main_stat = $r["main_stat"];
@@ -228,16 +270,88 @@
                 $this->innate_stat_value = $r["innate_stat_value"];
                 $this->innate_stat_value = $r["innate_stat_value"];
                 $this->substat_1 = $r["substat_1"];
                 $this->substat_1 = $r["substat_1"];
                 $this->substat_1_value = $r["substat_1_value"];
                 $this->substat_1_value = $r["substat_1_value"];
-                $this->substat_1_craft = $r["substat_1_craft"];
+                $this->substat_1_enchant = $r["substat_1_enchant"];
+                $this->substat_1_grind = $r["substat_1_grind"];
                 $this->substat_2 = $r["substat_2"];
                 $this->substat_2 = $r["substat_2"];
                 $this->substat_2_value = $r["substat_2_value"];
                 $this->substat_2_value = $r["substat_2_value"];
-                $this->substat_2_craft = $r["substat_2_craft"];
+                $this->substat_2_enchant = $r["substat_2_enchant"];
+                $this->substat_2_grind = $r["substat_2_grind"];
                 $this->substat_3 = $r["substat_3"];
                 $this->substat_3 = $r["substat_3"];
                 $this->substat_3_value = $r["substat_3_value"];
                 $this->substat_3_value = $r["substat_3_value"];
-                $this->substat_3_craft = $r["substat_3_craft"];
+                $this->substat_3_enchant = $r["substat_3_enchant"];
+                $this->substat_3_grind = $r["substat_3_grind"];
                 $this->substat_4 = $r["substat_4"];
                 $this->substat_4 = $r["substat_4"];
                 $this->substat_4_value = $r["substat_4_value"];
                 $this->substat_4_value = $r["substat_4_value"];
-                $this->substat_4_craft = $r["substat_4_craft"];
+                $this->substat_4_enchant = $r["substat_4_enchant"];
+                $this->substat_4_grind = $r["substat_4_grind"];
+                $this->main_stat_name = $this->stat_name($this->main_stat);
+                $this->innate_stat_name = $this->stat_name($this->innate_stat);
+                $this->substat_1_name = $this->stat_name($this->substat_1);
+                $this->substat_2_name = $this->stat_name($this->substat_2);
+                $this->substat_3_name = $this->stat_name($this->substat_3);
+                $this->substat_4_name = $this->stat_name($this->substat_4);
+                $this->quality_name = $this->quality_name($this->quality);
+                $this->original_quality_name = $this->quality_name($this->original_quality);
+            }
+        }
+
+        /**
+         * Gets a stat name frm the maps.
+         *
+         * @param int $stat Stat id.
+         * @return string Stat name (Uppercase)
+         */
+        private function stat_name($stat){
+            global $RUNE_STAT;
+            switch ($stat){
+                case $RUNE_STAT["HP"]:
+                    return "HP";
+                case $RUNE_STAT["HP%"]:
+                    return "HP%";
+                case $RUNE_STAT["ATK"]:
+                    return "ATK";
+                case $RUNE_STAT["ATK%"]:
+                    return "ATK%";
+                case $RUNE_STAT["DEF"]:
+                    return "DEF";
+                case $RUNE_STAT["DEF%"]:
+                    return "DEF%";
+                case $RUNE_STAT["SPD"]:
+                    return "SPD";
+                case $RUNE_STAT["CRR"]:
+                    return "CRR";
+                case $RUNE_STAT["CRD"]:
+                    return "CRD";
+                case $RUNE_STAT["RES"]:
+                    return "RES";
+                case $RUNE_STAT["ACC"]:
+                    return "ACC";
+                default:
+                    return "";
+            }
+        }
+
+        /**
+         * Gets a stat name frm the maps.
+         *
+         * @param int $q Quality id.
+         * @return string Quality (Uppercase)
+         */
+        private function quality_name($q){
+            global $QUALITY;
+            switch ($q){
+                case $QUALITY["NORMAL"]:
+                    return "NORMAL";
+                case $QUALITY["MAGIC"]:
+                    return "MAGIC";
+                case $QUALITY["RARE"]:
+                    return "RARE";
+                case $QUALITY["HERO"]:
+                    return "HERO";
+                case $QUALITY["LEGEND"]:
+                    return "LEGEND";
+                default:
+                    return "";
             }
             }
         }
         }
 
 

+ 205 - 0
application/entity/Rune_Craft.php

@@ -0,0 +1,205 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "K_Rune_Set.php");
+
+    /**
+     * Owned rune craft item.
+     *
+     * Represents an object from the table 'rune_craft'.
+     */
+    class Rune_Craft extends Entity{
+
+        /**
+         * Owner identifier.
+         */
+        public $uid;
+
+        /**
+         * Item identifier.
+         */
+        public $id;
+
+        /**
+         * Item quality.
+         */
+        public $quality;
+
+        /**
+         * Item quality name.
+         */
+        public $quality_name;
+
+        /**
+         * {@see K_Rune_Set} the item modifies.
+         */
+        public $rune;
+
+        /**
+         * Stat the item modifies.
+         */
+        public $stat;
+
+        /**
+         * Stat name.
+         */
+        public $stat_name;
+
+        /**
+         * Indicates if the Item is a gem.
+         */
+        public $gem;
+
+        /**
+         * Indicates if the Item is ancient.
+         */
+        public $ancient;
+
+        /**
+         * Indicates if the Item is inmemorial.
+         */
+        public $inmemorial;
+
+        /**
+         * Item name.
+         */
+        public $name;
+
+        /**
+         * Minimum value of the stat.
+         */
+        public $min;
+
+        /**
+         * Maximum value of the stat.
+         */
+        public $max;
+
+        /**
+         * Sell value.
+         */
+        public $value;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * rune, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Rune id.
+         */
+        public function __construct($db, $id){
+            global $path;
+            parent::__construct($db);
+            $s =
+              "SELECT " .
+              "  rune_craft.id AS id, " .
+              "  rune_craft.quality As quality, " .
+              "  rune_craft.rune AS rune, " .
+              "  rune_craft.stat AS stat, " .
+              "  rune_craft.value AS value, " .
+              "  k_rune_craft_type.name AS name, " .
+              "  k_rune_craft_type.gem AS gem, " .
+              "  k_rune_craft_type.inmemorial AS inmemorial, " .
+              "  k_rune_craft_type.ancient AS ancient, " .
+              "  k_rune_craft_range.min AS min, " .
+              "  k_rune_craft_range.max AS max " .
+              "FROM " .
+              "  rune_craft, ".
+              "  k_rune_craft_type, " .
+              "  k_rune_craft_range " .
+              "WHERE " . 
+              "  rune_craft.id = $id AND " .
+              "  rune_craft.type = k_rune_craft_type.id AND " .
+              "  k_rune_craft_type.gem = k_rune_craft_range.gem AND " .
+              "  k_rune_craft_type.gem = k_rune_craft_range.gem AND " .
+              "  k_rune_craft_type.ancient = k_rune_craft_range.ancient AND " .
+              "  rune_craft.quality = k_rune_craft_range.quality AND " .
+              "  rune_craft.stat = k_rune_craft_range.stat;";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->id = $r["id"];
+                $this->gem = $r["gem"];
+                $this->quality = $r["quality"];
+                $this->quality_name = $this->quality_name($r["quality"]);
+                $this->stat = $r["stat"];
+                $this->stat_name = $this->stat_name($r["stat"]);
+                $this->ancient = $r["ancient"];
+                $this->inmemorial = $r["inmemorial"];
+                if ($this->inmemorial == 0){
+                    $this->rune = new K_Rune_Set($this->db, $r["rune"]);
+                    $this->name = $this->rune->name . " " . $r["stat"];
+                }
+                else{
+                    $this->name = "Inmemorial " . $r["stat"];
+                }
+                $this->min = $r["min"];
+                $this->max = $r["max"];
+                $this->value = $r["value"];
+            }
+        }
+
+        /**
+         * Gets a stat name from the maps.
+         *
+         * @param int $stat Stat id.
+         * @return string Stat name (Uppercase)
+         */
+        private function stat_name($stat){
+            global $RUNE_STAT;
+            switch ($stat){
+                case $RUNE_STAT["HP"]:
+                    return "HP";
+                case $RUNE_STAT["HP%"]:
+                    return "HP%";
+                case $RUNE_STAT["ATK"]:
+                    return "ATK";
+                case $RUNE_STAT["ATK%"]:
+                    return "ATK%";
+                case $RUNE_STAT["DEF"]:
+                    return "DEF";
+                case $RUNE_STAT["DEF%"]:
+                    return "DEF%";
+                case $RUNE_STAT["SPD"]:
+                    return "SPD";
+                case $RUNE_STAT["CRR"]:
+                    return "CRR";
+                case $RUNE_STAT["CRD"]:
+                    return "CRD";
+                case $RUNE_STAT["RES"]:
+                    return "RES";
+                case $RUNE_STAT["ACC"]:
+                    return "ACC";
+                default:
+                    return "";
+            }
+        }
+
+        /**
+         * Gets a stat name from the maps.
+         *
+         * @param int $q Quality id.
+         * @return string Quality (Uppercase)
+         */
+        private function quality_name($q){
+            global $QUALITY;
+            switch ($q){
+                case $QUALITY["NORMAL"]:
+                    return "NORMAL";
+                case $QUALITY["MAGIC"]:
+                    return "MAGIC";
+                case $QUALITY["RARE"]:
+                    return "RARE";
+                case $QUALITY["HERO"]:
+                    return "HERO";
+                case $QUALITY["LEGEND"]:
+                    return "LEGEND";
+                default:
+                    return "";
+            }
+        }
+
+    }
+?>

+ 393 - 0
application/entity/Unit.php

@@ -0,0 +1,393 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "K_Unit.php");
+    require_once($path["entity"] . "Rune.php");
+
+
+    /**
+     * A Unit.
+     *
+     * Represents an object from the table 'unit'.
+     */
+    class Unit extends Entity{
+
+        /**
+         * Owner identifier.
+         */
+        public $uid;
+
+        /**
+         * Monster identifier.
+         */
+        public $id;
+
+        /**
+         * {@see Building} the unit is in.
+         */
+        public $building;
+
+        /**
+         * Base {@see K_Unit}.
+         */
+        public $unit;
+
+        /**
+         * Unit stars.
+         */
+        public $stars;
+
+        /**
+         * Unit level.
+         */
+        public $level;
+
+        /**
+         * Monster base HP stat.
+         */
+        public $hp;
+
+        /**
+         * Monster base ATK stat.
+         */
+        public $attack;
+
+        /**
+         * Monster base DEF stat.
+         */
+        public $defense;
+
+        /**
+         * Monster base SPD stat.
+         */
+        public $speed;
+
+        /**
+         * Monster base CRR stat.
+         */
+        public $crit_rate;
+
+        /**
+         * Monster base CRD stat.
+         */
+        public $crit_damage;
+
+        /**
+         * Monster base RES stat.
+         */
+        public $resistance;
+
+        /**
+         * Monster base ACC stat.
+         */
+        public $accuracy;
+
+        /**
+         * Total gained experience.
+         */
+        public $experience;
+
+        /**
+         * Total gained experience in its current level.
+         */
+        public $exp_gained;
+
+        /**
+         * Experience / hour in the current building.
+         */
+        public $exp_gain_rate;
+
+        /**
+         * Equipped transmogification.
+         */
+        public $costume;
+
+        /**
+         * Unit attribute
+         */
+        public $attribute;
+
+        /**
+         * {@see K_Source} the unit was aquired from.
+         */
+        public $source;
+
+        /**
+         * Datetime the unit was obtained.
+         */
+        public $create_time;
+
+        /**
+         * Indicates if the unit is a Homunculus
+         */
+        public $homunculus;
+
+        /**
+         * Indicates the Homunculus name
+         */
+        public $homunculus_name;
+
+        /**
+         * Indicates if the monster is locked.
+         */
+        public $lock;
+
+        /**
+         * Unit rune HP stat.
+         */
+        public $rune_hp = 0;
+
+        /**
+         * Unit rune ATK stat.
+         */
+        public $rune_attack = 0;
+
+        /**
+         * Unit rune DEF stat.
+         */
+        public $rune_defense = 0;
+
+        /**
+         * Unit rune SPD stat.
+         */
+        public $rune_speed = 0;
+
+        /**
+         * Unit rune CRR stat.
+         */
+        public $rune_crit_rate = 0;
+
+        /**
+         * Unit rune CRD stat.
+         */
+        public $rune_crit_damage = 0;
+
+        /**
+         * Unit rune RES stat.
+         */
+        public $rune_resistance = 0;
+
+        /**
+         * Unit rune ACC stat.
+         */
+        public $rune_accuracy = 0;
+
+        /**
+         * Average rune efficiency.
+         */
+        public $avg_rune_efficiency;
+
+        /**
+         * Equiped {@see Rune}s
+         */
+        public $rune = [];
+
+        /**
+         * Array with the levels of the skills.
+         */
+        public $skill_levels = [];
+
+        /**
+         * Total experience required for the current level.
+         */
+        public $experience_level = 0;
+
+        /**
+         * Experience required to level up.
+         */
+        public $experience_level_up = 0;
+
+        /**
+         * Unit title.
+         * If Homunculus,it will be it's name.
+         * If awakened, it will be the awakened from name.
+         * If unawakened, it will be <element> <name>.
+         */
+        public $title;
+
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * monster, populating it and it's items.
+         *
+         * @param SQLite3 $db Connection to the database.
+         * @param int $id Monster identifier.
+         * @param complete If false, query only monster and k_monster.
+         */
+        public function __construct($db, $id, $complete = true){
+            global $path;
+            parent::__construct($db);
+            $s =
+              "SELECT " .
+              "  uid, " .
+              "  id, " .
+              "  building, " .
+              "  unit, " .
+              "  stars, " .
+              "  level, " .
+              "  hp, " .
+              "  attack, " .
+              "  defense, " .
+              "  speed, " .
+              "  crit_rate, " .
+              "  crit_damage, " .
+              "  resistance, " .
+              "  accuracy, " .
+              "  experience, " .
+              "  exp_gained, " .
+              "  exp_gain_rate, " .
+              "  costume, " .
+              "  attribute, " .
+              "  source, " .
+              "  create_time, " .
+              "  homunculus, " .
+              "  homunculus_name, " .
+              "  lock " .
+              "FROM unit " .
+              "WHERE id = '$id'; ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            $this->uid = $r["uid"];
+            $this->id = $r["id"];
+            if (strlen($r["building"]) > 0){
+                // TODO Entity $this->monster = new Building($this->db, $r["building"]);
+            }
+            if (strlen($r["unit"]) > 0){
+                $this->unit = new K_Unit($this->db, $r["unit"], $complete);
+            }
+            $this->stars = $r["stars"];
+            $this->level = $r["level"];
+            $this->hp = $r["hp"];
+            $this->attack = $r["attack"];
+            $this->defense = $r["defense"];
+            $this->speed = $r["speed"];
+            $this->crit_rate = $r["crit_rate"];
+            $this->crit_damage = $r["crit_damage"];
+            $this->resistance = $r["resistance"];
+            $this->accuracy = $r["accuracy"];
+            $this->experience = $r["experience"];
+            $this->exp_gained = $r["exp_gained"];
+            $this->exp_gain_rate = $r["exp_gain_rate"];
+            $this->costume = $r["costume"]; // TODO: Create entities?
+            $this->attribute = $r["attribute"];
+            $this->source = new K_Source($this->db, $r["source"]); // TODO: Instantiate?
+            $this->create_time = date_create($r["create_time"]);
+            $this->homunculus = $r["homunculus"];
+            $this->homunculus_name = $r["homunculus_name"];
+            #$this->avg_rune_efficiency = $r["avg_rune_efficiency"];
+            #$this->fodder = $r["fodder"];
+            #$this->in_storage = $r["in_storage"];
+            #$this->ignore_for_fusion = $r["ignore_for_fusion"];
+            #$this->priority = $r["priority"];
+            #$this->notes = $r["notes"];
+            if ($complete){
+                $this->load_runes();
+                $s =
+                  "SELECT level " .
+                  "FROM " .
+                  "  unit_skill, " .
+                  "  k_skill " .
+                  "WHERE " .
+                  "  k_skill.id = unit_skill.skill AND " .
+                  "  unit = '$this->id' " .
+                  "ORDER BY slot;";
+                $q = $this->db->query($s);
+                while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                    array_push($this->skill_levels, $r["level"]);
+                }
+                $s =
+                  "SELECT exp " .
+                  "FROM k_experience " .
+                  "WHERE " .
+                  "  stars = $this->stars AND " .
+                  "  level = $this->level;";
+                $q = $this->db->query($s);
+                $r = $q->fetchArray(SQLITE3_ASSOC);
+                $this->experience_level = $r["exp"];
+                $this->experience_level_up = $r["exp"] - $this->exp_gained;
+            }
+            if ($this->homunculus){
+                $this->title = $this->homunculus_name;
+            }
+            else{
+                $this->title = $this->unit->title;
+            }
+        }
+
+        /**
+         * Loads the information about the equiped runes. 
+         * It is autoatically called at construction time if the
+         * $complete parameter is true (by default). No point in calling it
+         * twice.
+         */
+        public function load_runes(){
+            $this->rune = [];
+            $s =
+              "SELECT id " .
+              "FROM rune " .
+              "WHERE assigned_to = '$this->id'; ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->rune, new Rune($this->db, $r["id"]));
+            }
+            foreach ($this->rune as $rune){
+                $this->sum_rune_stat($rune->main_stat, $rune->main_stat_value);
+                $this->sum_rune_stat($rune->innate_stat, $rune->innate_stat_value);
+                $this->sum_rune_stat($rune->substat_1, $rune->substat_1_value + $rune->substat_1_grind);
+                $this->sum_rune_stat($rune->substat_2, $rune->substat_2_value + $rune->substat_2_grind);
+                $this->sum_rune_stat($rune->substat_3, $rune->substat_3_value + $rune->substat_3_grind);
+                $this->sum_rune_stat($rune->substat_4, $rune->substat_4_value + $rune->substat_4_grind);
+            }
+            $this->rune_attack = ceil($this->rune_attack);
+            $this->rune_defense = ceil($this->rune_defense);
+            $this->rune_hp = ceil($this->rune_hp);
+        }
+
+        /**
+         * Calculates the stat increase by a rune property.
+         * 
+         * @param string $stat Stat type.
+         * @param int $value Stat increase value.
+         */
+        private function sum_rune_stat($stat, $value){
+            global $RUNE_STAT;
+            switch ($stat){
+                case $RUNE_STAT["ATK"]:
+                    $this->rune_attack += $value;
+                    break;
+                case $RUNE_STAT["DEF"]:
+                    $this->rune_defense += $value;
+                    break;
+                case $RUNE_STAT["HP"]:
+                    $this->rune_hp += $value;
+                    break;
+                case $RUNE_STAT["SPD"]:
+                    $this->rune_speed += $value;
+                    break;
+                case $RUNE_STAT["CRR"]:
+                    $this->rune_crit_rate += $value;
+                    break;
+                case $RUNE_STAT["CRD"]:
+                    $this->rune_crit_damage += $value;
+                    break;
+                case $RUNE_STAT["ACC"]:
+                    $this->rune_accuracy += $value;
+                    break;
+                case $RUNE_STAT["RES"]:
+                    $this->rune_resistance += $value;
+                    break;
+                case $RUNE_STAT["ATK%"]:
+                    $this->rune_attack += ($this->attack * $value / 100);
+                    break;
+                case $RUNE_STAT["DEF%"]:
+                    $this->rune_defense += ($this->defense * $value / 100);
+                    break;
+                case $RUNE_STAT["HP%"]:
+                    $this->rune_hp += ($this->hp * $value / 100);
+                    break;
+            }
+        }
+    }
+?>

+ 385 - 0
application/helper/html.php

@@ -0,0 +1,385 @@
+<?php
+
+    /**
+     * Generates a monster panel.
+     * 
+     * @param unit Unit/K_Unit Entity to get the info from.
+     * @return string HTML content for a monster panel. Empty on error.
+     */
+    function html_unit_panel($unit) {
+        global $path;
+        if ($unit instanceof Unit){
+            $k = $unit->unit;
+            $stars = $unit->stars;
+            $level = true;
+        }
+        elseif ($unit instanceof K_Unit){
+            $k = $unit;
+            $stars = $unit->base_stars;
+            $level = false;
+        }
+        else{
+            return "";
+        }
+        $html = "";
+        if ($k->awakens_from == "" && $k->awakens_to == ""){
+            error_log("COND1");
+            // No to, no from, silver monster.
+            $star_class ="star_silver";
+        }
+        elseif ($k->awakens_from != ""){
+            error_log("COND2");
+            // Already awakened
+            if ($k->base_stars - $k->natural_stars == 1){
+                error_log("COND2.1");
+                // Normal awaken.
+                $star_class ="star_purple";
+            }
+            else{
+                error_log("COND2.2");
+                // Second awaken.
+                $star_class ="star_red";
+            }
+        }
+        elseif ($k->awakens_to != ""){
+            error_log("COND3");
+            // Awakeable.
+            $star_class ="star_gold";
+        }
+        $html .= "<span class='stars'>\n";
+        for ($i = 0; $i < $stars; $i ++){
+            $html .= "<img class='star $star_class' src='" . $path["img"]["layout"] . "icon/star.png'/>\n";
+        }
+        $html .= "</span>\n";
+        $html .= "<img title='" . $unit->title . "' class='monster border_" . $k->element_name . "' src='" . $k->get_image() . "'/>\n";
+        if ($level){
+            $html .= "<span class='level'>\n";
+            $html .= $unit->level . "\n";
+            $html .= "</span>\n";
+        }
+        return $html;
+    }
+
+    /**
+     * Generates a rune panel.
+     * 
+     * @param Rune rune Entity to get the info from.
+     * @param Unit unit Optional. The unit the rune is assigned to.
+     * @return string HTML content for a rune panel. Empty on error.
+     */
+    function html_rune_panel($rune, $unit = null) {
+        global $path;
+        if (!($rune instanceof Rune)){
+            return "";
+        }
+        $html = "";
+        $html .= "<div class='rune_panel rune_slot_" . $rune->slot . " rune_level_" . $rune->level . " rune_quality_" . strtolower($rune->quality_name) . " rune_original_quality_" . strtolower($rune->original_quality_name) . " rune_ancient_" . $rune->ancient . "'>\n";
+        $html .= "<img class='rune_base' src='" . $path["img"]["layout"] . "rune/base.png'/>\n";
+        $html .= "<img class='rune_icon' src='" . $rune->type->get_image() . "'/>\n";
+        $html .= "<span class='rune_stars'>\n";
+        for ($i = 0; $i < $rune->stars; $i ++){
+            $html .= "<img class='star' src='" . $path["img"]["layout"] . "icon/star.png'/>\n";
+        }
+        $html .= "</span>\n";
+        $html .= "<span class='rune_level'>\n";
+        $html .= $rune->level . "\n";
+        $html .= "</span>\n";
+        $html .= "</div>\n";
+        if ($unit instanceof Unit){
+            $html .= "<div class='assigned'>\n";
+            $html .= "<a target='blank' href='/monsters/" . $unit->id . "'>\n";
+            $html .= "<img title='" . $unit->title . "' class='monster_image border_" . $unit->unit->element_name . "' src='" . $unit->unit->get_image() . "'/>\n";
+            $html .= "</a>\n";
+            $html .= "</div>\n";
+        }
+        return $html;
+    }
+
+    /**
+     * Generates a rune table.
+     * 
+     * @param Rune rune Entity to get the info from.
+     * @param Unit unit Optional. The unit the rune is assigned to.
+     * @return string HTML content for a rune table. Empty on error.
+     */
+    function html_rune_table($rune, $unit = null) {
+        global $path;
+        if (!($rune instanceof Rune)){
+            return "";
+        }
+        $html = "";
+        $html .= "<table class='rune'>\n";
+        $html .= "<tr>\n";
+        $html .= "<td class='icon'>\n";
+        $html .= html_rune_panel($rune, $unit) . "\n";
+        $html .= "</td>\n";
+        $html .= "<td class='stats'>\n";
+        $html .= "<table>\n";
+        // Main stat
+        $html .= "<tr class='main_stat'>\n";
+        $html .= "<td class='stat'>\n";
+        if (in_array($rune->main_stat_name, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
+            $stat_name = str_replace("%", "", $rune->main_stat_name);
+            $stat_value = "+ " . $rune->main_stat_value . "%";
+        }
+        else{
+            $stat_name = $rune->main_stat_name;
+            $stat_value = "+ " . $rune->main_stat_value;
+        }
+        $html .= $stat_name . "\n";
+        $html .= "</td>\n";
+        $html .= "<td class='value'>\n";
+        $html .= $stat_value . "\n";
+        $html .= "<td>\n";
+        $html .= "</tr>\n";
+        // Innate stat
+        $html .= "<tr class='innate_stat'>\n";
+        $html .= "<td class='stat'>\n";
+        if (strlen($rune->innate_stat) == 0){
+            $stat_name = "&nbsp;";
+            $stat_value = "";
+        }
+        elseif (in_array($rune->innate_stat_name, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
+            $stat_name = str_replace("%", "", $rune->innate_stat_name);
+            $stat_value = "+ " . $rune->innate_stat_value . "%";
+        }
+        else{
+            $stat_name = $rune->innate_stat_name;
+            $stat_value = "+ " . $rune->innate_stat_value;
+        }
+        $html .= $stat_name . "\n";
+        $html .= "</td>\n";
+        $html .= "<td class='value'>\n";
+        $html .= $stat_value . "\n";
+        $html .= "<td>\n";
+        $html .= "</tr>\n";
+        $substats = array($rune->substat_1, $rune->substat_2, $rune->substat_3, $rune->substat_4);
+        $substats_name = array($rune->substat_1_name, $rune->substat_2_name, $rune->substat_3_name, $rune->substat_4_name);
+        $substats_value = array($rune->substat_1_value, $rune->substat_2_value, $rune->substat_3_value, $rune->substat_4_value);
+        $substats_grind = array($rune->substat_1_grind, $rune->substat_2_grind, $rune->substat_3_grind, $rune->substat_4_grind);
+        $substats_enchant = array($rune->substat_1_enchant, $rune->substat_2_enchant, $rune->substat_3_enchant, $rune->substat_4_enchant);
+        for ($i = 0; $i < 4; $i ++){
+            if (strlen($substats_name[$i]) == 0){
+                $stat_name = "&nbsp;";
+                $stat_value = "";
+            }
+            elseif (in_array($substats_name[$i], array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
+                $stat_name = str_replace("%", "", $substats_name[$i]);
+                $stat_value = "+ " . $substats_value[$i] . "%";
+            }
+            else{
+                $stat_name = $substats_name[$i];
+                $stat_value = "+ " . $substats_value[$i];
+            }
+            $grind = "";
+            if ($substats_grind[$i] > 0){
+                $grind = "+" . $substats_grind[$i];
+                if (in_array($substats_name[$i], array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
+                    $grind = $grind . "%";
+                }
+            }
+            $html .= "<tr class=substat>\n";
+            $html .= "<td class='stat'>\n";
+            $html .= $stat_name . "\n";
+            $html .= "</td>\n";
+            $html .= "<td class='value'>\n";
+            $html .= $stat_value . "\n";
+            $html .= "<span class='grind grind_$grind'>\n";
+            $html .= $grind . "\n";
+            $html .= "</span>\n";
+            if ($substats_enchant[$i] == 1){
+                $html .= "<img title='Enchanted' src='" . $path["img"]["layout"] . "rune/enchanted.png'/>\n";
+            }
+            $html .= "</td>\n";
+            $html .= "</tr>\n";
+        }
+        $html .= "</table>\n";
+        $html .= "</td>\n";
+        // Details
+        $html .= "<td class='details'>\n";
+        $html .= "<table class='table_details'>\n";
+        $html .= "<tr>\n";
+        $html .= "<td class='title'>\n";
+        $html .= "Quality:\n";
+        $html .= "</td>\n";
+        $html .= "<td class='value'>\n";
+        $html .= "<span class='quality quality_" . strtolower($rune->quality_name) . "'>\n";
+        $html .= $rune->quality_name . "\n";
+        $html .= "</span>\n";
+        $html .= "</td>\n";
+        $html .= "</tr>\n";
+        $html .= "<tr>\n";
+        $html .= "<td class='title'>\n";
+        $html .= "Origina q.:\n";
+        $html .= "</td>\n";
+        $html .= "<td class='value'>\n";
+        $html .= "<span class='quality quality_" . strtolower($rune->original_quality_name) . "'>\n";
+        $html .= $rune->original_quality_name . "\n";
+        $html .= "</span>\n";
+        $html .= "</td>\n";
+        $html .= "</tr>\n";
+        $html .= "<tr>\n";
+        $html .= "<td class='title'>\n";
+        $html .= "Value:\n";
+        $html .= "</td>\n";
+        $html .= "<td class='value'>\n";
+        $html .= number_format($rune->value, 0, ".", ",") . "\n";
+        $html .= "</td>\n";
+        $html .= "</tr>\n";
+        $html .= "<tr>\n";
+        $html .= "<td class='title'>\n";
+        $html .= "Efficiency:\n";
+        $html .= "</td>\n";
+        $html .= "<td class='value'>\n";
+        $html .= number_format($rune->efficiency, 2, ".", ",") . "%\n";
+        $html .= "</td>\n";
+        $html .= "</tr>\n";
+        $html .= "<tr>\n";
+        $html .= "<td class='title'>\n";
+        $html .= "Max. eff.:\n";
+        $html .= "</td>\n";
+        $html .= "<td class='value'>\n";
+        $html .= number_format($rune->max_efficiency, 2, ".", ",") . "%\n";
+        $html .= "</td>\n";
+        $html .= "</tr>\n";
+        $html .= "<tr>\n";
+        $html .= "<td class='title'>\n";
+        $html .= "Reached. eff.:\n";
+        $html .= "</td>\n";
+        $html .= "<td class='value'>\n";
+        $html .= number_format($rune->efficiency * 100 / $rune->max_efficiency, 2, ".", ",") . "%\n";
+        $html .= "</td>\n";
+        $html .= "</tr>\n";
+        $html .= "</table>\n";
+        $html .= "</td>\n";
+        $html .= "</tr>\n";
+        $html .= "</table>\n";
+        return $html;
+    }
+
+    /**
+     * Generates a grindstone or gem panel.
+     * 
+     * @param Rune_Craft craft Entity to get the info from.
+     * @return string HTML content for a rune panel. Empty on error.
+     */
+    function html_craft_panel($craft) {
+        global $path;
+        if (!($craft instanceof Rune_Craft)){
+            return "";
+        }
+        $html = "";
+        if ($craft->gem == 1){
+            if ($craft->inmemorial == 1){
+                $base = $path["img"]["layout"] . "grind/gem_inmemorial.png";
+            }
+            else{
+                $base = $path["img"]["layout"] . "grind/gem.png";
+            }
+        }
+        else{
+            if ($craft->inmemorial == 1){
+                $base = $path["img"]["layout"] . "grind/grind_inmemorial.png";
+            }
+            else{
+                $base = $path["img"]["layout"] . "grind/grind.png";
+            }
+        }
+        if ($craft->inmemorial == 0 && isset($craft->rune)){
+            $icon = "<img class='craft_icon' src='" . $craft->rune->get_image() . "'/>\n";
+        }
+        else{
+            $icon = "";
+        }
+        if (in_array($craft->stat_name, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
+            $stat_name = str_replace("%", "", $craft->stat_name);
+            $stat_value = "+ " . $craft->min . "~" . $craft->max . "%";
+        }
+        else{
+            $stat_name = $craft->stat_name;
+            $stat_value = "+ " . $craft->min . "~" . $craft->max;
+        }
+        $html .= "<div class='craft_panel craft_quality_" . strtolower($craft->quality_name) . " rune_ancient_" . $craft->ancient . "'>\n";
+        $html .= "<img class='craft_base' src='" . $base . "'/>\n";
+        $html .= $icon;
+        $html .= "<span class='craft_stat'>\n";
+        $html .= "<span class='craft_stat_name'>" . $stat_name . "</span>\n";
+        $html .= "<span class='craft_stat_value'>" . $stat_value . "</span>\n";
+        $html .= "</span>\n";
+        $html .= "</div>\n";
+        return $html;
+    }
+
+    /**
+     * Generates a building panel.
+     *
+     * @param unit Building/Decoration/K_Building/K_Decoration Entity to get the info from.
+     * @return string HTML content for a building panel. Empty on error.
+     */
+    function html_building_panel($building) {
+        global $path;
+        if ($building instanceof Building){
+            $level = false;
+            $title = $building->building->name;
+            $description = $building->building->description;
+            $img = $building->building->get_image();
+        }
+        elseif ($building instanceof K_Building){
+            $level = false;
+            $title = $building->name;
+            $description = $building->building->description;
+            $img = $building->get_image();
+        }
+        elseif ($building instanceof Decoration){
+            $level = $building->level;
+            $title = $building->decoration->name;
+            $description = $building->decoration->description;
+            $img = $building->decoration->get_image();
+        }
+        elseif ($building instanceof K_Decoration){
+            $level = false;
+            $title = $building->name;
+            $description = $building->building->description;
+            $img = $building->get_image();
+        }
+        else{
+            return "";
+        }
+        if (strlen($description) > 0){
+            $title .= ": " . $description;
+        }
+        $html = "";
+        $html = "<div class='building_panel'>\n";
+        $html .= "<img title='" . $title . "' class='building' src='" . $img . "'/>\n";
+        if ($level){
+            $html .= "<span class='level'>\n";
+            $html .= $level . "\n";
+            $html .= "</span>\n";
+        }
+        $html .= "</div>\n";
+        return $html;
+    }
+
+    /**
+     * Generates a item panel.
+     *
+     * @param item Inventory Entity to get the info from.
+     * @return string HTML content for a building panel. Empty on error.
+     */
+    function html_item_panel($item) {
+        global $path;
+        global $INVENTORY_TYPE;
+        if (!($item instanceof Inventory)){
+            return "";
+        }
+        $html = "";
+        $html = "<div class='item_panel'>\n";
+        $html .= "<img title='" . $item->name . "' class='item' src='" . $item->get_image() . "'/>\n";
+        $html .= "<span class='amount'>\n";
+        $html .= $item->amount . "\n";
+        $html .= "</span>\n";
+        $html .= "</div>\n";
+        return $html;
+    }
+
+?>

+ 6 - 133
application/helper/text.php

@@ -1,93 +1,11 @@
 <?php
 <?php
 
 
 
 
-    /**
-     * Selects the language the page will be displayed on.
-     * 
-     * First, it tries to read the language cookie in the client. If none is
-     * set, get the browser language preference list. If none is provided or
-     * they are not supported, it will use the default language.
-     * 
-     * @param MySQL_connection $db Connection to the database.
-     * @return string Lowercase, two-letter language code.
-     */
-    function select_language($db){
-
-        // Get available languages from db
-        $available_languages = array();
-        $q_lang = mysqli_query($db, "SELECT code FROM lang WHERE active = 1;");
-        while ($r_lang = mysqli_fetch_array($q_lang)){
-            array_push($available_languages, $r_lang["code"]);
-        }
-
-        // Is there a language cookie installed on the client?.
-        header("Cache-control: private");
-        if (isSet($_COOKIE["lang"])){
-            $lang = $_COOKIE["lang"];
-            if (in_array($lang, $available_languages)){
-                header("Location: " . get_protocol() . $_SERVER["HTTP_HOST"] . "/" . $lang . $_SERVER["REQUEST_URI"]);
-                return $lang;
-            }
-        }
-
-        // If no cookie, select from client browser preferences.
-        $lang = prefered_language($available_languages, $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
-        if (in_array($lang, $available_languages)){
-            header("Location: " . get_protocol() . $_SERVER["HTTP_HOST"] . "/" . $lang . $_SERVER["REQUEST_URI"]);
-            return $lang;
-        }
-
-        // If no method was succesfull, default language
-        $lang = $available_languages[0];
-        header("Location: " . get_protocol() . $_SERVER["HTTP_HOST"] . "/" . $lang . $_SERVER["REQUEST_URI"]);
-        return $lang;
-    }
-
-
-    /**
-     * Parses the language prefrences of the client broser, comparing them to
-     * the languages offered by the site and selects the prefered one among
-     * the ones supported.
-     * 
-     * @param string[] available_languages List of lowercase, two-letter
-     *                                      language codes allowed by the site.
-     * @param string http_accept_language Raw header with info about client
-     *                                    language preferences.
-     * @return string Lowercase, two-letter code of the prefered available
-     *                language.
-     */
-    function prefered_language(array $available_languages, $http_accept_language) {
-
-        $available_languages = array_flip($available_languages);
-
-        $langs;
-        preg_match_all("~([\w-]+)(?:[^,\d]+([\d.]+))?~", strtolower($http_accept_language), $matches, PREG_SET_ORDER);
-        foreach($matches as $match) {
-
-            list($a, $b) = explode("-", $match[1]) + array("", "");
-            $value = isset($match[2]) ? (float) $match[2] : 1.0;
-
-            if(isset($available_languages[$match[1]])) {
-                $langs[$match[1]] = $value;
-                continue;
-            }
-
-            if(isset($available_languages[$a])) {
-                $langs[$a] = $value - 0.1;
-            }
-
-        }
-        arsort($langs);
-        return $langs[0];
-    }
-
-
     /**
     /**
      * Tturns a date string into a human readable string on the specified
      * Tturns a date string into a human readable string on the specified
      * language. Only works for spanish, basque and english.
      * language. Only works for spanish, basque and english.
      * 
      * 
      * @param string $str_date Date string ('yyyy-mm-dd' or 'yyyy-mm-dd HH:MM:SS')
      * @param string $str_date Date string ('yyyy-mm-dd' or 'yyyy-mm-dd HH:MM:SS')
-     * @param string $lang Language code (es, en, eu).
      * @param string $time Append the time at the end.
      * @param string $time Append the time at the end.
      * @return string Formatted date string.
      * @return string Formatted date string.
      */
      */
@@ -101,61 +19,17 @@
         $wday --;
         $wday --;
         $hour = date("H", $date);
         $hour = date("H", $date);
         $minute = date("i", $date);
         $minute = date("i", $date);
-        switch ($lang){
-            case "en":
-                $week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
-                $months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
-                if ($time){
-                    $str = "$week[$wday], $months[$month] $day, $year at $hour:$minute";
-                }
-                else{
-                    $str = "$week[$wday], $months[$month] $day, $year";
-                }
-                break;
-            case "eu":
-                $week = ["astelehena", "asteartea", "asteazkena", "osteguna", "ostirala", "larumbata", "igandea"];
-                $months = ["urtarrilaren", "otsailaren", "martxoaren", "apirilaren", "maiatzaren", "ekainaren", "uztailaren", "abuztuaren", "irailaren", "urriaren", "azaroaren", "abenduaren"];
-                if ($time){
-                    $str = $year . "ko $months[$month] $day" . "an, $week[$wday], $hour:$minute";
-                }
-                else{
-                    $str = $year . "ko $months[$month] $day" . "an, $week[$wday]";
-                }
-                break;
-            default:
-                $week = ["Lunes", "Martes", "Mi&eacute;rcoles", "Jueves", "Viernes", "S&aacute;bado", "Domingo"];
-                $months = ["enero", " febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"];
-                if ($time){
-                    $str = "$week[$wday] $day de $months[$month] de $year a las $hour:$minute";
-                }
-                else{
-                    $str = "$week[$wday] $day de $months[$month] de $year";
-                }
-        }
-        return $str;
-    }
-
-
-    /**
-     * Retrieves a text fragment from the database.
-     * 
-     * @param Page|Entity $model An initialized data model.
-     * @param string $id Text identifier.
-     * @returns string The text.
-     */
-    function text($model, $id){
-        global $path;
-        $q = mysqli_query($model->db, "SELECT text, file FROM text WHERE id = '$id' AND lang = '" . $model->lang . "';");
-        $r = mysqli_fetch_array($q);
-        if (strlen($r["file"]) > 0){
-            return file_get_contents($path["string"] . $r["file"]);
+        $week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
+        $months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
+        if ($time){
+            $str = "$week[$wday], $months[$month] $day, $year at $hour:$minute";
         }
         }
         else{
         else{
-            return $r["text"];
+            $str = "$week[$wday], $months[$month] $day, $year";
         }
         }
+        return $str;
     }
     }
 
 
-
     /**
     /**
      * This function closes all the opened HTML tags in a given string.
      * This function closes all the opened HTML tags in a given string.
      * 
      * 
@@ -183,7 +57,6 @@
         return $html;
         return $html;
     }
     }
 
 
-
     /**
     /**
      * Text shortener. Given a string, it trims in the proximity of the
      * Text shortener. Given a string, it trims in the proximity of the
      * desired string, up to the next white character. If indicated, it will
      * desired string, up to the next white character. If indicated, it will

+ 32 - 27
application/page/Catalog_Page.php

@@ -1,7 +1,7 @@
 <?php
 <?php
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
-    require_once($path["entity"] . "K_Monster.php");
+    require_once($path["entity"] . "K_Unit.php");
 
 
 
 
     /**
     /**
@@ -10,19 +10,14 @@
     class Catalog_Page extends Page{
     class Catalog_Page extends Page{
 
 
         /**
         /**
-         * Array of arrays of monsters, grouped by attribute id.
+         * Array of {@see K_Unit}.
          */
          */
         public $monsters = [];
         public $monsters = [];
 
 
         /**
         /**
          * The filters the page can handle.
          * The filters the page can handle.
          */
          */
-        public $filters = [
-            "element" => "",
-            "name" => "",
-            "min_stars" => 1,
-            "max_stars" => 5,
-        ];
+        public $filters;
 
 
         /**
         /**
          * Constructor.
          * Constructor.
@@ -40,7 +35,7 @@
             $s_mon = $this->build_query();
             $s_mon = $this->build_query();
             $q_mon = $this->db->query($s_mon);
             $q_mon = $this->db->query($s_mon);
             while ($r_mon = $q_mon->fetchArray(SQLITE3_ASSOC)){
             while ($r_mon = $q_mon->fetchArray(SQLITE3_ASSOC)){
-                array_push($this->monsters, new K_Monster($db, $r_mon["id"], false));
+                array_push($this->monsters, new K_Unit($db, $r_mon["id"], false));
             }
             }
             $this->title = "Catalog - SWDB";
             $this->title = "Catalog - SWDB";
             $this->description = "Catalog of all monsters";
             $this->description = "Catalog of all monsters";
@@ -52,19 +47,19 @@
          * and adds them to the $filters array.
          * and adds them to the $filters array.
          */
          */
         private function parse_filters(){
         private function parse_filters(){
-            if (isset($_GET["element"])){
-                $f_element = strtoupper($_GET["element"]);
-                if ($f_element == "FIRE" || $f_element == "WATER" || $f_element == "WIND" || $f_element == "LIGHT" || $f_element == "DARK"){
-                    $this->filters["element"] = $_GET["element"];
-                }
+            global $ELEMENT;
+            global $FILTER_CATALOG;
+            $this->filters = $FILTER_CATALOG;
+            if (isset($_GET["element"]) && in_array($_GET["element"], $ELEMENT)){
+                $this->filters["element"] = $_GET["element"];
             }
             }
             if (isset($_GET["name"]) && strlen($_GET["name"]) > 0){
             if (isset($_GET["name"]) && strlen($_GET["name"]) > 0){
                 $this->filters["name"] = SQLite3::escapeString($_GET["name"]);
                 $this->filters["name"] = SQLite3::escapeString($_GET["name"]);
             }
             }
-            if (isset($_GET["min_stars"]) && intval($_GET["min_stars"]) > 0 && intval($_GET["min_stars"]) < 6){
+            if (isset($_GET["min_stars"]) && intval($_GET["min_stars"]) > 0 && intval($_GET["min_stars"]) <= 5){
                 $this->filters["min_stars"] = $_GET["min_stars"];
                 $this->filters["min_stars"] = $_GET["min_stars"];
             }
             }
-            if (isset($_GET["max_stars"]) && intval($_GET["max_stars"]) > 0 && intval($_GET["max_stars"]) < 6){
+            if (isset($_GET["max_stars"]) && intval($_GET["max_stars"]) > 0 && intval($_GET["max_stars"]) <= 5){
                 $this->filters["max_stars"] = $_GET["max_stars"];
                 $this->filters["max_stars"] = $_GET["max_stars"];
             }
             }
             return;
             return;
@@ -77,20 +72,30 @@
          * @return The query to be executed.
          * @return The query to be executed.
          */
          */
         private function build_query(){
         private function build_query(){
-            $s = "SELECT id FROM k_monster WHERE obtainable = 1 AND awakens_from IS NULL AND natural_stars >= " . $this->filters["min_stars"] . " AND natural_stars <= " . $this->filters["max_stars"];
-            if (strlen($this->filters["element"]) > 0){
-                $s = $s . " AND upper(element) = '" . strtoupper($this->filters["element"]) . "' ";
+            global $ELEMENT;
+            $s = "
+                SELECT id 
+                FROM k_unit 
+                WHERE 
+                  obtainable = 1 AND
+                  awakens_from IS NULL AND
+                  natural_stars >= " . $this->filters["min_stars"] . " AND 
+                  natural_stars <= " . $this->filters["max_stars"];
+            if (in_array($this->filters["element"], $ELEMENT)){
+                $s = $s . " AND element = " . strtoupper($this->filters["element"]) . " ";
             }
             }
             if ($this->filters["name"] != ""){
             if ($this->filters["name"] != ""){
-                $s = $s . " AND monster IN (SELECT id FROM k_monster WHERE upper(name) LIKE '%" . strtoupper($this->filters["name"]) . "%') ";
+                $s = $s . " AND upper(name) LIKE '%" . strtoupper($this->filters["name"]) . "%' ";
             }
             }
-            $s = $s . " ORDER BY " .
-            "  element = 'Fire' DESC, " .
-            "  element = 'Water' DESC, " .
-            "  element = 'Wind' DESC, " .
-            "  element = 'Light' DESC, " .
-            "  element = 'Dark' DESC, " .
-            "  natural_stars; ";
+            $s = $s . "
+                ORDER BY
+                  element = " . $ELEMENT["FIRE"] ." DESC,
+                  element = " . $ELEMENT["WATER"] ." DESC,
+                  element = " . $ELEMENT["WIND"] ." DESC,
+                  element = " . $ELEMENT["LIGHT"] ." DESC,
+                  element = " . $ELEMENT["DARK"] ." DESC,
+                  natural_stars;
+            ";
             return $s;
             return $s;
         }
         }
     }
     }

+ 3 - 3
application/page/Fusion_Page.php

@@ -2,7 +2,7 @@
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
     require_once($path["entity"] . "K_Fusion.php");
     require_once($path["entity"] . "K_Fusion.php");
-    require_once($path["entity"] . "K_Monster.php");
+    require_once($path["entity"] . "K_Unit.php");
 
 
 
 
     /**
     /**
@@ -16,7 +16,7 @@
         public $fusion = [];
         public $fusion = [];
 
 
         /**
         /**
-         * List of top-level fuseable {@see K_Monster}s (for filter).
+         * List of top-level fuseable {@see K_Unit}s (for filter).
          */
          */
         public $products = [];
         public $products = [];
 
 
@@ -47,7 +47,7 @@
               "ORDER BY stars DESC; ";
               "ORDER BY stars DESC; ";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
-                array_push($this->products, new K_Monster($this->db, $r["product"], false));
+                array_push($this->products, new K_Unit($this->db, $r["product"], false));
             }
             }
             $s = $this->build_query();
             $s = $this->build_query();
             $q = $this->db->query($s);
             $q = $this->db->query($s);

+ 62 - 0
application/page/Guild_Page.php

@@ -0,0 +1,62 @@
+ <?php
+
+    require_once($path["page"] . "Page.php");
+    require_once($path["entity"] . "Guild.php");
+    require_once($path["entity"] . "K_Guild_Skill_Group.php");
+
+    /**
+     * Guild page.
+     */
+    class Guild_Page extends Page{
+
+        /**
+         * @{see Guild}.
+         */
+        public $guild = [];
+
+        /**
+         * List of {@see K_Guild_Skill_Group}s.
+         */
+        public $skill_groups = [];
+
+        /**
+         * Constructor.
+         *
+         * Retrieves the data and initializes the variables.
+         *
+         * @param SQLite3 $db Connection to the database.
+         */
+        public function __construct($db){
+            global $path;
+            global $root;
+            parent::__construct($db);
+            $this->view = $path["view"] . "guild.php";
+            $s =
+              "SELECT DISTINCT guild AS id " .
+              "FROM " .
+              "  guild_member " .
+              "  guild; ";
+            // TODO: Where guild.member.player = ...
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->guild = new Guild($db, $r["id"]);
+                $this->title = $this->guild->name . " - SWDB";
+                $this->description = $this->guild->name . " Guild details";
+                $s =
+                  "SELECT id " .
+                  "FROM k_guild_skill_group " .
+                  "ORDER BY id; ";
+                $q = $this->db->query($s);
+                while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                    array_push($this->skill_groups, new K_Guild_Skill_Group($db, $r["id"]));
+                }
+            }
+            else{
+                $this->title = "Guild - SWDB";
+                $this->description = "No guild";
+            }
+            $this->canonical = $root . "guild/";
+        }
+    }
+?>

+ 230 - 1
application/page/Home_Page.php

@@ -1,6 +1,10 @@
 <?php
 <?php
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
+    require_once($path["entity"] . "Unit.php");
+    require_once($path["entity"] . "Building.php");
+    require_once($path["entity"] . "Decoration.php");
+    require_once($path["entity"] . "Inventory.php");
 
 
 
 
     /**
     /**
@@ -8,8 +12,89 @@
      */
      */
     class Home_Page extends Page{
     class Home_Page extends Page{
 
 
-        private $max_projects = 3;
+        /**
+         * Player ID.
+         */
+        public $uid;
+
+        /**
+         * Player name.
+         */
+        public $name;
 
 
+        /**
+         * Player country (XX).
+         */
+        public $country;
+
+        /**
+         * Total experience.
+         */
+         public $experience;
+
+        /**
+         * Representative {@see Unit}.
+         */
+        public $rep;
+
+        /**
+         * {@see Unit}s in Arena defense.
+         */
+        public $defense = [];
+
+        /**
+         * Currency
+         */
+        public $currency = [
+            "mana" => 0,
+            "crystal" => 0,
+            "energy" => 0,
+            "energy_max" => 0,
+            "arena_energy" => 0,
+            "arena_energy_max" => 0,
+            "darkportal_energy" => 0,
+            "darkportal_energy_max" => 0,
+            "dimension_energy" => 0,
+            "dimension_energy_max" => 0,
+            "honor_point" => 0,
+            "guild_point" => 0,
+            "honor_medal" => 0,
+            "honor_mark" => 0,
+            "event_coin" => 0,
+            "social_point" => 0,
+            "ancient_stone" => 0,
+            "costume_point" => 0,
+        ];
+
+        /**
+         * List of {@see Building}s.
+         */
+        public $building = [];
+
+        /**
+         * List of {@see Decoration}s.
+         */
+        public $decoration = [];
+
+        /**
+         * List of Scrolls in {@see Inventory}s.
+         */
+        public $inventory_scroll = [];
+
+        /**
+         * List of rune crafting items in {@see Inventory}s.
+         */
+        public $inventory_craft_rune = [];
+
+        /**
+         * List of rune crafting items in {@see Inventory}s.
+         */
+        public $inventory_craft = [];
+
+        /**
+         * List of rune crafting items in {@see Inventory}s.
+         */
+        public $inventory_essence = [];
 
 
         /**
         /**
          * Constructor.
          * Constructor.
@@ -22,8 +107,152 @@
         public function __construct($db){
         public function __construct($db){
             global $path;
             global $path;
             global $root;
             global $root;
+            global $INVENTORY_TYPE;
             parent::__construct($db);
             parent::__construct($db);
             $this->view = $path["view"] . "home.php";
             $this->view = $path["view"] . "home.php";
+            // TODO:Filter by player?
+            $s =
+              "SELECT " .
+              "  uid, " .
+              "  name, " .
+              "  country, " .
+              "  experience, " .
+              "  rep, " .
+              "  mana, " .
+              "  crystal, " .
+              "  energy, " .
+              "  energy_max, " .
+              "  arena_energy, " .
+              "  arena_energy_max, " .
+              "  darkportal_energy, " .
+              "  darkportal_energy_max, " .
+              "  dimension_energy, " .
+              "  dimension_energy_max, " .
+              "  honor_point, " .
+              "  guild_point, " .
+              "  honor_medal, " .
+              "  honor_mark, " .
+              "  event_coin, " .
+              "  social_point, " .
+              "  costume_point " .
+              "FROM player ";
+            $q = $this->db->query($s);
+            $r = $q->fetchArray(SQLITE3_ASSOC);
+            if ($r){
+                $this->uid = $r["uid"];
+                $this->name = $r["name"];
+                $this->country = $r["country"];
+                $this->experience = $r["experience"];
+                if (strlen($r["rep"]) > 0){
+                    $this->rep = new Unit($this->db, $r["rep"]);
+                }
+                $this->currency["mana"] = $r["mana"];
+                $this->currency["crystal"] = $r["crystal"];
+                $this->currency["energy"] = $r["energy"];
+                $this->currency["energy_max"] = $r["energy_max"];
+                $this->currency["arena_energy"] = $r["arena_energy"];
+                $this->currency["arena_energy_max"] = $r["arena_energy_max"];
+                $this->currency["darkportal_energy"] = $r["darkportal_energy"];
+                $this->currency["darkportal_energy_max"] = $r["darkportal_energy_max"];
+                $this->currency["dimension_energy"] = $r["dimension_energy"];
+                $this->currency["dimension_energy_max"] = $r["dimension_energy_max"];
+                $this->currency["honor_point"] = $r["honor_point"];
+                $this->currency["guild_point"] = $r["guild_point"];
+                $this->currency["honor_medal"] = $r["honor_medal"];
+                $this->currency["honor_mark"] = $r["honor_mark"];
+                $this->currency["event_coin"] = $r["event_coin"];
+                $this->currency["social_point"] = $r["social_point"];
+                $this->currency["costume_point"] = $r["costume_point"];
+            }
+            $s = "
+                SELECT unit
+                FROM defense
+                ORDER BY position;
+            ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->defense, new Unit($db, $r["unit"], false));
+            }
+            $s = "
+                SELECT DISTINCT building
+                FROM building;
+            ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->building, new Building($db, $r["building"]));
+            }
+            $s = "
+                SELECT decoration
+                FROM decoration;
+            ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->decoration, new Decoration($db, $r["decoration"]));
+            }
+            $s = "
+                SELECT id
+                FROM inventory
+                WHERE
+                  type = " . $INVENTORY_TYPE["SCROLL"] . " AND
+                  amount > 0;
+            ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->inventory_scroll, new Inventory($db, $r["id"]));
+            }
+            // Rune crafting items are marked as generic crafting.
+            $s = "
+                SELECT inventory.id
+                FROM
+                  inventory,
+                  k_inventory
+                WHERE
+                  inventory.id = k_inventory.id AND
+                  k_inventory.type = " . $INVENTORY_TYPE["RUNE_CRAFT"] . " AND
+                  amount > 0;
+            ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->inventory_craft_rune, new Inventory($db, $r["id"]));
+            }
+            $s = "
+                SELECT inventory.id
+                FROM
+                  inventory,
+                  k_inventory
+                WHERE
+                  inventory.id = k_inventory.id AND
+                  k_inventory.type = " . $INVENTORY_TYPE["CRAFT_STUFF"] . " AND
+                  amount > 0;
+            ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->inventory_craft, new Inventory($db, $r["id"]));
+            }
+            $s = "
+                SELECT inventory.id AS id
+                FROM
+                  inventory,
+                  k_inventory
+                WHERE
+                  k_inventory.id = inventory.id AND
+                  k_inventory.type = " . $INVENTORY_TYPE["ESSENCES"] . "
+                ORDER BY
+                  upper(name) NOT LIKE '%MAGIC%',
+                  upper(name) NOT LIKE '%FIRE%',
+                  upper(name) NOT LIKE '%WATER%',
+                  upper(name) NOT LIKE '%WIND%',
+                  upper(name) NOT LIKE '%LIGHT%',
+                  upper(name) NOT LIKE '%DARK%',
+                  upper(name) NOT LIKE '%LOW%',
+                  upper(name) NOT LIKE '%MID%',
+                  upper(name) NOT LIKE '%HIGH%'
+                ;
+            ";
+            $q = $this->db->query($s);
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                array_push($this->inventory_essence, new Inventory($db, $r["id"]));
+            }
             $this->title = "SWDB";
             $this->title = "SWDB";
             $this->description = "Summoners War DataBase";
             $this->description = "Summoners War DataBase";
             $this->canonical = $root;
             $this->canonical = $root;

+ 23 - 26
application/page/Monster_Info_Page.php

@@ -1,7 +1,7 @@
  <?php
  <?php
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
-    require_once($path["entity"] . "K_Monster.php");
+    require_once($path["entity"] . "K_Unit.php");
 
 
 
 
     /**
     /**
@@ -10,7 +10,7 @@
     class Monster_Info_Page extends Page{
     class Monster_Info_Page extends Page{
 
 
         /**
         /**
-         * Selected @{see Monster}0
+         * Selected @{see K_Unit} array.
          * [0]: Unawakened monster (null if default purple).
          * [0]: Unawakened monster (null if default purple).
          * [1]: Awakened monster (null if silver).
          * [1]: Awakened monster (null if silver).
          * [2]: Second awakened monster (null if unavailaable).
          * [2]: Second awakened monster (null if unavailaable).
@@ -18,15 +18,9 @@
         public $monster = [];
         public $monster = [];
 
 
         /**
         /**
-         * IDs to other monsters of thef family
+         * IDs to other monsters of the family
          */
          */
-        public $family = [
-            "Fire" => null,
-            "Water" => null,
-            "Wind" => null,
-            "Light" => null,
-            "Dark" => null,
-        ];
+        public $family = [];
 
 
         /**
         /**
          * Constructor.
          * Constructor.
@@ -42,13 +36,13 @@
             parent::__construct($db);
             parent::__construct($db);
             $this->view = $path["view"] . "monster_info.php";
             $this->view = $path["view"] . "monster_info.php";
             $title = "";
             $title = "";
-            $monster = new K_Monster($db, $id);
+            $monster = new K_Unit($db, $id);
             if ($monster->can_awaken == 0){
             if ($monster->can_awaken == 0){
                 // Silver star monster.
                 // Silver star monster.
                 $this->monster[0] = $monster;
                 $this->monster[0] = $monster;
                 $this->monster[1] = null;
                 $this->monster[1] = null;
                 $this->monster[2] = null;
                 $this->monster[2] = null;
-                $title = $this->monster[0]->element . " " . $this->monster[0]->name;
+                $title = $this->monster[0]->element_name . " " . $this->monster[0]->name;
             }
             }
             elseif ($monster->can_awaken == 1 && $monster->awakens_to == "" && $monster->awakens_from == ""){
             elseif ($monster->can_awaken == 1 && $monster->awakens_to == "" && $monster->awakens_from == ""){
                 // Default purple (Rainbowmon or King Angelmon)
                 // Default purple (Rainbowmon or King Angelmon)
@@ -59,37 +53,40 @@
             }
             }
             elseif ($monster->can_awaken == 1 && $monster->awakens_to == "" && strlen($monster->awakens_from) > 0){
             elseif ($monster->can_awaken == 1 && $monster->awakens_to == "" && strlen($monster->awakens_from) > 0){
                 // Normal monster, already awakened, no 2a.
                 // Normal monster, already awakened, no 2a.
-                $this->monster[0] = new K_Monster($db, $monster->awakens_from);
+                $this->monster[0] = new K_Unit($db, $monster->awakens_from);
                 $this->monster[1] = $monster;
                 $this->monster[1] = $monster;
                 $this->monster[2] = null;
                 $this->monster[2] = null;
-                $title = $this->monster[1]->name . " - " .$this->monster[0]->element . " " . $this->monster[0]->name;
+                $title = $this->monster[1]->name . " - " .$this->monster[0]->element_name . " " . $this->monster[0]->name;
                 $monster = $this->monster[0];
                 $monster = $this->monster[0];
             }
             }
             elseif ($monster->can_awaken == 1 && strlen($monster->awakens_to) > 0 && $monster->awakens_from == ""){
             elseif ($monster->can_awaken == 1 && strlen($monster->awakens_to) > 0 && $monster->awakens_from == ""){
                 // Normal monster, not awakened, may have 2a.
                 // Normal monster, not awakened, may have 2a.
                 $this->monster[0] = $monster;
                 $this->monster[0] = $monster;
-                $this->monster[1] = new K_Monster($db, $this->monster[0]->awakens_to);
+                $this->monster[1] = new K_Unit($db, $this->monster[0]->awakens_to);
                 if ($this->monster[1]->awakens_to == ""){
                 if ($this->monster[1]->awakens_to == ""){
                     $this->monster[2] = null;
                     $this->monster[2] = null;
                 }
                 }
                 else{
                 else{
-                    $this->monster[2] = new K_Monster($db, $this->monster[1]->awakens_to);
+                    $this->monster[2] = new K_Unit($db, $this->monster[1]->awakens_to);
                 }
                 }
-                $title = $this->monster[1]->name . " - " .$this->monster[0]->element . " " . $this->monster[0]->name;
+                $title = $this->monster[1]->name . " - " .$this->monster[0]->element_name . " " . $this->monster[0]->name;
             }
             }
 
 
-            $s =
-              "SELECT " .
-              "  id, " .
-              "  element " .
-              "FROM k_monster " .
-              "WHERE " .
-              "  family_id = " . $monster->family_id . " AND " .
-              "  element <> '" . $monster->element . "';";
+            // TODO REWORK
+            /*$s = "
+              SELECT
+                id,
+                element
+              FROM k_unit
+              WHERE
+                family = " . $monster->family . " AND
+                base_stars 
+                element <> " . $monster->element . ";
+            ";
             $q_mon = $this->db->query($s);
             $q_mon = $this->db->query($s);
             while ($r = $q_mon->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q_mon->fetchArray(SQLITE3_ASSOC)){
                 $this->family[$r["element"]] = $r["id"];
                 $this->family[$r["element"]] = $r["id"];
-            }
+            }*/
 
 
             $this->title = $title ." - SWDB";
             $this->title = $title ." - SWDB";
             $this->description = $title . " info - SWDB";
             $this->description = $title . " info - SWDB";

+ 34 - 31
application/page/Monster_Page.php

@@ -1,7 +1,7 @@
  <?php
  <?php
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
-    require_once($path["entity"] . "Monster.php");
+    require_once($path["entity"] . "Unit.php");
 
 
 
 
     /**
     /**
@@ -10,9 +10,9 @@
     class Monster_Page extends Page{
     class Monster_Page extends Page{
 
 
         /**
         /**
-         * Selected @{see Monster}.
+         * Selected @{see Unit}.
          */
          */
-        public $monsters;
+        public $unit;
 
 
         /**
         /**
          * Stats gained by building.
          * Stats gained by building.
@@ -24,11 +24,11 @@
             "spd" => 0,
             "spd" => 0,
             "crd" => 0,
             "crd" => 0,
             "elm" => [
             "elm" => [
-                "Fire" => 0,
-                "Water" => 0,
-                "Wind" => 0,
-                "Light" => 0,
-                "Dark" => 0
+                0 => 0,
+                1 => 0,
+                2 => 0,
+                3 => 0,
+                4 => 0
             ]
             ]
         ];
         ];
 
 
@@ -46,9 +46,9 @@
             parent::__construct($db);
             parent::__construct($db);
             $this->view = $path["view"] . "monster.php";
             $this->view = $path["view"] . "monster.php";
             $this->calculate_buildings();
             $this->calculate_buildings();
-            $this->monster = new Monster($db, $id);
-            $this->title = $this->monster->monster->name ." - SWDB";
-            $this->description = "Owned " . $this->monster->monster->name;
+            $this->unit = new Unit($db, $id);
+            $this->title = $this->unit->unit->name ." - SWDB";
+            $this->description = "Owned " . $this->unit->unit->name;
             $this->canonical = $root . "monster/" . $id;
             $this->canonical = $root . "monster/" . $id;
         }
         }
 
 
@@ -57,37 +57,40 @@
          * $building_stats array.
          * $building_stats array.
          */
          */
         private function calculate_buildings(){
         private function calculate_buildings(){
-            $s =
-              "SELECT " .
-              "  affected_stat, " .
-              "  bonus, " .
-              "  element " .
-              "FROM " .
-              "  k_building, " .
-              "  k_building_level, " .
-              "  building " .
-              "WHERE " .
-              "  k_building.id = building.building AND " .
-              "  building.building = k_building_level.building AND " .
-              "  building.level = k_building_level.level AND " .
-              "  area = 'Everywhere' AND " .
-              "  affected_stat IN ('ATK', 'DEF', 'HP', 'SPD', 'CRI Dmg');";
+            global $STAT;
+            global $EFFECT_AREA;
+            $s = "
+              SELECT
+                affected_stat,
+                bonus,
+                element
+              FROM
+                k_decoration,
+                k_decoration_level,
+                decoration
+              WHERE
+                k_decoration.id = decoration.decoration AND
+                decoration.decoration = k_decoration_level.decoration AND
+                decoration.level = k_decoration_level.level AND
+                area = " . $EFFECT_AREA["GENERAL"] . " AND
+                affected_stat IN (" . $STAT["ATK"] . ", " . $STAT["DEF"] . ", " . $STAT["HP"] . ", " . $STAT["SPD"] . ", " . $STAT["CRIT_DMG"] . ");
+            ";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
                 switch($r["affected_stat"]){
                 switch($r["affected_stat"]){
-                    case "DEF":
+                    case $STAT["DEF"]:
                         $this->building_stats["def"] += $r["bonus"];
                         $this->building_stats["def"] += $r["bonus"];
                         break;
                         break;
-                    case "HP":
+                    case $STAT["HP"]:
                         $this->building_stats["hp"] += $r["bonus"];
                         $this->building_stats["hp"] += $r["bonus"];
                         break;
                         break;
-                    case "SPD":
+                    case $STAT["SPD"]:
                         $this->building_stats["spd"] += $r["bonus"];
                         $this->building_stats["spd"] += $r["bonus"];
                         break;
                         break;
-                    case "CRI Dmg":
+                    case $STAT["CRIT_DMG"]:
                         $this->building_stats["crd"] += $r["bonus"];
                         $this->building_stats["crd"] += $r["bonus"];
                         break;
                         break;
-                    case "ATK":
+                    case $STAT["ATK"]:
                         if(strlen($r["element"]) > 0){
                         if(strlen($r["element"]) > 0){
                             $this->building_stats["elm"][$r["element"]] += $r["bonus"];
                             $this->building_stats["elm"][$r["element"]] += $r["bonus"];
                         }
                         }

+ 68 - 62
application/page/Monsters_Page.php

@@ -1,7 +1,7 @@
  <?php
  <?php
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
-    require_once($path["entity"] . "Monster.php");
+    require_once($path["entity"] . "Unit.php");
 
 
     /**
     /**
      * Monster list page.
      * Monster list page.
@@ -16,14 +16,7 @@
         /**
         /**
          * The filters the page can handle.
          * The filters the page can handle.
          */
          */
-        public $filters = [
-            "element" => "",
-            "name" => "",
-            "min_stars" => 1,
-            "max_stars" => 6,
-            "in_storage" => true,
-            "without_runes" => true
-        ];
+        public $filters;
 
 
         /**
         /**
          * Stats gained by building.
          * Stats gained by building.
@@ -35,11 +28,11 @@
             "spd" => 0,
             "spd" => 0,
             "crd" => 0,
             "crd" => 0,
             "elm" => [
             "elm" => [
-                "Fire" => 0,
-                "Water" => 0,
-                "Wind" => 0,
-                "Light" => 0,
-                "Dark" => 0
+                0 => 0,
+                1 => 0,
+                2 => 0,
+                3 => 0,
+                4 => 0
             ]
             ]
         ];
         ];
 
 
@@ -58,9 +51,10 @@
             $this->parse_filters();
             $this->parse_filters();
             $this->calculate_buildings();
             $this->calculate_buildings();
             $s_mon = $this->build_query();
             $s_mon = $this->build_query();
+            error_log($s_mon);
             $q_mon = $this->db->query($s_mon);
             $q_mon = $this->db->query($s_mon);
             while ($r_mon = $q_mon->fetchArray(SQLITE3_ASSOC)){
             while ($r_mon = $q_mon->fetchArray(SQLITE3_ASSOC)){
-                array_push($this->monsters, new Monster($db, $r_mon["id"]));
+                array_push($this->monsters, new Unit($db, $r_mon["id"]));
             }
             }
             $this->title = "Monsters - SWDB";
             $this->title = "Monsters - SWDB";
             $this->description = "Owned monsters";
             $this->description = "Owned monsters";
@@ -72,26 +66,25 @@
          * and adds them to the $filters array.
          * and adds them to the $filters array.
          */
          */
         private function parse_filters(){
         private function parse_filters(){
-            if (isset($_GET["element"])){
-                $f_element = strtoupper($_GET["element"]);
-                if ($f_element == "FIRE" || $f_element == "WATER" || $f_element == "WIND" || $f_element == "LIGHT" || $f_element == "DARK"){
-                    $this->filters["element"] = $_GET["element"];
-                }
+            global $FILTER_MONSTER;
+            $this->filters = $FILTER_MONSTER;
+            if (isset($_GET["element"]) && in_array($_GET["element"], $ELEMENT)){
+                $this->filters["element"] = $_GET["element"];
             }
             }
             if (isset($_GET["name"]) && strlen($_GET["name"]) > 0){
             if (isset($_GET["name"]) && strlen($_GET["name"]) > 0){
                 $this->filters["name"] = SQLite3::escapeString($_GET["name"]);
                 $this->filters["name"] = SQLite3::escapeString($_GET["name"]);
             }
             }
-            if (isset($_GET["min_stars"]) && intval($_GET["min_stars"]) > 0 && intval($_GET["min_stars"]) < 7){
+            if (isset($_GET["min_stars"]) && intval($_GET["min_stars"]) > 0 && intval($_GET["min_stars"]) <= 6){
                 $this->filters["min_stars"] = $_GET["min_stars"];
                 $this->filters["min_stars"] = $_GET["min_stars"];
             }
             }
-            if (isset($_GET["max_stars"]) && intval($_GET["max_stars"]) > 0 && intval($_GET["max_stars"]) < 7){
+            if (isset($_GET["max_stars"]) && intval($_GET["max_stars"]) > 0 && intval($_GET["max_stars"]) <= 6){
                 $this->filters["max_stars"] = $_GET["max_stars"];
                 $this->filters["max_stars"] = $_GET["max_stars"];
             }
             }
-            if (isset($_GET["in_storage"]) && $_GET["in_storage"] != "on"){
-                $this->filters["in_storage"] = false;
+            if (isset($_GET["in_storage"]) && $_GET["in_storage"] == "on"){
+                $this->filters["in_storage"] = true;
             }
             }
-            if (isset($_GET["without_runes"]) && $_GET["without_runes"] != "on"){
-                $this->filters["without_runes"] = false;
+            if (isset($_GET["without_runes"]) && $_GET["without_runes"] == "on"){
+                $this->filters["without_runes"] = true;
             }
             }
             return;
             return;
         }
         }
@@ -103,28 +96,38 @@
          * @return The query to be executed.
          * @return The query to be executed.
          */
          */
         private function build_query(){
         private function build_query(){
-            $s = "SELECT monster.id AS id FROM monster, k_monster WHERE monster.monster = k_monster.id AND stars >= " . $this->filters["min_stars"] . " AND stars <= " . $this->filters["max_stars"];
-            if (strlen($this->filters["element"]) > 0){
-                $s = $s . " AND monster IN (SELECT id FROM k_monster WHERE upper(element) = '" . strtoupper($this->filters["element"]) . "') ";
+            global $ELEMENT;
+            $s = "
+                SELECT unit.id AS id 
+                FROM
+                  unit,
+                  k_unit 
+                WHERE 
+                  unit.unit = k_unit.id AND 
+                  stars >= " . $this->filters["min_stars"] . " AND 
+                  stars <= " . $this->filters["max_stars"];
+            if (in_array($this->filters["element"], $ELEMENT)){
+                $s = $s . " AND unit IN (SELECT id FROM k_unit WHERE upper(element) = '" . strtoupper($this->filters["element"]) . "') ";
             }
             }
             if ($this->filters["name"] != ""){
             if ($this->filters["name"] != ""){
-                $s = $s . " AND monster IN (SELECT id FROM k_monster WHERE upper(name) LIKE '%" . strtoupper($this->filters["name"]) . "%') ";
+                $s = $s . " AND unit IN (SELECT id FROM k_unit WHERE upper(name) LIKE '%" . strtoupper($this->filters["name"]) . "%') ";
             }
             }
-            if (!$this->filters["in_storage"]){
-                $s = $s . " AND in_storage = 0 ";
+            if ($this->filters["in_storage"]){
+                // TODO $s = $s . " AND in_storage = 0 ";
             }
             }
             if (!$this->filters["without_runes"]){
             if (!$this->filters["without_runes"]){
-                $s = $s . " AND monster.id IN (SELECT DISTINCT monster FROM monster_rune) ";
+                $s = $s . " AND unit.id IN (SELECT DISTINCT assigned_to FROM rune) ";
             }
             }
-            $s = $s .
-              " ORDER BY " .
-              "  stars DESC, " .
-              "  level DESC, " .
-              "  element = 'Fire' DESC, " .
-              "  element = 'Water' DESC, " .
-              "  element = 'Wind' DESC, " .
-              "  element = 'Light' DESC, " .
-              "  element = 'Dark' DESC; ";
+            $s = $s . "
+                ORDER BY 
+                  stars DESC,
+                  level DESC,
+                  element = " . $ELEMENT["FIRE"] ." DESC,
+                  element = " . $ELEMENT["WATER"] ." DESC,
+                  element = " . $ELEMENT["WIND"] ." DESC,
+                  element = " . $ELEMENT["LIGHT"] ." DESC,
+                  element = " . $ELEMENT["DARK"] ." DESC
+            ";
             return $s;
             return $s;
         }
         }
 
 
@@ -133,37 +136,40 @@
          * $building_stats array.
          * $building_stats array.
          */
          */
         private function calculate_buildings(){
         private function calculate_buildings(){
-            $s =
-              "SELECT " .
-              "  affected_stat, " .
-              "  bonus, " .
-              "  element " .
-              "FROM " .
-              "  k_building, " .
-              "  k_building_level, " .
-              "  building " .
-              "WHERE " .
-              "  k_building.id = building.building AND " .
-              "  building.building = k_building_level.building AND " .
-              "  building.level = k_building_level.level AND " .
-              "  area = 'Everywhere' AND " .
-              "  affected_stat IN ('ATK', 'DEF', 'HP', 'SPD', 'CRI Dmg');";
+            global $STAT;
+            global $EFFECT_AREA;
+            $s = "
+              SELECT
+                affected_stat,
+                bonus,
+                element
+              FROM
+                k_decoration,
+                k_decoration_level,
+                decoration
+              WHERE
+                k_decoration.id = decoration.decoration AND
+                decoration.decoration = k_decoration_level.decoration AND
+                decoration.level = k_decoration_level.level AND
+                area = " . $EFFECT_AREA["GENERAL"] . " AND
+                affected_stat IN (" . $STAT["ATK"] . ", " . $STAT["DEF"] . ", " . $STAT["HP"] . ", " . $STAT["SPD"] . ", " . $STAT["CRIT_DMG"] . ");
+            ";
             $q = $this->db->query($s);
             $q = $this->db->query($s);
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
                 switch($r["affected_stat"]){
                 switch($r["affected_stat"]){
-                    case "DEF":
+                    case $STAT["DEF"]:
                         $this->building_stats["def"] += $r["bonus"];
                         $this->building_stats["def"] += $r["bonus"];
                         break;
                         break;
-                    case "HP":
+                    case $STAT["HP"]:
                         $this->building_stats["hp"] += $r["bonus"];
                         $this->building_stats["hp"] += $r["bonus"];
                         break;
                         break;
-                    case "SPD":
+                    case $STAT["SPD"]:
                         $this->building_stats["spd"] += $r["bonus"];
                         $this->building_stats["spd"] += $r["bonus"];
                         break;
                         break;
-                    case "CRI Dmg":
+                    case $STAT["CRIT_DMG"]:
                         $this->building_stats["crd"] += $r["bonus"];
                         $this->building_stats["crd"] += $r["bonus"];
                         break;
                         break;
-                    case "ATK":
+                    case $STAT["ATK"]:
                         if(strlen($r["element"]) > 0){
                         if(strlen($r["element"]) > 0){
                             $this->building_stats["elm"][$r["element"]] += $r["bonus"];
                             $this->building_stats["elm"][$r["element"]] += $r["bonus"];
                         }
                         }

+ 346 - 0
application/page/Report_Runecraft_Page.php

@@ -0,0 +1,346 @@
+ <?php
+
+    require_once($path["page"] . "Page.php");
+    require_once($path["entity"] . "Unit.php");
+    require_once($path["entity"] . "Rune.php");
+    require_once($path["entity"] . "Rune_Craft.php");
+    //include($path["application"] . "Filter.php");
+
+    /**
+     * Upgradeable runes report page.
+     */
+    class Report_Runecraft_Page extends Page{
+
+        /**
+         * Filters the report can handle.
+         */
+        public $filters;
+
+        /**
+         * List of available upgrades. Can be described as:
+         * $upgrades = [
+         *   [
+         *     unit (Unit),
+         *     upgrade = [
+         *       [
+         *         rune (Rune),
+         *         craft = [(Rune_Craft)]
+         *       ]
+         *     ]
+         *   ]
+         * ]
+         */
+        public $upgrades = [];
+
+        /**
+         * Constructor.
+         *
+         * Retrieves the data and initializes the variables.
+         *
+         * @param SQLite3 $db Connection to the database.
+         */
+        public function __construct($db){
+            global $path;
+            global $root;
+            global $a;
+            error_log("VAR a: " . $a);
+            parent::__construct($db);
+            $this->view = $path["view"] . "report_runecraft.php";
+            $this->parse_filters();
+            $s = $this->build_query();
+            $q = $this->db->query($s);
+            $prev_monster = "";
+            $prev_rune = "";
+            $upgrade = null;
+            $rupgrade = null;
+            while ($r = $q->fetchArray(SQLITE3_ASSOC)){
+                if ($r["unit"] != $prev_monster){
+                    if ($prev_rune != ""){
+                        array_push($upgrade["upgrade"], $rupgrade);
+                    }
+                    if ($prev_monster != ""){
+                        array_push($this->upgrades, $upgrade);
+                    }
+                    $prev_monster = $r["unit"];
+                    $prev_rune = "";
+                    $upgrade = [
+                        "unit" => new Unit($this->db, $r["unit"]),
+                        "upgrade" => [],
+                    ];
+                    $rupgrade = [
+                        "rune" => new Rune($this->db, $r["rune"]),
+                        "craft" => [],
+                    ];
+                }
+                if ($r["rune"] != $prev_rune){
+                    if ($prev_rune != ""){
+                        array_push($upgrade["upgrade"], $rupgrade);
+                    }
+                    $prev_rune = $r["rune"];
+                    $rupgrade = [
+                        "rune" => new Rune($this->db, $r["rune"]),
+                        "craft" => [],
+                    ];
+                }
+                $rune_craft = new Rune_craft($this->db, $r["craft"]);
+                array_push($rupgrade["craft"], $rune_craft);
+            }
+            // Last entries
+            array_push($upgrade["upgrade"], $rupgrade);
+            array_push($this->upgrades, $upgrade);
+            $this->title = "Rune craft - SWDB";
+            $this->description = "Find runes that can be upgraded via crafting.";
+            $this->canonical = $root . "report/runecraft/";
+        }
+
+        /**
+         * Parses the filters passed in the request and sets $filters.
+         * Filters must be in $_GET, nd the available ones are max_stars (1-6),
+         * min_stars (1-6) and in_storage (on/off).
+         */
+        private function parse_filters(){
+            //global $RUNE_STAT;
+            global $FILTER_RUNECRAFT;
+            global $FILTER_SKILLUP;
+            $this->filters = $FILTER_RUNECRAFT;
+            var_dump($FILTER_SKILLUP);
+            var_dump($this->filters);
+            // Monster
+            if (isset($_GET["monster_min_stars"]) && intval($_GET["monster_min_stars"]) > 0 && intval($_GET["monster_min_stars"]) < 7){
+                $this->filters["monster_min_stars"] = $_GET["monster_min_stars"];
+            }
+            if (isset($_GET["monster_max_stars"]) && intval($_GET["monster_max_stars"]) > 0 && intval($_GET["monster_max_stars"]) < 7){
+                $this->filters["monster_max_stars"] = $_GET["monster_max_stars"];
+            }
+            if (isset($_GET["monster_in_storage"]) && $_GET["monster_in_storage"] == "on"){
+                $this->filters["monster_in_storage"] = true;
+            }
+            else{
+                $this->filters["monster_in_storage"] = false;
+            }
+            if (isset($_GET["monster_name"]) && strlen($_GET["monster_name"]) > 0){
+                $this->filters["monster_name"] = SQLite3::escapeString($_GET["monster_name"]);
+            }
+            // Runes
+            if (isset($_GET["rune_min_stars"]) && intval($_GET["rune_min_stars"]) > 0 && intval($_GET["rune_min_stars"]) < 7){
+                $this->filters["rune_min_stars"] = $_GET["rune_min_stars"];
+            }
+            if (isset($_GET["rune_max_stars"]) && intval($_GET["rune_max_stars"]) > 0 && intval($_GET["rune_max_stars"]) < 7){
+                $this->filters["rune_max_stars"] = $_GET["rune_max_stars"];
+            }
+            if (isset($_GET["rune_min_level"]) && intval($_GET["rune_min_level"]) >= 0 && intval($_GET["rune_min_level"]) <= 15){
+                $this->filters["rune_min_level"] = $_GET["rune_min_level"];
+            }
+            if (isset($_GET["rune_max_level"]) && intval($_GET["max_level"]) >= 0 && intval($_GET["rune_max_level"]) <= 15){
+                $this->filters["rune_max_level"] = $_GET["rune_max_level"];
+            }
+            if (isset($_GET["rune_min_quality"]) && intval($_GET["rune_min_quality"]) >= 0 && intval($_GET["rune_min_quality"]) < 5){
+                $this->filters["rune_min_quality"] = $_GET["rune_min_quality"];
+            }
+            if (isset($_GET["rune_max_quality"]) && intval($_GET["rune_max_quality"]) >= 0 && intval($_GET["rune_max_quality"]) < 5){
+                $this->filters["rune_max_quality"] = $_GET["rune_max_quality"];
+            }
+            if (isset($_GET["rune_min_original_quality"]) && intval($_GET["rune_min_original_quality"]) >= 0 && intval($_GET["rune_min_original_quality"]) < 5){
+                $this->filters["rune_min_original_quality"] = $_GET["rune_min_original_quality"];
+            }
+            if (isset($_GET["rune_max_original_quality"]) && intval($_GET["rune_max_original_quality"]) >= 0 && intval($_GET["rune_max_original_quality"]) < 5){
+                $this->filters["rune_max_original_quality"] = $_GET["rune_max_original_quality"];
+            }
+            if (isset($_GET["rune_min_efficiency"]) && intval($_GET["rune_min_efficiency"]) >= 0 && intval($_GET["rune_min_efficiency"]) <= 100){
+                $this->filters["rune_min_efficiency"] = $_GET["rune_min_efficiency"];
+            }
+            if (isset($_GET["rune_max_efficiency"]) && intval($_GET["rune_max_efficiency"]) >= 0 && intval($_GET["rune_max_efficiency"]) <= 100){
+                $this->filters["rune_max_efficiency"] = $_GET["rune_max_efficiency"];
+            }
+            if (isset($_GET["rune_min_max_efficiency"]) && intval($_GET["rune_min_max_efficiency"]) >= 0 && intval($_GET["rune_min_max_efficiency"]) <= 100){
+                $this->filters["rune_min_max_efficiency"] = $_GET["rune_min_max_efficiency"];
+            }
+            if (isset($_GET["rune_max_max_efficiency"]) && intval($_GET["rune_max_max_efficiency"]) >= 0 && intval($_GET["rune_max_max_efficiency"]) <= 100){
+                $this->filters["rune_max_max_efficiency"] = $_GET["rune_max_max_efficiency"];
+            }
+            if (isset($_GET["rune_slot"])){
+                $slots = $_GET["rune_slot"];
+                foreach ($slots as $slot){
+                    if (intval($slot) >= 1 && intval($slot) < 7){
+                        array_push($this->filters["rune_slot"], intval($slot));
+                    }
+                }
+            }
+            // Grindstones
+            if (isset($_GET["grind_min_quality"]) && intval($_GET["grind_min_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["grind_min_quality"]) < $QUALITY["LEGEND"]){
+                $this->filters["grind_min_quality"] = $_GET["grind_min_quality"];
+            }
+            if (isset($_GET["grind_stat"])){
+                $stats = $_GET["grind_stat"];
+                $this->filters["grind_stat"] = [];
+                foreach ($stats as $stat){
+                    array_push($this->filters["grind_stat"], intval($stat));
+                }
+            }
+            if (isset($_GET["gem_stat_from"])){
+                $stats = $_GET["gem_stat_from"];
+                $this->filters["gem_stat_from"] = [];
+                foreach ($stats as $stat){
+                    array_push($this->filters["gem_stat_from"], intval($stat));
+                }
+            }
+            if (isset($_GET["gem_stat_to"])){
+                $stats = $_GET["gem_stat_to"];
+                $this->filters["gem_stat_to"] = [];
+                foreach ($stats as $stat){
+                    array_push($this->filters["gem_stat_to"], intval($stat));
+                }
+            }
+            return;
+        }
+
+        /**
+         * Builds the query for the page, using the providded or default filters.
+         *
+         * @return The query to be executed.
+         */
+        private function build_query(){
+            $s = "
+                SELECT
+                  unit.id AS unit,
+                  rune.id AS rune,
+                  rune_craft.id AS craft
+                FROM
+                  unit,
+                  k_unit,
+                  rune,
+                  rune_craft,
+                  k_rune_craft_type
+                WHERE
+                  unit.id = rune.assigned_to AND
+                  unit.unit = k_unit.id AND
+                  rune_craft.type = k_rune_craft_type.id AND
+                  unit.stars >= " . $this->filters["rune_min_stars"] . " AND
+                  unit.stars <= " . $this->filters["rune_max_stars"] . " AND
+                  -- RUNE FILTERS
+                  rune.quality >= " . $this->filters["rune_min_quality"] . " AND
+                  rune.quality <= " . $this->filters["rune_max_quality"] . " AND
+                  rune.level >= " . $this->filters["rune_min_level"] . " AND
+                  rune.level <= " . $this->filters["rune_max_level"] . " AND
+                  rune.stars >= " . $this->filters["rune_min_stars"] . " AND
+                  rune.stars <= " . $this->filters["rune_max_stars"] . " AND
+                  rune.original_quality >= " . $this->filters["rune_min_original_quality"] . " AND
+                  rune.original_quality <= " . $this->filters["rune_max_original_quality"] . " AND
+                  rune.efficiency >= " . $this->filters["rune_min_efficiency"] . " AND
+                  rune.efficiency <= " . $this->filters["rune_max_efficiency"] . " AND
+                  rune.max_efficiency >= " . $this->filters["rune_min_max_efficiency"] . " AND
+                  rune.max_efficiency <= " . $this->filters["rune_max_max_efficiency"] . " AND
+                  (
+                    rune.type = rune_craft.rune OR 
+                    k_rune_craft_type.inmemorial = 1
+                  ) AND
+                  k_rune_craft_type.ancient = rune.ancient AND
+                ";
+            if (strlen($this->filters["monster_name"]) > 0){
+                $s = $s . " AND upper(k_unit.name) LIKE = upper('%" . $this->filters["monster_name"] . "%') ";
+            }
+            if (!$this->filters["monster_in_storage"]){
+                //$s = $s . " AND unit.in_storage = 0 ";
+            }
+            if (count($this->filters["rune_slot"]) > 0){
+                $s = $s . " rune.slot IN ( ";
+                foreach($this->filters["rune_slot"] as $t){
+                    $s = $s . "$t, ";
+                }
+                $s = $s . "-1) AND ";
+            }
+            $s .= "
+                rune_craft.stat <> rune.main_stat AND
+                rune_craft.stat <> rune.innate_stat AND
+                  (
+                    k_rune_craft_type.gem = 1 AND
+                    (
+                      -- GEM FILTERS
+                      rune_craft.quality >= " . $this->filters["gem_min_quality"] . " AND
+            ";
+            if (count($this->filters["gem_stat_from"]) > 0){
+                $in = "(";
+                foreach($this->filters["gem_stat_from"] as $t){
+                    $in = $in . "$t, ";
+                }
+                $in = $in . "-1)";
+                $s .= " (rune.substat_1 IN $in OR rune.substat_2 IN $in OR rune.substat_3 IN $in OR rune.substat_4 IN $in) AND ";
+            }
+            if (count($this->filters["gem_stat_to"]) > 0){
+                $in = "(";
+                foreach($this->filters["gem_stat_to"] as $t){
+                    $in = $in . "$t, ";
+                }
+                $in = $in . "-1)";
+                $s .= " rune_craft.stat IN $in AND ";
+            }
+            $s .= "
+                      (
+                        rune_craft.stat <> rune.substat_1 AND
+                        rune_craft.stat <> rune.substat_2 AND
+                        rune_craft.stat <> rune.substat_3 AND
+                        rune_craft.stat <> rune.substat_4
+                      )
+                    )
+                  ) |
+                  (
+                    k_rune_craft_type.gem = 0 AND
+                    (
+                      -- GRINDSTONE FILTERS
+            ";
+            if (count($this->filters["grind_stat"]) > 0){
+                $in = "(";
+                foreach($this->filters["grind_stat"] as $t){
+                    $in = $in . "$t, ";
+                }
+                $in = $in . "-1)";
+                $s .= " rune_craft.stat IN $in AND ";
+            }
+            $s .= "
+                      rune_craft.quality >= " . $this->filters["grind_min_quality"] . " AND
+                      (
+                        (
+                          rune_craft.stat = rune.substat_1 AND
+                          rune_craft.stat <> rune.substat_2 AND
+                          rune_craft.stat <> rune.substat_3 AND
+                          rune_craft.stat <> rune.substat_4
+                        ) OR
+                        (
+                          rune_craft.stat <> rune.substat_1 AND
+                          rune_craft.stat = rune.substat_2 AND
+                          rune_craft.stat <> rune.substat_3 AND
+                          rune_craft.stat <> rune.substat_4
+                        ) OR
+                        (
+                          rune_craft.stat <> rune.substat_1 AND
+                          rune_craft.stat <> rune.substat_2 AND
+                          rune_craft.stat = rune.substat_3 AND
+                          rune_craft.stat <> rune.substat_4
+                        ) OR
+                        (
+                          rune_craft.stat <> rune.substat_1 AND
+                          rune_craft.stat <> rune.substat_2 AND
+                          rune_craft.stat <> rune.substat_3 AND
+                          rune_craft.stat = rune.substat_4
+                        )
+                      )
+                    )
+                  )
+                ";
+            $s .= "
+                ORDER BY
+                  unit.stars DESC,
+                  unit.level DESC,
+                  unit.id,
+                  rune.stars DESC,
+                  rune.original_quality DESC,
+                  rune.level DESC,
+                  rune.id, 
+                  rune.slot, 
+                  rune_craft.quality DESC,
+                  rune_craft.stat DESC;
+                ";
+            return $s;
+        }
+    }
+?>

+ 73 - 68
application/page/Report_Runeupgrade_Page.php

@@ -1,7 +1,7 @@
  <?php
  <?php
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
-    require_once($path["entity"] . "Monster.php");
+    require_once($path["entity"] . "Unit.php");
     require_once($path["entity"] . "Rune.php");
     require_once($path["entity"] . "Rune.php");
 
 
     /**
     /**
@@ -41,7 +41,7 @@
          * List of available upgrades. Can be described as:
          * List of available upgrades. Can be described as:
          * $upgrades = [
          * $upgrades = [
          *   [
          *   [
-         *     monster (Monster),
+         *     unit (Unit),
          *     upgrade = [
          *     upgrade = [
          *       [
          *       [
          *         rune (Rune),
          *         rune (Rune),
@@ -74,17 +74,17 @@
             $upgrade = null;
             $upgrade = null;
             $rupgrade = null;
             $rupgrade = null;
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
-                if ($r["monster"] != $prev_monster){
+                if ($r["unit"] != $prev_monster){
                     if ($prev_rune != ""){
                     if ($prev_rune != ""){
                         array_push($upgrade["upgrade"], $rupgrade);
                         array_push($upgrade["upgrade"], $rupgrade);
                     }
                     }
                     if ($prev_monster != ""){
                     if ($prev_monster != ""){
                         array_push($this->upgrades, $upgrade);
                         array_push($this->upgrades, $upgrade);
                     }
                     }
-                    $prev_monster = $r["monster"];
+                    $prev_monster = $r["unit"];
                     $prev_rune = "";
                     $prev_rune = "";
                     $upgrade = [
                     $upgrade = [
-                        "monster" => new Monster($this->db, $r["monster"]),
+                        "unit" => new Unit($this->db, $r["unit"]),
                         "upgrade" => [],
                         "upgrade" => [],
                     ];
                     ];
                     $rupgrade = [
                     $rupgrade = [
@@ -105,7 +105,7 @@
                 $rune_alt = new Rune($this->db, $r["alternative"]);
                 $rune_alt = new Rune($this->db, $r["alternative"]);
                 // If the alternative rune isassigned
                 // If the alternative rune isassigned
                 if ($this->filters["alternative_source"] > 0 && strlen($rune_alt->assigned_to) > 0){
                 if ($this->filters["alternative_source"] > 0 && strlen($rune_alt->assigned_to) > 0){
-                    $rune_alt->assigned_to = new Monster($this->db, $rune_alt->assigned_to);
+                    $rune_alt->assigned_to = new Unit($this->db, $rune_alt->assigned_to);
                 }
                 }
                 array_push($rupgrade["alternative"], $rune_alt);
                 array_push($rupgrade["alternative"], $rune_alt);
             }
             }
@@ -124,11 +124,11 @@
          */
          */
         private function parse_filters(){
         private function parse_filters(){
             // Monster
             // Monster
-            if (isset($_GET["monster_min_stars"]) && intval($_GET["monster_min_stars"]) > 0 && intval($_GET["mnster_min_stars"]) < 7){
+            if (isset($_GET["monster_min_stars"]) && intval($_GET["monster_min_stars"]) > 0 && intval($_GET["monster_min_stars"]) < 7){
                 $this->filters["monster_min_stars"] = $_GET["monster_min_stars"];
                 $this->filters["monster_min_stars"] = $_GET["monster_min_stars"];
             }
             }
-            if (isset($_GET["monster_max_stars"]) && intval($_GET["max_stars"]) > 0 && intval($_GET["monster_max_stars"]) < 7){
-                $this->filters["mnster_max_stars"] = $_GET["monster_max_stars"];
+            if (isset($_GET["monster_max_stars"]) && intval($_GET["monster_max_stars"]) > 0 && intval($_GET["monster_max_stars"]) < 7){
+                $this->filters["monster_max_stars"] = $_GET["monster_max_stars"];
             }
             }
             if (isset($_GET["monster_in_storage"]) && $_GET["monster_in_storage"] == "on"){
             if (isset($_GET["monster_in_storage"]) && $_GET["monster_in_storage"] == "on"){
                 $this->filters["monster_in_storage"] = true;
                 $this->filters["monster_in_storage"] = true;
@@ -146,22 +146,22 @@
             if (isset($_GET["rune_max_stars"]) && intval($_GET["rune_max_stars"]) > 0 && intval($_GET["rune_max_stars"]) < 7){
             if (isset($_GET["rune_max_stars"]) && intval($_GET["rune_max_stars"]) > 0 && intval($_GET["rune_max_stars"]) < 7){
                 $this->filters["rune_max_stars"] = $_GET["rune_max_stars"];
                 $this->filters["rune_max_stars"] = $_GET["rune_max_stars"];
             }
             }
-            if (isset($_GET["rune_min_level"]) && intval($_GET["rune_min_level"]) >= 0 && intval($_GET["mnster_min_level"]) <= 15){
+            if (isset($_GET["rune_min_level"]) && intval($_GET["rune_min_level"]) >= 0 && intval($_GET["rune_min_level"]) <= 15){
                 $this->filters["rune_min_level"] = $_GET["rune_min_level"];
                 $this->filters["rune_min_level"] = $_GET["rune_min_level"];
             }
             }
-            if (isset($_GET["rune_max_level"]) && intval($_GET["max_level"]) >= 0 && intval($_GET["rune_max_level"]) <= 15){
-                $this->filters["mnster_max_level"] = $_GET["rune_max_level"];
+            if (isset($_GET["rune_max_level"]) && intval($_GET["rune_max_level"]) >= 0 && intval($_GET["rune_max_level"]) <= 15){
+                $this->filters["rune_max_level"] = $_GET["rune_max_level"];
             }
             }
-            if (isset($_GET["rune_min_quality"]) && intval($_GET["rune_min_quality"]) >= 0 && intval($_GET["rune_min_quality"]) < 5){
+            if (isset($_GET["rune_min_quality"]) && intval($_GET["rune_min_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_min_quality"]) <= $QUALITY["LEGEND"]){
                 $this->filters["rune_min_quality"] = $_GET["rune_min_quality"];
                 $this->filters["rune_min_quality"] = $_GET["rune_min_quality"];
             }
             }
-            if (isset($_GET["rune_max_quality"]) && intval($_GET["rune_max_quality"]) >= 0 && intval($_GET["rune_max_quality"]) < 5){
+            if (isset($_GET["rune_max_quality"]) && intval($_GET["rune_max_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_max_quality"]) <= $QUALITY["LEGEND"]){
                 $this->filters["rune_max_quality"] = $_GET["rune_max_quality"];
                 $this->filters["rune_max_quality"] = $_GET["rune_max_quality"];
             }
             }
-            if (isset($_GET["rune_min_original_quality"]) && intval($_GET["rune_min_original_quality"]) >= 0 && intval($_GET["rune_min_original_quality"]) < 5){
+            if (isset($_GET["rune_min_original_quality"]) && intval($_GET["rune_min_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_min_original_quality"]) <= $QUALITY["LEGEND"]){
                 $this->filters["rune_min_original_quality"] = $_GET["rune_min_original_quality"];
                 $this->filters["rune_min_original_quality"] = $_GET["rune_min_original_quality"];
             }
             }
-            if (isset($_GET["rune_max_original_quality"]) && intval($_GET["rune_max_original_quality"]) >= 0 && intval($_GET["rune_max_original_quality"]) < 5){
+            if (isset($_GET["rune_max_original_quality"]) && intval($_GET["rune_max_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_max_original_quality"]) <= $QUALITY["LEGEND"]){
                 $this->filters["rune_max_original_quality"] = $_GET["rune_max_original_quality"];
                 $this->filters["rune_max_original_quality"] = $_GET["rune_max_original_quality"];
             }
             }
             if (isset($_GET["rune_min_efficiency"]) && intval($_GET["rune_min_efficiency"]) >= 0 && intval($_GET["rune_min_efficiency"]) <= 100){
             if (isset($_GET["rune_min_efficiency"]) && intval($_GET["rune_min_efficiency"]) >= 0 && intval($_GET["rune_min_efficiency"]) <= 100){
@@ -185,16 +185,16 @@
                 }
                 }
             }
             }
             // Alternatives
             // Alternatives
-            if (isset($_GET["alternative_min_stars"]) && intval($_GET["alternative_min_stars"]) > 0 && intval($_GET["mnster_min_stars"]) < 7){
+            if (isset($_GET["alternative_min_stars"]) && intval($_GET["alternative_min_stars"]) > 0 && intval($_GET["alternative_min_stars"]) < 7){
                 $this->filters["alternative_min_stars"] = $_GET["alternative_min_stars"];
                 $this->filters["alternative_min_stars"] = $_GET["alternative_min_stars"];
             }
             }
-            if (isset($_GET["alternative_min_level"]) && intval($_GET["alternative_min_level"]) >= 0 && intval($_GET["mnster_min_level"]) <= 15){
+            if (isset($_GET["alternative_min_level"]) && intval($_GET["alternative_min_level"]) >= 0 && intval($_GET["alternative_min_level"]) <= 15){
                 $this->filters["alternative_min_level"] = $_GET["alternative_min_level"];
                 $this->filters["alternative_min_level"] = $_GET["alternative_min_level"];
             }
             }
-            if (isset($_GET["alternative_min_original_quality"]) && intval($_GET["alternative_min_original_quality"]) >= 0 && intval($_GET["alternative_min_original_quality"]) < 5){
+            if (isset($_GET["alternative_min_original_quality"]) && intval($_GET["alternative_min_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["alternative_min_original_quality"]) <= $QUALITY["LEGEND"]){
                 $this->filters["alternative_min_original_quality"] = $_GET["alternative_min_original_quality"];
                 $this->filters["alternative_min_original_quality"] = $_GET["alternative_min_original_quality"];
             }
             }
-            if (isset($_GET["alternative_condition"]) && intval($_GET["alternative_condition"]) >= 0 && intval($_GET["alternative_condition"]) <= 5){
+            if (isset($_GET["alternative_condition"]) && intval($_GET["alternative_condition"]) >= 0 && intval($_GET["alternative_condition"]) <= $QUALITY["LEGEND"]){
                 $this->filters["alternative_condition"] = $_GET["alternative_condition"];
                 $this->filters["alternative_condition"] = $_GET["alternative_condition"];
             }
             }
             if (isset($_GET["alternative_source"]) && intval($_GET["alternative_source"]) >= 0 && intval($_GET["alternative_source"]) <= 2){
             if (isset($_GET["alternative_source"]) && intval($_GET["alternative_source"]) >= 0 && intval($_GET["alternative_source"]) <= 2){
@@ -209,47 +209,51 @@
          * @return The query to be executed.
          * @return The query to be executed.
          */
          */
         private function build_query(){
         private function build_query(){
-            $s =
-              "SELECT " .
-              "  monster.id AS monster, " .
-              "  rune.id AS id, " .
-              "  rune_alt.id AS alternative " .
-              "FROM " .
-              "  rune, " .
-              "  rune rune_alt, " .
-              "  monster " .
-              "WHERE " .
-              "  monster.id = rune.assigned_to AND " .
-              "  monster.stars >= " . $this->filters["monster_min_stars"] . " AND " .
-              "  monster.stars <= " . $this->filters["monster_max_stars"] . " AND " .
-              "  rune.stars >= " . $this->filters["rune_min_stars"] . " AND " .
-              "  rune.stars <= " . $this->filters["rune_max_stars"] . " AND " .
-              "  rune.level >= " . $this->filters["rune_min_level"] . " AND " .
-              "  rune.level <= " . $this->filters["rune_max_level"] . " AND " .
-              "  rune.quality >= " . $this->filters["rune_min_quality"] . " AND " .
-              "  rune.quality <= " . $this->filters["rune_max_quality"] . " AND " .
-              "  rune.original_quality >= " . $this->filters["rune_min_original_quality"] . " AND " .
-              "  rune.original_quality <= " . $this->filters["rune_max_original_quality"] . " AND " .
-              "  rune.efficiency >= " . $this->filters["rune_min_efficiency"] . " AND " .
-              "  rune.efficiency <= " . $this->filters["rune_max_efficiency"] . " AND " .
-              "  rune.max_efficiency >= " . $this->filters["rune_min_max_efficiency"] . " AND " .
-              "  rune.max_efficiency <= " . $this->filters["rune_max_max_efficiency"] . " AND " .
-              "  rune.type = rune_alt.type AND " .
-              "  rune.slot = rune_alt.slot AND " .
-              "  rune.main_stat = rune_alt.main_stat AND " .
-              "  rune_alt.stars >= " . $this->filters["alternative_min_stars"] . " AND " .
-              "  rune_alt.level >= " . $this->filters["alternative_min_level"] . " AND " .
-              "  rune_alt.original_quality >= " . $this->filters["alternative_min_original_quality"] . " AND ";
+            $s = "
+              SELECT
+                unit.id AS unit,
+                rune.id AS id,
+                rune_alt.id AS alternative
+              FROM
+                rune,
+                rune rune_alt,
+                unit,
+                k_unit
+              WHERE
+                unit.id = rune.assigned_to AND
+                unit.unit = k_unit.id AND
+                unit.stars >= " . $this->filters["monster_min_stars"] . " AND
+                unit.stars <= " . $this->filters["monster_max_stars"] . " AND
+                rune.stars >= " . $this->filters["rune_min_stars"] . " AND 
+                rune.stars <= " . $this->filters["rune_max_stars"] . " AND 
+                rune.level >= " . $this->filters["rune_min_level"] . " AND 
+                rune.level <= " . $this->filters["rune_max_level"] . " AND 
+                rune.quality >= " . $this->filters["rune_min_quality"] . " AND 
+                rune.quality <= " . $this->filters["rune_max_quality"] . " AND 
+                rune.original_quality >= " . $this->filters["rune_min_original_quality"] . " AND 
+                rune.original_quality <= " . $this->filters["rune_max_original_quality"] . " AND 
+                rune.efficiency >= " . $this->filters["rune_min_efficiency"] . " AND 
+                rune.efficiency <= " . $this->filters["rune_max_efficiency"] . " AND 
+                rune.max_efficiency >= " . $this->filters["rune_min_max_efficiency"] . " AND 
+                rune.max_efficiency <= " . $this->filters["rune_max_max_efficiency"] . " AND 
+                rune.type = rune_alt.type AND 
+                rune.slot = rune_alt.slot AND 
+                rune.main_stat = rune_alt.main_stat AND 
+                rune_alt.stars >= " . $this->filters["alternative_min_stars"] . " AND 
+                rune_alt.level >= " . $this->filters["alternative_min_level"] . " AND 
+                rune_alt.original_quality >= " . $this->filters["alternative_min_original_quality"] . " AND
+            ";
             switch ($this->filters["alternative_source"]){
             switch ($this->filters["alternative_source"]){
                 case 0: // Unassigned
                 case 0: // Unassigned
                     $s = $s . " rune_alt.assigned_to IS NULL AND ";
                     $s = $s . " rune_alt.assigned_to IS NULL AND ";
                     break;
                     break;
                 case 1: // Unassigned or assigned to lower star monsters
                 case 1: // Unassigned or assigned to lower star monsters
-                    $s = $s . 
-                      " ( " .
-                      " rune_alt.assigned_to IS NULL OR " .
-                      " rune_alt.assigned_to IN (SELECT id FROM monster m WHERE m.stars < monster.stars) " .
-                      " ) AND ";
+                    $s = $s . "
+                      (
+                        rune_alt.assigned_to IS NULL OR
+                        rune_alt.assigned_to IN (SELECT id FROM unit m WHERE m.stars < unit.stars)
+                      ) AND
+                    ";
                     break;
                     break;
                 // Case 2: Assigned or unassigned.
                 // Case 2: Assigned or unassigned.
             }  
             }  
@@ -287,10 +291,10 @@
                     break;
                     break;
             }
             }
             if (strlen($this->filters["monster_name"]) > 0){
             if (strlen($this->filters["monster_name"]) > 0){
-                $s = $s . " AND monster.name LIKE = '%" . $this->filters["monster_name"] . "%' ";
+                $s = $s . " AND k_unit.name LIKE = '%" . $this->filters["monster_name"] . "%' ";
             }
             }
             if (!$this->filters["monster_in_storage"]){
             if (!$this->filters["monster_in_storage"]){
-                $s = $s . " AND monster.in_storage = 0 ";
+                //$s = $s . " AND unit.in_storage = 0 ";
             }
             }
             if (count($this->filters["rune_slot"]) > 0){
             if (count($this->filters["rune_slot"]) > 0){
                 $s = $s . " AND rune.slot IN ( ";
                 $s = $s . " AND rune.slot IN ( ";
@@ -299,16 +303,17 @@
                 }
                 }
                 $s = $s . "-1) ";
                 $s = $s . "-1) ";
             }
             }
-            $s = $s .
-              "ORDER BY " .
-              "  monster.stars DESC, " .
-              "  monster.level DESC, " .
-              "  monster.id, " .
-              "  rune.slot, " .
-              "  id, " .
-              "  rune_alt.stars DESC, " .
-              "  rune_alt.original_quality DESC , " .
-              "  rune_alt.main_stat_value DESC;";
+            $s = $s . "
+              ORDER BY
+                unit.stars DESC,
+                unit.level DESC,
+                unit.id,
+                rune.slot,
+                id,
+                rune_alt.stars DESC,
+                rune_alt.original_quality DESC,
+                rune_alt.main_stat_value DESC;
+            ";
             return $s;
             return $s;
         }
         }
     }
     }

+ 60 - 64
application/page/Report_Skillup_Page.php

@@ -1,7 +1,7 @@
  <?php
  <?php
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
-    require_once($path["entity"] . "Monster.php");
+    require_once($path["entity"] . "Unit.php");
 
 
     /**
     /**
      * Urgent Skillup report page.
      * Urgent Skillup report page.
@@ -11,7 +11,7 @@
         /**
         /**
          * Array of @{see Monsters}s.
          * Array of @{see Monsters}s.
          */
          */
-        public $monsters = [];
+        public $units = [];
 
 
         /**
         /**
          * The filters the page can handle.
          * The filters the page can handle.
@@ -25,7 +25,8 @@
             "without_runes" => false,
             "without_runes" => false,
             "family" => false,
             "family" => false,
             "maxed" => false,
             "maxed" => false,
-            "2a" => false
+            "2a" => false,
+            "homunculus" => false
         ];
         ];
 
 
         /**
         /**
@@ -45,7 +46,7 @@
             error_log($s_mon);
             error_log($s_mon);
             $q_mon = $this->db->query($s_mon);
             $q_mon = $this->db->query($s_mon);
             while ($r_mon = $q_mon->fetchArray(SQLITE3_ASSOC)){
             while ($r_mon = $q_mon->fetchArray(SQLITE3_ASSOC)){
-                array_push($this->monsters, new Monster($db, $r_mon["id"]));
+                array_push($this->units, new Unit($db, $r_mon["id"]));
             }
             }
             $this->title = "Urgent skill-ups - SWDB";
             $this->title = "Urgent skill-ups - SWDB";
             $this->description = "Monster in need os skilling up";
             $this->description = "Monster in need os skilling up";
@@ -84,6 +85,10 @@
             if (isset($_GET["2a"]) && $_GET["2a"] == "on"){
             if (isset($_GET["2a"]) && $_GET["2a"] == "on"){
                 $this->filters["2a"] = true;
                 $this->filters["2a"] = true;
             }
             }
+            if (isset($_GET["homunculus"]) && $_GET["homunculus"] == "on"){
+                $this->filters["homunculus"] = true;
+            }
+
             return;
             return;
         }
         }
 
 
@@ -96,85 +101,76 @@
         private function build_query(){
         private function build_query(){
             $s =
             $s =
               "SELECT DISTINCT " .
               "SELECT DISTINCT " .
-              "  monster.id AS id, " .
-              "  sum( " .
-              "    CASE k_skill.slot " .
-              "      WHEN 1 THEN (monster.skill_1_level - 1) * 1 " .
-              "      WHEN 2 THEN (monster.skill_2_level - 1) * 1.5 " .
-              "      WHEN 3 THEN (monster.skill_3_level - 1) * 2 " .
-              "      WHEN 4 THEN (monster.skill_4_level - 1) * 2.5 " .
-              "      END " .
-              "  ) AS ponderated_level, " .
-              "  sum( " .
-              "    CASE k_skill.slot " .
-              "      WHEN 1 THEN (monster.skill_1_level - 1) " .
-              "      WHEN 2 THEN (monster.skill_2_level - 1) " .
-              "      WHEN 3 THEN (monster.skill_3_level - 1) " .
-              "      WHEN 4 THEN (monster.skill_4_level - 1) " .
-              "      END " .
-              "    ) AS level, " .
-              "  sum( " .
-              "    CASE k_skill.slot " .
-              "      WHEN 1 THEN (k_skill.max_level - 1) * 1 " .
-              "      WHEN 2 THEN (k_skill.max_level - 1) * 1.5 " .
-              "      WHEN 3 THEN (k_skill.max_level - 1) * 2 " .
-              "      WHEN 4 THEN (k_skill.max_level - 1) * 2.5 " .
-              "      END " .
-              "  ) AS ponderated_max_level, " .
-              "  sum( " .
-              "    CASE k_skill.slot " .
-              "      WHEN 1 THEN (k_skill.max_level - 1) " .
-              "      WHEN 2 THEN (k_skill.max_level - 1) " .
-              "      WHEN 3 THEN (k_skill.max_level - 1) " .
-              "      WHEN 4 THEN (k_skill.max_level - 1) " .
-              "      END " .
-              "  ) AS max_level " .
+              "  unit.id AS id, " .
+              "  sum(unit_skill.level * ((k_skill.slot + 1) / 2)) AS ponderated_lvl, " .
+              "  sum(unit_skill.level) AS lvl, " .
+              "  sum(k_skill.max_level * ((k_skill.slot + 1) / 2)) AS ponderated_max_lvl, " .
+              "  sum(k_skill.max_level) AS max_lvl " .
               "FROM " .
               "FROM " .
-              "  monster, " .
-              "  k_monster_skill, " .
-              "  k_skill, " .
-              "  k_monster " .
+              "  unit, " .
+              "  k_unit, " .
+              "  unit_skill, " .
+              "  k_unit_skill, " .
+              "  k_skill " .
               "WHERE " .
               "WHERE " .
-              "  monster.monster = k_monster_skill.monster AND " .
-              "  k_skill.id = k_monster_skill.skill AND " .
-              "  k_monster.id = monster.monster AND " .
-              "  k_skill.max_level > 1 AND " .
-              "  monster.stars >= " . $this->filters["min_stars"] . " AND " .
-              "  monster.stars <= " . $this->filters["max_stars"] . " AND " .
-              "  k_monster.natural_stars >= " . $this->filters["min_natural_stars"] . " AND " .
-              "  k_monster.natural_stars <= " . $this->filters["max_natural_stars"] . " ";
+              "  unit.unit = k_unit.id AND " .
+              "  unit_skill.unit = unit.id AND " .
+              "  unit_skill.skill = k_unit_skill.skill AND " .
+              "  k_unit.id = k_unit_skill.unit AND " .
+              "  k_skill.id = k_unit_skill.skill AND " .
+              "  unit.stars >= " . $this->filters["min_stars"] . " AND " .
+              "  unit.stars <= " . $this->filters["max_stars"] . " ";
+            if ($this->filters["2a"]){
+                error_log("2A - ACTIVE");
+                $s = $s .
+                  "  AND (( " .
+                  "    k_unit.natural_stars >= " . $this->filters["min_natural_stars"] . " AND " .
+                  "    k_unit.natural_stars <= " . $this->filters["max_natural_stars"] . " " .
+                  "  ) OR ( " .
+                  "    k_unit.base_stars - k_unit.natural_stars > 1 " .
+                  "  )) ";
+            }
+            else{
+                $s = $s .
+                  "  AND k_unit.natural_stars >= " . $this->filters["min_natural_stars"] . " AND " .
+                  "  k_unit.natural_stars <= " . $this->filters["max_natural_stars"] . " ";
+            }
             if (!$this->filters["in_storage"]){
             if (!$this->filters["in_storage"]){
-                $s = $s . " AND monster.in_storage = 0 ";
+                // TODO
+                //$s = $s . " AND unit.in_storage = 0 ";
             }
             }
             if (!$this->filters["without_runes"]){
             if (!$this->filters["without_runes"]){
-                $s = $s . " AND monster.id IN (SELECT DISTINCT monster FROM monster_rune) ";
+                $s = $s . " AND unit.id IN (SELECT DISTINCT assigned_to FROM rune) ";
             }
             }
-            if ($this->filters["family"]){
-                $s = $s . " AND monster.monster NOT IN (SELECT id FROM k_monster m WHERE family_id IN (SELECT family_id FROM k_monster k WHERE k.family_id = m.family_id AND k.natural_stars < m.natural_stars AND k.natural_stars < " . $this->filters["min_natural_stars"] . ")) ";
+            if (!$this->filters["family"]){
+                $s = $s . " AND unit.unit NOT IN (SELECT id FROM k_unit m WHERE family IN (SELECT family FROM k_unit k WHERE k.family = m.family AND k.natural_stars < m.natural_stars AND k.natural_stars < " . $this->filters["min_natural_stars"] . ")) ";
                 // Special case: Eirgar (Dark Vampire lord). Nat5 can be powered with 4 star Vampires.
                 // Special case: Eirgar (Dark Vampire lord). Nat5 can be powered with 4 star Vampires.
                 if ($this->filters["min_natural_stars"] >= 5){
                 if ($this->filters["min_natural_stars"] >= 5){
-                    $s = $s . " AND k_monster.id <> 1279 AND k_monster.id <> 1280 ";
+                    $s = $s . " AND k_unit.id <> 19114 AND k_unit.id <> 19104 ";
                 }
                 }
                 // Special case: Fran (Light Fairy Queen). Nat3 can be powered with 2 star Fairies.
                 // Special case: Fran (Light Fairy Queen). Nat3 can be powered with 2 star Fairies.
                 if ($this->filters["min_natural_stars"] >= 3){
                 if ($this->filters["min_natural_stars"] >= 3){
-                    $s = $s . " AND k_monster.id <> 417 AND k_monster.id <> 418 ";
+                    $s = $s . " AND k_unit.id <> 23015 AND k_unit.id <> 23005 ";
                 }
                 }
             }
             }
-            if (!$this->filters["2a"]){
-                $s = $s . " AND (k_monster.awakens_from IS NULL OR k_monster.awakens_to IS NOT NULL OR k_monster.base_stars - k_monster.natural_stars = 1) ";
+            //if (!$this->filters["2a"]){
+            //    $s = $s . " AND (k_unit.awakens_from IS NULL OR k_unit.awakens_to IS NOT NULL OR k_unit.base_stars - k_unit.natural_stars = 1) ";
+            //}
+            if (!$this->filters["homunculus"]){
+                $s = $s . " AND k_unit.homunculus <> 1 ";
             }
             }
             $s = $s .
             $s = $s .
-              "GROUP BY monster.id ";
+              "GROUP BY unit.id ";
             if (!$this->filters["maxed"]){
             if (!$this->filters["maxed"]){
-                $s = $s . " HAVING ponderated_level < ponderated_max_level ";
+                $s = $s . " HAVING ponderated_lvl < ponderated_max_lvl ";
             }
             }
             $s = $s .
             $s = $s .
               "ORDER BY " .
               "ORDER BY " .
-              "  ponderated_level * 100 / ponderated_max_level, " .
-              "  monster.stars DESC, " .
-              "  monster.level DESC, " .
-              "  level * 100 / max_level, " .
-              "  max_level - level DESC; ";
+              "  ponderated_lvl * 100 / ponderated_max_lvl, " .
+              "  unit.stars DESC; " .
+              "  unit.level DESC, " .
+              "  lvl * 100 / max_lvl, " .
+              "  max_lvl - lvl DESC; ";
             return $s;
             return $s;
         }
         }
     }
     }

+ 11 - 10
application/page/Runes_Page.php

@@ -2,7 +2,7 @@
 
 
     require_once($path["page"] . "Page.php");
     require_once($path["page"] . "Page.php");
     require_once($path["entity"] . "Rune.php");
     require_once($path["entity"] . "Rune.php");
-    require_once($path["entity"] . "Monster.php");
+    require_once($path["entity"] . "Unit.php");
 
 
     /**
     /**
      * Rune list page.
      * Rune list page.
@@ -37,7 +37,7 @@
             "min_max_efficiency" => 0,
             "min_max_efficiency" => 0,
             "max_max_efficiency" => 100,
             "max_max_efficiency" => 100,
             "assigned" => 1,
             "assigned" => 1,
-            "group" => "SLOT"
+            "group" => 0 // 0-> SLOT, 1->TYPE
         ];
         ];
 
 
         /**
         /**
@@ -58,7 +58,7 @@
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
             while ($r = $q->fetchArray(SQLITE3_ASSOC)){
                 $rune = new Rune($db, $r["id"]);
                 $rune = new Rune($db, $r["id"]);
                 if (strlen($rune->assigned_to) > 0){
                 if (strlen($rune->assigned_to) > 0){
-                    $rune->assigned_to = new Monster($this->db, $rune->assigned_to, false);
+                    $rune->assigned_to = new Unit($this->db, $rune->assigned_to, false);
                 }
                 }
                 array_push($this->runes, $rune);
                 array_push($this->runes, $rune);
         }
         }
@@ -75,19 +75,19 @@
             if (isset($_GET["type"])){
             if (isset($_GET["type"])){
                 $types = $_GET["type"];
                 $types = $_GET["type"];
                 foreach ($types as $type){
                 foreach ($types as $type){
-                    array_push($this->filters["type"], strtoupper(SQLite3::escapeString($type)));
+                    array_push($this->filters["type"], intval($type));
                 }
                 }
             }
             }
             if (isset($_GET["main"])){
             if (isset($_GET["main"])){
                 $mains = $_GET["main"];
                 $mains = $_GET["main"];
                 foreach ($mains as $main){
                 foreach ($mains as $main){
-                    array_push($this->filters["main"], strtoupper(SQLite3::escapeString($main)));
+                    array_push($this->filters["main"], intval($main));
                 }
                 }
             }
             }
             if (isset($_GET["sub"])){
             if (isset($_GET["sub"])){
                 $subs = $_GET["sub"];
                 $subs = $_GET["sub"];
                 foreach ($subs as $sub){
                 foreach ($subs as $sub){
-                    array_push($this->filters["sub"], strtoupper(SQLite3::escapeString($sub)));
+                    array_push($this->filters["sub"], intval($sub));
                 }
                 }
             }
             }
             if (isset($_GET["slot"])){
             if (isset($_GET["slot"])){
@@ -137,7 +137,7 @@
             if (isset($_GET["assigned"]) && intval($_GET["assigned"]) >= 0 && intval($_GET["assigned"]) <= 4){
             if (isset($_GET["assigned"]) && intval($_GET["assigned"]) >= 0 && intval($_GET["assigned"]) <= 4){
                 $this->filters["assigned"] = $_GET["assigned"];
                 $this->filters["assigned"] = $_GET["assigned"];
             }
             }
-            if (isset($_GET["group"]) && ($_GET["group"] == "SLOT" || $_GET["group"] == "TYPE")){
+            if (isset($_GET["group"]) && ($_GET["group"] == "1" || $_GET["group"] == "0")){
                 $this->filters["group"] = $_GET["group"];
                 $this->filters["group"] = $_GET["group"];
             }
             }
             return;
             return;
@@ -190,14 +190,15 @@
                     $s = $s . " AND assigned_to IS NULL ";
                     $s = $s . " AND assigned_to IS NULL ";
                     break;
                     break;
                 case 3:
                 case 3:
-                    $s = $s . " AND (assigned_to IS NULL OR assigned_to IN (SELECT DISTINCT id FROM monster WHERE in_storage = 0)) ";
+                    // TODO
+                    //$s = $s . " AND (assigned_to IS NULL OR assigned_to IN (SELECT DISTINCT id FROM unit WHERE in_storage = 0)) ";
                     break;
                     break;
                 case 4:
                 case 4:
-                    $s = $s . " AND assigned_to IN (SELECT DISTINCT id FROM monster WHERE in_storage = 0) ";
+                    //$s = $s . " AND assigned_to IN (SELECT DISTINCT id FROM unit WHERE in_storage = 0) ";
                     break;
                     break;
             }
             }
             $s = $s . " ORDER BY ";
             $s = $s . " ORDER BY ";
-            if ($this->filters["group"] == "TYPE"){
+            if ($this->filters["group"] == 0){
                 $s = $s . " type, slot, stars DESC, original_quality DESC, quality DESC, level;";
                 $s = $s . " type, slot, stars DESC, original_quality DESC, quality DESC, level;";
             }
             }
             else{
             else{

+ 4 - 86
application/view/catalog.php

@@ -8,6 +8,7 @@
         <!-- CSS files -->
         <!-- CSS files -->
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>catalog.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>catalog.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>filters.css'/>
         <!-- Script files -->
         <!-- Script files -->
         <script src="<?=$path["js"]?>ui.js"></script>
         <script src="<?=$path["js"]?>ui.js"></script>
         <!-- Meta tags -->
         <!-- Meta tags -->
@@ -37,62 +38,10 @@
             <h2>
             <h2>
                 Catalog filters
                 Catalog filters
             </h2>
             </h2>
-            <form action='/catalog/' method='get'>
-                <table>
-                    <tr>
-                        <td class='filter'>
-                            <span>Element:</span>
 <?php
 <?php
-                            $fire_selected = "";
-                            $water_selected = "";
-                            $wind_selected = "";
-                            $light_selected = "";
-                            $dark_selected = "";
-                            switch (strtoupper($page->filters["element"])){
-                                case "FIRE":
-                                    $fire_selected = "selected='selected'";
-                                    break;
-                                case "WATER":
-                                    $water_selected = "selected='selected'";
-                                    break;
-                                case "WIND":
-                                    $wind_selected = "selected='selected'";
-                                    break;
-                                case "LIGHT":
-                                    $light_selected = "selected='selected'";
-                                    break;
-                                case "DARK":
-                                    $dark_selected = "selected='selected'";
-                                    break;
-                            }
+            $filters = $page->filters;
+            include __DIR__ . "/inc/filter_catalog.php";
 ?>
 ?>
-                            <select name='element' id='filter_type'>
-                                <option value=''>All</option>
-                                <option value='Fire' <?=$fire_selected?>>Fire</option>
-                                <option value='Water' <?=$water_selected?>>Water</option>
-                                <option value='Wind' <?=$wind_selected?>>Wind</option>
-                                <option value='Light' <?=$light_selected?>>Light</option>
-                                <option value='Dark' <?=$dark_selected?>>Dark</option>
-                            </select>
-                        </td>
-                        <td class='filter' id='filter_stars'>
-                            <span>Stars:</span>
-                            <input type='number' name='min_stars' id='filter_stars_min' min='1' max='5' value='<?=$page->filters["min_stars"]?>'/>
-                            -
-                            <input type='number' name='max_stars' id='filter_stars_max' min='1' max='5' value='<?=$page->filters["max_stars"]?>'/>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='2'>
-                            <span>Name:</span>
-                            <input type='text' name='name' id='filter_name' value='<?=$page->filters["name"]?>'/>
-                        </td>
-                    </tr>
-                </table>
-                <div id='filter_apply'>
-                    <input type='submit' value='Apply'/>
-                </div>
-            </form>
         </section> <!-- #filters -->
         </section> <!-- #filters -->
         <section class='list'>
         <section class='list'>
             <h2>
             <h2>
@@ -111,42 +60,11 @@
                         }
                         }
                         $element = $mon->element;
                         $element = $mon->element;
                     }
                     }
-                    if ($mon->awakens_from == "" && $mon->awakens_to == ""){
-                        // No to, no from, silver monster.
-                        $star_class ="star_silver";
-                        $mon_title = $mon->element . " " . $mon->name;
-                    }
-                    elseif ($mon->awakens_from =! "" && $mon->awakens_to == ""){
-                        // Already awakened
-                        if ($mon->base_stars - $mon->natural_stars == 1){
-                            // Normal awaken.
-                            $star_class ="star_purple";
-                        }
-                        else{
-                            // Second awaken.
-                            $star_class ="star_red";
-                        }
-                        $mon_title = $mon->name;
-                    }
-                    elseif ($mon->awakens_to =! ""){
-                        // Awakeable.
-                        $star_class ="star_gold";
-                        $mon_title = $mon->element . " " . $mon->name;
-                    }
 ?>
 ?>
                     <div class='monster'>
                     <div class='monster'>
                         <a href='/catalog/<?=$mon->id?>'>
                         <a href='/catalog/<?=$mon->id?>'>
                             <div class='monster_panel'>
                             <div class='monster_panel'>
-                                <span class='stars'>
-<?php
-                                    for ($i = 0; $i < $mon->natural_stars; $i ++){
-?>
-                                        <img class='star <?=$star_class?>' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
-<?php
-                                    }
-?>
-                                </span>
-                                <img title='<?=$mon_title?>' class='monster border_<?=$mon->element?>' src='<?=$mon->get_image()?>'/>
+                                <?=html_unit_panel($mon)?>
                             </div>
                             </div>
                         </a>
                         </a>
                     </div>
                     </div>

+ 41 - 40
application/view/fusion.php

@@ -8,6 +8,7 @@
         <!-- CSS files -->
         <!-- CSS files -->
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>fusion.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>fusion.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>filters.css'/>
         <!-- Script files -->
         <!-- Script files -->
         <script src="<?=$path["js"]?>ui.js"></script>
         <script src="<?=$path["js"]?>ui.js"></script>
         <!-- Meta tags -->
         <!-- Meta tags -->
@@ -70,7 +71,7 @@
 ?>
 ?>
             <section class='content'>
             <section class='content'>
                 <h2>
                 <h2>
-                    <?=$fusion->product->element?> <?=$fusion->product->name?>
+                    <?=$fusion->product->title?>
                 </h2>
                 </h2>
                 <article>
                 <article>
                     <div class='f5'>
                     <div class='f5'>
@@ -84,7 +85,7 @@
                                         <img class='star star_gold' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                         <img class='star star_gold' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                         <img class='star star_gold' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                         <img class='star star_gold' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                     </span>
                                     </span>
-                                    <img title='<?=$fusion->product->name?>' class='monster border_<?=$fusion->product->element?>' src='<?=$fusion->product->get_image()?>'/>
+                                    <img title='<?=$fusion->product->name?>' class='monster border_<?=$fusion->product->element_name?>' src='<?=$fusion->product->get_image()?>'/>
                                     <span class='level'>
                                     <span class='level'>
                                         1
                                         1
                                     </span>
                                     </span>
@@ -96,14 +97,14 @@
                                 </span>
                                 </span>
 <?php
 <?php
                                 foreach ($fusion->product->owned as $owned){
                                 foreach ($fusion->product->owned as $owned){
-                                    if ($owned->monster->awakens_from == "" && $owned->monster->awakens_to == ""){
+                                    if ($owned->unit->awakens_from == "" && $owned->unit->awakens_to == ""){
                                         // No to, no from, silver monster.
                                         // No to, no from, silver monster.
                                         $star_class ="star_silver";
                                         $star_class ="star_silver";
-                                        $mon_title = $owned->monster->element . " " . $owned->monster->name;
+                                        $mon_title = $owned->unit->element_name . " " . $owned->unit->name;
                                     }
                                     }
-                                    elseif ($owned->monster->awakens_from =! "" && $owned->monster->awakens_to == ""){
+                                    elseif ($owned->unit->awakens_from != "" && $owned->unit->awakens_to == ""){
                                         // Already awakened
                                         // Already awakened
-                                        if ($owned->monster->base_stars - $owned->monster->natural_stars == 1){
+                                        if ($owned->unit->base_stars - $owned->unit->natural_stars == 1){
                                             // Normal awaken.
                                             // Normal awaken.
                                             $star_class ="star_purple";
                                             $star_class ="star_purple";
                                         }
                                         }
@@ -111,12 +112,12 @@
                                             // Second awaken.
                                             // Second awaken.
                                             $star_class ="star_red";
                                             $star_class ="star_red";
                                         }
                                         }
-                                        $mon_title = $owned->monster->name;
+                                        $mon_title = $owned->unit->name;
                                     }
                                     }
-                                    elseif ($owned->monster->awakens_to =! ""){
+                                    elseif ($owned->unit->awakens_to != ""){
                                         // Awakeable.
                                         // Awakeable.
                                         $star_class ="star_gold";
                                         $star_class ="star_gold";
-                                        $mon_title = $owned->monster->element . " " . $owned->monster->name;
+                                        $mon_title = $owned->unit->element_name . " " . $owned->unit->name;
                                     }
                                     }
                                     $mon_title = $mon_title . " - " . $owned->stars . "* - Lv." . $owned->level;
                                     $mon_title = $mon_title . " - " . $owned->stars . "* - Lv." . $owned->level;
 ?>
 ?>
@@ -131,7 +132,7 @@
                                                 }
                                                 }
 ?>
 ?>
                                             </span>
                                             </span>
-                                            <img title='<?=$mon_title?>' class='monster border_<?=$owned->monster->element?>' src='<?=$owned->monster->get_image()?>'/>
+                                            <img title='<?=$mon_title?>' class='monster border_<?=$owned->unit->element_name?>' src='<?=$owned->unit->get_image()?>'/>
                                             <span class='level'>
                                             <span class='level'>
                                                 <?=$owned->level?>
                                                 <?=$owned->level?>
                                             </span>
                                             </span>
@@ -156,7 +157,7 @@
                                                     <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                     <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                     <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                     <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                 </span>
                                                 </span>
-                                                <img title='<?=$sub_fusion->product_awaken->name?>' class='monster border_<?=$sub_fusion->product_awaken->element?>' src='<?=$sub_fusion->product_awaken->get_image()?>'/>
+                                                <img title='<?=$sub_fusion->product_awaken->name?>' class='monster border_<?=$sub_fusion->product_awaken->element_name?>' src='<?=$sub_fusion->product_awaken->get_image()?>'/>
                                                 <span class='level'>
                                                 <span class='level'>
                                                     35
                                                     35
                                                 </span>
                                                 </span>
@@ -173,7 +174,7 @@
                                                     }
                                                     }
 ?>
 ?>
                                                 </span>
                                                 </span>
-                                                <img title='<?=$sub_fusion->product->name?>' class='monster border_<?=$sub_fusion->product->element?>' src='<?=$sub_fusion->product->get_image()?>'/>
+                                                <img title='<?=$sub_fusion->product->name?>' class='monster border_<?=$sub_fusion->product->element_name?>' src='<?=$sub_fusion->product->get_image()?>'/>
                                                 <span class='level'>
                                                 <span class='level'>
                                                     1
                                                     1
                                                 </span>
                                                 </span>
@@ -199,14 +200,14 @@
                                             </span>
                                             </span>
 <?php
 <?php
                                             foreach ($sub_fusion->product->owned as $owned){
                                             foreach ($sub_fusion->product->owned as $owned){
-                                                if ($owned->monster->awakens_from == "" && $owned->monster->awakens_to == ""){
+                                                if ($owned->unit->awakens_from == "" && $owned->unit->awakens_to == ""){
                                                     // No to, no from, silver monster.
                                                     // No to, no from, silver monster.
                                                     $star_class ="star_silver";
                                                     $star_class ="star_silver";
-                                                    $mon_title = $owned->monster->element . " " . $owned->monster->name;
+                                                    $mon_title = $owned->unit->element_name . " " . $owned->unit->name;
                                                 }
                                                 }
-                                                elseif ($owned->monster->awakens_from =! "" && $owned->monster->awakens_to == ""){
+                                                elseif ($owned->unit->awakens_from != "" && $owned->unit->awakens_to == ""){
                                                     // Already awakened
                                                     // Already awakened
-                                                    if ($owned->monster->base_stars - $owned->monster->natural_stars == 1){
+                                                    if ($owned->unit->base_stars - $owned->unit->natural_stars == 1){
                                                         // Normal awaken.
                                                         // Normal awaken.
                                                         $star_class ="star_purple";
                                                         $star_class ="star_purple";
                                                     }
                                                     }
@@ -214,12 +215,12 @@
                                                         // Second awaken.
                                                         // Second awaken.
                                                         $star_class ="star_red";
                                                         $star_class ="star_red";
                                                     }
                                                     }
-                                                    $mon_title = $owned->monster->name;
+                                                    $mon_title = $owned->unit->name;
                                                 }
                                                 }
-                                                elseif ($owned->monster->awakens_to =! ""){
+                                                elseif ($owned->unit->awakens_to != ""){
                                                     // Awakeable.
                                                     // Awakeable.
                                                     $star_class ="star_gold";
                                                     $star_class ="star_gold";
-                                                    $mon_title = $owned->monster->element . " " . $owned->monster->name;
+                                                    $mon_title = $owned->unit->element_name . " " . $owned->unit->name;
                                                 }
                                                 }
                                                 $mon_title = $mon_title . " - " . $owned->stars . "* - Lv." . $owned->level;
                                                 $mon_title = $mon_title . " - " . $owned->stars . "* - Lv." . $owned->level;
 ?>
 ?>
@@ -234,7 +235,7 @@
                                                             }
                                                             }
 ?>
 ?>
                                                         </span>
                                                         </span>
-                                                        <img title='<?=$mon_title?>' class='monster border_<?=$owned->monster->element?>' src='<?=$owned->monster->get_image()?>'/>
+                                                        <img title='<?=$mon_title?>' class='monster border_<?=$owned->unit->element_name?>' src='<?=$owned->unit->get_image()?>'/>
                                                         <span class='level'>
                                                         <span class='level'>
                                                             <?=$owned->level?>
                                                             <?=$owned->level?>
                                                         </span>
                                                         </span>
@@ -259,7 +260,7 @@
                                                                 <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                                 <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                                 <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                                 <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                             </span>
                                                             </span>
-                                                            <img title='<?=$sub_monster->name?>' class='monster border_<?=$sub_monster->element?>' src='<?=$sub_monster->get_image()?>'/>
+                                                            <img title='<?=$sub_monster->name?>' class='monster border_<?=$sub_monster->element_name?>' src='<?=$sub_monster->get_image()?>'/>
                                                             <span class='level'>
                                                             <span class='level'>
                                                                 30
                                                                 30
                                                             </span>
                                                             </span>
@@ -290,7 +291,7 @@
                                                                 }
                                                                 }
 ?>
 ?>
                                                             </span>
                                                             </span>
-                                                            <img title='<?=$sub_fusion->ingredient_unawaken[$num]->name?>' class='monster border_<?=$sub_fusion->ingredient_unawaken[$num]->element?>' src='<?=$sub_fusion->ingredient_unawaken[$num]->get_image()?>'/>
+                                                            <img title='<?=$sub_fusion->ingredient_unawaken[$num]->name?>' class='monster border_<?=$sub_fusion->ingredient_unawaken[$num]->element_name?>' src='<?=$sub_fusion->ingredient_unawaken[$num]->get_image()?>'/>
                                                             <span class='level'>
                                                             <span class='level'>
                                                                 1
                                                                 1
                                                             </span>
                                                             </span>
@@ -302,14 +303,14 @@
                                                         </span>
                                                         </span>
 <?php
 <?php
                                                         foreach ($sub_monster->owned as $owned){
                                                         foreach ($sub_monster->owned as $owned){
-                                                            if ($owned->monster->awakens_from == "" && $owned->monster->awakens_to == ""){
+                                                            if ($owned->unit->awakens_from == "" && $owned->unit->awakens_to == ""){
                                                                 // No to, no from, silver monster.
                                                                 // No to, no from, silver monster.
                                                                 $star_class ="star_silver";
                                                                 $star_class ="star_silver";
-                                                                $mon_title = $owned->monster->element . " " . $owned->monster->name;
+                                                                $mon_title = $owned->unit->element_name . " " . $owned->unit->name;
                                                             }
                                                             }
-                                                            elseif ($owned->monster->awakens_from =! "" && $owned->monster->awakens_to == ""){
+                                                            elseif ($owned->unit->awakens_from != "" && $owned->unit->awakens_to == ""){
                                                                 // Already awakened
                                                                 // Already awakened
-                                                                if ($owned->monster->base_stars - $owned->monster->natural_stars == 1){
+                                                                if ($owned->unit->base_stars - $owned->unit->natural_stars == 1){
                                                                     // Normal awaken.
                                                                     // Normal awaken.
                                                                     $star_class ="star_purple";
                                                                     $star_class ="star_purple";
                                                                 }
                                                                 }
@@ -317,12 +318,12 @@
                                                                     // Second awaken.
                                                                     // Second awaken.
                                                                     $star_class ="star_red";
                                                                     $star_class ="star_red";
                                                                 }
                                                                 }
-                                                                $mon_title = $owned->monster->name;
+                                                                $mon_title = $owned->unit->name;
                                                             }
                                                             }
-                                                            elseif ($owned->monster->awakens_to =! ""){
+                                                            elseif ($owned->unit->awakens_to != ""){
                                                                 // Awakeable.
                                                                 // Awakeable.
                                                                 $star_class ="star_gold";
                                                                 $star_class ="star_gold";
-                                                                $mon_title = $owned->monster->element . " " . $owned->monster->name;
+                                                                $mon_title = $owned->unit->element_name . " " . $owned->unit->name;
                                                             }
                                                             }
                                                             $mon_title = $mon_title . " - " . $owned->stars . "* - Lv." . $owned->level;
                                                             $mon_title = $mon_title . " - " . $owned->stars . "* - Lv." . $owned->level;
 ?>
 ?>
@@ -337,7 +338,7 @@
                                                                         }
                                                                         }
 ?>
 ?>
                                                                     </span>
                                                                     </span>
-                                                                    <img title='<?=$mon_title?>' class='monster border_<?=$owned->monster->element?>' src='<?=$owned->monster->get_image()?>'/>
+                                                                    <img title='<?=$mon_title?>' class='monster border_<?=$owned->unit->element_name?>' src='<?=$owned->unit->get_image()?>'/>
                                                                     <span class='level'>
                                                                     <span class='level'>
                                                                         <?=$owned->level?>
                                                                         <?=$owned->level?>
                                                                     </span>
                                                                     </span>
@@ -370,7 +371,7 @@
                                                 <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                 <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                 <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                                 <img class='star star_purple' src='<?=$path["img"]["layout"]?>icon/star.png'/>
                                             </span>
                                             </span>
-                                            <img title='<?=$fusion->ingredient[0]->name?>' class='monster border_<?=$fusion->ingredient[0]->element?>' src='<?=$fusion->ingredient[0]->get_image()?>'/>
+                                            <img title='<?=$fusion->ingredient[0]->name?>' class='monster border_<?=$fusion->ingredient[0]->element_name?>' src='<?=$fusion->ingredient[0]->get_image()?>'/>
                                             <span class='level'>
                                             <span class='level'>
                                                 35
                                                 35
                                             </span>
                                             </span>
@@ -401,7 +402,7 @@
                                                 }
                                                 }
 ?>
 ?>
                                             </span>
                                             </span>
-                                            <img title='<?=$fusion->ingredient_unawaken[0]->name?>' class='monster border_<?=$fusion->ingredient_unawaken[0]->element?>' src='<?=$fusion->ingredient_unawaken[0]->get_image()?>'/>
+                                            <img title='<?=$fusion->ingredient_unawaken[0]->name?>' class='monster border_<?=$fusion->ingredient_unawaken[0]->element_name?>' src='<?=$fusion->ingredient_unawaken[0]->get_image()?>'/>
                                             <span class='level'>
                                             <span class='level'>
                                                 1
                                                 1
                                             </span>
                                             </span>
@@ -417,14 +418,14 @@
                                             <div class='monster_panel'>
                                             <div class='monster_panel'>
                                                 <span class='stars'>
                                                 <span class='stars'>
 <?php
 <?php
-                                                    if ($owned->monster->awakens_from == "" && $owned->monster->awakens_to == ""){
+                                                    if ($owned->unit->awakens_from == "" && $owned->unit->awakens_to == ""){
                                                         // No to, no from, silver monster.
                                                         // No to, no from, silver monster.
                                                         $star_class ="star_silver";
                                                         $star_class ="star_silver";
-                                                        $mon_title = $owned->monster->element . " " . $owned->monster->name;
+                                                        $mon_title = $owned->unit->element_name . " " . $owned->unit->name;
                                                     }
                                                     }
-                                                    elseif ($owned->monster->awakens_from =! "" && $owned->monster->awakens_to == ""){
+                                                    elseif ($owned->unit->awakens_from != "" && $owned->unit->awakens_to == ""){
                                                         // Already awakened
                                                         // Already awakened
-                                                        if ($owned->monster->base_stars - $owned->monster->natural_stars == 1){
+                                                        if ($owned->unit->base_stars - $owned->unit->natural_stars == 1){
                                                             // Normal awaken.
                                                             // Normal awaken.
                                                             $star_class ="star_purple";
                                                             $star_class ="star_purple";
                                                         }
                                                         }
@@ -432,12 +433,12 @@
                                                             // Second awaken.
                                                             // Second awaken.
                                                             $star_class ="star_red";
                                                             $star_class ="star_red";
                                                         }
                                                         }
-                                                        $mon_title = $owned->monster->name;
+                                                        $mon_title = $owned->unit->name;
                                                     }
                                                     }
-                                                    elseif ($owned->monster->awakens_to =! ""){
+                                                    elseif ($owned->unit->awakens_to != ""){
                                                         // Awakeable.
                                                         // Awakeable.
                                                         $star_class ="star_gold";
                                                         $star_class ="star_gold";
-                                                        $mon_title = $owned->monster->element . " " . $owned->monster->name;
+                                                        $mon_title = $owned->unit->element_name . " " . $owned->unit->name;
                                                     }
                                                     }
                                                     for ($i = 0; $i < $owned->stars; $i ++){
                                                     for ($i = 0; $i < $owned->stars; $i ++){
 ?>
 ?>
@@ -446,7 +447,7 @@
                                                     }
                                                     }
 ?>
 ?>
                                                 </span>
                                                 </span>
-                                                <img title='<?=$mon_title?>' class='monster border_<?=$owned->monster->element?>' src='<?=$owned->monster->get_image()?>'/>
+                                                <img title='<?=$mon_title?>' class='monster border_<?=$owned->unit->element_name?>' src='<?=$owned->unit->get_image()?>'/>
                                                 <span class='level'>
                                                 <span class='level'>
                                                     <?=$owned->level?>
                                                     <?=$owned->level?>
                                                 </span>
                                                 </span>

+ 287 - 0
application/view/guild.php

@@ -0,0 +1,287 @@
+<?php
+    global $GUILD_MEMBER_GRADE;
+    global $ARENA_RANKING_POINTS;
+    global $ARENA_RANKING_RANK;
+?>
+<!DOCTYPE html>
+<html lang='en'>
+    <head>
+        <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
+        <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
+        <title><?=$page->title?></title>
+        <link rel='shortcut icon' href='<?=$page->favicon?>'/>
+        <!-- CSS files -->
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>guild.css'/>
+        <!-- Script files -->
+        <script src="<?=$path["js"]?>ui.js"></script>
+        <!-- Meta tags -->
+        <link rel='canonical' href='<?=$page->canonical?>'/>
+        <link rel='author' href='<?=$page->author?>'/>
+        <link rel='publisher' href='<?=$page->author?>'/>
+        <meta name='description' content='<?=$page->description?>'/>
+        <meta property='og:title' content='<?=$page->title?>'/>
+        <meta property='og:url' content='<?=$page->canonical?>'/>
+        <meta property='og:description' content='<?=$page->description?>'/>
+        <meta property='og:image' content='<?=$page->icon?>'/>
+        <meta property='og:site_name' content='<?=$page->name?>'/>
+        <meta property='og:type' content='website'/>
+        <meta property='og:locale' content='en'/>
+        <meta name='twitter:card' content='summary'/>
+        <meta name='twitter:title' content='<?=$page->title?>'/>
+        <meta name='twitter:description' content='<?=$page->description?>'/>
+        <meta name='twitter:image' content='<?=$page->icon?>'/>
+        <meta name='twitter:url' content='<?=$page->canonical?>'/>
+        <meta name='robots' content='index follow'/>
+    </head>
+    <body>
+<?php
+        include __DIR__ . "/inc/header.php";
+        if (!isset($page->guild)){
+?>
+            <section id='no_guild'>
+                <h2>
+                    Guild
+                </h2>
+                You are not currently in a guild.
+            </section>
+<?php
+        }
+        else{
+?>
+            <section id='guild_info' class='content'>
+                <h2>
+                    <?=$page->guild->name?>
+                </h2>
+                <div id='guild_details'>
+                    <span id='guild_level'>
+                        Lv. <?=$page->guild->level?>
+                    </span>
+                    <span id='guild_experience'>
+                        (Exp: <?=$page->guild->experience?>)
+                    </span>
+                    <p id='guild_comment'>
+                        <?=$page->guild->comment?>
+                    </p>
+                    <p id='guild_notice'>
+                        <?=$page->guild->notice?>
+                    </p>
+                    <div id='guild_skills'>
+<?php
+                        foreach ($page->skill_groups as $group){
+?>
+                            <div class='skill_group'>
+                                <span class='skill_group_title'>
+                                    <?=$group->name?>
+                                </span>
+                                <img class='skill_group_image' alt='<?=$group->name?>' src='<?=$group->get_image()?>'/>
+                                <ul>
+                                    <li class='description'>
+                                        <?=$group->description?>
+                                    </li>
+<?php
+                                    foreach ($group->skills as $skill){
+                                        if ($skill->level > $page->guild->level){
+                                            $unavailable = "unavailable";
+                                        }
+                                        else{
+                                            $unavailable = "";
+                                        }
+?>
+                                        <li class='<?=$unavailable?>'>
+                                            Lv. <?=$skill->level?>: <?=$skill->effect?>
+                                        </li>
+<?php
+                                    }
+?>
+                                </ul>
+                            </div>
+<?php
+                        }
+?>
+                    </div>
+                </div>
+                <table id='guild_members'>
+                    <tr>
+                        <th>
+                            &nbsp;
+                        </th>
+                        <th>
+                            Name
+                        </th>
+                        <th>
+                            Lv.
+                        </th>
+                        <th colspan='2'>
+                            Arena
+                        </th>
+                        <th>
+                            War
+                        </th>
+                        <th>
+                            Def
+                        </th>
+                        <th>
+                            Login
+                        </th>
+                    </tr>
+<?php
+                    $odd = "";
+                    foreach ($page->guild->members as $member){
+?>
+                        <tr>
+                            <td class='grade <?=$odd?>'>
+<?php
+                                if ($member->grade == $GUILD_MEMBER_GRADE["LEADER"]){
+?>
+                                    <img alt='yes' src='<?=$path["img"]["layout"] . "icon/leader.png"?>'/>
+<?php
+                                }
+                                elseif ($member->grade == $GUILD_MEMBER_GRADE["VICELEADER"]){
+?>
+                                    <img alt='yes' src='<?=$path["img"]["layout"] . "icon/viceleader.png"?>'/>
+<?php
+                                }
+?>
+                            </td>
+                            <td class='name <?=$odd?>'>
+                                <?=$member->name?>
+                            </td>
+                            <td class='level <?=$odd?>'>
+                                <?=$member->level?>
+                            </td>
+                            <td class='score <?=$odd?>'>
+                                <?=$member->arena_score?>
+                            </td>
+                            <td class='score_icon <?=$odd?>'>
+<?php
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["BEGINER"] && ($ARENA_RANKING_RANK["BEGINER"] == null || $member->rating <= $ARENA_RANKING_RANK["BEGINER"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_beg.png";
+                                    $tit = "Beginer";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["CHALLENGER_1"] && ($ARENA_RANKING_RANK["CHALLENGER_1"] == null || $member->rating <= $ARENA_RANKING_RANK["CHALLENGER_1"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_cha1.png";
+                                    $tit = "Challenger 1";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["CHALLENGER_2"] && ($ARENA_RANKING_RANK["CHALLENGER_2"] == null || $member->rating <= $ARENA_RANKING_RANK["CHALLENGER_2"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_cha2.png";
+                                    $tit = "Challenger 2";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["CHALLENGER_3"] && ($ARENA_RANKING_RANK["CHALLENGER_3"] == null || $member->rating <= $ARENA_RANKING_RANK["CHALLENGER_3"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_cha3.png";
+                                    $tit = "Challenger 3";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["FIGHTER_1"] && ($ARENA_RANKING_RANK["FIGHTER_1"] == null || $member->rating <= $ARENA_RANKING_RANK["FIGHTER_1"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_fig1.png";
+                                    $tit = "Fighter 1";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["FIGHTER_2"] && ($ARENA_RANKING_RANK["FIGHTER_2"] == null || $member->rating <= $ARENA_RANKING_RANK["FIGHTER_2"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_fig2.png";
+                                    $tit = "Fighter 2";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["FIGHTER_3"] && ($ARENA_RANKING_RANK["FIGHTER_3"] == null || $member->rating <= $ARENA_RANKING_RANK["FIGHTER_3"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_fig3.png";
+                                    $tit = "Fighter 3";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["CONQUEROR_1"] && ($ARENA_RANKING_RANK["CONQUEROR_1"] == null || $member->rating <= $ARENA_RANKING_RANK["CONQUEROR_1"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_con1.png";
+                                    $tit = "Conqueror 1";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["CONQUEROR_2"] && ($ARENA_RANKING_RANK["CONQUEROR_2"] == null || $member->rating <= $ARENA_RANKING_RANK["CONQUEROR_2"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_con2.png";
+                                    $tit = "Conqueror 2";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["CONQUEROR_3"] && ($ARENA_RANKING_RANK["CONQUEROR_3"] == null || $member->rating <= $ARENA_RANKING_RANK["CONQUEROR_3"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_con3.png";
+                                    $tit = "Conqueror 3";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["GUARDIAN_1"] && ($ARENA_RANKING_RANK["GUARDIAN_1"] == null || $member->rating <= $ARENA_RANKING_RANK["GUARDIAN_1"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_gua1.png";
+                                    $tit = "Guardian 1";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["GUARDIAN_2"] && ($ARENA_RANKING_RANK["GUARDIAN_2"] == null || $member->rating <= $ARENA_RANKING_RANK["GUARDIAN_2"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_gua2.png";
+                                    $tit = "Guardian 2";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["GUARDIAN_3"] && ($ARENA_RANKING_RANK["GUARDIAN_3"] == null || $member->rating <= $ARENA_RANKING_RANK["GUARDIAN_3"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_gua3.png";
+                                    $tit = "Guardian 3";
+                                }
+                                if ($member->arena_score >= $ARENA_RANKING_POINTS["LEGEND"] && ($ARENA_RANKING_RANK["LEGEND"] == null || $member->rating <= $ARENA_RANKING_RANK["LEGEND"])){
+                                    $src = $path["img"]["layout"] . "icon/rank_leg.png";
+                                    $tit = "Legend";
+                                }
+?>
+                                <img alt='<?=$tit?>' src='<?=$src?>'/>
+                            </td>
+                            <td class='war <?=$odd?>'>
+<?php
+                                if ($member->in_war){
+?>
+                                    <img alt='yes' src='<?=$path["img"]["layout"] . "icon/ok.png"?>'/>
+<?php
+                                }
+?>
+                            </td>
+                            <td class='defense <?=$odd?>'>
+<?php
+                                if ($member->has_defense){
+?>
+                                    <img alt='yes' src='<?=$path["img"]["layout"] . "icon/ok.png"?>'/>
+<?php
+                                }
+?>
+                            </td>
+<?php
+                            $now = time();
+                            $date = (new DateTime("@$member->last_login"))->format('Y-m-d H:i:s');
+                            $days = $now - strtotime($date);
+                            $days = floor($days / (60 * 60 * 24));
+                            if ($days == 0){
+                                $hours = floor($days / (60 * 60));
+                                if ($hours == 0){
+                                    $last_login = "Online";
+                                }
+                                else if ($hours == 1){
+                                    $last_login = "1 hour";
+                                }
+                                else{
+                                    $last_login = floor($days / (60 * 60)) . " hours";
+                                }
+                                $warning = "";
+                            }
+                            else{
+                                $last_login = "$days days";
+                                if ($days < 2){
+                                    $last_login = "$days day";
+                                    $warning = "";
+                                }
+                                elseif ($days < 5){
+                                    $warning = "warning";
+                                }
+                                else{
+                                    $warning = "danger";
+                                }
+                            }
+?>
+                            <td class='last_login <?=$odd?> <?=$warning?>'>
+                                <?=$last_login?>
+                            </td>
+                        </tr>
+<?php
+                        if ($odd == ""){
+                            $odd = "odd";
+                        }
+                        else{
+                            $odd = "";
+                        }
+                    }
+?>
+                </table>
+            </section>
+<?php
+        }
+        include __DIR__ . "/inc/footer.php";
+?>
+    </body>
+</html>

+ 167 - 0
application/view/home.php

@@ -39,6 +39,173 @@
                     Summoners War DataBase
                     Summoners War DataBase
                 </span>
                 </span>
             </h2>
             </h2>
+            <article id='profile'>
+                <h3>
+                    <?=$page->name?>
+                </h3>
+                <div id='info'>
+<?php
+                    if (isset($page->rep)){
+?>
+                        <div id='rep'>
+                            <h4>
+                                Rep. Monster:
+                            </h4>
+                            <div class='monster_panel'>
+                                <?=html_unit_panel($page->rep)?>
+                            </div> <!-- .monster_panel -->
+                        </div>
+<?php
+                    } // if (isset($page->rep))
+?>
+                    <div id='defense'>
+                        <h4>
+                            Arena defense:
+                        </h4>
+<?php
+                        foreach ($page->defense as $defense){
+?>
+                            <div class='monster_panel'>
+                                <?=html_unit_panel($defense)?>
+                            </div>
+<?php
+                        }
+?>
+                    </div>
+                    <div id='building'>
+                        <h4>
+                            Buildings:
+                        </h4>
+<?php
+                        foreach ($page->building as $building){
+?>
+                            <?=html_building_panel($building)?>
+<?php
+                        }
+?>
+                    </div>
+                    <div id='decoration'>
+                        <h4>
+                            Decorations:
+                        </h4>
+<?php
+                        foreach ($page->decoration as $decoration){
+?>
+                            <?=html_building_panel($decoration)?>
+<?php
+                        }
+?>
+                    </div>
+                    <div class='inventory' id='inventory_scroll'>
+                        <h4>
+                            Scrolls:
+                        </h4>
+<?php
+                        foreach ($page->inventory_scroll as $item){
+?>
+                            <?=html_item_panel($item)?>
+<?php
+                        }
+?>
+                    </div>
+                    <div class='inventory' id='inventory_craft_rune'>
+                        <h4>
+                            Rune crafting items:
+                        </h4>
+<?php
+                        foreach ($page->inventory_craft_rune as $item){
+?>
+                            <?=html_item_panel($item)?>
+<?php
+                        }
+?>
+                    </div>
+                    <div class='inventory' id='inventory_craft'>
+                        <h4>
+                            Other crafting items:
+                        </h4>
+<?php
+                        foreach ($page->inventory_craft as $item){
+?>
+                            <?=html_item_panel($item)?>
+<?php
+                        }
+?>
+                    </div>
+                    <div class='inventory' id='inventory_essence'>
+                        <h4>
+                            Essences:
+                        </h4>
+<?php
+                        foreach ($page->inventory_essence as $item){
+?>
+                            <?=html_item_panel($item)?>
+<?php
+                        }
+?>
+                    </div>
+                </div>
+                <div id='currency'>
+                    <ul>
+                        <li>
+                            <img title='Energy' src='<?=$path["img"]["layout"]?>currency/energy.png'/>
+                            <?=$page->currency["energy"]?> / <?=$page->currency["energy_max"]?>
+                        </li>
+                        <li>
+                            <img title='Arena Invitations' src='<?=$path["img"]["layout"]?>currency/arenaenergy.png'/>
+                            <?=$page->currency["arena_energy"]?> / <?=$page->currency["arena_energy_max"]?>
+                        </li>
+                        <li>
+                            <img title='Dimensional Energy' src='<?=$path["img"]["layout"]?>currency/dimensionenergy.png'/>
+                            <?=$page->currency["dimension_energy"]?> / <?=$page->currency["dimension_energy_max"]?>
+                        </li>
+                        <li>
+                            <img title='Dimensional Crystal' src='<?=$path["img"]["layout"]?>currency/darkportalenergy.png'/>
+                            <?=$page->currency["darkportal_energy"]?> / <?=$page->currency["darkportal_energy_max"]?>
+                        </li>
+                        <li>
+                            <img title='Mana' src='<?=$path["img"]["layout"]?>currency/mana.png'/>
+                            <?=$page->currency["mana"]?>
+                        </li>
+                        <li>
+                            <img title='Crystal' src='<?=$path["img"]["layout"]?>currency/crystal.png'/>
+                            <?=$page->currency["crystal"]?>
+                        </li>
+                        <li>
+                            <img title='Social Points' src='<?=$path["img"]["layout"]?>currency/socialpoint.png'/>
+                            <?=$page->currency["social_point"]?>
+                        </li>
+                        <li>
+                            <img title='Honor Points' src='<?=$path["img"]["layout"]?>currency/honor.png'/>
+                            <?=$page->currency["honor_point"]?>
+                        </li>
+                        <li>
+                            <img title='Guild Points' src='<?=$path["img"]["layout"]?>currency/guildpoint.png'/>
+                            <?=$page->currency["guild_point"]?>
+                        </li>
+                        <li>
+                            <img title='Honor Medals' src='<?=$path["img"]["layout"]?>currency/badge.png'/>
+                            <?=$page->currency["honor_medal"]?>
+                        </li>
+                        <li>
+                            <img src='<?=$path["img"]["layout"]?>currency/mark.png'/>
+                            <?=$page->currency["honor_mark"]?>
+                        </li>
+                        <li>
+                            <img title='Ancient Coins' src='<?=$path["img"]["layout"]?>currency/ancientcoin.png'/>
+                            <?=$page->currency["event_coin"]?>
+                        </li>
+                        <li>
+                            <img title='Ancient Crystal' src='<?=$path["img"]["layout"]?>currency/ancientstone.png'/>
+                            <?=$page->currency["ancient_stone"]?>
+                        </li>
+                        <li>
+                            <img title='Shapeshifting Stones' src='<?=$path["img"]["layout"]?>currency/costumestone.png'/>
+                            <?=$page->currency["costume_point"]?>
+                        </li>
+                    </ul>
+                </div>
+            </article>
             <article>
             <article>
                 <h3>
                 <h3>
                     <a href='/catalog'>
                     <a href='/catalog'>

+ 38 - 0
application/view/inc/filter_catalog.php

@@ -0,0 +1,38 @@
+<?php
+    global $ELEMENT;
+?>
+<form action='/catalog/' method='get' id='filter_catalog' class='filter'>
+    <table>
+        <tr>
+            <td class='filter'>
+                <span>Element:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["element"]] = "selected";
+?>
+                <select name='element'>
+                    <option value='<?=$ELEMENT["FIRE"]?>' <?=$selected[0]?>>Fire</option>
+                    <option value='<?=$ELEMENT["WATER"]?>' <?=$selected[1]?>>Water</option>
+                    <option value='<?=$ELEMENT["WIND"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$ELEMENT["LIGHT"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$ELEMENT["DARK"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+            <td class='filter' id='filter_stars'>
+                <span>Stars:</span>
+                <input type='number' name='min_stars' id='filter_stars_min' min='1' max='5' value='<?=$filters["min_stars"]?>'/>
+                -
+                <input type='number' name='max_stars' id='filter_stars_max' min='1' max='5' value='<?=$filters["max_stars"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+                <span>Name:</span>
+                <input type='text' name='name' id='filter_name' value='<?=$filters["name"]?>'/>
+            </td>
+        </tr>
+    </table>
+    <div id='filter_apply'>
+        <input type='submit' value='Apply'/>
+    </div>
+</form>

+ 63 - 0
application/view/inc/filter_monsters.php

@@ -0,0 +1,63 @@
+<?php
+    global $ELEMENT;
+?>
+<form action='/monsters/' method='get'  id='filter_monsters' class='filter'>
+    <table>
+        <tr>
+            <td class='filter'>
+                <span>Element:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["element"]] = "selected";
+?>
+                <select name='element'>
+                    <option> </option>
+                    <option value='<?=$ELEMENT["FIRE"]?>' <?=$selected[0]?>>Fire</option>
+                    <option value='<?=$ELEMENT["WATER"]?>' <?=$selected[1]?>>Water</option>
+                    <option value='<?=$ELEMENT["WIND"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$ELEMENT["LIGHT"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$ELEMENT["DARK"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+            <td class='filter' id='filter_stars'>
+                <span>Stars:</span>
+                <input type='number' name='min_stars' id='filter_stars_min' min='1' max='6' value='<?=filters["min_stars"]?>'/>
+                -
+                <input type='number' name='max_stars' id='filter_stars_max' min='1' max='6' value='<?=filters["max_stars"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+                <span>Name:</span>
+                <input type='text' name='name' id='filter_name' value='<?=$page->filters["name"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+<?php
+                $checked = "";
+                if ($page->filters["in_storage"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='in_storage' <?=$checked?>/>
+                Show monsters in storage
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+<?php
+                $checked = "";
+                if ($page->filters["without_runes"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='without_runes' <?=$checked?>/>
+                Show monsters without runes
+            </td>
+        </tr>
+    </table>
+    <div id='filter_apply'>
+        <input type='submit' value='Apply'/>
+    </div>
+</form>

+ 260 - 0
application/view/inc/filter_report_runecraft.php

@@ -0,0 +1,260 @@
+<?php
+    global $RUNE_STAT;
+    global $QUALITY;
+?>
+<form action='/report/runecraft/' method='get' id='filter_runecraft' class='filter'>
+    <table>
+        <tr>
+            <td class='filter filter_title' rowspan='2'>
+                <span>
+                    Monster
+                </span>
+            </td>
+            <td class='filter' colspan='3'>
+                <span>Name:</span>
+                <input type='text' name='monster_name' id='filter_name' value='<?=$filters["monster_name"]?>'/>
+            </td>
+            <td class='filter'>
+                <span>Stars:</span>
+                <input type='number' name='monster_min_stars' id='filter_stars_min' min='1' max='6' value='<?=$filters["monster_min_stars"]?>'/>
+                -
+                <input type='number' name='monster_max_stars' id='filter_stars_max' min='1' max='6' value='<?=$filters["monster_max_stars"]?>'/>
+            </td>
+        </tr>
+            <td class='filter' colspan='4'>
+<?php
+                $checked = "";
+                if ($filters["monster_in_storage"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='monster_in_storage' <?=$checked?>/>
+                Show monsters in storage
+            </td>
+        </tr>
+        <tr>
+            <td class='filter filter_title filter_separator' rowspan='5'>
+                <span>
+                    Runes
+                </span>
+            </td>
+            <td class='filter filter_stars filter_separator' colspan='2'>
+                <span>Stars:</span>
+                <input type='number' name='rune_min_stars' id='filter_stars_min' min='1' max='6' value='<?=$filters["rune_min_stars"]?>'/>
+                -
+                <input type='number' name='rune_max_stars' id='filter_stars_max' min='1' max='6' value='<?=$filters["rune_max_stars"]?>'/>
+            </td>
+            <td class='filter filter_separator' colspan='2'>
+                <span>Level:</span>
+                <input type='number' name='rune_min_level' id='filter_level_min' min='0' max='15' value='<?=$filters["rune_min_level"]?>'/>
+                -
+                <input type='number' name='rune_max_level' id='filter_level_max' min='0' max='15' value='<?=$filters["rune_max_level"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' rowspan='4'>
+                <span>Slot:</span>
+                <select multiple name='rune_slot[]' id='filter_slot'>
+<?php
+                    for ($i = 1; $i <= 6; $i ++){
+                        if (in_array($i, $filters["rune_slot"])){
+                            $selected = "selected='selected'";
+                        }
+                        else{
+                            $selected = "";
+                        }
+?>
+                        <option value='<?=$i?>' <?=$selected?>><?=$i?></option>
+<?php
+                    }
+?>
+                </select>
+            </td>
+            <td class='filter' colspan='3'>
+                <span>Quality:</span>
+<?php
+
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["rune_min_quality"]] = "selected";
+?>
+                <select name='rune_min_quality' id='filter_quality_min'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+                -
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["rune_max_quality"]] = "selected";
+?>
+                <select name='rune_max_quality' id='filter_quality_max'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='3'>
+                <span>Original quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["rune_min_original_quality"]] = "selected";
+?>
+                <select name='rune_min_original_quality' id='filter_original_quality_min'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+                -
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["rune_max_original_quality"]] = "selected";
+?>
+                <select name='rune_max_original_quality' id='filter_original_quality_max'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='3'>
+                <span>Efficiency:</span>
+                <input type='number' name='rune_min_efficiency' id='filter_efficiency_min' min='0' max='100' value='<?=$filters["rune_min_efficiency"]?>'/>%
+                -
+                <input type='number' name='rune_max_efficiency' id='filter_efficiency_max' min='0' max='100' value='<?=$filters["rune_max_efficiency"]?>'/>%
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='3'>
+                <span>Maximum efficiency:</span>
+                <input type='number' name='rune_min_max_efficiency' id='filter_max_efficiency_min' min='0' max='100' value='<?=$filters["rune_min_max_efficiency"]?>'/>%
+                -
+                <input type='number' name='rune_max_max_efficiency' id='filter_max_efficiency_max' min='0' max='100' value='<?=$filters["rune_max_max_efficiency"]?>'/>%
+            </td>
+        </tr>
+        <tr>
+            <td class='filter filter_title filter_separator'>
+                <span>
+                    Grindstones
+                </span>
+            </td>
+            <td class='filter filter_stars filter_separator'>
+<?php
+                $checked = "";
+                if ($filters["grind"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='grind' <?=$checked?>/> Grindstones
+            </td>
+            <td class='filter filter_separator'>
+                <span>Min. quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["grind_min_quality"]] = "selected";
+?>
+                <select name='grind_min_quality'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+            <td class='filter filter_separator' colspan='2'>
+                <span>Stats:</span>
+                <select multiple name='grind_stat' id='filter_grind_stat'>
+<?php
+                    foreach($RUNE_STAT as $k=>$n){
+                        $selected = "";
+                        if (in_array($n, $filters["grind_stat"])){
+                            $selected = "selected='selected'";
+                        }
+                        $name = ucwords($k);
+?>
+                        <option value='<?=$n?>' <?=$selected?>><?=$name?></option>
+<?php
+                    }
+?>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter filter_title filter_separator'>
+                <span>
+                    Gems
+                </span>
+            </td>
+            <td class='filter filter_stars filter_separator'>
+<?php
+                $checked = "";
+                if ($filters["gem"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='gem' <?=$checked?>/> Gems
+            </td>
+            <td class='filter filter_separator'>
+                <span>Min. quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["gem_min_quality"]] = "selected";
+?>
+                <select name='gem_min_quality'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+            <td class='filter filter_separator'>
+                <span>Replace...</span>
+                <select multiple name='gem_stat_from' id='filter_gem_stat_from'>
+<?php
+                    foreach($RUNE_STAT as $k=>$n){
+                        $selected = "";
+                        if (in_array($n, $filters["gem_stat_from"])){
+                            $selected = "selected='selected'";
+                        }
+                        $name = ucwords($k);
+?>
+                        <option value='<?=$n?>' <?=$selected?>><?=$name?></option>
+<?php
+                    }
+?>
+                </select>
+            </td>
+            <td class='filter filter_separator'>
+                <span>...with...</span>
+                <select multiple name='gem_stat_from' id='filter_gem_stat_to'>
+<?php
+                    foreach($RUNE_STAT as $k=>$n){
+                        $selected = "";
+                        if (in_array($n, $filters["gem_stat_to"])){
+                            $selected = "selected='selected'";
+                        }
+                        $name = ucwords($k);
+?>
+                        <option value='<?=$n?>' <?=$selected?>><?=$name?></option>
+<?php
+                    }
+?>
+                </select>
+            </td>
+        </tr>
+    </table>
+    <div id='filter_apply'>
+        <input type='submit' value='Apply'/>
+    </div>
+</form>

+ 209 - 0
application/view/inc/filter_report_runeupgrade.php

@@ -0,0 +1,209 @@
+<?php
+    global $QUALITY;
+?>
+<form action='/report/runeupgrade/' method='get' id='filter_runeupgrade' class='filter'>
+    <table>
+        <tr>
+            <td class='filter filter_title' rowspan='2'>
+                <span>
+                    Monster
+                </span>
+            </td>
+            <td class='filter' colspan='3'>
+                <span>Name:</span>
+                <input type='text' name='monster_name' id='filter_name' value='<?=$filters["monster_name"]?>'/>
+            </td>
+            <td class='filter'>
+                <span>Stars:</span>
+                <input type='number' name='monster_min_stars' id='filter_stars_min' min='1' max='6' value='<?=$filters["monster_min_stars"]?>'/>
+                -
+                <input type='number' name='monster_max_stars' id='filter_stars_max' min='1' max='6' value='<?=$filters["monster_max_stars"]?>'/>
+            </td>
+        </tr>
+            <td class='filter' colspan='4'>
+<?php
+                $checked = "";
+                if ($filters["monster_in_storage"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='monster_in_storage' <?=$checked?>/>
+                Show monsters in storage
+            </td>
+        </tr>
+        <tr>
+            <td class='filter filter_title filter_separator' rowspan='5'>
+                <span>
+                    Runes
+                </span>
+            </td>
+            <td class='filter filter_stars filter_separator' colspan='2'>
+                <span>Stars:</span>
+                <input type='number' name='rune_min_stars' id='filter_stars_min' min='1' max='6' value='<?=$filters["rune_min_stars"]?>'/>
+                -
+                <input type='number' name='rune_max_stars' id='filter_stars_max' min='1' max='6' value='<?=$filters["rune_max_stars"]?>'/>
+            </td>
+            <td class='filter filter_separator' colspan='2'>
+                <span>Level:</span>
+                <input type='number' name='rune_min_level' id='filter_level_min' min='0' max='15' value='<?=$filters["rune_min_level"]?>'/>
+                -
+                <input type='number' name='rune_max_level' id='filter_level_max' min='0' max='15' value='<?=$filters["rune_max_level"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' rowspan='4'>
+                <span>Slot:</span>
+                <select multiple name='rune_slot[]' id='filter_slot'>
+<?php
+                    for ($i = 0; $i < 6; $i ++){
+                        if (in_array($i, $filters["rune_slot"])){
+                            $selected = "selected='selected'";
+                        }
+                        else{
+                            $selected = "";
+                        }
+?>
+                        <option value='<?=$i?>' <?=$selected?>><?=$i?></option>
+<?php
+                    }
+?>
+                </select>
+            </td>
+            <td class='filter' colspan='3'>
+                <span>Quality:</span>
+<?php
+
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["rune_min_quality"]] = "selected";
+?>
+                <select name='rune_min_quality' id='filter_quality_min'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+                -
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["rune_max_quality"]] = "selected";
+?>
+                <select name='rune_max_quality' id='filter_quality_max'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='3'>
+                <span>Original quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["rune_min_original_quality"]] = "selected";
+?>
+                <select name='rune_min_original_quality' id='filter_original_quality_min'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+                -
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["rune_max_original_quality"]] = "selected";
+?>
+                <select name='rune_max_original_quality' id='filter_original_quality_max'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='3'>
+                <span>Efficiency:</span>
+                <input type='number' name='rune_min_efficiency' id='filter_efficiency_min' min='0' max='100' value='<?=$filters["rune_min_efficiency"]?>'/>%
+                -
+                <input type='number' name='rune_max_efficiency' id='filter_efficiency_max' min='0' max='100' value='<?=$filters["rune_max_efficiency"]?>'/>%
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='3'>
+                <span>Maximum efficiency:</span>
+                <input type='number' name='rune_min_max_efficiency' id='filter_max_efficiency_min' min='0' max='100' value='<?=$filters["rune_min_max_efficiency"]?>'/>%
+                -
+                <input type='number' name='rune_max_max_efficiency' id='filter_max_efficiency_max' min='0' max='100' value='<?=$filters["rune_max_max_efficiency"]?>'/>%
+            </td>
+        </tr>
+        <tr>
+            <td class='filter filter_title filter_separator' rowspan='3'>
+                <span>
+                    Alternatives
+                </span>
+            </td>
+            <td class='filter filter_stars filter_separator'>
+                <span>Min. stars:</span>
+                <input type='number' name='alternative_min_stars' id='filter_stars_min' min='1' max='6' value='<?=$filters["alternative_min_stars"]?>'/>
+            </td>
+            <td class='filter filter_separator' colspan='2'>
+                <span>Min. O. quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["alternative_min_original_quality"]] = "selected";
+?>
+                <select name='alternative_min_original_quality' id='filter_original_quality_min'>
+                    <option value='<?=$QUALITY["NORMAL"]?>' <?=$selected[0]?>>Normal</option>
+                    <option value='<?=$QUALITY["MAGIC"]?>' <?=$selected[1]?>>Magic</option>
+                    <option value='<?=$QUALITY["RARE"]?>' <?=$selected[2]?>>Rare</option>
+                    <option value='<?=$QUALITY["HERO"]?>' <?=$selected[3]?>>Hero</option>
+                    <option value='<?=$QUALITY["LEGEND"]?>' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+            <td class='filter filter_separator'>
+                <span>Min. Level:</span>
+                <input type='number' name='alternative_min_level' id='filter_level_min' min='0' max='15' value='<?=$filters["alternative_min_level"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='4'>
+                <span>Condition:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["alternative_condition"]] = "selected";
+
+?>
+                <select name='alternative_condition'>
+                    <option value='0' <?=$selected[0]?>>Higher grade, any quality
+                    <option value='1' <?=$selected[1]?>>Higher grade or higher quality
+                    <option value='2' <?=$selected[2]?>>Equal or higher grade and equal or higher quality</option>
+                    <option value='3' <?=$selected[3]?>>Equal or higher grade and higher quality</option>
+                    <option value='4' <?=$selected[4]?>>Equal grade and equal or higher quality</option>
+                    <option value='5' <?=$selected[5]?>>Higher grade and higher quality</option>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='4'>
+                <span>Source:</span>
+<?php
+                $selected = Array("", "", "", "");
+                $selected[$filters["alternative_source"]] = "selected";
+?>
+                <select name='alternative_source'>
+                    <option value='0' <?=$selected[0]?>>Inventory only</option>
+                    <option value='1' <?=$selected[1]?>>Inventory or assigned to a lower grade monster</option>
+                    <option value='2' <?=$selected[2]?>>Any</option>
+                </select>
+            </td>
+        </tr>
+    </table>
+    <div id='filter_apply'>
+        <input type='submit' value='Apply'/>
+    </div>
+</form>

+ 93 - 0
application/view/inc/filter_report_skillup.php

@@ -0,0 +1,93 @@
+<form action='/report/skillup/' method='get' id='filter_skillup' class='filter'>
+    <table>
+        <tr>
+            <td class='filter' id='filter_stars'>
+                <span>Stars:</span>
+                <input type='number' name='min_stars' min='1' max='6' value='<?=$filters["min_stars"]?>'/>
+                -
+                <input type='number' name='max_stars'  min='1' max='6' value='<?=$filters["max_stars"]?>'/>
+            </td>
+            <td class='filter' id='filter_stars'>
+                <span>Natural stars:</span>
+                <input type='number' name='min_natural_stars' min='1' max='5' value='<?=$filters["min_natural_stars"]?>'/>
+                -
+                <input type='number' name='max_natural_stars' min='1' max='5' value='<?=$filters["max_natural_stars"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+<?php
+                $checked = "";
+                if ($filters["family"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='family' <?=$checked?>/>
+                Show monsters with family with lower grade.
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+<?php
+                $checked = "";
+                if ($filters["2a"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='2a' <?=$checked?>/>
+                Include second-awakened monsters.
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+<?php
+                $checked = "";
+                if ($filters["homunculus"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='homunculus' <?=$checked?>/>
+                Include Homunculus.
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+<?php
+                $checked = "";
+                if ($filters["in_storage"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='in_storage' <?=$checked?>/>
+                Show monsters in storage
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+<?php
+                $checked = "";
+                if ($filters["without_runes"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='without_runes' <?=$checked?>/>
+                Show monsters without runes
+            </td>
+        </tr>
+        <tr>
+            <td class='filter' colspan='2'>
+<?php
+                $checked = "";
+                if ($filters["maxed"]){
+                    $checked = "checked";
+                }
+?>
+                <input type='checkbox' name='maxed' <?=$checked?>/>
+                Show fully skilled-up monster
+            </td>
+        </tr>
+    </table>
+    <div id='filter_apply'>
+        <input type='submit' value='Apply'/>
+    </div>
+</form>

+ 194 - 0
application/view/inc/filter_runes.php

@@ -0,0 +1,194 @@
+<?php
+    global $RUNE_SET;
+    global $RUNE_STAT;
+?>
+<form action='/runes/' method='get' id='filter_runes' class='filter'>
+    <table>
+        <tr>
+            <td class='filter' rowspan='3'>
+                <span>Type:</span>
+                <select multiple name='type[]' id='filter_type'>
+<?php
+                    foreach($RUNE_SET as $k=>$n){
+                        $selected = "";
+                        if (in_array($n, $filters["type"])){
+                            $selected = "selected='selected'";
+                        }
+                        $name = ucwords(strtolower($k));
+?>
+                        <option value='<?=$n?>' <?=$selected?>><?=$name?></option>
+<?php
+                    }
+?>
+                </select>
+            </td>
+            <td class='filter' rowspan='2'>
+                <span>Slot:</span>
+                <select multiple name='slot[]' id='filter_slot'>
+<?php
+                    for ($i = 0; $i < 6; $i ++){
+                        if (in_array($i, $filters["slot"])){
+                            $selected = "selected='selected'";
+                        }
+                        else{
+                            $selected = "";
+                        }
+?>
+                        <option value='<?=$i?>' <?=$selected?>><?=$i?></option>
+<?php
+                    }
+?>
+                </select>
+            </td>
+            <td class='filter filter_stars' >
+                <span>Min. stars:</span>
+                <input type='number' name='min_stars' id='filter_stars_min' min='1' max='6' value='<?=$filters["min_stars"]?>'/>
+                <span>Max. stars:</span>
+                <input type='number' name='max_stars' id='filter_stars_max' min='1' max='6' value='<?=$filters["max_stars"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter'>
+                <span>Min. level:</span>
+                <input type='number' name='min_level' id='filter_level_min' min='0' max='15' value='<?=$filters["min_level"]?>'/>
+                <span>Max. level:</span>
+                <input type='number' name='max_level' id='filter_level_max' min='0' max='15' value='<?=$filters["max_level"]?>'/>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter'>
+                <span>Main stat:</span>
+                <select multiple name='main_stat[]' id='filter_main_stat'>
+<?php
+                    foreach($RUNE_STAT as $k=>$n){
+                        $selected = "";
+                        if (in_array($n, $filters["main"])){
+                            $selected = "selected='selected'";
+                        }
+                        $name = ucwords($k);
+?>
+                        <option value='<?=$n?>' <?=$selected?>><?=$name?></option>
+<?php
+                    }
+?>
+                    <option value='RES' <?=$selected?>>RES</option>
+                </select>
+            </td>
+            <td class='filter'>
+                <span>Has sub stat:</span>
+                <select multiple name='sub_stat[]' id='filter_sub_stat'>
+<?php
+                    foreach($RUNE_STAT as $k=>$n){
+                        $selected = "";
+                        if (in_array($n, $filters["sub"])){
+                            $selected = "selected='selected'";
+                        }
+                        $name = ucwords($k);
+?>
+                        <option value='<?=$n?>' <?=$selected?>><?=$name?></option>
+<?php
+                    }
+?>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter'>
+                <span>
+                    Assigned:
+                </span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["assigned"]] = "selected";
+?>
+                <select name='assigned' id='filter_assigned'>
+                    <option value='0' <?=$selected[0]?>>All</option>
+                    <option value='1' <?=$selected[1]?>>Assigned</option>
+                    <option value='2' <?=$selected[2]?>>Unassigned</option>
+                    <option value='3' <?=$selected[3]?>>All (no storage)</option>
+                    <option value='4' <?=$selected[4]?>>Assigned (no storage)</option>
+                </select>
+            </td>
+            <td class='filter'>
+                <span>Min. quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["min_quality"]] = "selected";
+?>
+                <select name='min_quality' id='filter_quality_min'>
+                    <option value='0' <?=$selected[0]?>>Normal</option>
+                    <option value='1' <?=$selected[1]?>>Magic</option>
+                    <option value='2' <?=$selected[2]?>>Rare</option>
+                    <option value='3' <?=$selected[3]?>>Hero</option>
+                    <option value='4' <?=$selected[4]?>>Legend</option>
+                </select>
+                <span>Max. quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["max_quality"]] = "selected";
+?>
+                <select name='min_quality' id='filter_quality_max'>
+                    <option value='0' <?=$selected[0]?>>Normal</option>
+                    <option value='1' <?=$selected[1]?>>Magic</option>
+                    <option value='2' <?=$selected[2]?>>Rare</option>
+                    <option value='3' <?=$selected[3]?>>Hero</option>
+                    <option value='4' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+            <td class='filter'>
+                <span>Min. original quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["min_original_quality"]] = "selected";
+?>
+                <select name='min_quality' id='filter_original_quality_min'>
+                    <option value='0' <?=$selected[0]?>>Normal</option>
+                    <option value='1' <?=$selected[1]?>>Magic</option>
+                    <option value='2' <?=$selected[2]?>>Rare</option>
+                    <option value='3' <?=$selected[3]?>>Hero</option>
+                    <option value='4' <?=$selected[4]?>>Legend</option>
+                </select>
+                <span>Max. original quality:</span>
+<?php
+                $selected = Array("", "", "", "", "");
+                $selected[$filters["max_original_quality"]] = "selected";
+?>
+                <select name='min_quality' id='filter_oriinal_quality_max'>
+                    <option value='0' <?=$selected[0]?>>Normal</option>
+                    <option value='1' <?=$selected[1]?>>Magic</option>
+                    <option value='2' <?=$selected[2]?>>Rare</option>
+                    <option value='3' <?=$selected[3]?>>Hero</option>
+                    <option value='4' <?=$selected[4]?>>Legend</option>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <td class='filter'>
+                <span>Group by:</span>
+<?php
+                $selected = Array("", "");
+                $selected[$filters["group"]] = "selected";
+?>
+                <select name='group' id='filter_group'>
+                    <option value='0' <?=$selected[0]?>>Slot</option>
+                    <option value='1' <?=$selected[1]?>>Type</option>
+                </select>
+            </td>
+            <td class='filter'>
+                <span>Min. efficiency:</span>
+                <input type='number' name='min_efficiency' id='filter_efficiency_min' min='0' max='100' value='<?=$filters["min_efficiency"]?>'/>%
+                <span>Max. efficiency:</span>
+                <input type='number' name='max_efficiency' id='filter_efficiency_max' min='0' max='100' value='<?=$filters["max_efficiency"]?>'/>%
+            </td>
+            <td class='filter'>
+                <span>Min. maximum efficiency:</span>
+                <input type='number' name='min_max_efficiency' id='filter_max_efficiency_min' min='0' max='100' value='<?=$filters["min_max_efficiency"]?>'/>%
+                <span>Max. maximum efficiency:</span>
+                <input type='number' name='max_max_efficiency' id='filter_max_efficiency_max' min='0' max='100' value='<?=$filters["max_max_efficiency"]?>'/>%
+            </td>
+        </tr>
+    </table>
+    <div id='filter_apply'>
+        <input type='submit' value='Apply'/>
+    </div>
+</form>

+ 3 - 0
application/view/inc/header.php

@@ -24,6 +24,9 @@
         <a href='/fusion'>
         <a href='/fusion'>
             Fusion
             Fusion
         </a>
         </a>
+        <a href='/guild'>
+            Guild
+        </a>
         <a href='/report'>
         <a href='/report'>
             Reports
             Reports
         </a>
         </a>

+ 66 - 373
application/view/monster.php

@@ -34,55 +34,45 @@
         include __DIR__ . "/inc/header.php";
         include __DIR__ . "/inc/header.php";
 ?>
 ?>
         <section id='monster' class='content'>
         <section id='monster' class='content'>
-<?php
-            if ($page->monster->monster->awakens_from == "" && $page->monster->monster->awakens_to == ""){
-                // No to, no from, silver monster.
-                $star_class ="star_silver";
-                $mon_title = $page->monster->monster->element . " " . $page->monster->monster->name;
-            }
-            elseif ($page->monster->monster->awakens_from =! "" && $page->monster->monster->awakens_to == ""){
-                // Already awakened
-                if ($page->monster->monster->base_stars - $page->monster->monster->natural_stars == 1){
-                    // Normal awaken.
-                    $star_class ="star_purple";
-                }
-                else{
-                    // Second awaken.
-                    $star_class ="star_red";
-                }
-                $mon_title = $page->monster->monster->name;
-            }
-            elseif ($page->monster->monster->awakens_to =! ""){
-                // Awakeable.
-                $star_class ="star_gold";
-                $mon_title = $page->monster->monster->element . " " . $page->monster->monster->name;
-            }
-?>
             <h2>
             <h2>
                 <span>
                 <span>
-                    <?=$mon_title?>
+                    <?=$page->unit->title?>
                 </span>
                 </span>
             </h2>
             </h2>
             <article id='profile'>
             <article id='profile'>
-                <div class='monster_panel'>
-                    <span class='stars'>
-<?php
-                        for ($i = 0; $i < $page->monster->stars; $i ++){
-?>
-                            <img class='star <?=$star_class?>' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
+                <div id='monster_info'>
+                    <div class='monster_panel'>
+                        <?=html_unit_panel($page->unit)?>
+                    </div>
 <?php
 <?php
-                        }
+                    if ($page->unit->experience_level != 0){
+                        $exp_pct = ceil($page->unit->exp_gained * 100 / $page->unit->experience_level);
+                        $exp_txt = $page->unit->exp_gained . " / " . $page->unit->experience_level;
+                    }
+                    else{
+                        $exp_pct = 100;
+                        $exp_txt = "MAX";
+                    }
+                    $now = time();
+                    //$datediff = $now - $page->unit->create_time->getTimestamp();
+                    $datediff = $now - strtotime($page->unit->create_time->format('Y-m-d H:i:s'));
+                    $datediff = floor($datediff / (60 * 60 * 24));
 ?>
 ?>
-                    </span>
-                    <img title='<?=$mon_title?>' class='monster border_<?=$page->monster->monster->element?>' src='<?=$page->monster->monster->get_image()?>'/>
-                    <span class='level'>
-                        <?=$page->monster->level?>
-                    </span>
+                    <div id='monster_details'>
+                        <div id='exp'>
+                            <span id='exp_bar' style='width:<?=$exp_pct?>%;'>
+                            </span>
+                            <span id='exp_text'>
+                                <?=$exp_txt?>
+                            </span>
+                        </div>
+                        Obtained on <?=$page->unit->create_time->format('Y-m-d')?> (<?=$datediff?> days ago) from <?=$page->unit->source->name?> <!-- TODO SOurce name, days ago -->
+                    </div>
                 </div>
                 </div>
 <?php
 <?php
-                $building_attack = floor(($page->monster->base_attack * $page->building_stats["atk"] / 100) + ($page->monster->base_attack * $page->building_stats["elm"][$page->monster->monster->element] / 100));
-                $building_defense = floor($page->building_stats["def"] * $page->monster->base_defense / 100);
-                $building_hp = floor($page->building_stats["hp"] * $page->monster->base_hp / 100);
+                $building_attack = floor(($page->unit->attack * $page->building_stats["atk"] / 100) + ($page->unit->attack * $page->building_stats["elm"][$page->unit->unit->element] / 100));
+                $building_defense = floor($page->building_stats["def"] * $page->unit->defense / 100);
+                $building_hp = floor($page->building_stats["hp"] * $page->unit->hp / 100);
                 $building_speed = $page->building_stats["spd"];
                 $building_speed = $page->building_stats["spd"];
                 $building_crit_rate = 0;
                 $building_crit_rate = 0;
                 $building_crit_damage = $page->building_stats["crd"];
                 $building_crit_damage = $page->building_stats["crd"];
@@ -112,16 +102,16 @@
                             ATK
                             ATK
                         </th>
                         </th>
                         <td class='base'>
                         <td class='base'>
-                            <?=$page->monster->base_attack?>
+                            <?=$page->unit->attack?>
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
-                            +<?=$page->monster->rune_attack?>
+                            +<?=$page->unit->rune_attack?>
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
                             +<?=$building_attack?>
                             +<?=$building_attack?>
                         </td>
                         </td>
                         <td class='total'>
                         <td class='total'>
-                            <?=$page->monster->base_attack + $page->monster->rune_attack + $building_attack?>
+                            <?=$page->unit->attack + $page->unit->rune_attack + $building_attack?>
                         </td>
                         </td>
                     </tr>
                     </tr>
                     <tr>
                     <tr>
@@ -129,16 +119,16 @@
                             DEF
                             DEF
                         </th>
                         </th>
                         <td class='base'>
                         <td class='base'>
-                            <?=$page->monster->base_defense?>
+                            <?=$page->unit->defense?>
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
-                            +<?=$page->monster->rune_defense?>
+                            +<?=$page->unit->rune_defense?>
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
                             +<?=$building_defense?>
                             +<?=$building_defense?>
                         </td>
                         </td>
                         <td class='total'>
                         <td class='total'>
-                            <?=$page->monster->base_defense + $page->monster->rune_defense + $building_defense?>
+                            <?=$page->unit->defense + $page->unit->rune_defense + $building_defense?>
                         </td>
                         </td>
                     </tr>
                     </tr>
                     <tr>
                     <tr>
@@ -146,16 +136,16 @@
                             HP
                             HP
                         </th>
                         </th>
                         <td class='base'>
                         <td class='base'>
-                            <?=$page->monster->base_hp?>
+                            <?=$page->unit->hp?>
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
-                            +<?=$page->monster->rune_hp?>
+                            +<?=$page->unit->rune_hp?>
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
                             +<?=$building_hp?>
                             +<?=$building_hp?>
                         </td>
                         </td>
                         <td class='total'>
                         <td class='total'>
-                            <?=$page->monster->base_hp + $page->monster->rune_hp + $building_hp?>
+                            <?=$page->unit->hp + $page->unit->rune_hp + $building_hp?>
                         </td>
                         </td>
                     </tr>
                     </tr>
                     <tr>
                     <tr>
@@ -163,16 +153,16 @@
                             SPD
                             SPD
                         </th>
                         </th>
                         <td class='base'>
                         <td class='base'>
-                            <?=$page->monster->base_speed?>
+                            <?=$page->unit->speed?>
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
-                            +<?=$page->monster->rune_speed?>
+                            +<?=$page->unit->rune_speed?>
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
                             +<?=$building_speed?>
                             +<?=$building_speed?>
                         </td>
                         </td>
                         <td class='total'>
                         <td class='total'>
-                            <?=$page->monster->base_speed + $page->monster->rune_speed + $building_speed?>
+                            <?=$page->unit->speed + $page->unit->rune_speed + $building_speed?>
                         </td>
                         </td>
                     </tr>
                     </tr>
                     <tr>
                     <tr>
@@ -180,16 +170,16 @@
                             CRR
                             CRR
                         </th>
                         </th>
                         <td class='base'>
                         <td class='base'>
-                            <?=$page->monster->base_crit_rate?>%
+                            <?=$page->unit->crit_rate?>%
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
-                            +<?=$page->monster->rune_crit_rate?>%
+                            +<?=$page->unit->rune_crit_rate?>%
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
                             +<?=$building_crit_rate?>%
                             +<?=$building_crit_rate?>%
                         </td>
                         </td>
                         <td class='total'>
                         <td class='total'>
-                            <?=$page->monster->base_crit_rate + $page->monster->rune_crit_rate + $building_crit_rate?>%
+                            <?=$page->unit->crit_rate + $page->unit->rune_crit_rate + $building_crit_rate?>%
                         </td>
                         </td>
                     </tr>
                     </tr>
                     <tr>
                     <tr>
@@ -197,16 +187,16 @@
                             CRD
                             CRD
                         </th>
                         </th>
                         <td class='base'>
                         <td class='base'>
-                            <?=$page->monster->base_crit_damage?>%
+                            <?=$page->unit->crit_damage?>%
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
-                            +<?=$page->monster->rune_crit_damage?>%
+                            +<?=$page->unit->rune_crit_damage?>%
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
                             +<?=$building_crit_damage?>%
                             +<?=$building_crit_damage?>%
                         </td>
                         </td>
                         <td class='total'>
                         <td class='total'>
-                            <?=$page->monster->base_crit_damage + $page->monster->rune_crit_damage + $building_crit_damage?>%
+                            <?=$page->unit->crit_damage + $page->unit->rune_crit_damage + $building_crit_damage?>%
                         </td>
                         </td>
                     </tr>
                     </tr>
                     <tr>
                     <tr>
@@ -214,16 +204,16 @@
                             ACC
                             ACC
                         </th>
                         </th>
                         <td class='base'>
                         <td class='base'>
-                            <?=$page->monster->base_accuracy?>%
+                            <?=$page->unit->accuracy?>%
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
-                            +<?=$page->monster->rune_accuracy?>%
+                            +<?=$page->unit->rune_accuracy?>%
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
                             +<?=$building_accuracy?>%
                             +<?=$building_accuracy?>%
                         </td>
                         </td>
                         <td class='total'>
                         <td class='total'>
-                            <?=$page->monster->base_accuracy + $page->monster->rune_accuracy + $building_accuracy?>%
+                            <?=$page->unit->accuracy + $page->unit->rune_accuracy + $building_accuracy?>%
                         </td>
                         </td>
                     </tr>
                     </tr>
                     <tr>
                     <tr>
@@ -231,25 +221,25 @@
                             RES
                             RES
                         </th>
                         </th>
                         <td class='base'>
                         <td class='base'>
-                            <?=$page->monster->base_resistance?>%
+                            <?=$page->unit->resistance?>%
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
-                            +<?=$page->monster->rune_resistance?>%
+                            +<?=$page->unit->rune_resistance?>%
                         </td>
                         </td>
                         <td class='extra'>
                         <td class='extra'>
                             +<?=$building_resistance?>%
                             +<?=$building_resistance?>%
                         </td>
                         </td>
                         <td class='total'>
                         <td class='total'>
-                            <?=$page->monster->base_resistance + $page->monster->rune_resistance + $building_resistance?>%
+                            <?=$page->unit->resistance + $page->unit->rune_resistance + $building_resistance?>%
                         </td>
                         </td>
                     </tr>
                     </tr>
                 </table>
                 </table>
                 <div id='skills'>
                 <div id='skills'>
 <?php
 <?php
-                    if ($page->monster->monster->leader_skill){
+                    if ($page->unit->unit->leader_skill){
 ?>
 ?>
                         <div class='skill'>
                         <div class='skill'>
-                            <img class='skill_img' src='<?=$page->monster->monster->leader_skill->get_image()?>'/>
+                            <img class='skill_img' src='<?=$page->unit->unit->leader_skill->get_image()?>'/>
                             <span class='skill_level'>
                             <span class='skill_level'>
                                 &nbsp;
                                 &nbsp;
                             </span>
                             </span>
@@ -257,53 +247,25 @@
                                 Leader skill
                                 Leader skill
                             </span>
                             </span>
                             <span class='skill_description'>
                             <span class='skill_description'>
-                                <?=$page->monster->monster->leader_skill->create_description()?>
+                                <?=$page->unit->unit->leader_skill->create_description()?>
                             </span>
                             </span>
                         </div>
                         </div>
 <?php
 <?php
                     }
                     }
-                    $skill_num = 1;
+                    $skill_num = 0;
                     $absolute_level = 0;
                     $absolute_level = 0;
                     $absolute_max_level = 0;
                     $absolute_max_level = 0;
                     $ponderated_level = 0;
                     $ponderated_level = 0;
                     $ponderated_max_level = 0;
                     $ponderated_max_level = 0;
-                    foreach ($page->monster->monster->skill as $skill){
+                    foreach ($page->unit->unit->skill as $skill){
                         if ($skill->max_level > 1){
                         if ($skill->max_level > 1){
                             $absolute_max_level += $skill->max_level - 1;
                             $absolute_max_level += $skill->max_level - 1;
                         }
                         }
-                        switch ($skill_num){
-                            case 1:
-                                $cur_lvl = $page->monster->skill_1_level;
-                                if ($skill->max_level > 1){
-                                    $absolute_level += $cur_lvl - 1;
-                                    $ponderated_level += $cur_lvl - 1;
-                                    $ponderated_max_level += $skill->max_level - 1;
-                                }
-                                break;
-                            case 2:
-                                $cur_lvl = $page->monster->skill_2_level;
-                                if ($skill->max_level > 1){
-                                    $absolute_level += $cur_lvl - 1;
-                                    $ponderated_level += ($cur_lvl - 1) * 1.5;
-                                    $ponderated_max_level += ($skill->max_level - 1) * 1.5;
-                                }
-                                break;
-                            case 3:
-                                $cur_lvl = $page->monster->skill_3_level;
-                                if ($skill->max_level > 1){
-                                    $absolute_level += $cur_lvl - 1;
-                                    $ponderated_level += ($cur_lvl - 1) * 2.0;
-                                    $ponderated_max_level += ($skill->max_level - 1) * 2.0;
-                                }
-                                break;
-                            case 4:
-                                $cur_lvl = $page->monster->skill_4_level;
-                                if ($skill->max_level > 1){
-                                    $absolute_level += $cur_lvl - 1;
-                                    $ponderated_level += ($cur_lvl - 1) * 2.5;
-                                    $ponderated_max_level += ($skill->max_level - 1) * 2.5;
-                                }
-                                break;
+                        $cur_lvl = $page->unit->skill_levels[$skill_num];
+                        if ($skill->max_level > 1){
+                            $absolute_level += $cur_lvl - 1;
+                            $ponderated_level += ($cur_lvl - 1) * (1 + ($skill_num / 2));
+                            $ponderated_max_level += ($skill->max_level - 1) * (1 + ($skill_num / 2));
                         }
                         }
                         $max_lvl = $skill->max_level;
                         $max_lvl = $skill->max_level;
                         if ($max_lvl == $cur_lvl){
                         if ($max_lvl == $cur_lvl){
@@ -405,7 +367,7 @@
             $total_stars = 0;
             $total_stars = 0;
             $total_value = 0;
             $total_value = 0;
             $total_runes = 0;
             $total_runes = 0;
-            foreach ($page->monster->rune as $rune){
+            foreach ($page->unit->rune as $rune){
                 $total_efficiency += $rune->efficiency;
                 $total_efficiency += $rune->efficiency;
                 $total_max_efficiency += $rune->max_efficiency;
                 $total_max_efficiency += $rune->max_efficiency;
                 $total_reached_efficiency += ($rune->efficiency * 100 / $rune->max_efficiency);
                 $total_reached_efficiency += ($rune->efficiency * 100 / $rune->max_efficiency);
@@ -415,276 +377,7 @@
                 $total_runes ++;
                 $total_runes ++;
 ?>
 ?>
                 <article>
                 <article>
-                    <table class='rune'>
-                        <tr>
-                            <td class='icon'>
-                                <div class='rune_panel rune_slot_<?=$rune->slot?> rune_level_<?=$rune->level?> rune_quality_<?=$rune->quality?> rune_original_quality_<?=$rune->original_quality?>'>
-                                    <img class='rune_base' src=<?=$path["img"]["layout"]?>rune/base.png/>
-                                    <img class='rune_icon' src='<?=$path["img"]["layout"]?>rune/<?=$rune->type?>.png'/>
-                                    <span class='rune_stars'>
-<?php
-                                        for ($i = 0; $i < $rune->stars; $i ++){
-?>
-                                            <img class='star' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
-<?php
-                                        }
-?>
-                                    </span>
-                                    <span class='rune_level'>
-                                        <?=$rune->level?>
-                                    </span>
-                                </div>
-                            </td>
-                            <td class='stats'>
-                                <table>
-                                    <tr class='main_stat'>
-                                        <td class='stat'>
-<?php
-                                            f (in_array($rune->main_stat, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                $stat_name = str_replace("%", "", $rune->main_stat);
-                                                $stat_value = "+ " . $rune->main_stat_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->main_stat;
-                                                $stat_value = "+ " . $rune->main_stat_value;
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value'>
-                                            <?=$stat_value?>
-                                        <td>
-                                    </tr>
-                                    <tr class='innate_stat'>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->innate_stat) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (strpos($rune->innate_stat, "%") !== false){
-                                                $stat_name = str_replace("%", "", $rune->innate_stat);
-                                                $stat_value = "+ " . $rune->innate_stat_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->innate_stat;
-                                                $stat_value = "+ " . $rune->innate_stat_value;
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value'>
-                                            <?=$stat_value?>
-                                        <td>
-                                    </tr>
-                                    <tr class=substat>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->substat_1) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (strpos($rune->substat_1, "%") !== false){
-                                                $stat_name = str_replace("%", "", $rune->substat_1);
-                                                $stat_value = "+ " . $rune->substat_1_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->substat_1;
-                                                $stat_value = "+ " . $rune->substat_1_value;
-                                            }
-                                            if ($rune->substat_1_craft == 1){
-                                                $craft = "craft";
-                                            }
-                                            else{
-                                                $craft = "";
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value <?=$craft?>'>
-                                            <?=$stat_value?>
-                                        <td>
-                                    </tr>
-                                    <tr class=substat>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->substat_2) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (strpos($rune->substat_2, "%") !== false){
-                                                $stat_name = str_replace("%", "", $rune->substat_2);
-                                                $stat_value = "+ " . $rune->substat_2_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->substat_2;
-                                                $stat_value = "+ " . $rune->substat_2_value;
-                                            }
-                                            if ($rune->substat_2_craft == 1){
-                                                $craft = "craft";
-                                            }
-                                            else{
-                                                $craft = "";
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value <?=$craft?>'>
-                                            <?=$stat_value?>
-                                        <td>
-                                    </tr>
-                                    <tr class=substat>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->substat_3) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (strpos($rune->substat_3, "%") !== false){
-                                                $stat_name = str_replace("%", "", $rune->substat_3);
-                                                $stat_value = "+ " . $rune->substat_3_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->substat_3;
-                                                $stat_value = "+ " . $rune->substat_3_value;
-                                            }
-                                            if ($rune->substat_3_craft == 1){
-                                                $craft = "craft";
-                                            }
-                                            else{
-                                                $craft = "";
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value <?=$craft?>'>
-                                            <?=$stat_value?>
-                                        <td>
-                                    </tr>
-                                    <tr class=substat>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->substat_4) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (strpos($rune->substat_4, "%") !== false){
-                                                $stat_name = str_replace("%", "", $rune->substat_4);
-                                                $stat_value = "+ " . $rune->substat_4_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->substat_4;
-                                                $stat_value = "+ " . $rune->substat_4_value;
-                                            }
-                                            if ($rune->substat_4_craft == 1){
-                                                $craft = "craft";
-                                            }
-                                            else{
-                                                $craft = "";
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value <?=$craft?>'>
-                                            <?=$stat_value?>
-                                        <td>
-                                    </tr>
-                                </table>
-                            </td>
-                            <td class='details'>
-<?php
-                                switch ($rune->quality){
-                                    case 0:
-                                        $q = "Normal";
-                                        break;
-                                    case 1:
-                                        $q = "Magic";
-                                        break;
-                                    case 2:
-                                        $q = "Rare";
-                                        break;
-                                    case 3:
-                                        $q = "Hero";
-                                        break;
-                                    case 4:
-                                        $q = "Legend";
-                                        break;
-                                }
-                                switch ($rune->original_quality){
-                                    case 0:
-                                        $oq = "Normal";
-                                        break;
-                                    case 1:
-                                        $oq = "Magic";
-                                        break;
-                                    case 2:
-                                        $oq = "Rare";
-                                        break;
-                                    case 3:
-                                        $oq = "Hero";
-                                        break;
-                                    case 4:
-                                        $oq = "Legend";
-                                        break;
-                                }
-?>
-                                <table class='table_details'>
-                                    <tr>
-                                        <td class='title'>
-                                            Quality:
-                                        </td>
-                                        <td class='value'>
-                                            <span class='quality quality_<?=strtolower($q)?>'>
-                                                <?=$q?>
-                                            </span>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Original quality:
-                                        </td>
-                                        <td class='value'>
-                                            <span class='quality quality_<?=strtolower($oq)?>'>
-                                                <?=$oq?>
-                                            </span>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Value:
-                                        </td>
-                                        <td class='value'>
-                                            <?=$rune->value?>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Efficiency:
-                                        </td>
-                                        <td class='value'>
-                                            <?=number_format($rune->efficiency, 2)?>%
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Max. efficiency:
-                                        </td>
-                                        <td class='value'>
-                                            <?=number_format($rune->max_efficiency, 2)?>%
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Reached efficiency:
-                                        </td>
-                                        <td class='value'>
-                                            <?=number_format($rune->efficiency * 100 / $rune->max_efficiency)?>%
-                                        </td>
-                                    </tr>
-                                </table>
-                            </td>
-                        </tr>
-                    </table>
+                    <?=html_rune_table($rune)?>
                 </article>
                 </article>
 <?php
 <?php
             }
             }

+ 14 - 39
application/view/monster_info.php

@@ -1,3 +1,6 @@
+<?php
+    global $ELEMENT;
+?>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html lang='en'>
 <html lang='en'>
     <head>
     <head>
@@ -34,34 +37,15 @@
         include __DIR__ . "/inc/header.php";
         include __DIR__ . "/inc/header.php";
         for ($i = 0; $i < 3; $i ++){
         for ($i = 0; $i < 3; $i ++){
             if ($page->monster[$i] != null){
             if ($page->monster[$i] != null){
-                if ($i == 0 && $page->monster[1] == null){
-                    // Silver monster.
-                        $star_class ="star_silver";
-                    $mon_title = $page->monster[$i]->element . " " . $page->monster[$i]->name;
-                }
-                elseif ($i == 0 && $page->monster[1] != null){
-                    // Gold monster.
-                    $star_class ="star_gold";
-                    $mon_title = $page->monster[$i]->element . " " . $page->monster[$i]->name;
-                }
-                elseif ($i == 1){
-                    // Awakened monster.
-                        $star_class ="star_purple";
-                    $mon_title = $page->monster[$i]->name;
-                }
-                elseif ($i == 2){
-                    // Second awakened.
-                    $star_class ="star_red";
-                    $mon_title = $page->monster[$i]->name;
-                }
 ?>
 ?>
                 <section class='content'>
                 <section class='content'>
                     <h2>
                     <h2>
-                        <?=$mon_title?>
+                        <?=$page->monster[$i]->title?>
+                        <!-- TODO: REWORK
                         <span class='family'>
                         <span class='family'>
 <?php
 <?php
                             //for ($f = 0; $f < 5; $f++){
                             //for ($f = 0; $f < 5; $f++){
-                            foreach (Array("Fire", "Water", "Wind", "Light", "Dark") as $element){
+                            foreach (Array($ELEMENT["FIRE"], $ELEMENT["WATER"], $ELEMENT["WIND"], $ELEMENT["LIGHT"], $ELEMENT["DARK"]) as $element){
                                 //$element = array_keys($page->family)[$f];
                                 //$element = array_keys($page->family)[$f];
                                 //$id = $page->family[$f];
                                 //$id = $page->family[$f];
                                 $id = $page->family[$element];
                                 $id = $page->family[$element];
@@ -89,21 +73,12 @@
                                 }
                                 }
                             }
                             }
 ?>
 ?>
-                        </span>
+                        </span>  -->
                     </h2>
                     </h2>
                     <article class='stage'>
                     <article class='stage'>
                         <div class='profile'>
                         <div class='profile'>
                             <div class='monster_panel'>
                             <div class='monster_panel'>
-                                <span class='stars'>
-<?php
-                                    for ($j = 0; $j < $page->monster[$i]->base_stars; $j ++){
-?>
-                                        <img class='star <?=$star_class?>' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
-<?php
-                                    }
-?>
-                                </span>
-                                <img title='<?=$mon_title?>' class='monster border_<?=$page->monster[$i]->element?>' src='<?=$page->monster[$i]->get_image()?>'/>
+                                <?=html_unit_panel($page->monster[$i])?>
                             </div>
                             </div>
                         </div>
                         </div>
                         <table class='stats'>
                         <table class='stats'>
@@ -112,7 +87,7 @@
                                     Type
                                     Type
                                 </th>
                                 </th>
                                 <th>
                                 <th>
-                                    <?=$page->monster[$i]->archetype?>
+                                    <?=$page->monster[$i]->archetype_name?>
                                 </th>
                                 </th>
                             </tr>
                             </tr>
                             <tr>
                             <tr>
@@ -120,7 +95,7 @@
                                     ATK
                                     ATK
                                 </th>
                                 </th>
                                 <td>
                                 <td>
-                                    <?=$page->monster[$i]->base_attack?>
+                                    <?=$page->monster[$i]->attack?>
                                 </td>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>
@@ -128,7 +103,7 @@
                                     DEF
                                     DEF
                                 </th>
                                 </th>
                                 <td>
                                 <td>
-                                    <?=$page->monster[$i]->base_defense?>
+                                    <?=$page->monster[$i]->defense?>
                                 </td>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>
@@ -136,7 +111,7 @@
                                     HP
                                     HP
                                 </th>
                                 </th>
                                 <td>
                                 <td>
-                                    <?=$page->monster[$i]->base_hp?>
+                                    <?=$page->monster[$i]->hp?>
                                 </td>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>
@@ -184,7 +159,7 @@
 <?php
 <?php
                             if (count($page->monster[$i]->sources) > 0){
                             if (count($page->monster[$i]->sources) > 0){
 ?>
 ?>
-                                <div class='sources'>
+                                <!-- TODO NOT WORKING<div class='sources'>
                                     <span>
                                     <span>
                                         Obtainable from:
                                         Obtainable from:
                                     </span>
                                     </span>
@@ -195,7 +170,7 @@
 <?php
 <?php
                                     }
                                     }
 ?>
 ?>
-                                </div>
+                                </div>-->
 <?php
 <?php
                             }
                             }
                             if (count($page->monster[$i]->essences) > 0){
                             if (count($page->monster[$i]->essences) > 0){

+ 30 - 149
application/view/monsters.php

@@ -1,3 +1,6 @@
+<?php
+    global $ELEMENT;
+?>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html lang='en'>
 <html lang='en'>
     <head>
     <head>
@@ -8,6 +11,7 @@
         <!-- CSS files -->
         <!-- CSS files -->
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>monsters.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>monsters.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>filters.css'/>
         <!-- Script files -->
         <!-- Script files -->
         <script src="<?=$path["js"]?>ui.js"></script>
         <script src="<?=$path["js"]?>ui.js"></script>
         <!-- Meta tags -->
         <!-- Meta tags -->
@@ -37,86 +41,10 @@
                 <h2>
                 <h2>
                     Monster filters
                     Monster filters
                 </h2>
                 </h2>
-                <form action='/monsters/' method='get'>
-                    <table>
-                        <tr>
-                            <td class='filter'>
-                                <span>Element:</span>
-<?php
-                                $fire_selected = "";
-                                $water_selected = "";
-                                $wind_selected = "";
-                                $light_selected = "";
-                                $dark_selected = "";
-                                switch (strtoupper($page->filters["element"])){
-                                    case "FIRE":
-                                        $fire_selected = "selected='selected'";
-                                        break;
-                                    case "WATER":
-                                        $water_selected = "selected='selected'";
-                                        break;
-                                    case "WIND":
-                                        $wind_selected = "selected='selected'";
-                                        break;
-                                    case "LIGHT":
-                                        $light_selected = "selected='selected'";
-                                        break;
-                                    case "DARK":
-                                        $dark_selected = "selected='selected'";
-                                        break;
-                                }
-?>
-                                <select name='element' id='filter_type'>
-                                    <option value=''>All</option>
-                                    <option value='Fire' <?=$fire_selected?>>Fire</option>
-                                    <option value='Water' <?=$water_selected?>>Water</option>
-                                    <option value='Wind' <?=$wind_selected?>>Wind</option>
-                                    <option value='Light' <?=$light_selected?>>Light</option>
-                                    <option value='Dark' <?=$dark_selected?>>Dark</option>
-                                </select>
-                            </td>
-                            <td class='filter' id='filter_stars'>
-                                <span>Stars:</span>
-                                <input type='number' name='min_stars' id='filter_stars_min' min='1' max='6' value='<?=$page->filters["min_stars"]?>'/>
-                                -
-                                <input type='number' name='max_stars' id='filter_stars_max' min='1' max='6' value='<?=$page->filters["max_stars"]?>'/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class='filter' colspan='2'>
-                                <span>Name:</span>
-                                <input type='text' name='name' id='filter_name' value='<?=$page->filters["name"]?>'/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class='filter' colspan='2'>
-<?php
-                                $checked = "";
-                                if ($page->filters["in_storage"]){
-                                    $checked = "checked";
-                                }
-?>
-                                <input type='checkbox' name='in_storage' <?=$checked?>/>
-                                Show monsters in storage
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class='filter' colspan='2'>
 <?php
 <?php
-                                $checked = "";
-                                if ($page->filters["without_runes"]){
-                                    $checked = "checked";
-                                }
+                $filters = $page->filters;
+                include __DIR__ . "/inc/filter_monsters.php";
 ?>
 ?>
-                                <input type='checkbox' name='without_runes' <?=$checked?>/>
-                                Show monsters without runes
-                            </td>
-                        </tr>
-                    </table>
-                    <div id='filter_apply'>
-                        <input type='submit' value='Apply'/>
-                    </div>
-                </form>
             </section> <!-- #filters -->
             </section> <!-- #filters -->
             <section class='list'>
             <section class='list'>
                 <h2>
                 <h2>
@@ -125,55 +53,21 @@
                 <article>
                 <article>
 <?php
 <?php
                     foreach ($page->monsters as $mon){
                     foreach ($page->monsters as $mon){
-                        if ($mon->monster->awakens_from == "" && $mon->monster->awakens_to == ""){
-                            // No to, no from, silver monster.
-                            $star_class ="star_silver";
-                            $mon_title = $mon->monster->element . " " . $mon->monster->name;
-                        }
-                        elseif ($mon->monster->awakens_from =! "" && $mon->monster->awakens_to == ""){
-                            // Already awakened
-                            if ($mon->monster->base_stars - $mon->monster->natural_stars == 1){
-                                // Normal awaken.
-                                $star_class ="star_purple";
-                            }
-                            else{
-                                // Second awaken.
-                                $star_class ="star_red";
-                            }
-                            $mon_title = $mon->monster->name;
-                        }
-                        elseif ($mon->monster->awakens_to =! ""){
-                            // Awakeable.
-                            $star_class ="star_gold";
-                            $mon_title = $mon->monster->element . " " . $mon->monster->name;
-                        }
 ?>
 ?>
                         <div class='monster'>
                         <div class='monster'>
                             <a href='/monsters/<?=$mon->id?>'>
                             <a href='/monsters/<?=$mon->id?>'>
                                 <div class='monster_panel'>
                                 <div class='monster_panel'>
-                                    <span class='stars'>
-<?php
-                                        for ($i = 0; $i < $mon->stars; $i ++){
-?>
-                                            <img class='star <?=$star_class?>' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
-<?php
-                                        }
-?>
-                                    </span>
-                                    <img title='<?=$mon_title?>' class='monster border_<?=$mon->monster->element?>' src='<?=$mon->monster->get_image()?>'/>
-                                    <span class='level'>
-                                        <?=$mon->level?>
-                                    </span>
+                                    <?=html_unit_panel($mon)?>
                                 </div>
                                 </div>
                             </a>
                             </a>
                             <div class='monster_tooltip'>
                             <div class='monster_tooltip'>
                                 <h4>
                                 <h4>
-                                    <?=$mon_title?>
+                                    <?=$mon->title?>
                                 </h4>
                                 </h4>
 <?php
 <?php
-                                $building_attack = floor(($mon->base_attack * $page->building_stats["atk"] / 100) + ($mon->base_attack * $page->building_stats["elm"][$mon->monster->element] / 100));
-                                $building_defense = floor($page->building_stats["def"] * $mon->base_defense / 100);
-                                $building_hp = floor($page->building_stats["hp"] * $mon->base_hp / 100);
+                                $building_attack = floor(($mon->attack * $page->building_stats["atk"] / 100) + ($mon->attack * $page->building_stats["elm"][$mon->unit->element] / 100));
+                                $building_defense = floor($page->building_stats["def"] * $mon->defense / 100);
+                                $building_hp = floor($page->building_stats["hp"] * $mon->hp / 100);
                                 $building_speed = $page->building_stats["spd"];
                                 $building_speed = $page->building_stats["spd"];
                                 $building_crit_rate = 0;
                                 $building_crit_rate = 0;
                                 $building_crit_damage = $page->building_stats["crd"];
                                 $building_crit_damage = $page->building_stats["crd"];
@@ -203,7 +97,7 @@
                                             ATK
                                             ATK
                                         </th>
                                         </th>
                                         <td class='base'>
                                         <td class='base'>
-                                            <?=$mon->base_attack?>
+                                            <?=$mon->attack?>
                                         </td>
                                         </td>
                                         <td class='extra'>
                                         <td class='extra'>
                                             +<?=$mon->rune_attack?>
                                             +<?=$mon->rune_attack?>
@@ -212,7 +106,7 @@
                                             +<?=$building_attack?>
                                             +<?=$building_attack?>
                                         </td>
                                         </td>
                                         <td class='total'>
                                         <td class='total'>
-                                            <?=$mon->base_attack + $mon->rune_attack + $building_attack?>
+                                            <?=$mon->attack + $mon->rune_attack + $building_attack?>
                                         </td>
                                         </td>
                                     </tr>
                                     </tr>
                                     <tr>
                                     <tr>
@@ -220,7 +114,7 @@
                                             DEF
                                             DEF
                                         </th>
                                         </th>
                                         <td class='base'>
                                         <td class='base'>
-                                            <?=$mon->base_defense?>
+                                            <?=$mon->defense?>
                                         </td>
                                         </td>
                                         <td class='extra'>
                                         <td class='extra'>
                                             +<?=$mon->rune_defense?>
                                             +<?=$mon->rune_defense?>
@@ -229,7 +123,7 @@
                                             +<?=$building_defense?>
                                             +<?=$building_defense?>
                                         </td>
                                         </td>
                                         <td class='total'>
                                         <td class='total'>
-                                            <?=$mon->base_defense + $mon->rune_defense + $building_defense?>
+                                            <?=$mon->defense + $mon->rune_defense + $building_defense?>
                                         </td>
                                         </td>
                                     </tr>
                                     </tr>
                                     <tr>
                                     <tr>
@@ -237,7 +131,7 @@
                                             HP
                                             HP
                                         </th>
                                         </th>
                                         <td class='base'>
                                         <td class='base'>
-                                            <?=$mon->base_hp?>
+                                            <?=$mon->hp?>
                                         </td>
                                         </td>
                                         <td class='extra'>
                                         <td class='extra'>
                                             +<?=$mon->rune_hp?>
                                             +<?=$mon->rune_hp?>
@@ -246,7 +140,7 @@
                                             +<?=$building_hp?>
                                             +<?=$building_hp?>
                                         </td>
                                         </td>
                                         <td class='total'>
                                         <td class='total'>
-                                            <?=$mon->base_hp + $mon->rune_hp + $building_hp?>
+                                            <?=$mon->hp + $mon->rune_hp + $building_hp?>
                                         </td>
                                         </td>
                                     </tr>
                                     </tr>
                                     <tr>
                                     <tr>
@@ -254,7 +148,7 @@
                                             SPD
                                             SPD
                                         </th>
                                         </th>
                                         <td class='base'>
                                         <td class='base'>
-                                            <?=$mon->base_speed?>
+                                            <?=$mon->speed?>
                                         </td>
                                         </td>
                                         <td class='extra'>
                                         <td class='extra'>
                                             +<?=$mon->rune_speed?>
                                             +<?=$mon->rune_speed?>
@@ -263,7 +157,7 @@
                                             +<?=$building_speed?>
                                             +<?=$building_speed?>
                                         </td>
                                         </td>
                                         <td class='total'>
                                         <td class='total'>
-                                            <?=$mon->base_speed + $mon->rune_speed + $building_speed?>
+                                            <?=$mon->speed + $mon->rune_speed + $building_speed?>
                                         </td>
                                         </td>
                                     </tr>
                                     </tr>
                                     <tr>
                                     <tr>
@@ -271,7 +165,7 @@
                                             CRR
                                             CRR
                                         </th>
                                         </th>
                                         <td class='base'>
                                         <td class='base'>
-                                            <?=$mon->base_crit_rate?>%
+                                            <?=$mon->crit_rate?>%
                                         </td>
                                         </td>
                                         <td class='extra'>
                                         <td class='extra'>
                                             +<?=$mon->rune_crit_rate?>%
                                             +<?=$mon->rune_crit_rate?>%
@@ -280,7 +174,7 @@
                                             +<?=$building_crit_rate?>%
                                             +<?=$building_crit_rate?>%
                                         </td>
                                         </td>
                                         <td class='total'>
                                         <td class='total'>
-                                            <?=$mon->base_crit_rate + $mon->rune_crit_rate + $building_crit_rate?>%
+                                            <?=$mon->crit_rate + $mon->rune_crit_rate + $building_crit_rate?>%
                                         </td>
                                         </td>
                                     </tr>
                                     </tr>
                                     <tr>
                                     <tr>
@@ -288,7 +182,7 @@
                                             CRD
                                             CRD
                                         </th>
                                         </th>
                                         <td class='base'>
                                         <td class='base'>
-                                            <?=$mon->base_crit_damage?>%
+                                            <?=$mon->crit_damage?>%
                                         </td>
                                         </td>
                                         <td class='extra'>
                                         <td class='extra'>
                                             +<?=$mon->rune_crit_damage?>%
                                             +<?=$mon->rune_crit_damage?>%
@@ -297,7 +191,7 @@
                                             +<?=$building_crit_damage?>%
                                             +<?=$building_crit_damage?>%
                                         </td>
                                         </td>
                                         <td class='total'>
                                         <td class='total'>
-                                            <?=$mon->base_crit_damage + $mon->rune_crit_damage + $building_crit_damage?>%
+                                            <?=$mon->crit_damage + $mon->rune_crit_damage + $building_crit_damage?>%
                                         </td>
                                         </td>
                                     </tr>
                                     </tr>
                                     <tr>
                                     <tr>
@@ -305,7 +199,7 @@
                                             ACC
                                             ACC
                                         </th>
                                         </th>
                                         <td class='base'>
                                         <td class='base'>
-                                            <?=$mon->base_accuracy?>%
+                                            <?=$mon->accuracy?>%
                                         </td>
                                         </td>
                                         <td class='extra'>
                                         <td class='extra'>
                                             +<?=$mon->rune_accuracy?>%
                                             +<?=$mon->rune_accuracy?>%
@@ -314,7 +208,7 @@
                                             +<?=$building_accuracy?>%
                                             +<?=$building_accuracy?>%
                                         </td>
                                         </td>
                                         <td class='total'>
                                         <td class='total'>
-                                            <?=$mon->base_accuracy + $mon->rune_accuracy + $building_accuracy?>%
+                                            <?=$mon->accuracy + $mon->rune_accuracy + $building_accuracy?>%
                                         </td>
                                         </td>
                                     </tr>
                                     </tr>
                                     <tr>
                                     <tr>
@@ -322,7 +216,7 @@
                                             RES
                                             RES
                                         </th>
                                         </th>
                                         <td class='base'>
                                         <td class='base'>
-                                            <?=$mon->base_resistance?>%
+                                            <?=$mon->resistance?>%
                                         </td>
                                         </td>
                                         <td class='extra'>
                                         <td class='extra'>
                                             +<?=$mon->rune_resistance?>%
                                             +<?=$mon->rune_resistance?>%
@@ -331,28 +225,15 @@
                                             +<?=$building_resistance?>%
                                             +<?=$building_resistance?>%
                                         </td>
                                         </td>
                                         <td class='total'>
                                         <td class='total'>
-                                            <?=$mon->base_resistance + $mon->rune_resistance + $building_resistance?>%
+                                            <?=$mon->resistance + $mon->rune_resistance + $building_resistance?>%
                                         </td>
                                         </td>
                                     </tr>
                                     </tr>
                                 </table>
                                 </table>
                                 <div class='skills'>
                                 <div class='skills'>
 <?php
 <?php
-                                    $skill_num = 1;
-                                    foreach ($mon->monster->skill as $skill){
-                                        switch ($skill_num){
-                                            case 1:
-                                                $cur_lvl = $mon->skill_1_level;
-                                                break;
-                                            case 2:
-                                                $cur_lvl = $mon->skill_2_level;
-                                                break;
-                                            case 3:
-                                                $cur_lvl = $mon->skill_3_level;
-                                                break;
-                                            case 4:
-                                                $cur_lvl = $mon->skill_4_level;
-                                                break;
-                                        }
+                                    $skill_num = 0;
+                                    foreach ($mon->unit->skill as $skill){
+                                        $cur_lvl = $mon->skill_levels[$skill_num];
                                         $max_lvl = $skill->max_level;
                                         $max_lvl = $skill->max_level;
                                         if ($max_lvl == $cur_lvl){
                                         if ($max_lvl == $cur_lvl){
                                             $maxed = "maxed";
                                             $maxed = "maxed";

+ 40 - 229
application/view/report.php

@@ -1,3 +1,8 @@
+<?php
+    global $FILTER_RUNECRAFT;
+    global $FILTER_RUNEUPGRADE;
+    global $FILTER_SKILLUP;
+?>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html lang='en'>
 <html lang='en'>
     <head>
     <head>
@@ -8,6 +13,7 @@
         <!-- CSS files -->
         <!-- CSS files -->
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>report.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>report.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>filters.css'/>
         <!-- Script files -->
         <!-- Script files -->
         <script src="<?=$path["js"]?>ui.js"></script>
         <script src="<?=$path["js"]?>ui.js"></script>
         <!-- Meta tags -->
         <!-- Meta tags -->
@@ -38,64 +44,15 @@
                 Pending skill-ups
                 Pending skill-ups
             </h2>
             </h2>
             <article>
             <article>
-                <form action='/report/skillup/' method='get'>
-                    <img alt=' ' src='<?=$path["img"]["content"]?>monster/0115.png'> <!-- Devilmon image -->
-                    <p>
-                        Shows a list of the monstes in need of skilling-up
-                        It sorts monster not by the absolute ammount of remaining power-ups, but by a ponderated list tht takes into account to which skills the previous power ups have gone, placing more value in the more advanced skills. 
-                    </p>
-                    <div class='report_filters'>
-                        <table>
-                            <tr>
-                                <td class='filter' id='filter_stars'>
-                                    <span>Stars:</span>
-                                    <input type='number' name='min_stars' min='1' max='6' value='5'/>
-                                    -
-                                    <input type='number' name='max_stars'  min='1' max='6' value='6'/>
-                                </td>
-                                <td class='filter' id='filter_stars'>
-                                    <span>Natural stars:</span>
-                                    <input type='number' name='min_natural_stars' min='1' max='5' value='5'/>
-                                    -
-                                    <input type='number' name='max_natural_stars' min='1' max='5' value='5'/>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='2'>
-                                    <input type='checkbox' name='family'/>
-                                    Show monsters with family with lower grade.
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='2'>
-                                    <input type='checkbox' name='2a'/>
-                                    Include second-awakened monsters.
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='2'>
-                                    <input type='checkbox' name='in_storage'/>
-                                    Show monsters in storage
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='2'>
-                                    <input type='checkbox' name='without_runes'/>
-                                    Show monsters without runes
-                                </td>
-                            </tr>
-                            <tr>
-                            <td class='filter' colspan='2'>
-                                <input type='checkbox' name='maxed'/>
-                                Show fully skilled-up monster
-                            </td>
-                            </tr>
-                        </table>
-                        <div id='filter_apply'>
-                            <input type='submit' value='Apply'/>
-                        </div>
-                    </div>
-                </form>
+                <img alt=' ' src='<?=$path["img"]["content"]?>unit/00015105.png'> <!-- Devilmon image -->
+                <p>
+                    Shows a list of the monstes in need of skilling-up
+                    It sorts monster not by the absolute ammount of remaining power-ups, but by a ponderated list tht takes into account to which skills the previous power ups have gone, placing more value in the more advanced skills. 
+                </p>
+<?php
+                $filters = $FILTER_SKILLUP;
+                include __DIR__ . "/inc/filter_report_skillup.php";
+?>
             </article>
             </article>
         </section>
         </section>
         <section class='content report'>
         <section class='content report'>
@@ -103,177 +60,31 @@
                 Runes to replace
                 Runes to replace
             </h2>
             </h2>
             <article class='report'>
             <article class='report'>
-                <form action='/report/runeupgrade/' method='get'>
-                    <img alt=' ' src='<?=$path["img"]["layout"]?>rune/base.png'> <!-- Devilmon image -->
-                    <p>
-                        Shows monsters with runes that can be upgraded.
-                        It list the runes that can be replaced by other runes in your inventory that have either more stars or a higher base quality.
-                    </p>
-                    <div class='filters report_filters'>
-                        <table>
-                            <tr>
-                                <td class='filter filter_title' rowspan='2'>
-                                    <span>
-                                        Monster
-                                    </span>
-                                </td>
-                                <td class='filter' colspan='3'>
-                                    <span>Name:</span>
-                                    <input type='text' name='monster_name' id='filter_name' value=''/>
-                                </td>
-                                <td class='filter'>
-                                    <span>Stars:</span>
-                                    <input type='number' name='monster_min_stars' id='filter_stars_min' min='1' max='6' value='5'/>
-                                    -
-                                    <input type='number' name='monster_max_stars' id='filter_stars_max' min='1' max='6' value='6'/>
-                                </td>
-                            </tr>
-                                <td class='filter' colspan='4'>
-                                    <input type='checkbox' name='monster_in_storage'/>
-                                    Show monsters in storage
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter filter_title filter_separator' rowspan='5'>
-                                    <span>
-                                        Runes
-                                    </span>
-                                </td>
-                                <td class='filter filter_stars filter_separator' colspan='2'>
-                                    <span>Stars:</span>
-                                    <input type='number' name='rune_min_stars' id='filter_stars_min' min='1' max='6' value='5'/>
-                                    -
-                                    <input type='number' name='rune_max_stars' id='filter_stars_max' min='1' max='6' value='6'/>
-                                </td>
-                                <td class='filter filter_separator' colspan='2'>
-                                    <span>Level:</span>
-                                    <input type='number' name='rune_min_level' id='filter_level_min' min='0' max='15' value='0'/>
-                                    -
-                                    <input type='number' name='rune_max_level' id='filter_level_max' min='0' max='15' value='15'/>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' rowspan='4'>
-                                    <span>Slot:</span>
-                                    <select multiple name='rune_slot[]' id='filter_slot'>
-                                        <option value='1'>1</option>
-                                        <option value='2'>2</option>
-                                        <option value='3'>3</option>
-                                        <option value='4'>4</option>
-                                        <option value='5'>5</option>
-                                        <option value='6'>6</option>
-                                    </select>
-                                </td>
-                                <td class='filter' colspan='3'>
-                                    <span>Quality:</span>
-                                    <select name='rune_min_quality' id='filter_quality_min'>
-                                        <option value='0' selected>Normal</option>
-                                        <option value='1'>Magic</option>
-                                        <option value='2'>Rare</option>
-                                        <option value='3'>Hero</option>
-                                        <option value='4'>Legend</option>
-                                    </select>
-                                    -
-                                    <select name='rune_max_quality' id='filter_quality_max'>
-                                        <option value='0'>Normal</option>
-                                        <option value='1'>Magic</option>
-                                        <option value='2'>Rare</option>
-                                        <option value='3'>Hero</option>
-                                        <option value='4' selected>Legend</option>
-                                    </select>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='3'>
-                                    <span>Original quality:</span>
-
-                                    <select name='rune_min_original_quality' id='filter_original_quality_min'>
-                                        <option value='0' selected>Normal</option>
-                                        <option value='1'>Magic</option>
-                                        <option value='2'>Rare</option>
-                                        <option value='3'>Hero</option>
-                                        <option value='4'>Legend</option>
-                                    </select>
-                                    -
-                                    <select name='rune_max_original_quality' id='filter_original_quality_max'>
-                                        <option value='0'>Normal</option>
-                                        <option value='1'>Magic</option>
-                                        <option value='2'>Rare</option>
-                                        <option value='3'>Hero</option>
-                                        <option value='4' selected>Legend</option>
-                                    </select>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='3'>
-                                    <span>Efficiency:</span>
-                                    <input type='number' name='rune_min_efficiency' id='filter_efficiency_min' min='0' max='100' value='0'/>%
-                                    -
-                                    <input type='number' name='rune_max_efficiency' id='filter_efficiency_max' min='0' max='100' value='100'/>%
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='3'>
-                                    <span>Maximum efficiency:</span>
-                                    <input type='number' name='rune_min_max_efficiency' id='filter_max_efficiency_min' min='0' max='100' value='0'/>%
-                                    -
-                                    <input type='number' name='rune_max_max_efficiency' id='filter_max_efficiency_max' min='0' max='100' value='100'/>%
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter filter_title filter_separator' rowspan='3'>
-                                    <span>
-                                        Alternatives
-                                    </span>
-                                </td>
-                                <td class='filter filter_stars filter_separator'>
-                                    <span>Min. stars:</span>
-                                    <input type='number' name='alternative_min_stars' id='filter_stars_min' min='1' max='6' value='6'/>
-                                </td>
-                                <td class='filter filter_separator' colspan='2'>
-                                    <span>Min. O. quality:</span>
-                                    <select name='alternative_min_original_quality' id='filter_original_quality_min'>
-                                        <option value='0' selected>Normal</option>
-                                        <option value='1'>Magic</option>
-                                        <option value='2'>Rare</option>
-                                        <option value='3'>Hero</option>
-                                        <option value='4'>Legend</option>
-                                    </select>
-                                </td>
-                                <td class='filter filter_separator'>
-                                    <span>Min. Level:</span>
-                                    <input type='number' name='alternative_min_level' id='filter_level_min' min='0' max='15' value='0'/>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='4'>
-                                    <span>Condition:</span>
-                                    <select name='alternative_condition'>
-                                        <option value='0'>Higher grade, any quality
-                                        <option value='1'>Higher grade or higher quality
-                                        <option value='2'>Equal or higher grade and equal or higher quality</option>
-                                        <option value='3' selected>Equal or higher grade and higher quality</option>
-                                        <option value='4' >Equal grade and equal or higher quality</option>
-                                        <option value='5'>Higher grade and higher quality</option>
-                                    </select>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class='filter' colspan='4'>
-                                    <span>Source:</span>
-                                    <select name='alternative_source'>
-                                        <option value='0' selected>Inventory only</option>
-                                        <option value='1'>Inventory or assigned to a lower grade monster</option>
-                                        <option value='2'>Any</option>
-                                    </select>
-                                </td>
-                            </tr>
-                        </table>
-                        <div id='filter_apply'>
-                            <input type='submit' value='Apply'/>
-                        </div>
-                    </div> <!-- .report_filters -->
-                </form>
+                <img alt=' ' src='<?=$path["img"]["layout"]?>rune/base.png'>
+                <p>
+                    Shows monsters with runes that can be upgraded.
+                    It list the runes that can be replaced by other runes in your inventory that have either more stars or a higher base quality.
+                </p>
+<?php
+                $filters = $FILTER_RUNEUPGRADE;
+                include __DIR__ . "/inc/filter_report_runeupgrade.php";
+?>
+            </article>
+        </section>
+        <section class='content report'>
+            <h2>
+                Runes to replace
+            </h2>
+            <article class='report'>
+                <img alt=' ' src='<?=$path["img"]["layout"]?>grind/gem_inmemorial.png'> 
+                <p>
+                    Shows monsters with runes that can be crafted.
+                    It list the grindstones and gems that are available for each rune.
+                </p>
+<?php
+                $filters = $FILTER_RUNECRAFT;
+                include __DIR__ . "/inc/filter_report_runecraft.php";
+?>
             </article>
             </article>
         </section>
         </section>
 <?php
 <?php

+ 93 - 0
application/view/report_runecraft.php

@@ -0,0 +1,93 @@
+<?php
+    global $RUNE_STAT;
+?>
+<!DOCTYPE html>
+<html lang='en'>
+    <head>
+        <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
+        <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
+        <title><?=$page->title?></title>
+        <link rel='shortcut icon' href='<?=$page->favicon?>'/>
+        <!-- CSS files -->
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>report_runecraft.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>filters.css'/>
+        <!-- Script files -->
+        <script src="<?=$path["js"]?>ui.js"></script>
+        <!-- Meta tags -->
+        <link rel='canonical' href='<?=$page->canonical?>'/>
+        <link rel='author' href='<?=$page->author?>'/>
+        <link rel='publisher' href='<?=$page->author?>'/>
+        <meta name='description' content='<?=$page->description?>'/>
+        <meta property='og:title' content='<?=$page->title?>'/>
+        <meta property='og:url' content='<?=$page->canonical?>'/>
+        <meta property='og:description' content='<?=$page->description?>'/>
+        <meta property='og:image' content='<?=$page->icon?>'/>
+        <meta property='og:site_name' content='<?=$page->name?>'/>
+        <meta property='og:type' content='website'/>
+        <meta property='og:locale' content='en'/>
+        <meta name='twitter:card' content='summary'/>
+        <meta name='twitter:title' content='<?=$page->title?>'/>
+        <meta name='twitter:description' content='<?=$page->description?>'/>
+        <meta name='twitter:image' content='<?=$page->icon?>'/>
+        <meta name='twitter:url' content='<?=$page->canonical?>'/>
+        <meta name='robots' content='index follow'/>
+    </head>
+    <body>
+<?php
+        include __DIR__ . "/inc/header.php";
+?>
+        <section class='filters'>
+            <h2>
+                <span>
+                    Report filters
+                </span>
+            </h2>
+<?php
+        $filters = $page->filters;
+        include __DIR__ . "/inc/filter_report_runecraft.php";
+?>
+        </section> <!-- #filters -->
+<?php
+            foreach ($page->upgrades as $upgrade){
+?>
+            <section class='content'>
+                <h2>
+                    <span>
+                        <?=$upgrade["unit"]->title?>
+                    </span>
+                </h2>
+                <article>
+                    <div class='monster'>
+                        <div class='profile'>
+                            <div class='monster_panel'>
+                                <?=html_unit_panel($upgrade["unit"])?>
+                            </div>
+                        </div> <!-- .profile -->
+                    </div>
+                    <div class='monster_runes'>
+<?php
+                        foreach ($upgrade["upgrade"] as $rupgrade){
+?>
+                            <?=html_rune_table($rupgrade["rune"])?>
+                            <div class='craft'>
+<?php
+                                foreach ($rupgrade["craft"] as $craft){
+?>
+                                    <?=html_craft_panel($craft)?>
+<?php
+                                }
+?>
+                            </div>
+<?php
+                        }
+?>
+                    </div> <!-- .monster_runes -->
+                </article>
+            </section>
+<?php
+            }
+        include __DIR__ . "/inc/footer.php";
+?>
+    </body>
+</html>

+ 10 - 973
application/view/report_runeupgrade.php

@@ -7,7 +7,8 @@
         <link rel='shortcut icon' href='<?=$page->favicon?>'/>
         <link rel='shortcut icon' href='<?=$page->favicon?>'/>
         <!-- CSS files -->
         <!-- CSS files -->
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
-        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>report.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>report_runeupgrade.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>filters.css'/>
         <!-- Script files -->
         <!-- Script files -->
         <script src="<?=$path["js"]?>ui.js"></script>
         <script src="<?=$path["js"]?>ui.js"></script>
         <!-- Meta tags -->
         <!-- Meta tags -->
@@ -39,440 +40,25 @@
                     Report filters
                     Report filters
                 </span>
                 </span>
             </h2>
             </h2>
-            <form action='/report/runeupgrade/' method='get'>
-                <table>
-                    <tr>
-                        <td class='filter filter_title' rowspan='2'>
-                            <span>
-                                Monster
-                            </span>
-                        </td>
-                        <td class='filter' colspan='3'>
-                            <span>Name:</span>
-                            <input type='text' name='monster_name' id='filter_name' value='<?=$page->filters["monster_name"]?>'/>
-                        </td>
-                        <td class='filter'>
-                            <span>Stars:</span>
-                            <input type='number' name='monster_min_stars' id='filter_stars_min' min='1' max='6' value='<?=$page->filters["monster_min_stars"]?>'/>
-                            -
-                            <input type='number' name='monster_max_stars' id='filter_stars_max' min='1' max='6' value='<?=$page->filters["monster_max_stars"]?>'/>
-                        </td>
-                    </tr>
-                        <td class='filter' colspan='4'>
 <?php
 <?php
-                            $checked = "";
-                            if ($page->filters["monster_in_storage"]){
-                                $checked = "checked";
-                            }
+            $filters = $page->filters;
+            include __DIR__ . "/inc/filter_report_runeupgrade.php";
 ?>
 ?>
-                            <input type='checkbox' name='monster_in_storage' <?=$checked?>/>
-                            Show monsters in storage
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter filter_title filter_separator' rowspan='5'>
-                            <span>
-                                Runes
-                            </span>
-                        </td>
-                        <td class='filter filter_stars filter_separator' colspan='2'>
-                            <span>Stars:</span>
-                            <input type='number' name='rune_min_stars' id='filter_stars_min' min='1' max='6' value='<?=$page->filters["rune_min_stars"]?>'/>
-                            -
-                            <input type='number' name='rune_max_stars' id='filter_stars_max' min='1' max='6' value='<?=$page->filters["rune_max_stars"]?>'/>
-                        </td>
-                        <td class='filter filter_separator' colspan='2'>
-                            <span>Level:</span>
-                            <input type='number' name='rune_min_level' id='filter_level_min' min='0' max='15' value='<?=$page->filters["rune_min_level"]?>'/>
-                            -
-                            <input type='number' name='rune_max_level' id='filter_level_max' min='0' max='15' value='<?=$page->filters["rune_max_level"]?>'/>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' rowspan='4'>
-                            <span>Slot:</span>
-                            <select multiple name='rune_slot[]' id='filter_slot'>
-<?php
-                                if (in_array(1, $page->filters["rune_slot"])){
-                                    $selected = "selected='selected'";
-                                }
-                                else{
-                                    $selected = "";
-                                }
-?>
-                                <option value='1' <?=$selected?>>1</option>
-<?php
-                                if (in_array(2, $page->filters["rune_slot"])){
-                                    $selected = "selected='selected'";
-                                }
-                                else{
-                                    $selected = "";
-                                }
-?>
-                                <option value='2' <?=$selected?>>2</option>
-<?php
-                                if (in_array(3, $page->filters["rune_slot"])){
-                                    $selected = "selected='selected'";
-                                }
-                                else{
-                                    $selected = "";
-                                }
-?>
-                                <option value='3' <?=$selected?>>3</option>
-<?php
-                                if (in_array(4, $page->filters["rune_slot"])){
-                                    $selected = "selected='selected'";
-                                }
-                                else{
-                                    $selected = "";
-                                }
-?>
-                                <option value='4' <?=$selected?>>4</option>
-<?php
-                                if (in_array(5, $page->filters["rune_slot"])){
-                                    $selected = "selected='selected'";
-                                }
-                                else{
-                                    $selected = "";
-                                }
-?>
-                                <option value='5' <?=$selected?>>5</option>
-<?php
-                                if (in_array(6, $page->filters["rune_slot"])){
-                                    $selected = "selected='selected'";
-                                }
-                                else{
-                                    $selected = "";
-                                }
-?>
-                                <option value='6' <?=$selected?>>6</option>
-                            </select>
-                        </td>
-                        <td class='filter' colspan='3'>
-                            <span>Quality:</span>
-<?php
-                            $selected_0 = "";
-                            $selected_1 = "";
-                            $selected_2 = "";
-                            $selected_3 = "";
-                            $selected_4 = "";
-                            switch (strtoupper($page->filters["rune_min_quality"])){
-                                case 0:
-                                    $selected_0 = "selected";
-                                    break;
-                                case 1:
-                                    $selected_1 = "selected";
-                                    break;
-                                case 2:
-                                    $selected_2 = "selected";
-                                    break;
-                                case 3:
-                                    $selected_3 = "selected";
-                                    break;
-                                case 4:
-                                    $selected_4 = "selected";
-                                    break;
-                            }
-?>
-                            <select name='rune_min_quality' id='filter_quality_min'>
-                                <option value='0' <?=$selected_0?>>Normal</option>
-                                <option value='1' <?=$selected_1?>>Magic</option>
-                                <option value='2' <?=$selected_2?>>Rare</option>
-                                <option value='3' <?=$selected_3?>>Hero</option>
-                                <option value='4' <?=$selected_4?>>Legend</option>
-                            </select>
-                            -
-<?php
-                            $selected_0 = "";
-                            $selected_1 = "";
-                            $selected_2 = "";
-                            $selected_3 = "";
-                            $selected_4 = "";
-                            switch (strtoupper($page->filters["rune_max_quality"])){
-                                case 0:
-                                    $selected_0 = "selected";
-                                    break;
-                                case 1:
-                                    $selected_1 = "selected";
-                                    break;
-                                case 2:
-                                    $selected_2 = "selected";
-                                    break;
-                                case 3:
-                                    $selected_3 = "selected";
-                                    break;
-                                case 4:
-                                    $selected_4 = "selected";
-                                    break;
-                            }
-?>
-                            <select name='rune_max_quality' id='filter_quality_max'>
-                                <option value='0' <?=$selected_0?>>Normal</option>
-                                <option value='1' <?=$selected_1?>>Magic</option>
-                                <option value='2' <?=$selected_2?>>Rare</option>
-                                <option value='3' <?=$selected_3?>>Hero</option>
-                                <option value='4' <?=$selected_4?>>Legend</option>
-                            </select>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='3'>
-                            <span>Original quality:</span>
-<?php
-                            $selected_0 = "";
-                            $selected_1 = "";
-                            $selected_2 = "";
-                            $selected_3 = "";
-                            $selected_4 = "";
-                            switch (strtoupper($page->filters["rune_min_original_quality"])){
-                                case 0:
-                                    $selected_0 = "selected";
-                                    break;
-                                case 1:
-                                    $selected_1 = "selected";
-                                    break;
-                                case 2:
-                                    $selected_2 = "selected";
-                                    break;
-                                case 3:
-                                    $selected_3 = "selected";
-                                    break;
-                                case 4:
-                                    $selected_4 = "selected";
-                                    break;
-                            }
-?>
-                            <select name='rune_min_original_quality' id='filter_original_quality_min'>
-                                <option value='0' <?=$selected_0?>>Normal</option>
-                                <option value='1' <?=$selected_1?>>Magic</option>
-                                <option value='2' <?=$selected_2?>>Rare</option>
-                                <option value='3' <?=$selected_3?>>Hero</option>
-                                <option value='4' <?=$selected_4?>>Legend</option>
-                            </select>
-                            -
-<?php
-                            $selected_0 = "";
-                            $selected_1 = "";
-                            $selected_2 = "";
-                            $selected_3 = "";
-                            $selected_4 = "";
-                            switch (strtoupper($page->filters["rune_max_quality"])){
-                                case 0:
-                                    $selected_0 = "selected";
-                                    break;
-                                case 1:
-                                    $selected_1 = "selected";
-                                    break;
-                                case 2:
-                                    $selected_2 = "selected";
-                                    break;
-                                case 3:
-                                    $selected_3 = "selected";
-                                    break;
-                                case 4:
-                                    $selected_4 = "selected";
-                                    break;
-                            }
-?>
-                            <select name='rune_max_original_quality' id='filter_original_quality_max'>
-                                <option value='0' <?=$selected_0?>>Normal</option>
-                                <option value='1' <?=$selected_1?>>Magic</option>
-                                <option value='2' <?=$selected_2?>>Rare</option>
-                                <option value='3' <?=$selected_3?>>Hero</option>
-                                <option value='4' <?=$selected_4?>>Legend</option>
-                            </select>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='3'>
-                            <span>Efficiency:</span>
-                            <input type='number' name='rune_min_efficiency' id='filter_efficiency_min' min='0' max='100' value='<?=$page->filters["rune_min_efficiency"]?>'/>%
-                            -
-                            <input type='number' name='rune_max_efficiency' id='filter_efficiency_max' min='0' max='100' value='<?=$page->filters["rune_max_efficiency"]?>'/>%
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='3'>
-                            <span>Maximum efficiency:</span>
-                            <input type='number' name='rune_min_max_efficiency' id='filter_max_efficiency_min' min='0' max='100' value='<?=$page->filters["rune_min_max_efficiency"]?>'/>%
-                            -
-                            <input type='number' name='rune_max_max_efficiency' id='filter_max_efficiency_max' min='0' max='100' value='<?=$page->filters["rune_max_max_efficiency"]?>'/>%
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter filter_title filter_separator' rowspan='3'>
-                            <span>
-                                Alternatives
-                            </span>
-                        </td>
-                        <td class='filter filter_stars filter_separator'>
-                            <span>Min. stars:</span>
-                            <input type='number' name='alternative_min_stars' id='filter_stars_min' min='1' max='6' value='<?=$page->filters["alternative_min_stars"]?>'/>
-                        </td>
-                        <td class='filter filter_separator' colspan='2'>
-                            <span>Min. O. quality:</span>
-<?php
-                            $selected_0 = "";
-                            $selected_1 = "";
-                            $selected_2 = "";
-                            $selected_3 = "";
-                            $selected_4 = "";
-                            switch (strtoupper($page->filters["alternative_min_original_quality"])){
-                                case 0:
-                                    $selected_0 = "selected";
-                                    break;
-                                case 1:
-                                    $selected_1 = "selected";
-                                    break;
-                                case 2:
-                                    $selected_2 = "selected";
-                                    break;
-                                case 3:
-                                    $selected_3 = "selected";
-                                    break;
-                                case 4:
-                                    $selected_4 = "selected";
-                                    break;
-                            }
-?>
-                            <select name='alternative_min_original_quality' id='filter_original_quality_min'>
-                                <option value='0' <?=$selected_0?>>Normal</option>
-                                <option value='1' <?=$selected_1?>>Magic</option>
-                                <option value='2' <?=$selected_2?>>Rare</option>
-                                <option value='3' <?=$selected_3?>>Hero</option>
-                                <option value='4' <?=$selected_4?>>Legend</option>
-                            </select>
-                        </td>
-                        <td class='filter filter_separator'>
-                            <span>Min. Level:</span>
-                            <input type='number' name='alternative_min_level' id='filter_level_min' min='0' max='15' value='<?=$page->filters["alternative_min_level"]?>'/>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='4'>
-                            <span>Condition:</span>
-<?php
-                            $selected_0 = "";
-                            $selected_1 = "";
-                            $selected_2 = "";
-                            $selected_3 = "";
-                            $selected_4 = "";
-                            $selected_5 = "";
-                            switch (strtoupper($page->filters["alternative_condition"])){
-                                case 0:
-                                    $selected_0 = "selected";
-                                    break;
-                                case 1:
-                                    $selected_1 = "selected";
-                                    break;
-                                case 2:
-                                    $selected_2 = "selected";
-                                    break;
-                                case 3:
-                                    $selected_3 = "selected";
-                                    break;
-                                case 4:
-                                    $selected_4 = "selected";
-                                    break;
-                                case 5:
-                                    $selected_5 = "selected";
-                                    break;
-                            }
-?>
-                            <select name='alternative_condition'>
-                                <option value='0' <?=$selected_0?>>Higher grade, any quality
-                                <option value='1' <?=$selected_1?>>Higher grade or higher quality
-                                <option value='2' <?=$selected_2?>>Equal or higher grade and equal or higher quality</option>
-                                <option value='3' <?=$selected_3?>>Equal or higher grade and higher quality</option>
-                                <option value='4' <?=$selected_4?>>Equal grade and equal or higher quality</option>
-                                <option value='5' <?=$selected_5?>>Higher grade and higher quality</option>
-                            </select>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='4'>
-                            <span>Source:</span>
-<?php
-                            $selected_0 = "";
-                            $selected_1 = "";
-                            $selected_2 = "";
-                            $selected_3 = "";
-                            switch (strtoupper($page->filters["alternative_source"])){
-                                case 0:
-                                    $selected_0 = "selected";
-                                    break;
-                                case 1:
-                                    $selected_1 = "selected";
-                                    break;
-                                case 2:
-                                    $selected_2 = "selected";
-                                    break;
-                                case 3:
-                                    $selected_3 = "selected";
-                                    break;
-                            }
-?>
-                            <select name='alternative_source'>
-                                <option value='0' <?=$selected_0?>>Inventory only</option>
-                                <option value='1' <?=$selected_1?>>Inventory or assigned to a lower grade monster</option>
-                                <option value='2' <?=$selected_2?>>Any</option>
-                            </select>
-                        </td>
-                    </tr>
-                </table>
-                <div id='filter_apply'>
-                    <input type='submit' value='Apply'/>
-                </div>
-            </form>
         </section> <!-- #filters -->
         </section> <!-- #filters -->
 <?php
 <?php
             foreach ($page->upgrades as $upgrade){
             foreach ($page->upgrades as $upgrade){
-                if ($upgrade["monster"]->monster->awakens_from == "" && $upgrade["monster"]->monster->awakens_to == ""){
-                    // No to, no from, silver monster.
-                    $star_class ="star_silver";
-                    $mon_title = $upgrade["monster"]->monster->element . " " . $upgrade["monster"]->monster->name;
-                }
-                elseif ($upgrade["monster"]->monster->awakens_from =! "" && $upgrade["monster"]->monster->awakens_to == ""){
-                    // Already awakened
-                    if ($upgrade["monster"]->monster->base_stars - $upgrade["monster"]->monster->natural_stars == 1){
-                        // Normal awaken.
-                        $star_class ="star_purple";
-                    }
-                    else{
-                        // Second awaken.
-                        $star_class ="star_red";
-                    }
-                    $mon_title = $upgrade["monster"]->monster->name;
-                }
-                elseif ($upgrade["monster"]->monster->awakens_to =! ""){
-                    // Awakeable.
-                    $star_class ="star_gold";
-                    $mon_title = $upgrade["monster"]->monster->element . " " . $upgrade["monster"]->monster->name;
-                }
 ?>
 ?>
             <section class='content'>
             <section class='content'>
                 <h2>
                 <h2>
                     <span>
                     <span>
-                        <?=$mon_title?>
+                        <?=$upgrade["unit"]->title?>
                     </span>
                     </span>
                 </h2>
                 </h2>
                 <article>
                 <article>
                     <div class='monster'>
                     <div class='monster'>
                         <div class='profile'>
                         <div class='profile'>
                             <div class='monster_panel'>
                             <div class='monster_panel'>
-                                <span class='stars'>
-<?php
-                                        for ($i = 0; $i < $upgrade["monster"]->stars; $i ++){
-?>
-                                        <img class='star <?=$star_class?>' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
-<?php
-                                        }
-?>
-                                </span>
-                                <img title='<?=$mon_title?>' class='monster border_<?=$upgrade["monster"]->monster->element?>' src='<?=$upgrade["monster"]->monster->get_image()?>'/>
-                                <span class='level'>
-                                    Lv. <?=$upgrade["monster"]->level?>
-                                </span>
+                                <?=html_unit_panel($upgrade["unit"])?>
                             </div>
                             </div>
                         </div> <!-- .profile -->
                         </div> <!-- .profile -->
                     </div>
                     </div>
@@ -480,565 +66,16 @@
 <?php
 <?php
                         foreach ($upgrade["upgrade"] as $rupgrade){
                         foreach ($upgrade["upgrade"] as $rupgrade){
 ?>
 ?>
-                        <table class='rune'>
-                            <tr>
-                                <td class='icon'>
-                                    <div class='rune_panel rune_slot_<?=$rupgrade["rune"]->slot?> rune_level_<?=$rupgrade["rune"]->level?> rune_quality_<?=$rupgrade["rune"]->quality?> rune_original_quality_<?=$rupgrade["rune"]->original_quality?>'>
-                                        <img class='rune_base' src='<?=$path["img"]["layout"]?>rune/base.png'/>
-                                        <img class='rune_icon' src='<?=$path["img"]["layout"]?>rune/<?=$rupgrade["rune"]->type?>.png'/>
-                                        <span class='rune_stars'>
-<?php
-                                                for ($i = 0; $i < $rupgrade["rune"]->stars; $i ++){
-?>
-                                                <img class='star' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
-<?php
-                                                }
-?>
-                                        </span>
-                                        <span class='rune_level'>
-                                            <?=$rupgrade["rune"]->level?>
-                                        </span>
-                                    </div> <!-- .rune_panel -->
-                                </td>
-                                <td class='stats'>
-                                    <table>
-                                        <tr class='main_stat'>
-                                            <td class='stat'>
-<?php
-                                                    if (in_array($rupgrade["rune"]->main_stat, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                        $stat_name = str_replace("%", "", $rupgrade["rune"]->main_stat);
-                                                        $stat_value = "+ " . $rupgrade["rune"]->main_stat_value . "%";
-                                                    }
-                                                    else{
-                                                        $stat_name = $rupgrade["rune"]->main_stat;
-                                                        $stat_value = "+ " . $rupgrade["rune"]->main_stat_value;
-                                                    }
-?>
-                                                <?=$stat_name?>
-                                            </td>
-                                            <td class='value'>
-                                                <?=$stat_value?>
-                                            </td>
-                                        </tr>
-                                        <tr class='innate_stat'>
-                                            <td class='stat'>
-<?php
-                                                    if (strlen($rupgrade["rune"]->innate_stat) == 0){
-                                                        $stat_name = "&nbsp;";
-                                                        $stat_value = "";
-                                                    }
-                                                    elseif (in_array($rupgrade["rune"]->innate_stat, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                        $stat_name = str_replace("%", "", $rupgrade["rune"]->innate_stat);
-                                                        $stat_value = "+ " . $rupgrade["rune"]->innate_stat_value . "%";
-                                                    }
-                                                    else{
-                                                        $stat_name = $rupgrade["rune"]->innate_stat;
-                                                        $stat_value = "+ " . $rupgrade["rune"]->innate_stat_value;
-                                                    }
-?>
-                                                <?=$stat_name?>
-                                            </td>
-                                            <td class='value'>
-                                                <?=$stat_value?>
-                                            </td>
-                                        </tr>
-                                        <tr class=substat>
-                                            <td class='stat'>
-<?php
-                                                    if (strlen($rupgrade["rune"]->substat_1) == 0){
-                                                        $stat_name = "&nbsp;";
-                                                        $stat_value = "";
-                                                    }
-                                                    elseif (in_array($rupgrade["rune"]->substat_1, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                        $stat_name = str_replace("%", "", $rupgrade["rune"]->substat_1);
-                                                        $stat_value = "+ " . $rupgrade["rune"]->substat_1_value . "%";
-                                                    }
-                                                    else{
-                                                        $stat_name = $rupgrade["rune"]->substat_1;
-                                                        $stat_value = "+ " . $rupgrade["rune"]->substat_1_value;
-                                                    }
-                                                    if ($rupgrade["rune"]->substat_1_craft == 1){
-                                                        $craft = "craft";
-                                                    }
-                                                    else{
-                                                        $craft = "";
-                                                    }
-?>
-                                                <?=$stat_name?>
-                                            </td>
-                                            <td class='value <?=$craft?>'>
-                                                <?=$stat_value?>
-                                            </td>
-                                        </tr>
-                                        <tr class=substat>
-                                            <td class='stat'>
-<?php
-                                                    if (strlen($rupgrade["rune"]->substat_2) == 0){
-                                                        $stat_name = "&nbsp;";
-                                                        $stat_value = "";
-                                                    }
-                                                    elseif (in_array($rupgrade["rune"]->substat_2, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                        $stat_name = str_replace("%", "", $rupgrade["rune"]->substat_2);
-                                                        $stat_value = "+ " . $rupgrade["rune"]->substat_2_value . "%";
-                                                    }
-                                                    else{
-                                                        $stat_name = $rupgrade["rune"]->substat_2;
-                                                        $stat_value = "+ " . $rupgrade["rune"]->substat_2_value;
-                                                    }
-                                                    if ($rupgrade["rune"]->substat_2_craft == 1){
-                                                        $craft = "craft";
-                                                    }
-                                                    else{
-                                                        $craft = "";
-                                                    }
-?>
-                                                <?=$stat_name?>
-                                            </td>
-                                            <td class='value <?=$craft?>'>
-                                                <?=$stat_value?>
-                                            </td>
-                                        </tr>
-                                        <tr class=substat>
-                                            <td class='stat'>
-<?php
-                                                    if (strlen($rupgrade["rune"]->substat_3) == 0){
-                                                        $stat_name = "&nbsp;";
-                                                        $stat_value = "";
-                                                    }
-                                                    elseif (in_array($rupgrade["rune"]->substat_3, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                        $stat_name = str_replace("%", "", $rupgrade["rune"]->substat_3);
-                                                        $stat_value = "+ " . $rupgrade["rune"]->substat_3_value . "%";
-                                                    }
-                                                    else{
-                                                        $stat_name = $rupgrade["rune"]->substat_3;
-                                                        $stat_value = "+ " . $rupgrade["rune"]->substat_3_value;
-                                                    }
-                                                    if ($rupgrade["rune"]->substat_3_craft == 1){
-                                                        $craft = "craft";
-                                                    }
-                                                    else{
-                                                        $craft = "";
-                                                    }
-?>
-                                                <?=$stat_name?>
-                                            </td>
-                                            <td class='value <?=$craft?>'>
-                                                <?=$stat_value?>
-                                            </td>
-                                        </tr>
-                                        <tr class=substat>
-                                            <td class='stat'>
-<?php
-                                                    if (strlen($rupgrade["rune"]->substat_4) == 0){
-                                                        $stat_name = "&nbsp;";
-                                                        $stat_value = "";
-                                                    }
-                                                    elseif (in_array($rupgrade["rune"]->substat_4, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                        $stat_name = str_replace("%", "", $rupgrade["rune"]->substat_4);
-                                                        $stat_value = "+ " . $rupgrade["rune"]->substat_4_value . "%";
-                                                    }
-                                                    else{
-                                                        $stat_name = $rupgrade["rune"]->substat_4;
-                                                        $stat_value = "+ " . $rupgrade["rune"]->substat_4_value;
-                                                    }
-                                                    if ($rupgrade["rune"]->substat_4_craft == 1){
-                                                        $craft = "craft";
-                                                    }
-                                                    else{
-                                                        $craft = "";
-                                                    }
-?>
-                                                <?=$stat_name?>
-                                            </td>
-                                            <td class='value <?=$craft?>'>
-                                                <?=$stat_value?>
-                                            </td>
-                                        </tr>
-                                    </table>
-                                </td>
-                                <td class='details'>
-<?php
-                                        switch ($rupgrade["rune"]->quality){
-                                            case 0:
-                                                $q = "Normal";
-                                                break;
-                                            case 1:
-                                                $q = "Magic";
-                                                break;
-                                            case 2:
-                                                $q = "Rare";
-                                                break;
-                                            case 3:
-                                                $q = "Hero";
-                                                break;
-                                            case 4:
-                                                $q = "Legend";
-                                                break;
-                                        }
-                                        switch ($rupgrade["rune"]->original_quality){
-                                            case 0:
-                                                $oq = "Normal";
-                                                break;
-                                            case 1:
-                                                $oq = "Magic";
-                                                break;
-                                            case 2:
-                                                $oq = "Rare";
-                                                break;
-                                            case 3:
-                                                $oq = "Hero";
-                                                break;
-                                            case 4:
-                                                $oq = "Legend";
-                                                break;
-                                        }
-?>
-                                    <table class='table_details'>
-                                        <tr>
-                                            <td class='title'>
-                                                Quality:
-                                            </td>
-                                            <td class='value'>
-                                                <span class='quality quality_<?=strtolower($q)?>'>
-                                                    <?=$q?>
-                                                </span>
-                                            </td>
-                                        </tr>
-                                        <tr>
-                                            <td class='title'>
-                                                Original quality:
-                                            </td>
-                                            <td class='value'>
-                                                <span class='quality quality_<?=strtolower($oq)?>'>
-                                                    <?=$oq?>
-                                                </span>
-                                            </td>
-                                        </tr>
-                                        <tr>
-                                            <td class='title'>
-                                                Value:
-                                            </td>
-                                            <td class='value'>
-                                                <?=$rupgrade["rune"]->value?>
-                                            </td>
-                                        </tr>
-                                        <tr>
-                                            <td class='title'>
-                                                Efficiency:
-                                            </td>
-                                            <td class='value'>
-                                                <?=number_format($rupgrade["rune"]->efficiency, 2)?>%
-                                            </td>
-                                        </tr>
-                                        <tr>
-                                            <td class='title'>
-                                                Max. efficiency:
-                                            </td>
-                                            <td class='value'>
-                                                <?=number_format($rupgrade["rune"]->max_efficiency, 2)?>%
-                                            </td>
-                                        </tr>
-                                        <tr>
-                                            <td class='title'>
-                                                Reached efficiency:
-                                            </td>
-                                            <td class='value'>
-                                                <?=number_format($rupgrade["rune"]->efficiency * 100 / $rupgrade["rune"]->max_efficiency)?>%
-                                            </td>
-                                        </tr>
-                                    </table>
-                                </td>
-                            </tr>
-                        </table> <!-- .rune -->
-                        <div class='alternatives'>
+                            <?=html_rune_table($rupgrade["rune"])?>
+                            <div class='alternatives'>
 <?php
 <?php
                                 foreach ($rupgrade["alternative"] as $alternative){
                                 foreach ($rupgrade["alternative"] as $alternative){
 ?>
 ?>
-                                <table class='rune alternative'>
-                                    <tr>
-                                        <td class='icon'>
-                                            <div class='rune_panel rune_slot_<?=$alternative->slot?> rune_level_<?=$alternative->level?> rune_quality_<?=$alternative->quality?> rune_original_quality_<?=$alternative->original_quality?>'>
-                                                <img class='rune_base' src='<?=$path["img"]["layout"]?>rune/base.png'/>
-                                                <img class='rune_icon' src='<?=$path["img"]["layout"]?>rune/<?=$alternative->type?>.png'/>
-                                                <span class='rune_stars'>
-<?php
-                                                        for ($i = 0; $i < $alternative->stars; $i ++){
-?>
-                                                        <img class='star' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
-<?php
-                                                        }
-?>
-                                                </span>
-                                                <span class='rune_level'>
-                                                    <?=$alternative->level?>
-                                                </span>
-                                            </div> <!-- .rune_panel -->
-<?php
-                                            if ($page->filters["alternative_source"] > 0 && null != $alternative->assigned_to){
-?>
-                                                <div class='assigned'>
-                                                    <a target='blank' href='/monsters/<?=$alternative->assigned_to->id?>'>
-                                                        <img title='<?=$alternative->assigned_to->monster->name?>' class='monster_image border_<?=$alternative->assigned_to->monster->element?>' src='<?=$alternative->assigned_to->monster->get_image()?>'/>
-                                                    </a>
-                                                </div>
-<?php
-                                            }
-?>
-                                        </td>
-                                        <td class='stats'>
-                                            <table>
-                                                <tr class='main_stat'>
-                                                    <td class='stat'>
-<?php
-                                                            if (in_array($alternative->main_stat, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                                $stat_name = str_replace("%", "", $alternative->main_stat);
-                                                                $stat_value = "+ " . $alternative->main_stat_value . "%";
-                                                            }
-                                                            else{
-                                                                $stat_name = $alternative->main_stat;
-                                                                $stat_value = "+ " . $alternative->main_stat_value;
-                                                            }
-?>
-                                                        <?=$stat_name?>
-                                                    </td>
-                                                    <td class='value'>
-                                                        <?=$stat_value?>
-                                                    </td>
-                                                </tr>
-                                                <tr class='innate_stat'>
-                                                    <td class='stat'>
-<?php
-                                                            if (strlen($alternative->innate_stat) == 0){
-                                                                $stat_name = "&nbsp;";
-                                                                $stat_value = "";
-                                                            }
-                                                            elseif (in_array($alternative->innate_stat, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                                $stat_name = str_replace("%", "", $alternative->innate_stat);
-                                                                $stat_value = "+ " . $alternative->innate_stat_value . "%";
-                                                            }
-                                                            else{
-                                                                $stat_name = $alternative->innate_stat;
-                                                                $stat_value = "+ " . $alternative->innate_stat_value;
-                                                            }
-?>
-                                                        <?=$stat_name?>
-                                                    </td>
-                                                    <td class='value'>
-                                                        <?=$stat_value?>
-                                                    </td>
-                                                </tr>
-                                                <tr class=substat>
-                                                    <td class='stat'>
-<?php
-                                                            if (strlen($alternative->substat_1) == 0){
-                                                                $stat_name = "&nbsp;";
-                                                                $stat_value = "";
-                                                            }
-                                                            elseif (in_array($alternative->substat_1, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                                $stat_name = str_replace("%", "", $alternative->substat_1);
-                                                                $stat_value = "+ " . $alternative->substat_1_value . "%";
-                                                            }
-                                                            else{
-                                                                $stat_name = $alternative->substat_1;
-                                                                $stat_value = "+ " . $alternative->substat_1_value;
-                                                            }
-                                                            if ($alternative->substat_1_craft == 1){
-                                                                $craft = "craft";
-                                                            }
-                                                            else{
-                                                                $craft = "";
-                                                            }
-?>
-                                                        <?=$stat_name?>
-                                                    </td>
-                                                    <td class='value <?=$craft?>'>
-                                                        <?=$stat_value?>
-                                                    </td>
-                                                </tr>
-                                                <tr class=substat>
-                                                    <td class='stat'>
-<?php
-                                                            if (strlen($alternative->substat_2) == 0){
-                                                                $stat_name = "&nbsp;";
-                                                                $stat_value = "";
-                                                            }
-                                                            elseif (in_array($alternative->substat_2, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                                $stat_name = str_replace("%", "", $alternative->substat_2);
-                                                                $stat_value = "+ " . $alternative->substat_2_value . "%";
-                                                            }
-                                                            else{
-                                                                $stat_name = $alternative->substat_2;
-                                                                $stat_value = "+ " . $alternative->substat_2_value;
-                                                            }
-                                                            if ($alternative->substat_2_craft == 1){
-                                                                $craft = "craft";
-                                                            }
-                                                            else{
-                                                                $craft = "";
-                                                            }
-?>
-                                                        <?=$stat_name?>
-                                                    </td>
-                                                    <td class='value <?=$craft?>'>
-                                                        <?=$stat_value?>
-                                                    </td>
-                                                </tr>
-                                                <tr class=substat>
-                                                    <td class='stat'>
-<?php
-                                                            if (strlen($alternative->substat_3) == 0){
-                                                                $stat_name = "&nbsp;";
-                                                                $stat_value = "";
-                                                            }
-                                                            elseif (in_array($alternative->substat_3, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                                $stat_name = str_replace("%", "", $alternative->substat_3);
-                                                                $stat_value = "+ " . $alternative->substat_3_value . "%";
-                                                            }
-                                                            else{
-                                                                $stat_name = $alternative->substat_3;
-                                                                $stat_value = "+ " . $alternative->substat_3_value;
-                                                            }
-                                                            if ($alternative->substat_3_craft == 1){
-                                                                $craft = "craft";
-                                                            }
-                                                            else{
-                                                                $craft = "";
-                                                            }
-?>
-                                                        <?=$stat_name?>
-                                                    </td>
-                                                    <td class='value <?=$craft?>'>
-                                                        <?=$stat_value?>
-                                                    </td>
-                                                </tr>
-                                                <tr class=substat>
-                                                    <td class='stat'>
-<?php
-                                                            if (strlen($alternative->substat_4) == 0){
-                                                                $stat_name = "&nbsp;";
-                                                                $stat_value = "";
-                                                            }
-                                                            elseif (in_array($alternative->substat_4, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                                $stat_name = str_replace("%", "", $alternative->substat_4);
-                                                                $stat_value = "+ " . $alternative->substat_4_value . "%";
-                                                            }
-                                                            else{
-                                                                $stat_name = $alternative->substat_4;
-                                                                $stat_value = "+ " . $alternative->substat_4_value;
-                                                            }
-                                                            if ($alternative->substat_4_craft == 1){
-                                                                $craft = "craft";
-                                                            }
-                                                            else{
-                                                                $craft = "";
-                                                            }
-?>
-                                                        <?=$stat_name?>
-                                                    </td>
-                                                    <td class='value <?=$craft?>'>
-                                                        <?=$stat_value?>
-                                                    </td>
-                                                </tr>
-                                            </table>
-                                        </td>
-                                        <td class='details'>
-<?php
-                                                switch ($alternative->quality){
-                                                    case 0:
-                                                        $q = "Normal";
-                                                        break;
-                                                    case 1:
-                                                        $q = "Magic";
-                                                        break;
-                                                    case 2:
-                                                        $q = "Rare";
-                                                        break;
-                                                    case 3:
-                                                        $q = "Hero";
-                                                        break;
-                                                    case 4:
-                                                        $q = "Legend";
-                                                        break;
-                                                }
-                                                switch ($alternative->original_quality){
-                                                    case 0:
-                                                        $oq = "Normal";
-                                                        break;
-                                                    case 1:
-                                                        $oq = "Magic";
-                                                        break;
-                                                    case 2:
-                                                        $oq = "Rare";
-                                                        break;
-                                                    case 3:
-                                                        $oq = "Hero";
-                                                        break;
-                                                    case 4:
-                                                        $oq = "Legend";
-                                                        break;
-                                                }
-?>
-                                            <table class='table_details'>
-                                                <tr>
-                                                    <td class='title'>
-                                                        Quality:
-                                                    </td>
-                                                    <td class='value'>
-                                                        <span class='quality quality_<?=strtolower($q)?>'>
-                                                            <?=$q?>
-                                                        </span>
-                                                    </td>
-                                                </tr>
-                                                <tr>
-                                                    <td class='title'>
-                                                        Original quality:
-                                                    </td>
-                                                    <td class='value'>
-                                                        <span class='quality quality_<?=strtolower($oq)?>'>
-                                                            <?=$oq?>
-                                                        </span>
-                                                    </td>
-                                                </tr>
-                                                <tr>
-                                                    <td class='title'>
-                                                        Value:
-                                                    </td>
-                                                    <td class='value'>
-                                                        <?=$alternative->value?>
-                                                    </td>
-                                                </tr>
-                                                <tr>
-                                                    <td class='title'>
-                                                        Efficiency:
-                                                    </td>
-                                                    <td class='value'>
-                                                        <?=number_format($alternative->efficiency, 2)?>%
-                                                    </td>
-                                                </tr>
-                                                <tr>
-                                                    <td class='title'>
-                                                        Max. efficiency:
-                                                    </td>
-                                                    <td class='value'>
-                                                        <?=number_format($alternative->max_efficiency, 2)?>%
-                                                    </td>
-                                                </tr>
-                                                <tr>
-                                                    <td class='title'>
-                                                        Reached efficiency:
-                                                    </td>
-                                                    <td class='value'>
-                                                        <?=number_format($alternative->efficiency * 100 / $alternative->max_efficiency)?>%
-                                                    </td>
-                                                </tr>
-                                            </table>
-                                        </td>
-                                    </tr>
-                                </table> <!-- .alternative -->
+                                    <?=html_rune_table($alternative, $alternative->assigned_to)?>
 <?php
 <?php
                                 }
                                 }
 ?>
 ?>
-                        </div>
+                            </div>
 <?php
 <?php
                         }
                         }
 ?>
 ?>

+ 36 - 155
application/view/report_skillup.php

@@ -7,7 +7,8 @@
         <link rel='shortcut icon' href='<?=$page->favicon?>'/>
         <link rel='shortcut icon' href='<?=$page->favicon?>'/>
         <!-- CSS files -->
         <!-- CSS files -->
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
-        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>report.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>report_skillup.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>filters.css'/>
         <!-- Script files -->
         <!-- Script files -->
         <script src="<?=$path["js"]?>ui.js"></script>
         <script src="<?=$path["js"]?>ui.js"></script>
         <!-- Meta tags -->
         <!-- Meta tags -->
@@ -39,114 +40,22 @@
                     Monster filters
                     Monster filters
                 </span>
                 </span>
             </h2>
             </h2>
-            <form action='/report/skillup/' method='get'>
-                <table>
-                    <tr>
-                        <td class='filter' id='filter_stars'>
-                            <span>Stars:</span>
-                            <input type='number' name='min_stars' min='1' max='6' value='<?=$page->filters["min_stars"]?>'/>
-                            -
-                            <input type='number' name='max_stars'  min='1' max='6' value='<?=$page->filters["max_stars"]?>'/>
-                        </td>
-                        <td class='filter' id='filter_stars'>
-                            <span>Natural stars:</span>
-                            <input type='number' name='min_natural_stars' min='1' max='6' value='<?=$page->filters["min_natural_stars"]?>'/>
-                            -
-                            <input type='number' name='max_natural_stars' min='1' max='6' value='<?=$page->filters["max_natural_stars"]?>'/>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='2'>
 <?php
 <?php
-                            $checked = "";
-                            if ($page->filters["family"]){
-                                $checked = "checked";
-                            }
-?>
-                            <input type='checkbox' name='family' <?=$checked?>/>
-                            Show monsters with family with lower grade.
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='2'>
-<?php
-                            $checked = "";
-                            if ($page->filters["2a"]){
-                                $checked = "checked";
-                            }
-?>
-                            <input type='checkbox' name='2a' <?=$checked?>/>
-                            Include second-awakened monsters.
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='2'>
-<?php
-                            $checked = "";
-                            if ($page->filters["in_storage"]){
-                                $checked = "checked";
-                            }
-?>
-                            <input type='checkbox' name='in_storage' <?=$checked?>/>
-                            Show monsters in storage
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='2'>
-<?php
-                            $checked = "";
-                            if ($page->filters["without_runes"]){
-                                $checked = "checked";
-                            }
-?>
-                            <input type='checkbox' name='without_runes' <?=$checked?>/>
-                            Show monsters without runes
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class='filter' colspan='2'>
-<?php
-                            $checked = "";
-                            if ($page->filters["maxed"]){
-                                $checked = "checked";
-                            }
+            $filters = $page->filters;
+            include __DIR__ . "/inc/filter_report_skillup.php";
 ?>
 ?>
-                            <input type='checkbox' name='maxed' <?=$checked?>/>
-                            Show fully skilled-up monster
-                        </td>
-                    </tr>
-                </table>
-                <div id='filter_apply'>
-                    <input type='submit' value='Apply'/>
-                </div>
-            </form>
         </section> <!-- #filters -->
         </section> <!-- #filters -->
 <?php
 <?php
         $index = 1;
         $index = 1;
-        foreach ($page->monsters as $mon){
-            if ($mon->monster->awakens_from == "" && $mon->monster->awakens_to == ""){
-                // No to, no from, silver monster.
-                $star_src = $path["img"]["layout"] . "icon/star_silver.png";
-                $mon_title = $mon->monster->element . " " . $mon->monster->name;
-            }
-            elseif ($mon->monster->awakens_from =! "" && $mon->monster->awakens_to == ""){
-                // Already awakened.
-                $star_src = $path["img"]["layout"] . "icon/star_aw.png";
-                $mon_title = $mon->monster->name;
-            }
-            elseif ($mon->monster->awakens_to =! ""){
-                // Awakeable.
-                $star_src = $path["img"]["layout"] . "icon/star.png";
-                $mon_title = $mon->monster->element . " " . $mon->monster->name;
-            }
-            if ($mon->monster->awakens_from == "" && $mon->monster->awakens_to == ""){
+        foreach ($page->units as $unit){
+            if ($unit->unit->awakens_from == "" && $unit->unit->awakens_to == ""){
                 // No to, no from, silver monster.
                 // No to, no from, silver monster.
                 $star_class ="star_silver";
                 $star_class ="star_silver";
-                $mon_title = $mon->monster->element . " " . $mon->monster->name;
+                $unit_title = $unit->unit->element . " " . $unit->unit->name;
             }
             }
-            elseif ($mon->monster->awakens_from =! "" && $mon->monster->awakens_to == ""){
+            elseif ($unit->unit->awakens_from != "" && $unit->unit->awakens_to == ""){
                 // Already awakened
                 // Already awakened
-                if ($mon->monster->base_stars - $mon->monster->natural_stars == 1){
+                if ($unit->unit->base_stars - $unit->unit->natural_stars == 1){
                     // Normal awaken.
                     // Normal awaken.
                     $star_class = "star_purple";
                     $star_class = "star_purple";
                 }
                 }
@@ -154,32 +63,32 @@
                     // Second awaken.
                     // Second awaken.
                     $star_class = "star_red";
                     $star_class = "star_red";
                 }
                 }
-                $mon_title = $mon->monster->name;
+                $unit_title = $unit->unit->name;
             }
             }
-            elseif ($mon->monster->awakens_to =! ""){
+            elseif ($unit->unit->awakens_to != ""){
                 // Awakeable.
                 // Awakeable.
                 $star_class = "star_gold";
                 $star_class = "star_gold";
-                $mon_title = $mon->monster->element . " " . $mon->monster->name;
+                $unit_title = $unit->unit->element . " " . $unit->unit->name;
             }
             }
             switch ($index % 10){
             switch ($index % 10){
                 case 1:
                 case 1:
-                    $index_title = $index . "<span class='superindex'>st</span> - " . $mon_title;
+                    $index_title = $index . "<span class='superindex'>st</span> - " . $unit_title;
                     break;
                     break;
                 case 2:
                 case 2:
-                    $index_title = $index . "<span class='superindex'>nd</span> - " . $mon_title;
+                    $index_title = $index . "<span class='superindex'>nd</span> - " . $unit_title;
                     break;
                     break;
                 case 3:
                 case 3:
-                    $index_title = $index . "<span class='superindex'>rd</span> - " . $mon_title;
+                    $index_title = $index . "<span class='superindex'>rd</span> - " . $unit_title;
                     break;
                     break;
                 default:
                 default:
-                    $index_title = $index . "<span class='superindex'>th</span> - " . $mon_title;
+                    $index_title = $index . "<span class='superindex'>th</span> - " . $unit_title;
                     break;
                     break;
             }
             }
             switch ($index % 100){
             switch ($index % 100){
                 case 11:
                 case 11:
                 case 12:
                 case 12:
                 case 13:
                 case 13:
-                    $index_title = $index . "<span class='superindex'>th</span> - " . $mon_title;
+                    $index_title = $index . "<span class='superindex'>th</span> - " . $unit_title;
                     break;
                     break;
             }
             }
 ?>
 ?>
@@ -195,63 +104,35 @@
                             <div class='monster_panel'>
                             <div class='monster_panel'>
                                 <span class='stars'>
                                 <span class='stars'>
 <?php
 <?php
-                                    for ($i = 0; $i < $mon->stars; $i ++){
+                                    for ($i = 0; $i < $unit->stars; $i ++){
 ?>
 ?>
                                         <img class='star <?=$star_class?>' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
                                         <img class='star <?=$star_class?>' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
 <?php
 <?php
                                     }
                                     }
 ?>
 ?>
                                 </span>
                                 </span>
-                                <img title='<?=$mon_title?>' class='monster border_<?=$mon->monster->element?>' src='<?=$mon->monster->get_image()?>'/>
+                                <img title='<?=$unit_title?>' class='monster border_<?=$unit->unit->element_name?>' src='<?=$unit->unit->get_image()?>'/>
                                 <span class='level'>
                                 <span class='level'>
-                                    <?=$mon->level?>
+                                    <?=$unit->level?>
                                 </span>
                                 </span>
                             </div>
                             </div>
                         </div> <!-- .profile -->
                         </div> <!-- .profile -->
                         <div class='skills'>
                         <div class='skills'>
 <?php
 <?php
-                            $skill_num = 1;
+                            $skill_num = 0;
                             $absolute_level = 0;
                             $absolute_level = 0;
                             $absolute_max_level = 0;
                             $absolute_max_level = 0;
                             $ponderated_level = 0;
                             $ponderated_level = 0;
                             $ponderated_max_level = 0;
                             $ponderated_max_level = 0;
-                            foreach ($mon->monster->skill as $skill){
+                            foreach ($unit->unit->skill as $skill){
                                 if ($skill->max_level > 1){
                                 if ($skill->max_level > 1){
                                     $absolute_max_level += $skill->max_level - 1;
                                     $absolute_max_level += $skill->max_level - 1;
                                 }
                                 }
-                                switch ($skill_num){
-                                    case 1:
-                                        $cur_lvl = $mon->skill_1_level;
-                                        if ($skill->max_level > 1){
-                                            $absolute_level += $cur_lvl - 1;
-                                            $ponderated_level += $cur_lvl - 1;
-                                            $ponderated_max_level += $skill->max_level - 1;
-                                        }
-                                        break;
-                                    case 2:
-                                        $cur_lvl = $mon->skill_2_level;
-                                        if ($skill->max_level > 1){
-                                            $absolute_level += $cur_lvl - 1;
-                                            $ponderated_level += ($cur_lvl - 1) * 1.5;
-                                            $ponderated_max_level += ($skill->max_level - 1) * 1.5;
-                                        }
-                                        break;
-                                    case 3:
-                                        $cur_lvl = $mon->skill_3_level;
-                                        if ($skill->max_level > 1){
-                                            $absolute_level += $cur_lvl - 1;
-                                            $ponderated_level += ($cur_lvl - 1) * 2.0;
-                                            $ponderated_max_level += ($skill->max_level - 1) * 2.0;
-                                        }
-                                        break;
-                                    case 4:
-                                        $cur_lvl = $mon->skill_4_level;
-                                        if ($skill->max_level > 1){
-                                            $absolute_level += $cur_lvl - 1;
-                                            $ponderated_level += ($cur_lvl - 1) * 2.5;
-                                            $ponderated_max_level += ($skill->max_level - 1) * 2.5;
-                                        }
-                                        break;
+                                $cur_lvl = $unit->skill_levels[$skill_num];
+                                if ($skill->max_level > 1){
+                                    $absolute_level += $cur_lvl - 1;
+                                    $ponderated_level += ($cur_lvl - 1) * (1 + ($skill_num / 2));
+                                    $ponderated_max_level += ($skill->max_level - 1) * (1 + ($skill_num / 2));
                                 }
                                 }
                                 $max_lvl = $skill->max_level;
                                 $max_lvl = $skill->max_level;
                                 if ($max_lvl == $cur_lvl){
                                 if ($max_lvl == $cur_lvl){
@@ -261,15 +142,15 @@
                                     $maxed = "";
                                     $maxed = "";
                                 }
                                 }
 ?>
 ?>
-                            <div class='skill'>
-                                <img title='<?=$skill->description?>' src='<?=$skill->get_image()?>'/>
-                                <span class='skill_level <?=$maxed?>'>
-                                    <?=$cur_lvl?>/<?=$max_lvl?>
-                                </span>
-                                <span class='skill_name'>
-                                    <?=$skill->name?>
-                                </span>
-                            </div>
+                                <div class='skill'>
+                                    <img title='<?=$skill->description?>' src='<?=$skill->get_image()?>'/>
+                                    <span class='skill_level <?=$maxed?>'>
+                                        <?=$cur_lvl?>/<?=$max_lvl?>
+                                    </span>
+                                    <span class='skill_name'>
+                                        <?=$skill->name?>
+                                    </span>
+                                </div>
 <?php
 <?php
                                 $skill_num ++;
                                 $skill_num ++;
                             }
                             }

+ 8 - 972
application/view/runes.php

@@ -8,6 +8,7 @@
         <!-- CSS files -->
         <!-- CSS files -->
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>ui.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>runes.css'/>
         <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>runes.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$path["css"]?>filters.css'/>
         <!-- Script files -->
         <!-- Script files -->
         <script src="<?=$path["js"]?>ui.js"></script>
         <script src="<?=$path["js"]?>ui.js"></script>
         <!-- Meta tags -->
         <!-- Meta tags -->
@@ -37,696 +38,11 @@
                 <h2>
                 <h2>
                     Rune filters
                     Rune filters
                 </h2>
                 </h2>
-                <form action='/runes/' method='get'>
-                    <table>
-                        <tr>
-                            <td class='filter' rowspan='3'>
-                                <span>Type:</span>
-                                <select multiple name='type[]' id='filter_type'>
 <?php
 <?php
-                                    $selected = "";
-                                    if (in_array("ACCURACY", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
+                $filters = $page->filters;
+                include __DIR__ . "/inc/filter_runes.php";
 ?>
 ?>
-                                    <option value='ACCURACY' <?=$selected?>>Accuracy</option>
-<?php
-                                    if (in_array("BLADE", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='BLADE' <?=$selected?>>Blade</option>
-<?php
-                                    if (in_array("DESPAIR", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='DESPAIR' <?=$selected?>>Despair</option>
-<?php
-                                    if (in_array("DESTROY", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='DESTROY' <?=$selected?>>Destroy</option>
-<?php
-                                    if (in_array("DETERMINATION", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='DETERMINATION' <?=$selected?>>Determination</option>
-<?php
-                                    if (in_array("ENDURE", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ENDURE' <?=$selected?>>Endure</option>
-<?php
-                                    if (in_array("ENERGY", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ENERGY' <?=$selected?>>Energy</option>
-<?php
-                                    if (in_array("ENHANCE", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ENHANCE' <?=$selected?>>Enhance</option>
-<?php
-                                    if (in_array("FATAL", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='FATAL' <?=$selected?>>Fatal</option>
-<?php
-                                    if (in_array("FIGHT", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='FIGHT' <?=$selected?>>Fight</option>
-<?php
-                                    if (in_array("FOCUS", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='FOCUS' <?=$selected?>>Focus</option>
-<?php
-                                    if (in_array("GUARD", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='GUARD' <?=$selected?>>Guard</option>
-<?php
-                                    if (in_array("NEMESIS", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='NEMESIS' <?=$selected?>>Nemesis</option>
-<?php
-                                    if (in_array("RAGE", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='RAGE' <?=$selected?>>Rage</option>
-<?php
-                                    if (in_array("REVENGE", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='REVENGE' <?=$selected?>>Revenge</option>
-<?php
-                                    if (in_array("SHIELD", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='SHIELD' <?=$selected?>>Shield</option>
-<?php
-                                    if (in_array("SWIFT", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='SWIFT' <?=$selected?>>Swift</option>
-<?php
-                                    if (in_array("TOLERANCE", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='TOLERANCE' <?=$selected?>>Tolerance</option>
-<?php
-                                    if (in_array("VAMPIRE", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='VAMPIRE' <?=$selected?>>Vampire</option>
-<?php
-                                    if (in_array("VIOLENT", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='VIOLENT' <?=$selected?>>Violent</option>
-<?php
-                                    if (in_array("WILL", $page->filters["type"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='WILL' <?=$selected?>>Will</option>
-                                </select>
-                            </td>
-                            <td class='filter' rowspan='2'>
-                                <span>Slot:</span>
-                                <select multiple name='slot[]' id='filter_slot'>
-<?php
-                                    if (in_array(1, $page->filters["slot"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='1' <?=$selected?>>1</option>
-<?php
-                                    if (in_array(2, $page->filters["slot"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='2' <?=$selected?>>2</option>
-<?php
-                                    if (in_array(3, $page->filters["slot"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='3' <?=$selected?>>3</option>
-<?php
-                                    if (in_array(4, $page->filters["slot"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='4' <?=$selected?>>4</option>
-<?php
-                                    if (in_array(5, $page->filters["slot"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='5' <?=$selected?>>5</option>
-<?php
-                                    if (in_array(6, $page->filters["slot"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='6' <?=$selected?>>6</option>
-                                </select>
-                            </td>
-                            <td class='filter filter_stars' >
-                                <span>Min. stars:</span>
-                                <input type='number' name='min_stars' id='filter_stars_min' min='1' max='6' value='<?=$page->filters["min_stars"]?>'/>
-                                <span>Max. stars:</span>
-                                <input type='number' name='max_stars' id='filter_stars_max' min='1' max='6' value='<?=$page->filters["max_stars"]?>'/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class='filter'>
-                                <span>Min. level:</span>
-                                <input type='number' name='min_level' id='filter_level_min' min='0' max='15' value='<?=$page->filters["min_level"]?>'/>
-                                <span>Max. level:</span>
-                                <input type='number' name='max_level' id='filter_level_max' min='0' max='15' value='<?=$page->filters["max_level"]?>'/>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class='filter'>
-                                <span>Main stat:</span>
-                                <select multiple name='main_stat[]' id='filter_main_stat'>
-<?php
-                                    if (in_array("ATK%", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ATK%' <?=$selected?>>ATK%</option>
-<?php
-                                    if (in_array("ATK", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ATK' <?=$selected?>>ATK</option>
-<?php
-                                    if (in_array("DEF%", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='DEF%' <?=$selected?>>DEF%</option>
-<?php
-                                    if (in_array("DEF", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='DEF' <?=$selected?>>DEF</option>
-<?php
-                                    if (in_array("HP%", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='HP%' <?=$selected?>>HP%</option>
-<?php
-                                    if (in_array("HP", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='HP' <?=$selected?>>HP</option>
-<?php
-                                    if (in_array("SPD", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='SPD' <?=$selected?>>SPD</option>
-<?php
-                                    if (in_array("CRR", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='CRR' <?=$selected?>>CRR</option>
-<?php
-                                    if (in_array("CRD", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='CRD' <?=$selected?>>CRD</option>
-<?php
-                                    if (in_array("ACC", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ACC' <?=$selected?>>ACC</option>
-<?php
-                                    if (in_array("RES", $page->filters["main"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='RES' <?=$selected?>>RES</option>
-                                </select>
-                            </td>
-                            <td class='filter'>
-                                <span>Has sub stat:</span>
-                                <select multiple name='sub_stat[]' id='filter_sub_stat'>
-<?php
-                                    if (in_array("ATK%", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ATK%' <?=$selected?>>ATK%</option>
-<?php
-                                    if (in_array("ATK", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ATK' <?=$selected?>>ATK</option>
-<?php
-                                    if (in_array("DEF%", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='DEF%' <?=$selected?>>DEF%</option>
-<?php
-                                    if (in_array("DEF", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='DEF' <?=$selected?>>DEF</option>
-<?php
-                                    if (in_array("HP%", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='HP%' <?=$selected?>>HP%</option>
-<?php
-                                    if (in_array("HP", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='HP' <?=$selected?>>HP</option>
-<?php
-                                    if (in_array("SPD", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='SPD' <?=$selected?>>SPD</option>
-<?php
-                                    if (in_array("CRR", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='CRR' <?=$selected?>>CRR</option>
-<?php
-                                    if (in_array("CRD", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='CRD' <?=$selected?>>CRD</option>
-<?php
-                                    if (in_array("ACC", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='ACC' <?=$selected?>>ACC</option>
-<?php
-                                    if (in_array("RES", $page->filters["sub"])){
-                                        $selected = "selected='selected'";
-                                    }
-                                    else{
-                                        $selected = "";
-                                    }
-?>
-                                    <option value='RES' <?=$selected?>>RES</option>
-                                </select>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class='filter'>
-                                <span>
-                                    Assigned:
-                                </span>
-<?php
-                                $selected_0 = "";
-                                $selected_1 = "";
-                                $selected_2 = "";
-                                $selected_3 = "";
-                                $selected_4 = "";
-                                switch (strtoupper($page->filters["assigned"])){
-                                    case 0:
-                                        $selected_0 = "selected";
-                                        break;
-                                    case 1:
-                                        $selected_1 = "selected";
-                                        break;
-                                    case 2:
-                                        $selected_2 = "selected";
-                                        break;
-                                    case 3:
-                                        $selected_3 = "selected";
-                                        break;
-                                    case 4:
-                                        $selected_4 = "selected";
-                                        break;
-                                }
-?>
-                                <select name='assigned' id='filter_assigned'>
-                                    <option value='0' <?=$selected_0?>>All</option>
-                                    <option value='1' <?=$selected_1?>>Assigned</option>
-                                    <option value='2' <?=$selected_2?>>Unassigned</option>
-                                    <option value='3' <?=$selected_3?>>All (no storage)</option>
-                                    <option value='4' <?=$selected_4?>>Assigned (no storage)</option>
-                                </select>
-                            </td>
-                            <td class='filter'>
-                                <span>Min. quality:</span>
-<?php
-                                $selected_0 = "";
-                                $selected_1 = "";
-                                $selected_2 = "";
-                                $selected_3 = "";
-                                $selected_4 = "";
-                                switch (strtoupper($page->filters["min_quality"])){
-                                    case 0:
-                                        $selected_0 = "selected";
-                                        break;
-                                    case 1:
-                                        $selected_1 = "selected";
-                                        break;
-                                    case 2:
-                                        $selected_2 = "selected";
-                                        break;
-                                    case 3:
-                                        $selected_3 = "selected";
-                                        break;
-                                    case 4:
-                                        $selected_4 = "selected";
-                                        break;
-                                }
-?>
-                                <select name='min_quality' id='filter_quality_min'>
-                                    <option value='0' <?=$selected_0?>>Normal</option>
-                                    <option value='1' <?=$selected_1?>>Magic</option>
-                                    <option value='2' <?=$selected_2?>>Rare</option>
-                                    <option value='3' <?=$selected_3?>>Hero</option>
-                                    <option value='4' <?=$selected_4?>>Legend</option>
-                                </select>
-                                <span>Max. quality:</span>
-<?php
-                                $selected_0 = "";
-                                $selected_1 = "";
-                                $selected_2 = "";
-                                $selected_3 = "";
-                                $selected_4 = "";
-                                switch (strtoupper($page->filters["max_quality"])){
-                                    case 0:
-                                        $selected_0 = "selected";
-                                        break;
-                                    case 1:
-                                        $selected_1 = "selected";
-                                        break;
-                                    case 2:
-                                        $selected_2 = "selected";
-                                        break;
-                                    case 3:
-                                        $selected_3 = "selected";
-                                        break;
-                                    case 4:
-                                        $selected_4 = "selected";
-                                        break;
-                                }
-?>
-                                <select name='max_quality' id='filter_quality_max'>
-                                    <option value='0' <?=$selected_0?>>Normal</option>
-                                    <option value='1' <?=$selected_1?>>Magic</option>
-                                    <option value='2' <?=$selected_2?>>Rare</option>
-                                    <option value='3' <?=$selected_3?>>Hero</option>
-                                    <option value='4' <?=$selected_4?>>Legend</option>
-                                </select>
-                            </td>
-                            <td class='filter'>
-                                <span>Min. original quality:</span>
-<?php
-                                $selected_0 = "";
-                                $selected_1 = "";
-                                $selected_2 = "";
-                                $selected_3 = "";
-                                $selected_4 = "";
-                                switch (strtoupper($page->filters["min_original_quality"])){
-                                    case 0:
-                                        $selected_0 = "selected";
-                                        break;
-                                    case 1:
-                                        $selected_1 = "selected";
-                                        break;
-                                    case 2:
-                                        $selected_2 = "selected";
-                                        break;
-                                    case 3:
-                                        $selected_3 = "selected";
-                                        break;
-                                    case 4:
-                                        $selected_4 = "selected";
-                                        break;
-                                }
-?>
-                                <select name='min_original_quality' id='filter_original_quality_min'>
-                                    <option value='0' <?=$selected_0?>>Normal</option>
-                                    <option value='1' <?=$selected_1?>>Magic</option>
-                                    <option value='2' <?=$selected_2?>>Rare</option>
-                                    <option value='3' <?=$selected_3?>>Hero</option>
-                                    <option value='4' <?=$selected_4?>>Legend</option>
-                                </select>
-                                <span>Max. original quality:</span>
-<?php
-                                $selected_0 = "";
-                                $selected_1 = "";
-                                $selected_2 = "";
-                                $selected_3 = "";
-                                $selected_4 = "";
-                                switch (strtoupper($page->filters["max_quality"])){
-                                    case 0:
-                                        $selected_0 = "selected";
-                                        break;
-                                    case 1:
-                                        $selected_1 = "selected";
-                                        break;
-                                    case 2:
-                                        $selected_2 = "selected";
-                                        break;
-                                    case 3:
-                                        $selected_3 = "selected";
-                                        break;
-                                    case 4:
-                                        $selected_4 = "selected";
-                                        break;
-                                }
-?>
-                                <select name='max_original_quality' id='filter_original_quality_max'>
-                                    <option value='0' <?=$selected_0?>>Normal</option>
-                                    <option value='1' <?=$selected_1?>>Magic</option>
-                                    <option value='2' <?=$selected_2?>>Rare</option>
-                                    <option value='3' <?=$selected_3?>>Hero</option>
-                                    <option value='4' <?=$selected_4?>>Legend</option>
-                                </select>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class='filter'>
-                                <span>Group by:</span>
-<?php
-                                $selected_0 = "";
-                                $selected_1 = "";
-                                switch (strtoupper($page->filters["group"])){
-                                    case "SLOT":
-                                        $selected_0 = "selected";
-                                        break;
-                                    case "TYPE":
-                                        $selected_1 = "selected";
-                                        break;
-                                }
-?>
-                                <select name='group' id='filter_group'>
-                                    <option value='SLOT' <?=$selected_0?>>Slot</option>
-                                    <option value='TYPE' <?=$selected_1?>>Type</option>
-                                </select>
-                            </td>
-                            <td class='filter'>
-                                <span>Min. efficiency:</span>
-                                <input type='number' name='min_efficiency' id='filter_efficiency_min' min='0' max='100' value='<?=$page->filters["min_efficiency"]?>'/>%
-                                <span>Max. efficiency:</span>
-                                <input type='number' name='max_efficiency' id='filter_efficiency_max' min='0' max='100' value='<?=$page->filters["max_efficiency"]?>'/>%
-                            </td>
-                            <td class='filter'>
-                                <span>Min. maximum efficiency:</span>
-                                <input type='number' name='min_max_efficiency' id='filter_max_efficiency_min' min='0' max='100' value='<?=$page->filters["min_max_efficiency"]?>'/>%
-                                <span>Max. maximum efficiency:</span>
-                                <input type='number' name='max_max_efficiency' id='filter_max_efficiency_max' min='0' max='100' value='<?=$page->filters["max_max_efficiency"]?>'/>%
-                            </td>
-                        </tr>
-                    </table>
-                    <div id='filter_apply'>
-                        <input type='submit' value='Apply'/>
-                    </div>
-                </form>
+
             </section> <!-- #filters -->
             </section> <!-- #filters -->
 <?php
 <?php
                 $prev_group = "";
                 $prev_group = "";
@@ -736,9 +52,9 @@
                 foreach ($page->runes as $rune){
                 foreach ($page->runes as $rune){
                     switch ($page->filters["group"]){
                     switch ($page->filters["group"]){
                         case "TYPE":
                         case "TYPE":
-                            $group = $rune->type;
-                            $group_title = $rune->type;
-                            $group_image = $path["img"]["layout"] . "rune/" .$rune->type . ".png";
+                            $group = $rune->type->name;
+                            $group_title = $rune->type->name;
+                            $group_image = $path["img"]["layout"] . "rune/" .str_pad($rune->type->id, 2, '0', STR_PAD_LEFT) . ".png";
                             break;
                             break;
                         default:
                         default:
                             $group = $rune->slot;
                             $group = $rune->slot;
@@ -770,287 +86,7 @@
 <?php
 <?php
                     }
                     }
 ?>
 ?>
-                    <table class='rune'>
-                        <tr>
-                            <td class='icon'>
-                                <div class='rune_panel rune_slot_<?=$rune->slot?> rune_level_<?=$rune->level?> rune_quality_<?=$rune->quality?> rune_original_quality_<?=$rune->original_quality?>'>
-                                    <img class='rune_base' src='<?=$path["img"]["layout"]?>rune/base.png'/>
-                                    <img class='rune_icon' src='<?=$path["img"]["layout"]?>rune/<?=$rune->type?>.png'/>
-                                    <span class='rune_stars'>
-<?php
-                                        for ($i = 0; $i < $rune->stars; $i ++){
-?>
-                                            <img class='star' src='<?=$path["img"]["layout"] . "icon/star.png"?>'/>
-<?php
-                                        }
-?>
-                                    </span>
-                                    <span class='rune_level'>
-                                        <?=$rune->level?>
-                                    </span>
-                                </div>
-<?php
-                                if ($rune->assigned_to != null){
-?>
-                                    <div class='assigned'>
-                                        <a target='blank' href='/monsters/<?=$rune->assigned_to->id?>'>
-                                            <img title='<?=$rune->assigned_to->monster->name?>' class='monster_image border_<?=$rune->assigned_to->monster->element?>' src='<?=$rune->assigned_to->monster->get_image()?>'/>
-                                        </a>
-                                    </div>
-<?php
-                                }
-?>
-                            </td>
-                            <td class='stats'>
-                                <table>
-                                    <tr class='main_stat'>
-                                        <td class='stat'>
-<?php
-                                            if (in_array($rune->main_stat, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                $stat_name = str_replace("%", "", $rune->main_stat);
-                                                $stat_value = "+ " . $rune->main_stat_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->main_stat;
-                                                $stat_value = "+ " . $rune->main_stat_value;
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value'>
-                                            <?=$stat_value?>
-                                        </td>
-                                    </tr>
-                                    <tr class='innate_stat'>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->innate_stat) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (in_array($rune->innate_stat, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                $stat_name = str_replace("%", "", $rune->innate_stat);
-                                                $stat_value = "+ " . $rune->innate_stat_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->innate_stat;
-                                                $stat_value = "+ " . $rune->innate_stat_value;
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value'>
-                                            <?=$stat_value?>
-                                        </td>
-                                    </tr>
-                                    <tr class=substat>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->substat_1) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (in_array($rune->substat_1, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                $stat_name = str_replace("%", "", $rune->substat_1);
-                                                $stat_value = "+ " . $rune->substat_1_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->substat_1;
-                                                $stat_value = "+ " . $rune->substat_1_value;
-                                            }
-                                            if ($rune->substat_1_craft == 1){
-                                                $craft = "craft";
-                                            }
-                                            else{
-                                                $craft = "";
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value <?=$craft?>'>
-                                            <?=$stat_value?>
-                                        </td>
-                                    </tr>
-                                    <tr class=substat>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->substat_2) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (in_array($rune->substat_2, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                $stat_name = str_replace("%", "", $rune->substat_2);
-                                                $stat_value = "+ " . $rune->substat_2_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->substat_2;
-                                                $stat_value = "+ " . $rune->substat_2_value;
-                                            }
-                                            if ($rune->substat_2_craft == 1){
-                                                $craft = "craft";
-                                            }
-                                            else{
-                                                $craft = "";
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value <?=$craft?>'>
-                                            <?=$stat_value?>
-                                        </td>
-                                    </tr>
-                                    <tr class=substat>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->substat_3) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (in_array($rune->substat_3, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                $stat_name = str_replace("%", "", $rune->substat_3);
-                                                $stat_value = "+ " . $rune->substat_3_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->substat_3;
-                                                $stat_value = "+ " . $rune->substat_3_value;
-                                            }
-                                            if ($rune->substat_3_craft == 1){
-                                                $craft = "craft";
-                                            }
-                                            else{
-                                                $craft = "";
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value <?=$craft?>'>
-                                            <?=$stat_value?>
-                                        </td>
-                                    </tr>
-                                    <tr class=substat>
-                                        <td class='stat'>
-<?php
-                                            if (strlen($rune->substat_4) == 0){
-                                                $stat_name = "&nbsp;";
-                                                $stat_value = "";
-                                            }
-                                            elseif (in_array($rune->substat_4, array("CRR", "CRD", "RES", "ACC", "HP%", "ATK%", "DEF%"))){
-                                                $stat_name = str_replace("%", "", $rune->substat_4);
-                                                $stat_value = "+ " . $rune->substat_4_value . "%";
-                                            }
-                                            else{
-                                                $stat_name = $rune->substat_4;
-                                                $stat_value = "+ " . $rune->substat_4_value;
-                                            }
-                                            if ($rune->substat_4_craft == 1){
-                                                $craft = "craft";
-                                            }
-                                            else{
-                                                $craft = "";
-                                            }
-?>
-                                            <?=$stat_name?>
-                                        </td>
-                                        <td class='value <?=$craft?>'>
-                                            <?=$stat_value?>
-                                        </td>
-                                    </tr>
-                                </table>
-                            </td>
-                            <td class='details'>
-<?php
-                                switch ($rune->quality){
-                                    case 0:
-                                        $q = "Normal";
-                                        break;
-                                    case 1:
-                                        $q = "Magic";
-                                        break;
-                                    case 2:
-                                        $q = "Rare";
-                                        break;
-                                    case 3:
-                                        $q = "Hero";
-                                        break;
-                                    case 4:
-                                        $q = "Legend";
-                                        break;
-                                }
-                                switch ($rune->original_quality){
-                                    case 0:
-                                        $oq = "Normal";
-                                        break;
-                                    case 1:
-                                        $oq = "Magic";
-                                        break;
-                                    case 2:
-                                        $oq = "Rare";
-                                        break;
-                                    case 3:
-                                        $oq = "Hero";
-                                        break;
-                                    case 4:
-                                        $oq = "Legend";
-                                        break;
-                                }
-?>
-                                <table class='table_details'>
-                                    <tr>
-                                        <td class='title'>
-                                            Quality:
-                                        </td>
-                                        <td class='value'>
-                                            <span class='quality quality_<?=strtolower($q)?>'>
-                                                <?=$q?>
-                                            </span>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Original quality:
-                                        </td>
-                                        <td class='value'>
-                                            <span class='quality quality_<?=strtolower($oq)?>'>
-                                                <?=$oq?>
-                                            </span>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Value:
-                                        </td>
-                                        <td class='value'>
-                                            <?=$rune->value?>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Efficiency:
-                                        </td>
-                                        <td class='value'>
-                                            <?=number_format($rune->efficiency, 2)?>%
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Max. efficiency:
-                                        </td>
-                                        <td class='value'>
-                                            <?=number_format($rune->max_efficiency, 2)?>%
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class='title'>
-                                            Reached efficiency:
-                                        </td>
-                                        <td class='value'>
-                                            <?=number_format($rune->efficiency * 100 / $rune->max_efficiency)?>%
-                                        </td>
-                                    </tr>
-                                </table>
-                            </td>
-                        </tr>
-                    </table>
+                    <?=html_rune_table($rune, $rune->assigned_to)?>
 <?php
 <?php
                 }
                 }
 ?>
 ?>

+ 912 - 0
data.sql

@@ -0,0 +1,912 @@
+CREATE TABLE IF NOT EXISTS k_difficulty(id INT, name TEXT);
+
+CREATE TABLE IF NOT EXISTS k_source(id INT, name TEXT, description TEXT, farmable_source INT);
+
+CREATE TABLE IF NOT EXISTS k_element(id INT, name TEXT, strong_against INT, weak_against INT);
+
+CREATE TABLE IF NOT EXISTS k_secret_dungeon(unit TEXT);
+
+CREATE TABLE IF NOT EXISTS k_archetype(id INT, name TEXT, description TEXT);
+
+CREATE TABLE IF NOT EXISTS k_stat(id INT, name TEXT);
+
+CREATE TABLE IF NOT EXISTS k_effect_area(id INT, name TEXT);
+
+CREATE TABLE IF NOT EXISTS k_decoration(id INT, area TEXT, affected_stat TEXT, element TEXT, name TEXT, description TEXT, max_level INT);
+
+CREATE TABLE IF NOT EXISTS k_building(id INT, name TEXT, description TEXT);
+
+CREATE TABLE IF NOT EXISTS k_inventory_type(id INT, name TEXT, description TEXT);
+
+CREATE TABLE IF NOT EXISTS k_inventory(id INT, type INT, name TEXT, description TEXT);
+
+CREATE TABLE IF NOT EXISTS k_enhance(id INT, name TEXT, description TEXT);
+
+CREATE TABLE IF NOT EXISTS k_rune_set(id INT, name TEXT, amount INT, description TEXT);
+
+CREATE TABLE IF NOT EXISTS k_rune_stat(id INT, name TEXT);
+
+CREATE TABLE IF NOT EXISTS k_quality(id INT, name TEXT);
+
+CREATE TABLE IF NOT EXISTS k_craft(id INT, name TEXT);
+
+CREATE TABLE IF NOT EXISTS k_experience(stars INT, level INT, exp INT);
+
+CREATE TABLE IF NOT EXISTS k_guild_skill_group(id INT, name TEXT, description TEXT);
+
+CREATE TABLE IF NOT EXISTS k_guild_skill(id INT, skill_group INT, level INT, effect TEXT);
+
+CREATE TABLE IF NOT EXISTS k_rune_craft_type(id INT, name TEXT, gem INT, inmemorial INT, ancient INT);
+
+CREATE TABLE IF NOT EXISTS k_rune_craft_range(gem INT, ancient INT, quality INT, stat INT, min INT, max INT);
+
+
+INSERT INTO k_difficulty VALUES (0, 'Easy');
+INSERT INTO k_difficulty VALUES (1, 'Normal');
+INSERT INTO k_difficulty VALUES (2, 'Hard');
+INSERT INTO k_difficulty VALUES (3, 'Hell');
+
+INSERT INTO k_source VALUES (1, 'Unknow Scroll', '', 1);
+INSERT INTO k_source VALUES (2, 'Mystical Scroll', '', 1);
+INSERT INTO k_source VALUES (3, 'Light & Dark Scroll', '', 1);
+INSERT INTO k_source VALUES (4, 'Water Scroll', '', 1);
+INSERT INTO k_source VALUES (5, 'Fire Scroll', '', 1);
+INSERT INTO k_source VALUES (6, 'Wind Scroll', '', 1);
+INSERT INTO k_source VALUES (7, 'Legendary Scroll', '', 1);
+INSERT INTO k_source VALUES (8, 'Summon Stones', '', 1);
+INSERT INTO k_source VALUES (9, 'Summon Pieces', '', 1);
+INSERT INTO k_source VALUES (10, 'Light & Dark Pieces', '', 1);
+INSERT INTO k_source VALUES (11, 'Transcendence Scroll', '', 1);
+INSERT INTO k_source VALUES (12, 'Legendary Water Scroll', '', 1);
+INSERT INTO k_source VALUES (13, 'Legendary Fire Scroll', '', 1);
+INSERT INTO k_source VALUES (14, 'Legendary Wind Scroll', '', 1);
+
+INSERT INTO k_secret_dungeon VALUES ('10103');
+INSERT INTO k_secret_dungeon VALUES ('10105');
+INSERT INTO k_secret_dungeon VALUES ('10201');
+INSERT INTO k_secret_dungeon VALUES ('10202');
+INSERT INTO k_secret_dungeon VALUES ('10203');
+INSERT INTO k_secret_dungeon VALUES ('10204');
+INSERT INTO k_secret_dungeon VALUES ('10205');
+INSERT INTO k_secret_dungeon VALUES ('10301');
+INSERT INTO k_secret_dungeon VALUES ('10302');
+INSERT INTO k_secret_dungeon VALUES ('10303');
+INSERT INTO k_secret_dungeon VALUES ('10304');
+INSERT INTO k_secret_dungeon VALUES ('10305');
+INSERT INTO k_secret_dungeon VALUES ('10401');
+INSERT INTO k_secret_dungeon VALUES ('10402');
+INSERT INTO k_secret_dungeon VALUES ('10403');
+INSERT INTO k_secret_dungeon VALUES ('10404');
+INSERT INTO k_secret_dungeon VALUES ('10601');
+INSERT INTO k_secret_dungeon VALUES ('10602');
+INSERT INTO k_secret_dungeon VALUES ('10603');
+INSERT INTO k_secret_dungeon VALUES ('10604');
+INSERT INTO k_secret_dungeon VALUES ('10702');
+INSERT INTO k_secret_dungeon VALUES ('10703');
+INSERT INTO k_secret_dungeon VALUES ('10705');
+INSERT INTO k_secret_dungeon VALUES ('10801');
+INSERT INTO k_secret_dungeon VALUES ('10802');
+INSERT INTO k_secret_dungeon VALUES ('10803');
+INSERT INTO k_secret_dungeon VALUES ('10901');
+INSERT INTO k_secret_dungeon VALUES ('10902');
+INSERT INTO k_secret_dungeon VALUES ('10903');
+INSERT INTO k_secret_dungeon VALUES ('10905');
+INSERT INTO k_secret_dungeon VALUES ('11101');
+INSERT INTO k_secret_dungeon VALUES ('11103');
+INSERT INTO k_secret_dungeon VALUES ('11104');
+INSERT INTO k_secret_dungeon VALUES ('11105');
+INSERT INTO k_secret_dungeon VALUES ('12101');
+INSERT INTO k_secret_dungeon VALUES ('12102');
+INSERT INTO k_secret_dungeon VALUES ('12103');
+INSERT INTO k_secret_dungeon VALUES ('13201');
+INSERT INTO k_secret_dungeon VALUES ('13202');
+INSERT INTO k_secret_dungeon VALUES ('13203');
+INSERT INTO k_secret_dungeon VALUES ('13204');
+INSERT INTO k_secret_dungeon VALUES ('13205');
+INSERT INTO k_secret_dungeon VALUES ('14801');
+INSERT INTO k_secret_dungeon VALUES ('14802');
+INSERT INTO k_secret_dungeon VALUES ('14803');
+INSERT INTO k_secret_dungeon VALUES ('14804');
+INSERT INTO k_secret_dungeon VALUES ('15201');
+INSERT INTO k_secret_dungeon VALUES ('15203');
+INSERT INTO k_secret_dungeon VALUES ('13604');
+INSERT INTO k_secret_dungeon VALUES ('13605');
+INSERT INTO k_secret_dungeon VALUES ('12605');
+INSERT INTO k_secret_dungeon VALUES ('12814');
+INSERT INTO k_secret_dungeon VALUES ('10101');
+INSERT INTO k_secret_dungeon VALUES ('10102');
+INSERT INTO k_secret_dungeon VALUES ('10104');
+INSERT INTO k_secret_dungeon VALUES ('10405');
+INSERT INTO k_secret_dungeon VALUES ('10501');
+INSERT INTO k_secret_dungeon VALUES ('10502');
+INSERT INTO k_secret_dungeon VALUES ('10503');
+INSERT INTO k_secret_dungeon VALUES ('10504');
+INSERT INTO k_secret_dungeon VALUES ('10505');
+INSERT INTO k_secret_dungeon VALUES ('10605');
+INSERT INTO k_secret_dungeon VALUES ('10701');
+INSERT INTO k_secret_dungeon VALUES ('10704');
+INSERT INTO k_secret_dungeon VALUES ('10804');
+INSERT INTO k_secret_dungeon VALUES ('10805');
+INSERT INTO k_secret_dungeon VALUES ('10904');
+INSERT INTO k_secret_dungeon VALUES ('11001');
+INSERT INTO k_secret_dungeon VALUES ('11002');
+INSERT INTO k_secret_dungeon VALUES ('11003');
+INSERT INTO k_secret_dungeon VALUES ('11004');
+INSERT INTO k_secret_dungeon VALUES ('11005');
+INSERT INTO k_secret_dungeon VALUES ('11102');
+INSERT INTO k_secret_dungeon VALUES ('11301');
+INSERT INTO k_secret_dungeon VALUES ('11302');
+INSERT INTO k_secret_dungeon VALUES ('11303');
+INSERT INTO k_secret_dungeon VALUES ('11304');
+INSERT INTO k_secret_dungeon VALUES ('11305');
+INSERT INTO k_secret_dungeon VALUES ('11401');
+INSERT INTO k_secret_dungeon VALUES ('11402');
+INSERT INTO k_secret_dungeon VALUES ('11403');
+INSERT INTO k_secret_dungeon VALUES ('11404');
+INSERT INTO k_secret_dungeon VALUES ('11405');
+INSERT INTO k_secret_dungeon VALUES ('11501');
+INSERT INTO k_secret_dungeon VALUES ('11502');
+INSERT INTO k_secret_dungeon VALUES ('11503');
+INSERT INTO k_secret_dungeon VALUES ('11504');
+INSERT INTO k_secret_dungeon VALUES ('11505');
+INSERT INTO k_secret_dungeon VALUES ('11701');
+INSERT INTO k_secret_dungeon VALUES ('11702');
+INSERT INTO k_secret_dungeon VALUES ('11703');
+INSERT INTO k_secret_dungeon VALUES ('11704');
+INSERT INTO k_secret_dungeon VALUES ('11705');
+INSERT INTO k_secret_dungeon VALUES ('12001');
+INSERT INTO k_secret_dungeon VALUES ('12002');
+INSERT INTO k_secret_dungeon VALUES ('12003');
+INSERT INTO k_secret_dungeon VALUES ('12004');
+INSERT INTO k_secret_dungeon VALUES ('12005');
+INSERT INTO k_secret_dungeon VALUES ('12104');
+INSERT INTO k_secret_dungeon VALUES ('12105');
+INSERT INTO k_secret_dungeon VALUES ('13701');
+INSERT INTO k_secret_dungeon VALUES ('13702');
+INSERT INTO k_secret_dungeon VALUES ('13703');
+INSERT INTO k_secret_dungeon VALUES ('13704');
+INSERT INTO k_secret_dungeon VALUES ('13705');
+INSERT INTO k_secret_dungeon VALUES ('14001');
+INSERT INTO k_secret_dungeon VALUES ('14002');
+INSERT INTO k_secret_dungeon VALUES ('14003');
+INSERT INTO k_secret_dungeon VALUES ('14004');
+INSERT INTO k_secret_dungeon VALUES ('14005');
+INSERT INTO k_secret_dungeon VALUES ('14805');
+INSERT INTO k_secret_dungeon VALUES ('15001');
+INSERT INTO k_secret_dungeon VALUES ('15002');
+INSERT INTO k_secret_dungeon VALUES ('15003');
+INSERT INTO k_secret_dungeon VALUES ('15004');
+INSERT INTO k_secret_dungeon VALUES ('15005');
+INSERT INTO k_secret_dungeon VALUES ('15202');
+INSERT INTO k_secret_dungeon VALUES ('15204');
+INSERT INTO k_secret_dungeon VALUES ('15205');
+INSERT INTO k_secret_dungeon VALUES ('15301');
+INSERT INTO k_secret_dungeon VALUES ('15303');
+INSERT INTO k_secret_dungeon VALUES ('15305');
+INSERT INTO k_secret_dungeon VALUES ('15401');
+INSERT INTO k_secret_dungeon VALUES ('15402');
+INSERT INTO k_secret_dungeon VALUES ('15403');
+INSERT INTO k_secret_dungeon VALUES ('16001');
+INSERT INTO k_secret_dungeon VALUES ('16002');
+INSERT INTO k_secret_dungeon VALUES ('16003');
+INSERT INTO k_secret_dungeon VALUES ('16004');
+INSERT INTO k_secret_dungeon VALUES ('16005');
+INSERT INTO k_secret_dungeon VALUES ('14901');
+INSERT INTO k_secret_dungeon VALUES ('14902');
+INSERT INTO k_secret_dungeon VALUES ('14903');
+INSERT INTO k_secret_dungeon VALUES ('14904');
+INSERT INTO k_secret_dungeon VALUES ('14905');
+INSERT INTO k_secret_dungeon VALUES ('15601');
+INSERT INTO k_secret_dungeon VALUES ('15602');
+INSERT INTO k_secret_dungeon VALUES ('15603');
+INSERT INTO k_secret_dungeon VALUES ('15604');
+INSERT INTO k_secret_dungeon VALUES ('15605');
+INSERT INTO k_secret_dungeon VALUES ('16501');
+INSERT INTO k_secret_dungeon VALUES ('16502');
+INSERT INTO k_secret_dungeon VALUES ('16503');
+INSERT INTO k_secret_dungeon VALUES ('16504');
+INSERT INTO k_secret_dungeon VALUES ('16505');
+INSERT INTO k_secret_dungeon VALUES ('15901');
+INSERT INTO k_secret_dungeon VALUES ('15902');
+INSERT INTO k_secret_dungeon VALUES ('15903');
+INSERT INTO k_secret_dungeon VALUES ('15904');
+INSERT INTO k_secret_dungeon VALUES ('15905');
+INSERT INTO k_secret_dungeon VALUES ('17201');
+INSERT INTO k_secret_dungeon VALUES ('17202');
+INSERT INTO k_secret_dungeon VALUES ('17203');
+INSERT INTO k_secret_dungeon VALUES ('17204');
+INSERT INTO k_secret_dungeon VALUES ('17205');
+INSERT INTO k_secret_dungeon VALUES ('17701');
+INSERT INTO k_secret_dungeon VALUES ('17702');
+INSERT INTO k_secret_dungeon VALUES ('17703');
+INSERT INTO k_secret_dungeon VALUES ('17704');
+INSERT INTO k_secret_dungeon VALUES ('17705');
+INSERT INTO k_secret_dungeon VALUES ('17801');
+INSERT INTO k_secret_dungeon VALUES ('17802');
+INSERT INTO k_secret_dungeon VALUES ('17803');
+INSERT INTO k_secret_dungeon VALUES ('17804');
+INSERT INTO k_secret_dungeon VALUES ('17805');
+INSERT INTO k_secret_dungeon VALUES ('12705');
+INSERT INTO k_secret_dungeon VALUES ('12905');
+INSERT INTO k_secret_dungeon VALUES ('13005');
+INSERT INTO k_secret_dungeon VALUES ('13105');
+INSERT INTO k_secret_dungeon VALUES ('12805');
+INSERT INTO k_secret_dungeon VALUES ('15801');
+INSERT INTO k_secret_dungeon VALUES ('15802');
+INSERT INTO k_secret_dungeon VALUES ('15803');
+INSERT INTO k_secret_dungeon VALUES ('15804');
+INSERT INTO k_secret_dungeon VALUES ('15805');
+INSERT INTO k_secret_dungeon VALUES ('18501');
+INSERT INTO k_secret_dungeon VALUES ('18502');
+INSERT INTO k_secret_dungeon VALUES ('18503');
+INSERT INTO k_secret_dungeon VALUES ('18504');
+INSERT INTO k_secret_dungeon VALUES ('18505');
+INSERT INTO k_secret_dungeon VALUES ('18402');
+INSERT INTO k_secret_dungeon VALUES ('18405');
+INSERT INTO k_secret_dungeon VALUES ('18701');
+INSERT INTO k_secret_dungeon VALUES ('18702');
+INSERT INTO k_secret_dungeon VALUES ('18703');
+INSERT INTO k_secret_dungeon VALUES ('18704');
+INSERT INTO k_secret_dungeon VALUES ('18705');
+INSERT INTO k_secret_dungeon VALUES ('19001');
+INSERT INTO k_secret_dungeon VALUES ('19002');
+INSERT INTO k_secret_dungeon VALUES ('19003');
+INSERT INTO k_secret_dungeon VALUES ('19004');
+INSERT INTO k_secret_dungeon VALUES ('19005');
+INSERT INTO k_secret_dungeon VALUES ('19501');
+INSERT INTO k_secret_dungeon VALUES ('19502');
+INSERT INTO k_secret_dungeon VALUES ('19503');
+INSERT INTO k_secret_dungeon VALUES ('19504');
+INSERT INTO k_secret_dungeon VALUES ('19505');
+INSERT INTO k_secret_dungeon VALUES ('20201');
+INSERT INTO k_secret_dungeon VALUES ('20202');
+INSERT INTO k_secret_dungeon VALUES ('20203');
+INSERT INTO k_secret_dungeon VALUES ('20204');
+INSERT INTO k_secret_dungeon VALUES ('20205');
+INSERT INTO k_secret_dungeon VALUES ('20701');
+INSERT INTO k_secret_dungeon VALUES ('20702');
+INSERT INTO k_secret_dungeon VALUES ('20703');
+INSERT INTO k_secret_dungeon VALUES ('20704');
+INSERT INTO k_secret_dungeon VALUES ('20705');
+INSERT INTO k_secret_dungeon VALUES ('20801');
+INSERT INTO k_secret_dungeon VALUES ('20802');
+INSERT INTO k_secret_dungeon VALUES ('20803');
+INSERT INTO k_secret_dungeon VALUES ('20804');
+INSERT INTO k_secret_dungeon VALUES ('20805');
+INSERT INTO k_secret_dungeon VALUES ('20301');
+INSERT INTO k_secret_dungeon VALUES ('20302');
+INSERT INTO k_secret_dungeon VALUES ('20303');
+INSERT INTO k_secret_dungeon VALUES ('20304');
+INSERT INTO k_secret_dungeon VALUES ('20305');
+
+INSERT INTO k_element VALUES (1, 'Water', 2, 3);
+INSERT INTO k_element VALUES (2, 'Fire', 3, 1);
+INSERT INTO k_element VALUES (3, 'Wind', 1, 2);
+INSERT INTO k_element VALUES (4, 'Light', 5, 5);
+INSERT INTO k_element VALUES (5, 'Dark', 4, 4);
+INSERT INTO k_element VALUES (6, 'Pure', null, null);
+
+INSERT INTO k_archetype VALUES (0, 'None', '');
+INSERT INTO k_archetype VALUES (1, 'Attack', '');
+INSERT INTO k_archetype VALUES (2, 'Defense', '');
+INSERT INTO k_archetype VALUES (3, 'HP', '');
+INSERT INTO k_archetype VALUES (4, 'Support', '');
+INSERT INTO k_archetype VALUES (5, 'Material', '');
+
+INSERT INTO k_stat VALUES (1, 'HP');
+INSERT INTO k_stat VALUES (2, 'ATK');
+INSERT INTO k_stat VALUES (3, 'DEF');
+INSERT INTO k_stat VALUES (4, 'SPD');
+INSERT INTO k_stat VALUES (5, 'CRIT_RATE');
+INSERT INTO k_stat VALUES (6, 'CRIT_DMG');
+INSERT INTO k_stat VALUES (7, 'RES');
+INSERT INTO k_stat VALUES (8, 'ACC');
+
+INSERT INTO k_effect_area VALUES (1, 'General');
+INSERT INTO k_effect_area VALUES (1, 'Arena');
+INSERT INTO k_effect_area VALUES (2, 'Dungeon');
+INSERT INTO k_effect_area VALUES (5, 'Guild');
+
+INSERT INTO k_decoration VALUES (4, 1, 3, null, 'Guardstone', '', 10);
+INSERT INTO k_decoration VALUES (15, 1, 2, 2, 'Fire Sanctuary', '', 10);
+INSERT INTO k_decoration VALUES (16, 1, 2, 1, 'Water Sanctuary', '', 10);
+INSERT INTO k_decoration VALUES (17, 1, 2, 3, 'Wind Sanctuary', '', 10);
+INSERT INTO k_decoration VALUES (18, 1, 2, 4, 'Light Sanctuary', '', 10);
+INSERT INTO k_decoration VALUES (19, 1, 2, 5, 'Dark Sanctuary', '', 10);
+INSERT INTO k_decoration VALUES (31, 1, 6, null, 'Fallen Ancient Guardian', '', 10);
+INSERT INTO k_decoration VALUES (6, 1, 4, null, 'Sky Tribe Totem', '', 10);
+INSERT INTO k_decoration VALUES (8, 1, 1, null, 'Crystal Altar', '', 10);
+INSERT INTO k_decoration VALUES (36, 5, 2, null, 'Flag of Battle', '', 10);
+INSERT INTO k_decoration VALUES (37, 5, 6, null, 'Flag of Rage', '', 10);
+INSERT INTO k_decoration VALUES (38, 5, 1, null, 'Flag of Hope', '', 10);
+INSERT INTO k_decoration VALUES (39, 5, 3, null, 'Flag of Will', '', 10);
+INSERT INTO k_decoration VALUES (9, 1, 2, null, 'Ancient Sword', '', 10);
+INSERT INTO k_decoration VALUES (7, 1, null, null, 'Arcane Booster Tower', '', 10);
+INSERT INTO k_decoration VALUES (34, 1, null, null, 'Crystal Rock', '', 10);
+INSERT INTO k_decoration VALUES (11, 1, null, null, 'Mysterious Plant', '', 10);
+INSERT INTO k_decoration VALUES (5, 1, null, null, 'Mana Fountain', '', 10);
+INSERT INTO k_decoration VALUES (10, 1, null, null, 'Sanctum of Energy', '', 10);
+INSERT INTO k_decoration VALUES (35, 1, null, null, 'Fairy Tree', '', 10);
+
+INSERT INTO k_building VALUES(1, 'Summoners Tower', '');
+INSERT INTO k_building VALUES(2, 'Summonhenge', '');
+INSERT INTO k_building VALUES(3, 'Pond of Mana', '');
+INSERT INTO k_building VALUES(4, 'Crystal Mine', '');
+INSERT INTO k_building VALUES(8, 'Gateway', '');
+INSERT INTO k_building VALUES(10, 'Temple of Wishes', '');
+INSERT INTO k_building VALUES(11, 'Magic Shop', '');
+INSERT INTO k_building VALUES(12, 'Ancient Stones', '');
+INSERT INTO k_building VALUES(14, 'Arcane Tower', '');
+INSERT INTO k_building VALUES(15, 'Crystal Titan', '');
+INSERT INTO k_building VALUES(16, 'Fusion Hexagram', '');
+INSERT INTO k_building VALUES(17, 'Fuse Center', '');
+INSERT INTO k_building VALUES(20, 'Power Up Circle', '');
+INSERT INTO k_building VALUES(22, 'Tranquil Forest', '');
+INSERT INTO k_building VALUES(23, 'Gusty Cliffs', '');
+INSERT INTO k_building VALUES(24, 'Deep Forest Ent', '');
+INSERT INTO k_building VALUES(25, 'Monster Storage', '');
+INSERT INTO k_building VALUES(27, 'Transmogrification Building', '');
+
+INSERT INTO k_inventory_type VALUES(1, 'Monster', '');
+INSERT INTO k_inventory_type VALUES(6, 'Currency', '');
+INSERT INTO k_inventory_type VALUES(8, 'Rune', '');
+INSERT INTO k_inventory_type VALUES(9, 'Scroll', '');
+INSERT INTO k_inventory_type VALUES(10, 'Booster', '');
+INSERT INTO k_inventory_type VALUES(11, 'Essences', '');
+INSERT INTO k_inventory_type VALUES(12, 'Monster Piece', '');
+INSERT INTO k_inventory_type VALUES(15, 'UNKNOWN', 'Appears in inventory_info with qty 0');
+INSERT INTO k_inventory_type VALUES(19, 'Guild Monster Piece', '');
+INSERT INTO k_inventory_type VALUES(19, 'Rainbowmon', ''); -- Possibly material monsters in general. Appears when wish returns a rainbowmon.
+INSERT INTO k_inventory_type VALUES(27, 'Rune Craft', '');
+INSERT INTO k_inventory_type VALUES(29, 'Craft Stuff', '');
+INSERT INTO k_inventory_type VALUES(61, 'Enhancing Monster', '');
+
+INSERT INTO k_inventory VALUES(1, 9, 'Unknown Scroll', '');
+INSERT INTO k_inventory VALUES(2, 9, 'Social Points', '');
+INSERT INTO k_inventory VALUES(3, 9, 'Mystical Scroll', '');
+INSERT INTO k_inventory VALUES(4, 9, 'Mystical Summon', '');
+INSERT INTO k_inventory VALUES(5, 9, 'Fire Scroll', '');
+INSERT INTO k_inventory VALUES(6, 9, 'Water Scroll', '');
+INSERT INTO k_inventory VALUES(7, 9, 'Wind Scroll', '');
+INSERT INTO k_inventory VALUES(8, 9, 'Light and Dark Scroll', '');
+INSERT INTO k_inventory VALUES(9, 9, 'Legendary Scroll', '');
+INSERT INTO k_inventory VALUES(10, 9, 'Summon Stone', '');
+INSERT INTO k_inventory VALUES(11, 9, 'Light and Dark Summon', '');
+INSERT INTO k_inventory VALUES(12, 9, 'Legendary Summon Pieces', '');
+INSERT INTO k_inventory VALUES(13, 9, 'Transcendance Scroll', '');
+INSERT INTO k_inventory VALUES(14, 9, 'Legendary Water Scroll', '');
+INSERT INTO k_inventory VALUES(15, 9, 'Legendary Fire Scroll', '');
+INSERT INTO k_inventory VALUES(16, 9, 'Legendary Wind Scroll', '');
+INSERT INTO k_inventory VALUES(11006, 11, 'Essence of Magic (low)', '');
+INSERT INTO k_inventory VALUES(12006, 11, 'Essence of Magic (mid)', '');
+INSERT INTO k_inventory VALUES(13006, 11, 'Essence of Magic (high)', '');
+INSERT INTO k_inventory VALUES(11001, 11, 'Essence of Water (low)', '');
+INSERT INTO k_inventory VALUES(12001, 11, 'Essence of Water (mid)', '');
+INSERT INTO k_inventory VALUES(13001, 11, 'Essence of Water (high)', '');
+INSERT INTO k_inventory VALUES(11002, 11, 'Essence of Fire (low)', '');
+INSERT INTO k_inventory VALUES(12002, 11, 'Essence of Fire (mid)', '');
+INSERT INTO k_inventory VALUES(13002, 11, 'Essence of Fire (high)', '');
+INSERT INTO k_inventory VALUES(11003, 11, 'Essence of Wind (low)', '');
+INSERT INTO k_inventory VALUES(12003, 11, 'Essence of Wind (mid)', '');
+INSERT INTO k_inventory VALUES(13003, 11, 'Essence of Wind (high)', '');
+INSERT INTO k_inventory VALUES(11004, 11, 'Essence of Light (low)', '');
+INSERT INTO k_inventory VALUES(12004, 11, 'Essence of Light (mid)', '');
+INSERT INTO k_inventory VALUES(13004, 11, 'Essence of Light (high)', '');
+INSERT INTO k_inventory VALUES(11005, 11, 'Essence of Dark (low)', '');
+INSERT INTO k_inventory VALUES(12005, 11, 'Essence of Dark (mid)', '');
+INSERT INTO k_inventory VALUES(13005, 11, 'Essence of Dark (high)', '');
+INSERT INTO k_inventory VALUES(1001, 29, 'Wood', '');
+INSERT INTO k_inventory VALUES(1002, 29, 'Leather', '');
+INSERT INTO k_inventory VALUES(1003, 29, 'Rock', '');
+INSERT INTO k_inventory VALUES(1004, 29, 'Ore', '');
+INSERT INTO k_inventory VALUES(1005, 29, 'Mithril', '');
+INSERT INTO k_inventory VALUES(1006, 29, 'Cloth', '');
+INSERT INTO k_inventory VALUES(2001, 27, 'Rune Piece', '');
+INSERT INTO k_inventory VALUES(3001, 29, 'Powder', '');
+INSERT INTO k_inventory VALUES(4001, 27, 'Symbol of Harmony', '');
+INSERT INTO k_inventory VALUES(4002, 27, 'Symbol of Transcendance', '');
+INSERT INTO k_inventory VALUES(4003, 27, 'Symbol of Chaos', '');
+INSERT INTO k_inventory VALUES(5001, 29,  'Crystal of Water', '');
+INSERT INTO k_inventory VALUES(5002, 29, 'Crystal of Fire', '');
+INSERT INTO k_inventory VALUES(5003, 29, 'Crystal of Wind', '');
+INSERT INTO k_inventory VALUES(5004, 29, 'Crystal of Light', '');
+INSERT INTO k_inventory VALUES(5005, 29, 'Crystal of Dark', '');
+INSERT INTO k_inventory VALUES(6001, 29, 'Crystal of Magic', '');
+INSERT INTO k_inventory VALUES(7001, 29, 'Crystal of Pure', '');
+INSERT INTO k_inventory VALUES(142110115, 61, 'Water Angelmon', '');
+INSERT INTO k_inventory VALUES(142120115, 61, 'Fire Angelmon', '');
+INSERT INTO k_inventory VALUES(142130115, 61, 'Wind Angelmon', '');
+INSERT INTO k_inventory VALUES(142140115, 61, 'Light Angelmon', '');
+INSERT INTO k_inventory VALUES(142150115, 61, 'Dark Angelmon', '');
+INSERT INTO k_inventory VALUES(182110115, 61, 'Water King Angelmon', '');
+INSERT INTO k_inventory VALUES(182120115, 61, 'Fire King Angelmon', '');
+INSERT INTO k_inventory VALUES(182130115, 61, 'Wind King Angelmon', '');
+INSERT INTO k_inventory VALUES(182140115, 61, 'Light King Angelmon', '');
+INSERT INTO k_inventory VALUES(182150115, 61, 'Dark King Angelmon', '');
+INSERT INTO k_inventory VALUES(143140220, 61, 'Rainbowmon (2* MAX)', '');
+INSERT INTO k_inventory VALUES(143140301, 61, 'Rainbowmon (3*)', '');
+INSERT INTO k_inventory VALUES(143140325, 61, 'Rainbowmon (3* MAX)', '');
+INSERT INTO k_inventory VALUES(143140401, 61, 'Rainbowmon (4*)', '');
+INSERT INTO k_inventory VALUES(143140430, 61, 'Rainbowmon (4* MAX)', '');
+INSERT INTO k_inventory VALUES(143140501, 61, 'Rainbowmon (5*)', '');
+INSERT INTO k_inventory VALUES(151050101, 61, 'Devilmon', '');
+INSERT INTO k_inventory VALUES(217140115, 61, 'Super Angelmon', '');
+
+INSERT INTO k_rune_set VALUES(1, 'Energy', 2, '');
+INSERT INTO k_rune_set VALUES(2, 'Guard', 2, '');
+INSERT INTO k_rune_set VALUES(3, 'Swift', 2, '');
+INSERT INTO k_rune_set VALUES(4, 'Blade', 2, '');
+INSERT INTO k_rune_set VALUES(5, 'Rage', 2, '');
+INSERT INTO k_rune_set VALUES(6, 'Focus', 2, '');
+INSERT INTO k_rune_set VALUES(7, 'Endure', 2, '');
+INSERT INTO k_rune_set VALUES(8, 'Fatal', 2, '');
+INSERT INTO k_rune_set VALUES(10, 'Despair', 2, '');
+INSERT INTO k_rune_set VALUES(11, 'Vampire', 2, '');
+INSERT INTO k_rune_set VALUES(13, 'Violent', 2, '');
+INSERT INTO k_rune_set VALUES(14, 'Nemesis', 2, '');
+INSERT INTO k_rune_set VALUES(15, 'Will', 2, '');
+INSERT INTO k_rune_set VALUES(16, 'Shield', 2, '');
+INSERT INTO k_rune_set VALUES(17, 'Revenge', 2, '');
+INSERT INTO k_rune_set VALUES(18, 'Destroy', 2, '');
+INSERT INTO k_rune_set VALUES(19, 'Fight', 2, '');
+INSERT INTO k_rune_set VALUES(20, 'Determination', 2, '');
+INSERT INTO k_rune_set VALUES(21, 'Enhance', 2, '');
+INSERT INTO k_rune_set VALUES(22, 'Accuracy', 2, '');
+INSERT INTO k_rune_set VALUES(23, 'Tolerance', 2, '');
+
+INSERT INTO k_rune_stat VALUES(1, 'HP');
+INSERT INTO k_rune_stat VALUES(2, 'HP%');
+INSERT INTO k_rune_stat VALUES(3, 'ATK');
+INSERT INTO k_rune_stat VALUES(4, 'ATK%');
+INSERT INTO k_rune_stat VALUES(5, 'DEF');
+INSERT INTO k_rune_stat VALUES(6, 'DEF%');
+INSERT INTO k_rune_stat VALUES(8, 'SPD');
+INSERT INTO k_rune_stat VALUES(9, 'CRIT_RATE');
+INSERT INTO k_rune_stat VALUES(10, 'CRIT_DMG');
+INSERT INTO k_rune_stat VALUES(11, 'RES');
+INSERT INTO k_rune_stat VALUES(12, 'ACC');
+
+INSERT INTO k_quality VALUES(1, 'Normal');
+INSERT INTO k_quality VALUES(2, 'Magic');
+INSERT INTO k_quality VALUES(3, 'Rare');
+INSERT INTO k_quality VALUES(4, 'Hero');
+INSERT INTO k_quality VALUES(5, 'Legend');
+
+INSERT INTO k_craft VALUES(1, 'Enchant_gem');
+INSERT INTO k_craft VALUES(2, 'Grindstone');
+INSERT INTO k_craft VALUES(3, 'Immemorial_gem');
+INSERT INTO k_craft VALUES(4, 'Immemorial_grindstone');
+
+INSERT INTO k_experience VALUES (1, 1, 460);
+INSERT INTO k_experience VALUES (2, 1, 552);
+INSERT INTO k_experience VALUES (3, 1, 662);
+INSERT INTO k_experience VALUES (4, 1, 796);
+INSERT INTO k_experience VALUES (5, 1, 952);
+INSERT INTO k_experience VALUES (6, 1, 1150);
+INSERT INTO k_experience VALUES (1, 2, 516);
+INSERT INTO k_experience VALUES (2, 2, 619);
+INSERT INTO k_experience VALUES (3, 2, 743);
+INSERT INTO k_experience VALUES (4, 2, 892);
+INSERT INTO k_experience VALUES (5, 2, 1068);
+INSERT INTO k_experience VALUES (6, 2, 1290);
+INSERT INTO k_experience VALUES (1, 3, 579);
+INSERT INTO k_experience VALUES (2, 3, 695);
+INSERT INTO k_experience VALUES (3, 3, 834);
+INSERT INTO k_experience VALUES (4, 3, 1002);
+INSERT INTO k_experience VALUES (5, 3, 1199);
+INSERT INTO k_experience VALUES (6, 3, 1447);
+INSERT INTO k_experience VALUES (1, 4, 650);
+INSERT INTO k_experience VALUES (2, 4, 779);
+INSERT INTO k_experience VALUES (3, 4, 936);
+INSERT INTO k_experience VALUES (4, 4, 1124);
+INSERT INTO k_experience VALUES (5, 4, 1344);
+INSERT INTO k_experience VALUES (6, 4, 1624);
+INSERT INTO k_experience VALUES (1, 5, 728);
+INSERT INTO k_experience VALUES (2, 5, 875);
+INSERT INTO k_experience VALUES (3, 5, 1049);
+INSERT INTO k_experience VALUES (4, 5, 1261);
+INSERT INTO k_experience VALUES (5, 5, 1509);
+INSERT INTO k_experience VALUES (6, 5, 1823);
+INSERT INTO k_experience VALUES (1, 6, 818);
+INSERT INTO k_experience VALUES (2, 6, 981);
+INSERT INTO k_experience VALUES (3, 6, 1178);
+INSERT INTO k_experience VALUES (4, 6, 1415);
+INSERT INTO k_experience VALUES (5, 6, 1693);
+INSERT INTO k_experience VALUES (6, 6, 2044);
+INSERT INTO k_experience VALUES (1, 7, 918);
+INSERT INTO k_experience VALUES (2, 7, 1102);
+INSERT INTO k_experience VALUES (3, 7, 1321);
+INSERT INTO k_experience VALUES (4, 7, 1587);
+INSERT INTO k_experience VALUES (5, 7, 1899);
+INSERT INTO k_experience VALUES (6, 7, 2294);
+INSERT INTO k_experience VALUES (1, 8, 1029);
+INSERT INTO k_experience VALUES (2, 8, 1235);
+INSERT INTO k_experience VALUES (3, 8, 1483);
+INSERT INTO k_experience VALUES (4, 8, 1781);
+INSERT INTO k_experience VALUES (5, 8, 2131);
+INSERT INTO k_experience VALUES (6, 8, 2574);
+INSERT INTO k_experience VALUES (1, 9, 1155);
+INSERT INTO k_experience VALUES (2, 9, 1386);
+INSERT INTO k_experience VALUES (3, 9, 1663);
+INSERT INTO k_experience VALUES (4, 9, 1998);
+INSERT INTO k_experience VALUES (5, 9, 2392);
+INSERT INTO k_experience VALUES (6, 9, 2888);
+INSERT INTO k_experience VALUES (1, 10, 1296);
+INSERT INTO k_experience VALUES (2, 10, 1555);
+INSERT INTO k_experience VALUES (3, 10, 1866);
+INSERT INTO k_experience VALUES (4, 10, 2243);
+INSERT INTO k_experience VALUES (5, 10, 2682);
+INSERT INTO k_experience VALUES (6, 10, 3240);
+INSERT INTO k_experience VALUES (1, 11, 1455);
+INSERT INTO k_experience VALUES (2, 11, 1745);
+INSERT INTO k_experience VALUES (3, 11, 2094);
+INSERT INTO k_experience VALUES (4, 11, 2515);
+INSERT INTO k_experience VALUES (5, 11, 3010);
+INSERT INTO k_experience VALUES (6, 11, 3635);
+INSERT INTO k_experience VALUES (1, 12, 1631);
+INSERT INTO k_experience VALUES (2, 12, 1958);
+INSERT INTO k_experience VALUES (3, 12, 2350);
+INSERT INTO k_experience VALUES (4, 12, 2823);
+INSERT INTO k_experience VALUES (5, 12, 3378);
+INSERT INTO k_experience VALUES (6, 12, 4079);
+INSERT INTO k_experience VALUES (1, 13, 1831);
+INSERT INTO k_experience VALUES (2, 13, 2197);
+INSERT INTO k_experience VALUES (3, 13, 2636);
+INSERT INTO k_experience VALUES (4, 13, 3167);
+INSERT INTO k_experience VALUES (5, 13, 3789);
+INSERT INTO k_experience VALUES (6, 13, 4576);
+INSERT INTO k_experience VALUES (1, 14, 2054);
+INSERT INTO k_experience VALUES (2, 14, 2465);
+INSERT INTO k_experience VALUES (3, 14, 2957);
+INSERT INTO k_experience VALUES (4, 14, 3553);
+INSERT INTO k_experience VALUES (5, 14, 4252);
+INSERT INTO k_experience VALUES (6, 14, 5135);
+INSERT INTO k_experience VALUES (1, 15, 0);
+INSERT INTO k_experience VALUES (2, 15, 2765);
+INSERT INTO k_experience VALUES (3, 15, 3319);
+INSERT INTO k_experience VALUES (4, 15, 3987);
+INSERT INTO k_experience VALUES (5, 15, 4770);
+INSERT INTO k_experience VALUES (6, 15, 5762);
+INSERT INTO k_experience VALUES (2, 16, 3103);
+INSERT INTO k_experience VALUES (3, 16, 3723);
+INSERT INTO k_experience VALUES (4, 16, 4473);
+INSERT INTO k_experience VALUES (5, 16, 5352);
+INSERT INTO k_experience VALUES (6, 16, 6464);
+INSERT INTO k_experience VALUES (2, 17, 3481);
+INSERT INTO k_experience VALUES (3, 17, 4178);
+INSERT INTO k_experience VALUES (4, 17, 5019);
+INSERT INTO k_experience VALUES (5, 17, 6006);
+INSERT INTO k_experience VALUES (6, 17, 7252);
+INSERT INTO k_experience VALUES (2, 18, 3906);
+INSERT INTO k_experience VALUES (3, 18, 4687);
+INSERT INTO k_experience VALUES (4, 18, 5631);
+INSERT INTO k_experience VALUES (5, 18, 6738);
+INSERT INTO k_experience VALUES (6, 18, 8138);
+INSERT INTO k_experience VALUES (2, 19, 4423);
+INSERT INTO k_experience VALUES (3, 19, 5307);
+INSERT INTO k_experience VALUES (4, 19, 6376);
+INSERT INTO k_experience VALUES (5, 19, 7628);
+INSERT INTO k_experience VALUES (6, 19, 9214);
+INSERT INTO k_experience VALUES (2, 20, 0);
+INSERT INTO k_experience VALUES (3, 20, 6009);
+INSERT INTO k_experience VALUES (4, 20, 7219);
+INSERT INTO k_experience VALUES (5, 20, 8638);
+INSERT INTO k_experience VALUES (6, 20, 10431);
+INSERT INTO k_experience VALUES (3, 21, 6802);
+INSERT INTO k_experience VALUES (4, 21, 8172);
+INSERT INTO k_experience VALUES (5, 21, 9779);
+INSERT INTO k_experience VALUES (6, 21, 11811);
+INSERT INTO k_experience VALUES (3, 22, 7703);
+INSERT INTO k_experience VALUES (4, 22, 9254);
+INSERT INTO k_experience VALUES (5, 22, 11072);
+INSERT INTO k_experience VALUES (6, 22, 13371);
+INSERT INTO k_experience VALUES (3, 23, 8720);
+INSERT INTO k_experience VALUES (4, 23, 10476);
+INSERT INTO k_experience VALUES (5, 23, 12535);
+INSERT INTO k_experience VALUES (6, 23, 15140);
+INSERT INTO k_experience VALUES (3, 24, 9962);
+INSERT INTO k_experience VALUES (4, 24, 11969);
+INSERT INTO k_experience VALUES (5, 24, 14321);
+INSERT INTO k_experience VALUES (6, 24, 17296);
+INSERT INTO k_experience VALUES (3, 25, 0);
+INSERT INTO k_experience VALUES (4, 25, 13673);
+INSERT INTO k_experience VALUES (5, 25, 16360);
+INSERT INTO k_experience VALUES (6, 25, 19758);
+INSERT INTO k_experience VALUES (4, 26, 15619);
+INSERT INTO k_experience VALUES (5, 26, 18690);
+INSERT INTO k_experience VALUES (6, 26, 22572);
+INSERT INTO k_experience VALUES (4, 27, 17844);
+INSERT INTO k_experience VALUES (5, 27, 21350);
+INSERT INTO k_experience VALUES (6, 27, 25786);
+INSERT INTO k_experience VALUES (4, 28, 20386);
+INSERT INTO k_experience VALUES (5, 28, 24392);
+INSERT INTO k_experience VALUES (6, 28, 29458);
+INSERT INTO k_experience VALUES (4, 29, 23495);
+INSERT INTO k_experience VALUES (5, 29, 28113);
+INSERT INTO k_experience VALUES (6, 29, 33954);
+INSERT INTO k_experience VALUES (4, 30, 0);
+INSERT INTO k_experience VALUES (5, 30, 32404);
+INSERT INTO k_experience VALUES (6, 30, 39134);
+INSERT INTO k_experience VALUES (5, 31, 37348);
+INSERT INTO k_experience VALUES (6, 31, 45107);
+INSERT INTO k_experience VALUES (5, 32, 43048);
+INSERT INTO k_experience VALUES (6, 32, 51990);
+INSERT INTO k_experience VALUES (5, 33, 49617);
+INSERT INTO k_experience VALUES (6, 33, 59924);
+INSERT INTO k_experience VALUES (5, 34, 57188);
+INSERT INTO k_experience VALUES (6, 34, 69068);
+INSERT INTO k_experience VALUES (5, 35, 0);
+INSERT INTO k_experience VALUES (6, 35, 76085);
+INSERT INTO k_experience VALUES (6, 36, 83816);
+INSERT INTO k_experience VALUES (6, 37, 92332);
+INSERT INTO k_experience VALUES (6, 38, 101712);
+INSERT INTO k_experience VALUES (6, 39, 112046);
+INSERT INTO k_experience VALUES (6, 40, 0);
+
+INSERT INTO k_guild_skill_group VALUES (1, 'Crest of Punishment', 'Increases the stats of ally Monsters in Cairos Dungeon');
+INSERT INTO k_guild_skill_group VALUES (2, 'Aura of Purification', 'Increases the stats of ally Monsters in Rift Beast Battles');
+INSERT INTO k_guild_skill_group VALUES (3, 'Pavement of Ancient', 'Increases the stats of ally Monsters in Labyrinths');
+INSERT INTO k_guild_skill_group VALUES (4, 'Pledge of Faith', 'Increases the stats of ally Monsters in Rift Raid Battles');
+INSERT INTO k_guild_skill_group VALUES (5, 'Trade association Alliance', 'Unlocks an aditional slot in the Guild Magic Shop');
+INSERT INTO k_guild_skill_group VALUES (6, 'Mana Purifier', 'Increases the amount of Mana Stones you acquire in all battles');
+INSERT INTO k_guild_skill_group VALUES (7, 'EXP Amplifier', 'Increases the amount of EXP  that all Monsters acquire in battles');
+
+INSERT INTO k_guild_skill VALUES (1, 1, 1, 'HP +2%');
+INSERT INTO k_guild_skill VALUES (2, 1, 6, 'DEF +2%');
+INSERT INTO k_guild_skill VALUES (3, 1, 11, 'ATK +2%');
+INSERT INTO k_guild_skill VALUES (4, 1, 16, 'HP +2%');
+INSERT INTO k_guild_skill VALUES (5, 1, 21, 'DEF +2%');
+INSERT INTO k_guild_skill VALUES (6, 1, 26, 'ATK +2%');
+INSERT INTO k_guild_skill VALUES (7, 2, 2, 'HP +2%');
+INSERT INTO k_guild_skill VALUES (8, 2, 7, 'DEF +2%');
+INSERT INTO k_guild_skill VALUES (9, 2, 12, 'ATK +2%');
+INSERT INTO k_guild_skill VALUES (10, 2, 17, 'HP +2%');
+INSERT INTO k_guild_skill VALUES (11, 2, 22, 'DEF +2%');
+INSERT INTO k_guild_skill VALUES (12, 2, 27, 'ATK +2%');
+INSERT INTO k_guild_skill VALUES (13, 3, 3, 'HP +2%');
+INSERT INTO k_guild_skill VALUES (14, 3, 8, 'DEF +2%');
+INSERT INTO k_guild_skill VALUES (15, 3, 13, 'ATK +2%');
+INSERT INTO k_guild_skill VALUES (16, 3, 18, 'HP +2%');
+INSERT INTO k_guild_skill VALUES (17, 3, 23, 'DEF +2%');
+INSERT INTO k_guild_skill VALUES (18, 3, 28, 'ATK +2%');
+INSERT INTO k_guild_skill VALUES (19, 4, 4, 'HP +2%');
+INSERT INTO k_guild_skill VALUES (20, 4, 9, 'DEF +2%');
+INSERT INTO k_guild_skill VALUES (21, 4, 14, 'ATK +2%');
+INSERT INTO k_guild_skill VALUES (22, 4, 19, 'HP +2%');
+INSERT INTO k_guild_skill VALUES (23, 4, 24, 'DEF +2%');
+INSERT INTO k_guild_skill VALUES (24, 4, 29, 'ATK +2%');
+INSERT INTO k_guild_skill VALUES (25, 5, 5, 'Add 1 more Guild Magic Shop slot');
+INSERT INTO k_guild_skill VALUES (26, 5, 10, 'Add 1 more Guild Magic Shop slot');
+INSERT INTO k_guild_skill VALUES (27, 5, 15, 'Add 1 more Guild Magic Shop slot');
+INSERT INTO k_guild_skill VALUES (28, 5, 20, 'Add 1 more Guild Magic Shop slot');
+INSERT INTO k_guild_skill VALUES (29, 6, 15, 'Gain 5% additional Mana Stones');
+INSERT INTO k_guild_skill VALUES (30, 7, 30, 'Gain 5% additional EXP');
+
+INSERT INTO k_rune_craft_type VALUES (1, 'Enchant Gem', 1, 0, 0);
+INSERT INTO k_rune_craft_type VALUES (2, 'Grindstone', 0, 0, 0);
+INSERT INTO k_rune_craft_type VALUES (3, 'Inmemorial Gem', 1, 1, 0);
+INSERT INTO k_rune_craft_type VALUES (4, 'Inmemorial Grindstone', 0, 1, 0);
+INSERT INTO k_rune_craft_type VALUES (5, 'Ancient Gem', 1, 0, 1);
+INSERT INTO k_rune_craft_type VALUES (6, 'Ancient Grindstone', 0, 0, 1);
+
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 1, 80, 120);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 1, 100, 200);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 1, 180, 250);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 1, 230, 450);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 1, 430, 550);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 2, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 2, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 2, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 2, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 2, 5, 10);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 3, 4, 8);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 3, 6, 12);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 3, 10, 18);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 3, 12, 22);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 3, 18, 30);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 4, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 4, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 4, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 4, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 4, 5, 10);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 5, 4, 8);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 5, 6, 12);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 5, 10, 18);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 5, 12, 22);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 5, 18, 30);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 6, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 6, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 6, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 6, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 6, 5, 10);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 8, 1, 2);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 8, 1, 2);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 8, 2, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 8, 3, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 8, 4, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 9, 1, 2);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 9, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 9, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 9, 3, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 9, 4, 6);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 10, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 10, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 10, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 10, 3, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 10, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 11, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 11, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 11, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 11, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 11, 4, 8);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 1, 12, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 2, 12, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 3, 12, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 4, 12, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 0, 5, 12, 4, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 1, 100, 150);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 1, 130, 220);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 1, 200, 310);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 1, 290, 420);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 1, 400, 580);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 2, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 2, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 2, 5, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 2, 7, 11);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 2, 9, 13);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 3, 8, 12);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 3, 10, 16);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 3, 15, 23);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 3, 20, 30);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 3, 28, 40);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 4, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 4, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 4, 5, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 4, 7, 11);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 4, 9, 13);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 5, 8, 12);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 5, 10, 16);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 5, 15, 23);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 5, 20, 30);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 5, 28, 40);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 6, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 6, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 6, 5, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 6, 7, 11);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 6, 9, 13);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 8, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 8, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 8, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 8, 5, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 8, 7, 10);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 9, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 9, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 9, 3, 5);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 9, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 9, 6, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 10, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 10, 3, 5);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 10, 4, 6);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 10, 5, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 10, 7, 10);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 11, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 11, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 11, 5, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 11, 6, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 11, 8, 11);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 1, 12, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 2, 12, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 3, 12, 5, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 4, 12, 6, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 0, 5, 12, 8, 11);
+-- TODO: Fix ancient ranges
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 1, 80, 120);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 1, 100, 200);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 1, 180, 250);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 1, 230, 450);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 1, 430, 550);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 2, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 2, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 2, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 2, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 2, 5, 10);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 3, 4, 8);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 3, 6, 12);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 3, 10, 18);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 3, 12, 22);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 3, 18, 30);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 4, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 4, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 4, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 4, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 4, 5, 10);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 5, 4, 8);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 5, 6, 12);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 5, 10, 18);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 5, 12, 22);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 5, 18, 30);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 6, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 6, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 6, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 6, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 6, 5, 10);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 8, 1, 2);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 8, 1, 2);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 8, 2, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 8, 3, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 8, 4, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 9, 1, 2);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 9, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 9, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 9, 3, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 9, 4, 6);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 10, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 10, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 10, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 10, 3, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 10, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 11, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 11, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 11, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 11, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 11, 4, 8);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 1, 12, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 2, 12, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 3, 12, 2, 5);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 4, 12, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (0, 1, 5, 12, 4, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 1, 100, 150);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 1, 130, 220);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 1, 200, 310);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 1, 290, 420);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 1, 400, 580);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 2, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 2, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 2, 5, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 2, 7, 11);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 2, 9, 13);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 3, 8, 12);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 3, 10, 16);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 3, 15, 23);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 3, 20, 30);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 3, 28, 40);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 4, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 4, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 4, 5, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 4, 7, 11);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 4, 9, 13);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 5, 8, 12);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 5, 10, 16);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 5, 15, 23);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 5, 20, 30);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 5, 28, 40);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 6, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 6, 3, 7);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 6, 5, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 6, 7, 11);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 6, 9, 13);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 8, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 8, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 8, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 8, 5, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 8, 7, 10);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 9, 1, 3);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 9, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 9, 3, 5);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 9, 4, 7);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 9, 6, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 10, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 10, 3, 5);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 10, 4, 6);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 10, 5, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 10, 7, 10);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 11, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 11, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 11, 5, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 11, 6, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 11, 8, 11);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 1, 12, 2, 4);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 2, 12, 3, 6);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 3, 12, 5, 8);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 4, 12, 6, 9);
+INSERT INTO k_rune_craft_range VALUES (1, 1, 5, 12, 8, 11);

+ 298 - 114
install_base.py

@@ -9,7 +9,7 @@ import sqlite3
 import wget
 import wget
 import json
 import json
 
 
-OPT_DOWNLOAD = True;
+OPT_DOWNLOAD = False; # TODO
 OPT_DOWNLOAD_OVERWRITE = False;
 OPT_DOWNLOAD_OVERWRITE = False;
 
 
 """
 """
@@ -27,20 +27,8 @@ def createDatabase(name):
         db = sqlite3.connect(name)
         db = sqlite3.connect(name)
         cursor = db.cursor()
         cursor = db.cursor()
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS k_building(
-                id INT,
-                com2us_id INT,
-                area TEXT,
-                affected_stat TEXT,
-                element TEXT,
-                name TEXT,
-                description TEXT,
-                max_level INT
-            );
-        ''')
-        cursor.execute('''
-            CREATE TABLE IF NOT EXISTS k_building_level(
-                building INT,
+            CREATE TABLE IF NOT EXISTS k_decoration_level(
+                decoration TEXT,
                 level INT,
                 level INT,
                 bonus INT,
                 bonus INT,
                 cost INT
                 cost INT
@@ -56,14 +44,28 @@ def createDatabase(name):
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
             CREATE TABLE IF NOT EXISTS k_skill_level(
             CREATE TABLE IF NOT EXISTS k_skill_level(
-                skill INT,
+                skill TEXT,
                 level INT,
                 level INT,
                 description TEXT
                 description TEXT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
             CREATE TABLE IF NOT EXISTS k_skill(
             CREATE TABLE IF NOT EXISTS k_skill(
-                id INT,
+                id TEXT,
+                name TEXT,
+                description TEXT,
+                slot INT,
+                cooltime INT,
+                hits INT,
+                passive INT,
+                aoe INT,
+                max_level INT,
+                multiplier_formula TEXT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS k_skill_tmp(
+                id TEXT,
                 com2us_id TEXT,
                 com2us_id TEXT,
                 name TEXT,
                 name TEXT,
                 description TEXT,
                 description TEXT,
@@ -78,7 +80,7 @@ def createDatabase(name):
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
             CREATE TABLE IF NOT EXISTS k_skill_effect(
             CREATE TABLE IF NOT EXISTS k_skill_effect(
-                skill INT,
+                skill TEXT,
                 effect INT
                 effect INT
             );
             );
         ''')
         ''')
@@ -92,18 +94,45 @@ def createDatabase(name):
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS k_source(
-                id INT,
+            CREATE TABLE IF NOT EXISTS k_unit(
+                id TEXT,
+                family TEXT,
                 name TEXT,
                 name TEXT,
-                description TEXT,
-                farmable_source INT
+                element TEXT,
+                archetype TEXT,
+                base_stars INT,
+                natural_stars INT,
+                obtainable INT,
+                can_awaken INT,
+                awaken_bonus TEXT,
+                skill_ups_to_max INT,
+                leader_skill INT,
+                hp INT,
+                attack INT,
+                defense INT,
+                speed INT,
+                crit_rate INT,
+                crit_damage INT,
+                resistance INT,
+                accuracy INT,
+                raw_hp INT,
+                raw_attack INT,
+                raw_defense INT,
+                max_lvl_hp INT,
+                max_lvl_attack INT,
+                max_lvl_defense INT,
+                awakens_from INT,
+                awakens_to INT,
+                fusion_food INT,
+                homunculus INT,
+                craft_cost INT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS k_monster(
-                id INT,
+            CREATE TABLE IF NOT EXISTS k_unit_tmp(
+                id TEXT,
                 com2us_id TEXT,
                 com2us_id TEXT,
-                family_id TEXT,
+                family TEXT,
                 name TEXT,
                 name TEXT,
                 element TEXT,
                 element TEXT,
                 archetype TEXT,
                 archetype TEXT,
@@ -114,9 +143,9 @@ def createDatabase(name):
                 awaken_bonus TEXT,
                 awaken_bonus TEXT,
                 skill_ups_to_max INT,
                 skill_ups_to_max INT,
                 leader_skill INT,
                 leader_skill INT,
-                base_hp INT,
-                base_attack INT,
-                base_defense INT,
+                hp INT,
+                attack INT,
+                defense INT,
                 speed INT,
                 speed INT,
                 crit_rate INT,
                 crit_rate INT,
                 crit_damage INT,
                 crit_damage INT,
@@ -136,20 +165,20 @@ def createDatabase(name):
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS k_monster_skill(
-                monster INT,
-                skill INT
+            CREATE TABLE IF NOT EXISTS k_unit_skill(
+                unit TEXT,
+                skill TEXT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS k_monster_source(
-                monster INT,
+            CREATE TABLE IF NOT EXISTS k_unit_source(
+                unit TEXT,
                 source INT
                 source INT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS k_monster_essence(
-                monster INT,
+            CREATE TABLE IF NOT EXISTS k_unit_essence(
+                unit TEXT,
                 element TEXT,
                 element TEXT,
                 grade TEXT,
                 grade TEXT,
                 amount TEXT
                 amount TEXT
@@ -158,66 +187,116 @@ def createDatabase(name):
         cursor.execute('''
         cursor.execute('''
             CREATE TABLE IF NOT EXISTS k_fusion(
             CREATE TABLE IF NOT EXISTS k_fusion(
                 id INT,
                 id INT,
-                product INT,
+                product TEXT,
                 stars INT,
                 stars INT,
                 cost INT,
                 cost INT,
-                ingredient INT
+                ingredient TEXT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS k_craft(
-                id INT,
-                name INT
+            CREATE TABLE IF NOT EXISTS player(
+                uid TEXT,
+                name TEXT,
+                mana INT,
+                crystal INT,
+                country TEXT,
+                lang TEXT,
+                level INT,
+                experience INT,
+                energy INT,
+                energy_max INT,
+                energy_per_min INT,
+                arena_energy INT,
+                arena_energy_max INT,
+                rep TEXT,
+                social_point INT,
+                honor_point INT,
+                guild_point INT,
+                darkportal_energy INT,
+                darkportal_energy_max INT,
+                dimension_energy INT,
+                dimension_energy_max INT,
+                costume_point INT,
+                costume_point_max INT,
+                honor_medal INT,
+                honor_mark INT,
+                event_coin INT,
+                storage_slots INT,
+                island INT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS monster(
+            CREATE TABLE IF NOT EXISTS scenario(
+                uid TEXT,
+                region INT,
+                difficulty INT,
+                cleared INT,
+                max_cleared INT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS defense(
+                uid TEXT,
+                unit TEXT,
+                position INT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS defense(
+                uid TEXT,
+                building INT,
+                level INT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS unit(
+                uid TEXT,
                 id TEXT,
                 id TEXT,
-                com2us_id TEXT,
-                monster INT,
-                stars INT,
+                building TEXT,
+                unit TEXT,
                 level INT,
                 level INT,
-                skill_1_level INT,
-                skill_2_level INT,
-                skill_3_level INT,
-                skill_4_level INT,
-                base_hp INT,
-                base_attack INT,
-                base_defense INT,
-                base_speed INT,
-                base_crit_rate INT,
-                base_crit_damage INT,
-                base_resistance INT,
-                base_accuracy INT,
-                rune_hp INT,
-                rune_attack INT,
-                rune_defense INT,
-                rune_speed INT,
-                rune_crit_rate INT,
-                rune_crit_damage INT,
-                rune_resistance INT,
-                rune_accuracy INT,
-                avg_rune_efficiency INT,
-                fodder INT,
-                in_storage INT,
-                ignore_for_fusion INT,
-                priority INT,
-                notes INT
+                stars INT,
+                hp INT,
+                attack INT,
+                defense INT,
+                speed INT,
+                crit_rate INT,
+                crit_damage INT,
+                resistance INT,
+                accuracy INT,
+                experience INT,
+                exp_gained INT,
+                exp_gain_rate INT,
+                costume INT,
+                attribute INT,
+                source INT,
+                create_time DATETIME,
+                homunculus INT,
+                homunculus_name TEXT,
+                lock INT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS unit_skill(
+                uid TEXT,
+                unit TEXT,
+                skill TEXT,
+                level INT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
             CREATE TABLE IF NOT EXISTS rune(
             CREATE TABLE IF NOT EXISTS rune(
+                uid TEXT,
                 id TEXT,
                 id TEXT,
-                com2us_id TEXT,
                 assigned_to TEXT,
                 assigned_to TEXT,
                 type TEXT,
                 type TEXT,
                 slot INT,
                 slot INT,
                 stars INT,
                 stars INT,
+                ancient INT,
                 level INT,
                 level INT,
                 quality INT,
                 quality INT,
                 original_quality INT,
                 original_quality INT,
                 value INT,
                 value INT,
-                substat_upgrades_remaining INT,
                 efficiency INT,
                 efficiency INT,
                 max_efficiency INT,
                 max_efficiency INT,
                 main_stat TEXT,
                 main_stat TEXT,
@@ -226,30 +305,89 @@ def createDatabase(name):
                 innate_stat_value INT,
                 innate_stat_value INT,
                 substat_1 TEXT,
                 substat_1 TEXT,
                 substat_1_value INT,
                 substat_1_value INT,
-                substat_1_craft INT,
+                substat_1_enchant INT,
+                substat_1_grind INT,
                 substat_2 TEXT,
                 substat_2 TEXT,
                 substat_2_value INT,
                 substat_2_value INT,
-                substat_2_craft INT,
+                substat_2_enchant INT,
+                substat_2_grind INT,
                 substat_3 TEXT,
                 substat_3 TEXT,
                 substat_3_value INT,
                 substat_3_value INT,
-                substat_3_craft INT,
+                substat_3_enchant INT,
+                substat_3_grind INT,
                 substat_4 TEXT,
                 substat_4 TEXT,
                 substat_4_value INT,
                 substat_4_value INT,
-                substat_4_craft INT
+                substat_4_enchant INT,
+                substat_4_grind INT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS monster_rune(
-                monster TEXT,
-                rune INT
+            CREATE TABLE IF NOT EXISTS building(
+                uid TEXT,
+                building INT,
+                gain INT
             );
             );
         ''')
         ''')
         cursor.execute('''
         cursor.execute('''
-            CREATE TABLE IF NOT EXISTS building(
-                building INT,
+            CREATE TABLE IF NOT EXISTS decoration(
+                uid TEXT,
+                decoration INT,
                 level INT
                 level INT
             );
             );
         ''')
         ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS inventory(
+                uid TEXT,
+                id TEXT,
+                type TEXT,
+                amount INT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS summon_special(
+                week TEXT,
+                unit TEXT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS guild(
+                id TEXT,
+                name TEXT,
+                level INT,
+                experience INT,
+                recruiting INT,
+                members INT,
+                leader INT,
+                comment TEXT,
+                notice TEXT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS guild_member(
+                id TEXT,
+                guild TEXT,
+                grade INT,
+                name TEXT,
+                level INT,
+                rating INT,
+                arena_score INT,
+                joined TIMESTAMP,
+                last_login TIMESTAMP,
+                in_war INT,
+                has_defense INT
+            );
+        ''')
+        cursor.execute('''
+            CREATE TABLE IF NOT EXISTS rune_craft(
+                uid TEXT,
+                id INT,
+                type INT,
+                quality INT,
+                rune INT,
+                stat INT,
+                value INT
+            );
+        ''')
         db.commit()
         db.commit()
         cursor.close()
         cursor.close()
         return db
         return db
@@ -327,7 +465,7 @@ def parseBuildings(db, url):
             name = building["name"]
             name = building["name"]
             description = building["description"]
             description = building["description"]
             max_level = building["max_level"]
             max_level = building["max_level"]
-            insert(db, "k_building", (id, com2us_id, area, affected_stat, element, name, description, max_level))
+            insert(db, "k_building_tmp", (id, com2us_id, area, affected_stat, element, name, description, max_level))
             lv = 0
             lv = 0
             for bonus in building["stat_bonus"]:
             for bonus in building["stat_bonus"]:
                 insert(db, "k_building_level", (id, lv, bonus, building["upgrade_cost"][lv]))
                 insert(db, "k_building_level", (id, lv, bonus, building["upgrade_cost"][lv]))
@@ -364,7 +502,7 @@ def parseSkills(db, url):
             aoe = skill["aoe"]
             aoe = skill["aoe"]
             max_level = skill["max_level"]
             max_level = skill["max_level"]
             multiplier_formula = skill["multiplier_formula"]
             multiplier_formula = skill["multiplier_formula"]
-            insert(db, "k_skill", (id, com2us_id, name, description, slot, cooltime, hits, passive, aoe, max_level, multiplier_formula))
+            insert(db, "k_skill_tmp", (id, com2us_id, name, description, slot, cooltime, hits, passive, aoe, max_level, multiplier_formula))
             insert(db, "k_skill_level", (id, 1, ""))
             insert(db, "k_skill_level", (id, 1, ""))
             if (max_level > 1):
             if (max_level > 1):
                 lv = 2
                 lv = 2
@@ -467,7 +605,7 @@ def parseSources(db, url):
             break
             break
 
 
 """
 """
-Parses monster data (tables k_monster, k_monster_essence, k_monster_source,
+Parses monster data (tables k_unit, k_unit_essence, k_unit_source,
 k_monsster_skill).
 k_monsster_skill).
 
 
 :param db: Sqlite database connection.
 :param db: Sqlite database connection.
@@ -500,9 +638,9 @@ def parseMonsters(db, url):
             else:
             else:
                 leader_skill = None
                 leader_skill = None
             homunculus_skills = mon["homunculus_skills"]
             homunculus_skills = mon["homunculus_skills"]
-            base_hp = mon["base_hp"]
-            base_attack = mon["base_attack"]
-            base_defense = mon["base_defense"]
+            hp = mon["base_hp"]
+            attack = mon["base_attack"]
+            defense = mon["base_defense"]
             speed = mon["speed"]
             speed = mon["speed"]
             crit_rate = mon["crit_rate"]
             crit_rate = mon["crit_rate"]
             crit_damage = mon["crit_damage"]
             crit_damage = mon["crit_damage"]
@@ -537,47 +675,47 @@ def parseMonsters(db, url):
             fusion_food = mon["fusion_food"]
             fusion_food = mon["fusion_food"]
             homunculus = mon["homunculus"]
             homunculus = mon["homunculus"]
             craft_cost = mon["craft_cost"]
             craft_cost = mon["craft_cost"]
-            insert(db, "k_monster", (id, com2us_id, family_id, name, element, archetype, base_stars, natural_stars, obtainable, can_awaken, awaken_bonus, skill_ups_to_max, leader_skill, base_hp, base_attack, base_defense, speed, crit_rate, crit_damage, resistance, accuracy, raw_hp, raw_attack, raw_defense, max_lvl_hp, max_lvl_attack, max_lvl_defense, awakens_from, awakens_to, fusion_food, homunculus, craft_cost))
+            insert(db, "k_unit_tmp", (id, com2us_id, family_id, name, element, archetype, base_stars, natural_stars, obtainable, can_awaken, awaken_bonus, skill_ups_to_max, leader_skill, hp, attack, defense, speed, crit_rate, crit_damage, resistance, accuracy, raw_hp, raw_attack, raw_defense, max_lvl_hp, max_lvl_attack, max_lvl_defense, awakens_from, awakens_to, fusion_food, homunculus, craft_cost))
             if awaken_mats_fire_low > 0:
             if awaken_mats_fire_low > 0:
-                insert(db, "k_monster_essence", (id, "Fire", "Low", awaken_mats_fire_low))
+                insert(db, "k_unit_essence", (id, "Fire", "Low", awaken_mats_fire_low))
             if awaken_mats_fire_mid > 0:
             if awaken_mats_fire_mid > 0:
-                insert(db, "k_monster_essence", (id, "Fire", "Mid", awaken_mats_fire_mid))
+                insert(db, "k_unit_essence", (id, "Fire", "Mid", awaken_mats_fire_mid))
             if awaken_mats_fire_high > 0:
             if awaken_mats_fire_high > 0:
-                insert(db, "k_monster_essence", (id, "Fire", "High", awaken_mats_fire_high))
+                insert(db, "k_unit_essence", (id, "Fire", "High", awaken_mats_fire_high))
             if awaken_mats_water_low > 0:
             if awaken_mats_water_low > 0:
-                insert(db, "k_monster_essence", (id, "Water", "Low", awaken_mats_water_low))
+                insert(db, "k_unit_essence", (id, "Water", "Low", awaken_mats_water_low))
             if awaken_mats_water_mid > 0:
             if awaken_mats_water_mid > 0:
-                insert(db, "k_monster_essence", (id, "Water", "Mid", awaken_mats_water_mid))
+                insert(db, "k_unit_essence", (id, "Water", "Mid", awaken_mats_water_mid))
             if awaken_mats_water_high > 0:
             if awaken_mats_water_high > 0:
-                insert(db, "k_monster_essence", (id, "Water", "High", awaken_mats_water_high))
+                insert(db, "k_unit_essence", (id, "Water", "High", awaken_mats_water_high))
             if awaken_mats_wind_low > 0:
             if awaken_mats_wind_low > 0:
-                insert(db, "k_monster_essence", (id, "Wind", "Low", awaken_mats_wind_low))
+                insert(db, "k_unit_essence", (id, "Wind", "Low", awaken_mats_wind_low))
             if awaken_mats_wind_mid > 0:
             if awaken_mats_wind_mid > 0:
-                insert(db, "k_monster_essence", (id, "Wind", "Mid", awaken_mats_wind_mid))
+                insert(db, "k_unit_essence", (id, "Wind", "Mid", awaken_mats_wind_mid))
             if awaken_mats_wind_high > 0:
             if awaken_mats_wind_high > 0:
-                insert(db, "k_monster_essence", (id, "Wind", "High", awaken_mats_wind_high))
+                insert(db, "k_unit_essence", (id, "Wind", "High", awaken_mats_wind_high))
             if awaken_mats_dark_low > 0:
             if awaken_mats_dark_low > 0:
-                insert(db, "k_monster_essence", (id, "Dark", "Low", awaken_mats_dark_low))
+                insert(db, "k_unit_essence", (id, "Dark", "Low", awaken_mats_dark_low))
             if awaken_mats_dark_mid > 0:
             if awaken_mats_dark_mid > 0:
-                insert(db, "k_monster_essence", (id, "Dark", "Mid", awaken_mats_dark_mid))
+                insert(db, "k_unit_essence", (id, "Dark", "Mid", awaken_mats_dark_mid))
             if awaken_mats_dark_high > 0:
             if awaken_mats_dark_high > 0:
-                insert(db, "k_monster_essence", (id, "Dark", "High", awaken_mats_dark_high))
+                insert(db, "k_unit_essence", (id, "Dark", "High", awaken_mats_dark_high))
             if awaken_mats_light_low > 0:
             if awaken_mats_light_low > 0:
-                insert(db, "k_monster_essence", (id, "Light", "Low", awaken_mats_light_low))
+                insert(db, "k_unit_essence", (id, "Light", "Low", awaken_mats_light_low))
             if awaken_mats_light_mid > 0:
             if awaken_mats_light_mid > 0:
-                insert(db, "k_monster_essence", (id, "Light", "Mid", awaken_mats_light_mid))
+                insert(db, "k_unit_essence", (id, "Light", "Mid", awaken_mats_light_mid))
             if awaken_mats_light_high > 0:
             if awaken_mats_light_high > 0:
-                insert(db, "k_monster_essence", (id, "Light", "High", awaken_mats_light_high))
+                insert(db, "k_unit_essence", (id, "Light", "High", awaken_mats_light_high))
             if awaken_mats_magic_low > 0:
             if awaken_mats_magic_low > 0:
-                insert(db, "k_monster_essence", (id, "Magic", "Low", awaken_mats_magic_low))
+                insert(db, "k_unit_essence", (id, "Magic", "Low", awaken_mats_magic_low))
             if awaken_mats_magic_mid > 0:
             if awaken_mats_magic_mid > 0:
-                insert(db, "k_monster_essence", (id, "Magic", "Mid", awaken_mats_magic_mid))
+                insert(db, "k_unit_essence", (id, "Magic", "Mid", awaken_mats_magic_mid))
             if awaken_mats_magic_high > 0:
             if awaken_mats_magic_high > 0:
-                insert(db, "k_monster_essence", (id, "Magic", "High", awaken_mats_magic_high))
+                insert(db, "k_unit_essence", (id, "Magic", "High", awaken_mats_magic_high))
             for skill in mon["skills"]:
             for skill in mon["skills"]:
-                insert(db, "k_monster_skill", (id, skill))
+                insert(db, "k_unit_skill", (id, skill))
             for source in mon["source"]:
             for source in mon["source"]:
-                insert(db, "k_monster_source", (id, source["id"]))
+                insert(db, "k_unit_source", (id, source["id"]))
             # TODO: craft_materials
             # TODO: craft_materials
             image = "https://swarfarm.com/static/herders/images/monsters/" + mon["image_filename"]
             image = "https://swarfarm.com/static/herders/images/monsters/" + mon["image_filename"]
             download(image, 'public/img/content/monster/' + str(id).zfill(4) + '.png')
             download(image, 'public/img/content/monster/' + str(id).zfill(4) + '.png')
@@ -653,28 +791,74 @@ wil be cut.
 
 
 :param db: Sqlite database connection.
 :param db: Sqlite database connection.
 """
 """
-def removeImperfect():
+def removeImperfect(db):
+    print("Unlinking inperfetc units...")
     cursor = db.cursor()
     cursor = db.cursor()
     cursor.execute('''
     cursor.execute('''
-        UPDATE k_monster
+        UPDATE k_unit
         SET awakens_from = null
         SET awakens_from = null
-        WHERE awakens_from IN (SELECT id FROM k_monster WHERE name LIKE 'Imperfect %')
+        WHERE awakens_from IN (SELECT id FROM k_unit WHERE name LIKE 'Imperfect %')
     ''');
     ''');
     db.commit()
     db.commit()
     cursor.close()
     cursor.close()
 
 
+"""
+Changes IDS from swarfarm formats to swex formats.
 
 
+:param db: Sqlite database connection.
+"""
+def useSwexIds(db):
+    print("Updating IDs...")
+    cursor = db.cursor()
+    #cursor.execute('UPDATE k_building_level SET building = (SELECT com2us_id FROM k_building WHERE building = id)')
+    #cursor.execute('UPDATE k_building_tmp SET id = com2us_id')
+    cursor.execute('UPDATE k_skill_level SET skill = (SELECT com2us_id FROM k_skill_tmp WHERE skill = id)')
+    cursor.execute('UPDATE k_skill_effect SET skill = (SELECT com2us_id FROM k_skill_tmp WHERE skill = id)')
+    cursor.execute('UPDATE k_unit_skill SET skill = (SELECT com2us_id FROM k_skill_tmp WHERE skill = id)')
+    cursor.execute('UPDATE k_skill_tmp SET id = com2us_id')
+    cursor.execute('UPDATE k_unit_skill SET unit = (SELECT com2us_id FROM k_unit_tmp WHERE unit = k_unit_tmp.id)')
+    cursor.execute('UPDATE k_unit_source SET unit = (SELECT com2us_id FROM k_unit_tmp WHERE unit = k_unit_tmp.id)')
+    cursor.execute('UPDATE k_unit_essence SET unit = (SELECT com2us_id FROM k_unit_tmp WHERE unit = k_unit_tmp.id)')
+    cursor.execute('UPDATE k_fusion SET product = (SELECT com2us_id FROM k_unit_tmp WHERE product = k_unit_tmp.id)')
+    cursor.execute('UPDATE k_fusion SET ingredient = (SELECT com2us_id FROM k_unit_tmp WHERE ingredient = k_unit_tmp.id)')
+    cursor.execute('UPDATE k_unit_tmp SET awakens_from = (SELECT com2us_id FROM k_unit_tmp un WHERE k_unit_tmp.awakens_from = un.id)')
+    cursor.execute('UPDATE k_unit_tmp SET awakens_to = (SELECT com2us_id FROM k_unit_tmp un WHERE k_unit_tmp.awakens_to = un.id)')
+    cursor.execute('UPDATE k_unit_tmp SET id = com2us_id')
+    cursor.execute('UPDATE k_unit_tmp SET element = (SELECT id FROM k_element WHERE k_element.name = k_unit_tmp.element)')
+    cursor.execute('UPDATE k_unit_tmp SET archetype = (SELECT id FROM k_archetype WHERE k_archetype.name = k_unit_tmp.archetype) WHERE archetype IS NOT NULL')
+    db.commit()
+    #cursor.execute('INSERT INTO k_building SELECT id, area, affected_stat, element, name, description, max_level FROM k_building_tmp')
+    cursor.execute('INSERT INTO k_skill SELECT id, name, description, slot, cooltime, hits, passive, aoe, max_level, multiplier_formula FROM k_skill_tmp')
+    cursor.execute('INSERT INTO k_unit SELECT id, family, name, element, archetype, base_stars, natural_stars, obtainable, can_awaken, awaken_bonus, skill_ups_to_max, leader_skill, hp, attack, defense, speed, crit_rate, crit_damage, resistance, accuracy, raw_hp, raw_attack, raw_defense, max_lvl_hp, max_lvl_attack, max_lvl_defense, awakens_from, awakens_to, fusion_food, homunculus, craft_cost FROM k_unit_tmp')
+    db.commit()
+    #cursor.execute('DROP TABLE k_building_tmp')
+    cursor.execute('DROP TABLE k_skill_tmp')
+    cursor.execute('DROP TABLE k_unit_tmp')
+    cursor.close()
+
+def staticData(db):
+    print("Procesing data...")
+    cursor = db.cursor()
+    with open("data.sql", "r") as data:
+        for line in data:
+            if len(line) > 1:
+                cursor.execute(line)
+    db.commit()
+    cursor.close()
 
 
 """
 """
 Begin script
 Begin script
 """
 """
 db = createDatabase('application/sw.sqlite')
 db = createDatabase('application/sw.sqlite')
-parseBuildings(db, 'https://swarfarm.com/api/v2/buildings/')
+staticData(db)
+#parseBuildings(db, 'https://swarfarm.com/api/v2/buildings/')
 parseEffects(db, 'https://swarfarm.com/api/v2/skill-effects/')
 parseEffects(db, 'https://swarfarm.com/api/v2/skill-effects/')
 parseSkills(db, 'https://swarfarm.com/api/v2/skills/')
 parseSkills(db, 'https://swarfarm.com/api/v2/skills/')
 parseLeaderSkills(db, 'https://swarfarm.com/api/v2/leader-skills/')
 parseLeaderSkills(db, 'https://swarfarm.com/api/v2/leader-skills/')
-parseSources(db, 'https://swarfarm.com/api/v2/monster-sources/')
+#parseSources(db, 'https://swarfarm.com/api/v2/monster-sources/')
 parseMonsters(db, 'https://swarfarm.com/api/v2/monsters/')
 parseMonsters(db, 'https://swarfarm.com/api/v2/monsters/')
 parseFusions(db, 'https://swarfarm.com/api/v2/fusions/')
 parseFusions(db, 'https://swarfarm.com/api/v2/fusions/')
-parseCraft(db, 'https://swarfarm.com/api/v2/craft-materials/')
+#parseCraft(db, 'https://swarfarm.com/api/v2/craft-materials/')
 removeImperfect(db)
 removeImperfect(db)
+useSwexIds(db)
+

+ 834 - 311
install_user.py

@@ -8,8 +8,14 @@ import urllib.request
 import sqlite3
 import sqlite3
 import wget
 import wget
 import json
 import json
+import math
 
 
-USER = "ivv0"
+FILE = "/home/ivalentin/.SWEX/IVV0-8114048.json"
+
+def readFile(file):
+    with open(file) as json_file:
+        data = json.load(json_file)
+    return data
 
 
 """
 """
 Opens the database file and deletes from the user tables
 Opens the database file and deletes from the user tables
@@ -25,11 +31,19 @@ def openDatabase(name):
     try:
     try:
         db = sqlite3.connect(name)
         db = sqlite3.connect(name)
         cursor = db.cursor()
         cursor = db.cursor()
-        cursor.execute('''DELETE FROM monster''')
-        cursor.execute('''DELETE FROM monster_rune''')
+        cursor.execute('''DELETE FROM scenario''')
+        cursor.execute('''DELETE FROM defense''')
+        cursor.execute('''DELETE FROM unit''')
+        cursor.execute('''DELETE FROM unit_skill''')
         cursor.execute('''DELETE FROM rune''')
         cursor.execute('''DELETE FROM rune''')
-        #cursor.execute('''DELETE FROM player''')
+        cursor.execute('''DELETE FROM player''')
         cursor.execute('''DELETE FROM building''')
         cursor.execute('''DELETE FROM building''')
+        cursor.execute('''DELETE FROM decoration''')
+        cursor.execute('''DELETE FROM inventory''')
+        cursor.execute('''DELETE FROM summon_special''')
+        cursor.execute('''DELETE FROM guild''')
+        cursor.execute('''DELETE FROM guild_member''')
+        cursor.execute('''DELETE FROM rune_craft''')
         db.commit()
         db.commit()
         cursor.close()
         cursor.close()
         return db
         return db
@@ -64,335 +78,844 @@ def insert(db, table, values):
     cursor.close;
     cursor.close;
 
 
 """
 """
-Parses building data (table building).
+Parses player (table player).
+
+:param db: Sqlite database connection.
+:param data: Data in SWEX json file.
+"""
+def parsePlayer(db, data):
+    print("Parsing player...")
+    uid = data["wizard_info"]["wizard_id"]
+    name = data["wizard_info"]["wizard_name"]
+    mana = data["wizard_info"]["wizard_mana"]
+    crystal = data["wizard_info"]["wizard_crystal"]
+    country = data["wizard_info"]["wizard_last_country"]
+    lang = data["wizard_info"]["wizard_last_lang"]
+    level = data["wizard_info"]["wizard_level"]
+    experience = data["wizard_info"]["experience"]
+    energy = data["wizard_info"]["wizard_energy"]
+    energy_max = data["wizard_info"]["energy_max"]
+    energy_per_min = data["wizard_info"]["energy_per_min"]
+    arena_energy = data["wizard_info"]["arena_energy"]
+    arena_energy_max = data["wizard_info"]["arena_energy_max"]
+    rep = data["wizard_info"]["rep_unit_id"]
+    social_point = data["wizard_info"]["social_point_current"]
+    honor_point = data["wizard_info"]["honor_point"]
+    guild_point = data["wizard_info"]["guild_point"]
+    darkportal_energy = data["wizard_info"]["darkportal_energy"]
+    darkportal_energy_max = data["wizard_info"]["darkportal_energy_max"]
+    dimension_energy = data["dimension_hole_info"]["energy"]
+    dimension_energy_max = data["dimension_hole_info"]["energy_max"]
+    costume_point = data["wizard_info"]["costume_point"]
+    costume_point_max = data["wizard_info"]["costume_point_max"]
+    honor_medal = data["wizard_info"]["honor_medal"]
+    honor_mark = data["wizard_info"]["honor_mark"]
+    event_coin = data["wizard_info"]["event_coin"]
+    storage_slots = data["unit_depository_slots"]["number"]
+    island_upgrade = 0
+    for island in data["island_info"]:
+        if island["id"] <= 7 and island["open"] == 1:
+            island_upgrade = island["id"]
+    insert(db, "player", (uid, name, mana, crystal, country, lang, level, experience, energy, energy_max, energy_per_min, arena_energy, arena_energy_max, rep, social_point, honor_point, guild_point, darkportal_energy, darkportal_energy_max, dimension_energy, dimension_energy_max, costume_point, costume_point_max, honor_medal, honor_medal, event_coin, storage_slots, island_upgrade))
+    db.commit()
+
+"""
+Parses scenarios (table scenario).
+
+:param db: Sqlite database connection.
+:param data: Data in SWEX json file.
+"""
+def parseScenarios(db, data):
+    print("Parsing scenarios...")
+    uid = data["wizard_info"]["wizard_id"]
+    for sce in data["scenario_list"]:
+        region = sce["region_id"]
+        difficulty = sce["difficulty"]
+        cleared = sce["cleared"]
+        max_cleared = 0
+        for stage in sce["stage_list"]:
+            if stage["cleared"] == 1:
+                max_cleared = stage["stage_no"]
+        insert(db, "scenario", (uid, region, difficulty, cleared, max_cleared))
+    db.commit()
+
+"""
+Parses arena defense units (table defense).
+
+:param db: Sqlite database connection.
+:param data: Data in SWEX json file.
+"""
+def parseDefense(db, data):
+    print("Parsing arena defense...")
+    uid = data["wizard_info"]["wizard_id"]
+    for defense in data["defense_unit_list"]:
+        unit = defense["unit_id"]
+        position = defense["pos_id"]
+        insert(db, "defense", (uid, unit, position))
+    db.commit()
+
+"""
+Parses buildings (table building).
 
 
 :param db: Sqlite database connection.
 :param db: Sqlite database connection.
-:param url: Swarfarm APIv2, building-instances.
+:param data: Data in SWEX json file.
 """
 """
-def parseBuildings(db, url):
+def parseBuildings(db, data):
     print("Parsing buildings...")
     print("Parsing buildings...")
-    http = urllib3.PoolManager()
-    mlist = str(http.request('GET', url).data.decode('utf-8'))
-    data = json.loads(mlist)
-    while True:
-        for building in data["results"]:
-            building_id = building["building"]
-            level = building["level"]
-            insert(db, "building", (building_id, level))
-
-        # Next page
-        db.commit()
-        if data["next"] != None:
-            mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
-            data = json.loads(mlist)
-        else:
-            break
+    uid = data["wizard_info"]["wizard_id"]
+    for bui in data["building_list"]:
+        building = bui["building_master_id"]
+        gain = bui["gain_per_hour"]
+        insert(db, "building", (uid, building, gain))
+    db.commit()
 
 
 """
 """
-Parses rune data (table rune).
+Parses decoration buildings (table dcoration).
 
 
 :param db: Sqlite database connection.
 :param db: Sqlite database connection.
-:param url: Swarfarm APIv2, rune-instances.
+:param data: Data in SWEX json file.
 """
 """
-def parseRunes(db, url):
-    print("Parsing runes...")
-    http = urllib3.PoolManager()
-    mlist = str(http.request('GET', url).data.decode('utf-8'))
-    data = json.loads(mlist)
-    while True:
-        for rune in data["results"]:
-            id = rune["id"]
-            com2us_id = rune["com2us_id"]
-            assigned_to = rune["assigned_to"]
-            rtype = rune["type"]
-            if rtype == 1:
-                rtype = 'Energy'
-            elif rtype == 2:
-                rtype = 'Fatal'
-            elif rtype == 3:
-                rtype = 'Blade'
-            elif rtype == 4:
-                rtype = 'Rage'
-            elif rtype == 5:
-                rtype = 'Swift'
-            elif rtype == 6:
-                rtype = 'Focus'
-            elif rtype == 7:
-                rtype = 'Guard'
-            elif rtype == 8:
-                rtype = 'Endure'
-            elif rtype == 9:
-                rtype = 'Violent'
-            elif rtype == 10:
-                rtype = 'Will'
-            elif rtype == 11:
-                rtype = 'Nemesis'
-            elif rtype == 12:
-                rtype = 'Shield'
-            elif rtype == 13:
-                rtype = 'Revenge'
-            elif rtype == 14:
-                rtype = 'Despair'
-            elif rtype == 15:
-                rtype = 'Vampire'
-            elif rtype == 16:
-                rtype = 'Destroy'
-            elif rtype == 17:
-                rtype = 'Fight'
-            elif rtype == 18:
-                rtype = 'Determination'
-            elif rtype == 19:
-                rtype = 'Enhance'
-            elif rtype == 20:
-                rtype = 'Accuracy'
-            elif rtype == 21:
-                rtype = 'Tolerance'
-            slot = rune["slot"]
-            stars = rune["stars"]
-            level = rune["level"]
-            quality = rune["quality"]
-            original_quality = rune["original_quality"]
-            value = rune["value"]
-            substat_upgrades_remaining = rune["substat_upgrades_remaining"]
-            efficiency = rune["efficiency"]
-            max_efficiency = rune["max_efficiency"]
-            main_stat = rune["main_stat"]
-            main_stat_value = rune["main_stat_value"]
-            innate_stat = rune["innate_stat"]
-            innate_stat_value = rune["innate_stat_value"]
-            substat_1 = rune["substat_1"]
-            substat_1_value = rune["substat_1_value"]
-            substat_1_craft = rune["substat_1_craft"]
-            substat_2 = rune["substat_2"]
-            substat_2_value = rune["substat_2_value"]
-            substat_2_craft = rune["substat_2_craft"]
-            substat_3 = rune["substat_3"]
-            substat_3_value = rune["substat_3_value"]
-            substat_3_craft = rune["substat_3_craft"]
-            substat_4 = rune["substat_4"]
-            substat_4_value = rune["substat_4_value"]
-            substat_4_craft = rune["substat_4_craft"]
-            """
-            Human readable stat names (as of 2019-08-16):
-                STAT_HP = 1
-                STAT_HP_PCT = 2
-                STAT_ATK = 3
-                STAT_ATK_PCT = 4
-                STAT_DEF = 5
-                STAT_DEF_PCT = 6
-                STAT_SPD = 7
-                STAT_CRIT_RATE_PCT = 8
-                STAT_CRIT_DMG_PCT = 9
-                STAT_RESIST_PCT = 10
-                STAT_ACCURACY_PCT = 11
-            """
-            if (main_stat == 1):
-                main_stat = "HP"
-            elif (main_stat == 2):
-                main_stat = "HP%"
-            elif (main_stat == 3):
-                main_stat = "ATK"
-            elif (main_stat == 4):
-                main_stat = "ATK%"
-            elif (main_stat == 5):
-                main_stat = "DEF"
-            elif (main_stat == 6):
-                main_stat = "DEF%"
-            elif (main_stat == 7):
-                main_stat = "SPD"
-            elif (main_stat == 8):
-                main_stat = "CRR"
-            elif (main_stat == 9):
-                main_stat = "CRD"
-            elif (main_stat == 10):
-                main_stat = "RES"
-            elif (main_stat == 11):
-                main_stat = "ACC"
-            if (innate_stat == 1):
-                innate_stat = "HP"
-            elif (innate_stat == 2):
-                innate_stat = "HP%"
-            elif (innate_stat == 3):
-                innate_stat = "ATK"
-            elif (innate_stat == 4):
-                innate_stat = "ATK%"
-            elif (innate_stat == 5):
-                innate_stat = "DEF"
-            elif (innate_stat == 6):
-                innate_stat = "DEF%"
-            elif (innate_stat == 7):
-                innate_stat = "SPD"
-            elif (innate_stat == 8):
-                innate_stat = "CRR"
-            elif (innate_stat == 9):
-                innate_stat = "CRD"
-            elif (innate_stat == 10):
-                innate_stat = "RES"
-            elif (innate_stat == 11):
-                innate_stat = "ACC"
-            if (substat_1 == 1):
-                substat_1 = "HP"
-            elif (substat_1 == 2):
-                substat_1 = "HP%"
-            elif (substat_1 == 3):
-                substat_1 = "ATK"
-            elif (substat_1 == 4):
-                substat_1 = "ATK%"
-            elif (substat_1 == 5):
-                substat_1 = "DEF"
-            elif (substat_1 == 6):
-                substat_1 = "DEF%"
-            elif (substat_1 == 7):
-                substat_1 = "SPD"
-            elif (substat_1 == 8):
-                substat_1 = "CRR"
-            elif (substat_1 == 9):
-                substat_1 = "CRD"
-            elif (substat_1 == 10):
-                substat_1 = "RES"
-            elif (substat_1 == 11):
-                substat_1 = "ACC"
-            if (substat_2 == 1):
-                substat_2 = "HP"
-            elif (substat_2 == 2):
-                substat_2 = "HP%"
-            elif (substat_2 == 3):
-                substat_2 = "ATK"
-            elif (substat_2 == 4):
-                substat_2 = "ATK%"
-            elif (substat_2 == 5):
-                substat_2 = "DEF"
-            elif (substat_2 == 6):
-                substat_2 = "DEF%"
-            elif (substat_2 == 7):
-                substat_2 = "SPD"
-            elif (substat_2 == 8):
-                substat_2 = "CRR"
-            elif (substat_2 == 9):
-                substat_2 = "CRD"
-            elif (substat_2 == 10):
-                substat_2 = "RES"
-            elif (substat_2 == 11):
-                substat_2 = "ACC"
-            if (substat_3 == 1):
-                substat_3 = "HP"
-            elif (substat_3 == 2):
-                substat_3 = "HP%"
-            elif (substat_3 == 3):
-                substat_3 = "ATK"
-            elif (substat_3 == 4):
-                substat_3 = "ATK%"
-            elif (substat_3 == 5):
-                substat_3 = "DEF"
-            elif (substat_3 == 6):
-                substat_3 = "DEF%"
-            elif (substat_3 == 7):
-                substat_3 = "SPD"
-            elif (substat_3 == 8):
-                substat_3 = "CRR"
-            elif (substat_3 == 9):
-                substat_3 = "CRD"
-            elif (substat_3 == 10):
-                substat_3 = "RES"
-            elif (substat_3 == 11):
-                substat_3 = "ACC"
-            if (substat_4 == 1):
-                substat_4 = "HP"
-            elif (substat_4 == 2):
-                substat_4 = "HP%"
-            elif (substat_4 == 3):
-                substat_4 = "ATK"
-            elif (substat_4 == 4):
-                substat_4 = "ATK%"
-            elif (substat_4 == 5):
-                substat_4 = "DEF"
-            elif (substat_4 == 6):
-                substat_4 = "DEF%"
-            elif (substat_4 == 7):
-                substat_4 = "SPD"
-            elif (substat_4 == 8):
-                substat_4 = "CRR"
-            elif (substat_4 == 9):
-                substat_4 = "CRD"
-            elif (substat_4 == 10):
-                substat_4 = "RES"
-            elif (substat_4 == 11):
-                substat_4 = "ACC"
-            insert(db, "rune", (id, com2us_id, assigned_to, rtype, slot, stars, level, quality, original_quality, value, substat_upgrades_remaining, efficiency, max_efficiency, main_stat, main_stat_value, innate_stat, innate_stat_value, substat_1, substat_1_value, substat_1_craft, substat_2, substat_2_value, substat_2_craft, substat_3, substat_3_value, substat_3_craft, substat_4, substat_4_value, substat_4_craft))
-
-        # Next page
-        db.commit()
-        if data["next"] != None:
-            mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
-            data = json.loads(mlist)
-        else:
-            break
+def parseDecorations(db, data):
+    print("Parsing decorations...")
+    uid = data["wizard_info"]["wizard_id"]
+    for bui in data["deco_list"]:
+        building = bui["master_id"]
+        level = bui["level"]
+        insert(db, "decoration", (uid, building, level))
+    db.commit()
 
 
 """
 """
-Parses monster data (tables monster, monster_rune).
+Parses unit data (tables unit, unit_skill).
 
 
 :param db: Sqlite database connection.
 :param db: Sqlite database connection.
-:param url: Swarfarm APIv2, monster-instances.
+:param data: Data in SWEX json file.
 """
 """
-def parseMonsters(db, url):
+def parseUnits(db, data):
     print("Parsing monsters...")
     print("Parsing monsters...")
-    http = urllib3.PoolManager()
-    mlist = str(http.request('GET', url).data.decode('utf-8'))
-    data = json.loads(mlist)
-    while True:
-        for mon in data["results"]:
-            id = mon["id"]
-            com2us_id = mon["com2us_id"]
-            monster = mon["monster"]
-            stars = mon["stars"]
-            level = mon["level"]
-            skill_1_level = mon["skill_1_level"]
-            skill_2_level = mon["skill_2_level"]
-            skill_3_level = mon["skill_3_level"]
-            skill_4_level = mon["skill_4_level"]
-            base_hp = mon["base_hp"]
-            base_attack = mon["base_attack"]
-            base_defense = mon["base_defense"]
-            base_speed = mon["base_speed"]
-            base_crit_rate = mon["base_crit_rate"]
-            base_crit_damage = mon["base_crit_damage"]
-            base_resistance = mon["base_resistance"]
-            base_accuracy = mon["base_accuracy"]
-            rune_hp = mon["rune_hp"]
-            rune_attack = mon["rune_attack"]
-            rune_defense = mon["rune_defense"]
-            rune_speed = mon["rune_speed"]
-            rune_crit_rate = mon["rune_crit_rate"]
-            rune_crit_damage = mon["rune_crit_damage"]
-            rune_resistance = mon["rune_resistance"]
-            rune_accuracy = mon["rune_accuracy"]
-            avg_rune_efficiency = mon["avg_rune_efficiency"]
-            fodder = mon["fodder"]
-            in_storage = mon["in_storage"]
-            ignore_for_fusion = mon["ignore_for_fusion"]
-            priority = mon["priority"]
-            notes = mon["notes"]
-            insert(db, "monster", (id, com2us_id, monster, stars, level, skill_1_level, skill_2_level, skill_3_level, skill_4_level, base_hp, base_attack, base_defense, base_speed, base_crit_rate, base_crit_damage, base_resistance, base_accuracy, rune_hp, rune_attack, rune_defense, rune_speed, rune_crit_rate, rune_crit_damage, rune_resistance, rune_accuracy, avg_rune_efficiency, fodder, in_storage, ignore_for_fusion, priority, notes))
-            for rune in mon["runes"]:
-                insert(db, "monster_rune", (id, rune["id"]))
-
-        # Next page
-        db.commit()
-        if data["next"] != None:
-            mlist = str(http.request('GET', data["next"]).data.decode('utf-8'))
-            data = json.loads(mlist)
+    uid = data["wizard_info"]["wizard_id"]
+    lock_list = data["unit_lock_list"]
+    for mon in data["unit_list"]:
+        id = mon["unit_id"]
+        building = mon["building_id"]
+        monster = mon["unit_master_id"]
+        level = mon["unit_level"]
+        stars = mon["class"]
+        hp = mon["con"] * 15 # Always x15
+        attack = mon["atk"]
+        defense = mon["def"]
+        speed = mon["spd"]
+        crit_rate = mon["critical_rate"]
+        crit_damage = mon["critical_damage"]
+        resistance = mon["resist"]
+        accuracy = mon["accuracy"]
+        experience = mon["experience"]
+        exp_gained = mon["exp_gained"]
+        exp_gain_rate = mon["exp_gain_rate"]
+        costume = mon["costume_master_id"]
+        attribute = mon["attribute"]
+        source = mon["source"]
+        create_time = mon["create_time"]
+        homunculus = mon["homunculus"]
+        homunculus_name = mon["homunculus_name"]
+        lock = 0
+        if id in lock_list:
+            lock = 1
+        insert(db, "unit", (uid, id, building, monster, level, stars, hp, attack, defense, speed, crit_rate, crit_damage, resistance, accuracy, experience, exp_gained, exp_gain_rate, costume, attribute, source, create_time, homunculus, homunculus_name, lock))
+        for skill in mon["skills"]:
+            skill_id = skill[0]
+            skill_level = skill[1]
+            insert(db, "unit_skill", (uid, id, skill_id, skill_level))
+    db.commit()
+
+"""
+Parses inventory data (table inventory).
+
+:param db: Sqlite database connection.
+:param data: Data in SWEX json file.
+"""
+def parseInventory(db, data):
+    print("Parsing inventory...")
+    uid = data["wizard_info"]["wizard_id"]
+    for item in data["inventory_info"]:
+        id = item["item_master_id"]
+        type = item["item_master_type"]
+        # TODO: Master id?
+        amount = item["item_quantity"]
+        insert(db, "inventory", (uid, id, type, amount))
+
+"""
+Parses summon stone list (table summon_special).
+
+:param db: Sqlite database connection.
+:param data: Data in SWEX json file.
+"""
+def parseSummonSpecial(db, data):
+    print("Parsing Summon stone monster list...")
+    uid = data["wizard_info"]["wizard_id"]
+    for unit in data["summon_special_info"]["this"]:
+        insert(db, "summon_special", (0, unit))
+    for unit in data["summon_special_info"]["next"]:
+        insert(db, "summon_special", (1, unit))
+    for unit in data["summon_special_info"]["third"]:
+        insert(db, "summon_special", (2, unit))
+    for unit in data["summon_special_info"]["fourth"]:
+        insert(db, "summon_special", (3, unit))
+
+"""
+Parses rune data (table rune).
+
+:param db: Sqlite database connection.
+:param data: Data in SWEX json file.
+"""
+def parseRunes(db, data):
+    print("Parsing runes...")
+    STAT_HP = 1
+    STAT_HP_PCT = 2
+    STAT_ATK = 3
+    STAT_ATK_PCT = 4
+    STAT_DEF = 5
+    STAT_DEF_PCT = 6
+    STAT_SPD = 8
+    STAT_CRIT_RATE_PCT = 9
+    STAT_CRIT_DMG_PCT = 10
+    STAT_RESIST_PCT = 11
+    STAT_ACCURACY_PCT = 12
+    MAIN_STAT_VALUES = {
+        # [stat][stars][level]: value
+        STAT_HP: {
+            1: [40, 85, 130, 175, 220, 265, 310, 355, 400, 445, 490, 535, 580, 625, 670, 804],
+            2: [70, 130, 190, 250, 310, 370, 430, 490, 550, 610, 670, 730, 790, 850, 910, 1092],
+            3: [100, 175, 250, 325, 400, 475, 550, 625, 700, 775, 850, 925, 1000, 1075, 1150, 1380],
+            4: [160, 250, 340, 430, 520, 610, 700, 790, 880, 970, 1060, 1150, 1240, 1330, 1420, 1704],
+            5: [270, 375, 480, 585, 690, 795, 900, 1005, 1110, 1215, 1320, 1425, 1530, 1635, 1740, 2088],
+            6: [360, 480, 600, 720, 840, 960, 1080, 1200, 1320, 1440, 1560, 1680, 1800, 1920, 2040, 2448],
+        },
+        STAT_HP_PCT: {
+            1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18],
+            2: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19],
+            3: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 38],
+            4: [5, 7, 9, 11, 13, 16, 18, 20, 22, 24, 27, 29, 31, 33, 36, 43],
+            5: [8, 10, 12, 15, 17, 20, 22, 24, 27, 29, 32, 34, 37, 40, 43, 51],
+            6: [11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 63],
+        },
+        STAT_ATK: {
+            1: [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 54],
+            2: [5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 73],
+            3: [7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77, 92],
+            4: [10, 16, 22, 28, 34, 40, 46, 52, 58, 64, 70, 76, 82, 88, 94, 112],
+            5: [15, 22, 29, 36, 43, 50, 57, 64, 71, 78, 85, 92, 99, 106, 113, 135],
+            6: [22, 30, 38, 46, 54, 62, 70, 78, 86, 94, 102, 110, 118, 126, 134, 160],
+        },
+        STAT_ATK_PCT: {
+            1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18],
+            2: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19],
+            3: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 38],
+            4: [5, 7, 9, 11, 13, 16, 18, 20, 22, 24, 27, 29, 31, 33, 36, 43],
+            5: [8, 10, 12, 15, 17, 20, 22, 24, 27, 29, 32, 34, 37, 40, 43, 51],
+            6: [11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 63],
+        },
+        STAT_DEF: {
+            1: [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 54],
+            2: [5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 73],
+            3: [7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77, 92],
+            4: [10, 16, 22, 28, 34, 40, 46, 52, 58, 64, 70, 76, 82, 88, 94, 112],
+            5: [15, 22, 29, 36, 43, 50, 57, 64, 71, 78, 85, 92, 99, 106, 113, 135],
+            6: [22, 30, 38, 46, 54, 62, 70, 78, 86, 94, 102, 110, 118, 126, 134, 160],
+        },
+        STAT_DEF_PCT: {
+            1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18],
+            2: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19],
+            3: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 38],
+            4: [5, 7, 9, 11, 13, 16, 18, 20, 22, 24, 27, 29, 31, 33, 36, 43],
+            5: [8, 10, 12, 15, 17, 20, 22, 24, 27, 29, 32, 34, 37, 40, 43, 51],
+            6: [11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 63],
+        },
+        STAT_SPD: {
+            1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18],
+            2: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19],
+            3: [3, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 19, 21, 25],
+            4: [4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 30],
+            5: [5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 39],
+            6: [7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 42],
+        },
+        STAT_CRIT_RATE_PCT: {
+            1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18],
+            2: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19],
+            3: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 37],
+            4: [4, 6, 8, 11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 33, 35, 41],
+            5: [5, 7, 10, 12, 15, 17, 19, 22, 24, 27, 29, 31, 34, 36, 39, 47],
+            6: [7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 58],
+        },
+        STAT_CRIT_DMG_PCT: {
+            1: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19],
+            2: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 37],
+            3: [4, 6, 9, 11, 13, 16, 18, 20, 22, 25, 27, 29, 32, 34, 36, 43],
+            4: [6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 57],
+            5: [8, 11, 15, 18, 21, 25, 28, 31, 34, 38, 41, 44, 48, 51, 54, 65],
+            6: [11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 80],
+        },
+        STAT_RESIST_PCT: {
+            1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18],
+            2: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19],
+            3: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 38],
+            4: [6, 8, 10, 13, 15, 17, 19, 21, 24, 26, 28, 30, 32, 35, 37, 44],
+            5: [9, 11, 14, 16, 19, 21, 23, 26, 28, 31, 33, 35, 38, 40, 43, 51],
+            6: [12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 64],
+        },
+        STAT_ACCURACY_PCT: {
+            1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18],
+            2: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19],
+            3: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 38],
+            4: [6, 8, 10, 13, 15, 17, 19, 21, 24, 26, 28, 30, 32, 35, 37, 44],
+            5: [9, 11, 14, 16, 19, 21, 23, 26, 28, 31, 33, 35, 38, 40, 43, 51],
+            6: [12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 64],
+        },
+    }
+    SUBSTAT_INCREMENTS = {
+        # [stat][stars]: value
+        # Max possible substat value can be found by multiplying by 5
+        STAT_HP: {
+            1: 60,
+            2: 105,
+            3: 165,
+            4: 225,
+            5: 300,
+            6: 375,
+        },
+        STAT_HP_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+        STAT_ATK: {
+            1: 4,
+            2: 5,
+            3: 8,
+            4: 10,
+            5: 15,
+            6: 20,
+        },
+        STAT_ATK_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+        STAT_DEF: {
+            1: 4,
+            2: 5,
+            3: 8,
+            4: 10,
+            5: 15,
+            6: 20,
+        },
+        STAT_DEF_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+        STAT_SPD: {
+            1: 1,
+            2: 2,
+            3: 3,
+            4: 4,
+            5: 5,
+            6: 6,
+        },
+        STAT_CRIT_RATE_PCT: {
+            1: 1,
+            2: 2,
+            3: 3,
+            4: 4,
+            5: 5,
+            6: 6,
+        },
+        STAT_CRIT_DMG_PCT: {
+            1: 2,
+            2: 3,
+            3: 4,
+            4: 5,
+            5: 6,
+            6: 7,
+        },
+        STAT_RESIST_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+        STAT_ACCURACY_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+    }
+    uid = data["wizard_info"]["wizard_id"]
+    # Unequipped runes
+    for rune in data["runes"]:
+        id = rune["rune_id"]
+        assigned_to = rune["occupied_id"]
+        if assigned_to == 0:
+            assigned_to = None
+        runeset = rune["set_id"]
+        slot = rune["slot_no"]
+        stars = rune["class"]
+        ancient = 0
+        level = rune["upgrade_curr"]
+        original_quality = rune["extra"]
+        value = rune["sell_value"]
+        if stars > 10:
+            ancient = 1
+            stars = stars - 10
+            original_quality = original_quality - 10
+        if level >= 12:
+            quality = 4
+        elif level >= 9:
+            quality = 3
+        elif level >= 6:
+            quality = 2
+        elif level >= 3:
+            quality = 1
         else:
         else:
-            break
+            quality = 0
+        if original_quality > quality:
+            quality = original_quality
+        # TODO: Calculate
+        #efficiency = rune["efficiency"]
+        #max_efficiency = rune["max_efficiency"]
+        efficiency = 0
+        max_efficiency = 0
+        main_stat = rune["pri_eff"][0]
+        main_stat_value = rune["pri_eff"][1]
+        if rune["prefix_eff"][0] > 0:
+            innate_stat = rune["prefix_eff"][0]
+            innate_stat_value = rune["prefix_eff"][1]
+        else:
+            innate_stat = None
+            innate_stat_value = 0
+        if len(rune["sec_eff"]) > 0:
+            substat_1 = rune["sec_eff"][0][0]
+            substat_1_value = rune["sec_eff"][0][1]
+            substat_1_enchant = rune["sec_eff"][0][2]
+            substat_1_grind = rune["sec_eff"][0][3]
+        else:
+            substat_1 = None
+            substat_1_value = 0
+            substat_1_enchant = 0
+            substat_1_grind = 0
+        if len(rune["sec_eff"]) > 1:
+            substat_2 = rune["sec_eff"][1][0]
+            substat_2_value = rune["sec_eff"][1][1]
+            substat_2_enchant = rune["sec_eff"][1][2]
+            substat_2_grind = rune["sec_eff"][1][3]
+        else:
+            substat_2 = None
+            substat_2_value = 0
+            substat_2_enchant = 0
+            substat_2_grind = 0
+        if len(rune["sec_eff"]) > 2:
+            substat_3 = rune["sec_eff"][2][0]
+            substat_3_value = rune["sec_eff"][2][1]
+            substat_3_enchant = rune["sec_eff"][2][2]
+            substat_3_grind = rune["sec_eff"][2][3]
+        else:
+            substat_3 = None
+            substat_3_value = 0
+            substat_3_enchant = 0
+            substat_3_grind = 0
+        if len(rune["sec_eff"]) > 3:
+            substat_4 = rune["sec_eff"][0][0]
+            substat_4_value = rune["sec_eff"][3][1]
+            substat_4_enchant = rune["sec_eff"][3][2]
+            substat_4_grind = rune["sec_eff"][3][3]
+        else:
+            substat_4 = None
+            substat_4_value = 0
+            substat_4_enchant = 0
+            substat_4_grind = 0
+
+        # Calculate efficiences
+        efficiency = 0
+        substats = []
+        efficiency += float(MAIN_STAT_VALUES[main_stat][stars][15]) / float(MAIN_STAT_VALUES[main_stat][6][15])
+        if innate_stat is not None:
+            efficiency += innate_stat_value / float(SUBSTAT_INCREMENTS[innate_stat][6] * 5)
+        if substat_1 is not None:
+            substats.append(substat_1)
+            efficiency += substat_1_value / float(SUBSTAT_INCREMENTS[substat_1][6] * 5)
+        if substat_2 is not None:
+            substats.append(substat_2)
+            efficiency += substat_2_value / float(SUBSTAT_INCREMENTS[substat_2][6] * 5)
+        if substat_3 is not None:
+            substats.append(substat_3)
+            efficiency += substat_3_value / float(SUBSTAT_INCREMENTS[substat_3][6] * 5)
+        if substat_4 is not None:
+            substats.append(substat_4)
+            efficiency += substat_4_value / float(SUBSTAT_INCREMENTS[substat_4][6] * 5)
+        efficiency = efficiency / 2.8 * 100
+        max_efficiency = get_max_efficiency(substats, efficiency, level, stars, original_quality)
 
 
+        insert(db, "rune", (uid, id, assigned_to, runeset, slot, stars, ancient, level, quality, original_quality, value, efficiency, max_efficiency, main_stat, main_stat_value, innate_stat, innate_stat_value, substat_1, substat_1_value, substat_1_enchant, substat_1_grind, substat_2, substat_2_value, substat_2_enchant, substat_2_grind, substat_3, substat_3_value, substat_3_enchant, substat_3_grind, substat_4, substat_4_value, substat_4_enchant, substat_4_grind))
+    # Equipped runes
+    for mon in data["unit_list"]:
+        for rune in mon["runes"]:
+            id = rune["rune_id"]
+            assigned_to = rune["occupied_id"]
+            if assigned_to == 0:
+                assigned_to = None
+            runeset = rune["set_id"]
+            slot = rune["slot_no"]
+            stars = rune["class"]
+            ancient = 0
+            level = rune["upgrade_curr"]
+            original_quality = rune["extra"]
+            value = rune["sell_value"]
+            if stars > 10:
+                ancient = 1
+                stars = stars - 10
+                original_quality = original_quality - 10
+            if level >= 12:
+                quality = 4
+            elif level >= 9:
+                quality = 3
+            elif level >= 6:
+                quality = 2
+            elif level >= 3:
+                quality = 1
+            else:
+                quality = 0
+            if original_quality > quality:
+                quality = original_quality
+            # TODO: Calculate
+            #efficiency = rune["efficiency"]
+            #max_efficiency = rune["max_efficiency"]
+            efficiency = 0
+            max_efficiency = 0
+            main_stat = rune["pri_eff"][0]
+            main_stat_value = rune["pri_eff"][1]
+            if rune["prefix_eff"][0] > 0:
+                innate_stat = rune["prefix_eff"][0]
+                innate_stat_value = rune["prefix_eff"][1]
+            else:
+                innate_stat = None
+                innate_stat_value = 0
+            if len(rune["sec_eff"]) > 0:
+                substat_1 = rune["sec_eff"][0][0]
+                substat_1_value = rune["sec_eff"][0][1]
+                substat_1_enchant = rune["sec_eff"][0][2]
+                substat_1_grind = rune["sec_eff"][0][3]
+            else:
+                substat_1 = None
+                substat_1_value = 0
+                substat_1_enchant = 0
+                substat_1_grind = 0
+            if len(rune["sec_eff"]) > 1:
+                substat_2 = rune["sec_eff"][1][0]
+                substat_2_value = rune["sec_eff"][1][1]
+                substat_2_enchant = rune["sec_eff"][1][2]
+                substat_2_grind = rune["sec_eff"][1][3]
+            else:
+                substat_2 = None
+                substat_2_value = 0
+                substat_2_enchant = 0
+                substat_2_grind = 0
+            if len(rune["sec_eff"]) > 2:
+                substat_3 = rune["sec_eff"][2][0]
+                substat_3_value = rune["sec_eff"][2][1]
+                substat_3_enchant = rune["sec_eff"][2][2]
+                substat_3_grind = rune["sec_eff"][2][3]
+            else:
+                substat_3 = None
+                substat_3_value = 0
+                substat_3_enchant = 0
+                substat_3_grind = 0
+            if len(rune["sec_eff"]) > 3:
+                substat_4 = rune["sec_eff"][3][0]
+                substat_4_value = rune["sec_eff"][3][1]
+                substat_4_enchant = rune["sec_eff"][3][2]
+                substat_4_grind = rune["sec_eff"][3][3]
+            else:
+                substat_4 = None
+                substat_4_value = 0
+                substat_4_enchant = 0
+                substat_4_grind = 0
 
 
+            # Calculate efficiences
+            efficiency = 0
+            substats = []
+            efficiency += float(MAIN_STAT_VALUES[main_stat][stars][15]) / float(MAIN_STAT_VALUES[main_stat][6][15])
+            if innate_stat is not None:
+                efficiency += innate_stat_value / float(SUBSTAT_INCREMENTS[innate_stat][6] * 5)
+            if substat_1 is not None:
+                substats.append(substat_1)
+                efficiency += substat_1_value / float(SUBSTAT_INCREMENTS[substat_1][6] * 5)
+            if substat_2 is not None:
+                substats.append(substat_2)
+                efficiency += substat_2_value / float(SUBSTAT_INCREMENTS[substat_2][6] * 5)
+            if substat_3 is not None:
+                substats.append(substat_3)
+                efficiency += substat_3_value / float(SUBSTAT_INCREMENTS[substat_3][6] * 5)
+            if substat_4 is not None:
+                substats.append(substat_4)
+                efficiency += substat_4_value / float(SUBSTAT_INCREMENTS[substat_4][6] * 5)
+            efficiency = efficiency / 2.8 * 100
+            max_efficiency = get_max_efficiency(substats, efficiency, level, stars, original_quality)
 
 
+            insert(db, "rune", (uid, id, assigned_to, runeset, slot, stars, ancient, level, quality, original_quality, value, efficiency, max_efficiency, main_stat, main_stat_value, innate_stat, innate_stat_value, substat_1, substat_1_value, substat_1_enchant, substat_1_grind, substat_2, substat_2_value, substat_2_enchant, substat_2_grind, substat_3, substat_3_value, substat_3_enchant, substat_3_grind, substat_4, substat_4_value, substat_4_enchant, substat_4_grind))
+    db.commit()
+
+"""
+calculates the max efficiency of a rune.
+
+:param substats: Array of substat types, dont include empty ones.
+:param efficiency: Current rune efficiency.
+:param level: Current rune level.
+:param stars: Rune stars.
+:param quality: Rune original quality.
+:return Max. efficiency.
+"""
+def get_max_efficiency(substats, efficiency, level, stars, quality):
+    STAT_HP = 1
+    STAT_HP_PCT = 2
+    STAT_ATK = 3
+    STAT_ATK_PCT = 4
+    STAT_DEF = 5
+    STAT_DEF_PCT = 6
+    STAT_SPD = 8
+    STAT_CRIT_RATE_PCT = 9
+    STAT_CRIT_DMG_PCT = 10
+    STAT_RESIST_PCT = 11
+    STAT_ACCURACY_PCT = 12
+    SUBSTAT_INCREMENTS = {
+        # [stat][stars]: value
+        STAT_HP: {
+            1: 60,
+            2: 105,
+            3: 165,
+            4: 225,
+            5: 300,
+            6: 375,
+        },
+        STAT_HP_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+        STAT_ATK: {
+            1: 4,
+            2: 5,
+            3: 8,
+            4: 10,
+            5: 15,
+            6: 20,
+        },
+        STAT_ATK_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+        STAT_DEF: {
+            1: 4,
+            2: 5,
+            3: 8,
+            4: 10,
+            5: 15,
+            6: 20,
+        },
+        STAT_DEF_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+        STAT_SPD: {
+            1: 1,
+            2: 2,
+            3: 3,
+            4: 4,
+            5: 5,
+            6: 6,
+        },
+        STAT_CRIT_RATE_PCT: {
+            1: 1,
+            2: 2,
+            3: 3,
+            4: 4,
+            5: 5,
+            6: 6,
+        },
+        STAT_CRIT_DMG_PCT: {
+            1: 2,
+            2: 3,
+            3: 4,
+            4: 5,
+            5: 6,
+            6: 7,
+        },
+        STAT_RESIST_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+        STAT_ACCURACY_PCT: {
+            1: 2,
+            2: 3,
+            3: 5,
+            4: 6,
+            5: 7,
+            6: 8,
+        },
+    }
+    UPGRADE_VALUES = {
+        rune_type: {
+            stars: value/level_data[6]
+            for stars, value in level_data.items()
+        }
+        for rune_type, level_data in SUBSTAT_INCREMENTS.items()
+    }
+    #substat_upgrades_remaining = (4 - math.floor((min(level, 12) / 3))) - (3 - quality)
+    substat_upgrades_remaining = (4 - math.floor((min(level, 12) / 3))) - max((3 - quality), 0)
+    new_stats = max(min(4 - len(substats), substat_upgrades_remaining), 0)
+    old_stats = substat_upgrades_remaining - new_stats
+    
+    #if id == 16042097882:
+    #    print("substat_upgrades_remaining: " + str(substat_upgrades_remaining))
+    #    print("quality: " + str(quality))
+    #    print("level: " + str(level))
+    #    print("math.floor((min(level, 12) / 3)): " + str(math.floor((min(level, 12) / 3))))
+    #    print("old_stats: " + str(old_stats))
+    #    print("new_stats: " + str(new_stats))
+
+    if old_stats > 0:
+        # we can repeatedly upgrade the most value of the existing stats
+        best_stat = max(
+            0,  # ensure max() doesn't error if we only have one stat
+            *[UPGRADE_VALUES[stat][stars] for stat in substats]
+        )
+        efficiency += best_stat * old_stats * 0.2 / 2.8 * 100
+    if new_stats:
+        # add the top N stats
+        available_upgrades = sorted(
+            [
+                upgrade_value[stars]
+                for stat, upgrade_value in UPGRADE_VALUES.items()
+                if stat not in substats
+            ],
+            reverse=True
+        )
+        efficiency += sum(available_upgrades[:new_stats]) * 0.2 / 2.8 * 100
+
+    return efficiency
+
+"""
+Parses rune craft item data (table rune_craft).
+
+:param db: Sqlite database connection.
+:param data: Data in SWEX json file.
+"""
+def parseRuneCraft(db, data):
+    print("Parsing rune craft itmes...")
+    uid = data["wizard_info"]["wizard_id"]
+    for item in data["rune_craft_item_list"]:
+        id = item["craft_item_id"]
+        type = item["craft_type"]
+        value = item["sell_value"]
+        info = str(item["craft_type_id"])
+        """
+        info : 5 or 6 digit number: RRSSQ
+          RR: Rune
+          SS: Stat
+          Q:  Quality
+        """
+        quality = int(info[-1:])
+        stat = int(info[-4:-2])
+        rune = int(info[:-4])
+        insert(db, "rune_craft", (uid, id, type, quality, rune, stat, value))
+
+"""
+Parses guild data (tables guild, guild_member).
+
+:param db: Sqlite database connection.
+:param data: Data in SWEX json file.
+"""
+def parseGuild(db, data):
+    print("Parsing guild...")
+    if len(data["guild"]["guild_info"]) < 1:
+        return
+    guild = data["guild"]["guild_info"]
+    id = guild["guild_id"]
+    name = guild["name"]
+    level = guild["level"]
+    experience = guild["experience"]
+    recruiting = guild["recruit_status"]
+    members = guild["member_now"]
+    leader = guild["master_wizard_id"]
+    comment = guild["comment"]
+    notice = guild["notice"]
+    insert(db, "guild", (id, name, level, experience, recruiting, members, leader, comment, notice))
+    # Single quates ahead, dirty fix
+    for k, member in data["guild"]["guild_members"].items():
+        m = json.loads(str(member).replace("'", '"'))        
+        id = m["wizard_id"]
+        guild = member["guild_id"]
+        grade = member["grade"]
+        name = member["wizard_name"]
+        level = member["wizard_level"]
+        rating = member["rating_id"]
+        arena_score = member["arena_score"]
+        joined = member["join_timestamp"]
+        last_login = member["last_login_timestamp"]
+        in_war = 0 # Checked later
+        has_defense = 0 # Checked later
+        insert(db, "guild_member", (id, guild, grade, name, level, rating, arena_score, joined, last_login, in_war, has_defense))
+    cursor = db.cursor()
+    for war in data["guildwar_member_list"]:
+        cursor.execute("UPDATE guild_member SET in_war = 1 WHERE guild = ? AND id = ?;", (war["guild_id"], war["wizard_id"]))
+    for defense in data["guild_member_defense_list"]:
+        if len(defense["unit_list"]) > 0:
+            cursor.execute("UPDATE guild_member SET has_defense = 1 WHERE id = '" + str(defense["wizard_id"]) + "';")
+    db.commit()
+    cursor.close()
 
 
 """
 """
 Begin script
 Begin script
 """
 """
 db = openDatabase('application/sw.sqlite')
 db = openDatabase('application/sw.sqlite')
-parseBuildings(db, 'https://swarfarm.com/api/v2/profiles/' + USER +  '/buildings/')
-parseRunes(db, 'https://swarfarm.com/api/v2/profiles/' + USER +  '/runes/')
-parseMonsters(db, 'https://swarfarm.com/api/v2/profiles/' + USER +  '/monsters/')
-db.commit()
+data = readFile(FILE)
+parsePlayer(db, data)
+parseScenarios(db, data)
+parseDefense(db, data)
+parseBuildings(db, data)
+parseDecorations(db, data)
+# TODO homunculus_skill_list
+parseUnits(db, data)
+parseSummonSpecial(db, data)
+parseInventory(db, data)
+parseRunes(db, data)
+parseRuneCraft(db, data)
+parseGuild(db, data)
 
 

+ 71 - 0
public/css/filters.css

@@ -0,0 +1,71 @@
+/* Filters section, for lists. */
+section.filters{
+    display: inline-block;
+    min-width: 40%;
+    background-color: #aa8866;
+}
+@media screen and (max-width : 990px){
+    section.filters{
+        font-size: 80%;
+    }
+}
+
+form.filter{
+    text-align:center;
+    background-color: #aa8866;
+}
+
+form.filter table{
+    margin: auto;
+    display: inline;
+    border-collapse: collapse;
+}
+form.filter table td.filter{
+    vertical-align: top;
+    padding: 0.2em;
+    text-align: center;
+    color: #ffffff;
+}
+form.filter table td.filter span{
+    display: block;
+    margin: 0.1em;
+    font-size: 80%;
+}
+
+form.filter td.filter_title{
+    font-weight: bold;
+    border-right: 0.2em solid #ffffff;
+    text-align: center;
+    vertical-align: top;
+    padding-bottom: 0.5em;
+}
+
+form.filter td.filter_title span{
+    display: block;
+    width: 0.8em;
+    word-break: break-all;
+    margin-top: 0em;
+    line-height: 90%;
+    text-align: left;
+}
+form.filter td.filter_separator{
+    border-top: 0.2em solid #ffffff;
+}
+
+
+form.filter div#filter_apply{
+    text-align: center;
+    margin: 0.5em auto 1em auto;
+}
+
+form#filter_runeupgrade select#filter_slot{
+    height: 10em;
+}
+
+form#filter_runecraft table td select#filter_grind_stat, select#filter_gem_stat_from, select#filter_gem_stat_to{
+    height: 16em;
+}
+
+form#filter_runecraft select#filter_slot{
+    height: 10em;
+}

+ 115 - 0
public/css/guild.css

@@ -0,0 +1,115 @@
+div#guild_details{
+    color: #ffffff;
+    display: inline-block;
+    width: 50%;
+    vertical-align: top;
+}
+div#guild_details span#guild_level{
+    font-size: 300%;
+}
+div#guild_details span#guild_experience{
+    font-style: italic;
+    padding-left: 2em;
+}
+div#guild_details p#guild_comment{
+    color: #00ff00;
+    font-style: italic;
+    margin: 0.5em 1em;
+}
+div#guild_details p#guild_notice{
+    color: #ff00ab;
+    font-style: italic;
+    font-weight: bold;
+    margin: 0.5em 1em;
+}
+div#guild_details div#guild_skills{
+    display: inline-block;
+}
+
+div#guild_details div#guild_skills div.skill_group{
+    border: 0.2em solid #f2c920;
+    border-radius: 0.5em;
+    background-color: #00000044;
+    margin: 0.2em 0.2em 0.5em 1em;
+    text-align: left;
+}
+
+div#guild_details div#guild_skills div.skill_group span.skill_group_title{
+    display: block;
+    font-size: 110%;
+    font-weight: bold;
+    text-align: center;
+}
+
+div#guild_details div#guild_skills div.skill_group span.skill_group_description{
+    display: block;
+    font-size: 90%;
+    font-style: italic;
+    text-align: center;
+}
+
+div#guild_details div#guild_skills div.skill_group img.skill_group_image{
+    display: inline-block;
+    vertical-align: middle;
+    width: 5em;
+    height: 5em;
+    border: 0.1em solid #f2c920;
+    border-radius: 0.5em;
+    margin: 0.2em 0.2em 0.5em 1em;
+}
+
+div#guild_details div#guild_skills div.skill_group ul{
+    display: inline-block;
+    font-weight: bold;
+    font-size: 70%;
+    vertical-align: middle;
+    margin: 0;
+}
+div#guild_details div#guild_skills div.skill_group ul li{
+    margin: -0.3em;
+}
+div#guild_details div#guild_skills div.skill_group ul li.description{
+    list-style-type: none;
+    margin: -0.3em 0.3em 0.1em -3em;
+}
+
+div#guild_details div#guild_skills div.skill_group ul li.unavailable{
+    color: #888888;
+}
+
+
+
+table#guild_members{
+    display: inline-block;
+    width: 40%;
+    vertical-align: top;
+    border-collapse: collapse;
+    color: #ffffff;
+}
+table#guild_members th{
+    background-color: #00000088;
+    font-weight: bold;
+    font-size: 90%;
+}
+
+table#guild_members td{
+    background-color: #00000022;
+    height: 1.5em;
+}
+table#guild_members td.odd{
+    background-color: #00000044;
+}
+
+table#guild_members td img{
+    height: 1.5em;
+}
+
+table#guild_members td.last_login{
+    color: #00ff00;
+}
+table#guild_members td.last_login.warning{
+    color: #ffff00;
+}
+table#guild_members td.last_login.danger{
+    color: #ff0000;
+}

+ 101 - 50
public/css/home.css

@@ -1,59 +1,110 @@
-article{
-    display: inline-block;
-    vertical-align: top;
-    width: 30%;
-    margin: 2%;
-    border: 0.2em solid #000000;
-    border-radius: 1em;
-    box-shadow: inset 0 0 0.5em #000000;
-    background-color: #ffffffaa;
-    padding: 2em 1.5em 1em 1.5em;
+article#profile{
+    width: 40%;
     text-align: left;
     text-align: left;
 }
 }
-@media screen and (max-width : 990px){
-    article{
-        display: block;
-        width: 80%;
-        margin: 1em auto;
-        /*padding: 1em 1em 0.5em 1em;*/
-    }
-}
 
 
-article h3{
-    margin: -1em -0.75em 0.5em -0.75em;
-    border-bottom: 0.1em solid #f2c920;
-    background-color: #00000044;
+article#profile h4{
     color: #ffffff;
     color: #ffffff;
-    text-align: left;
-    border-top-left-radius: 0.25em;
-    border-top-right-radius: 0.25em;
-    padding: 0.15em 0 0.15em 2em;
-    font-size: 200%;
     font-weight: bold;
     font-weight: bold;
+    margin: 0.5em 1em 0em 0.5em;
+    display: inline;
+    vertical-align: middle;
 }
 }
-@media screen and (max-width : 990px){
-    article h3{
-        padding: 0.15em 0 0.15em 1em;
-    }
+
+article#profile div#currency ul li img{
+    height: 1.2em;
+    width: 1.2em;
+    vertical-align: middle;
 }
 }
-article h3 a{
-    color: #ffffff;
-    text-shadow: 0 0 0.1em #000000;
-    transition: all .3s ease-in-out;
-}
-article h3 a:hover{
-    color: #444444;
-    text-shadow: 0 0 0.1em #ffffff;
-}
-@media screen and (max-width : 990px){
-    article h3 a{
-        text-shadow: 0 0 0;
-    }
-    article h3 a:hover{
-        color: #fffff;
-        text-shadow: 0 0 0;
-    }
-}
-article p{
+
+article#profile div#rep div.monster_panel{
+    font-size: 50%;
+    margin: 0;
+    vertical-align: middle;
+}
+
+article#profile div#defense div.monster_panel{
+    font-size: 35%;
     margin: 0;
     margin: 0;
+    vertical-align: middle;
 }
 }
+
+/**
+ * Monster panel
+ */
+article#profile div.building_panel{
+    display: inline-block;
+    width: 2em;
+    height: 2em;
+    margin: 0.2em 0em;
+    position: relative;
+    border-radius: 15%;
+    vertical-align: middle;
+}
+
+article#profile div#building h4, div#decoration h4{
+    display: block;
+}
+
+article#profile div.building_panel img.building{
+    width: 2em;
+    height: 2em;
+    border-style: solid;
+    border-width: 0.1em;
+    border-radius: 15%;
+}
+
+article#profile div.building_panel span.level{
+    position: relative;
+    bottom: 1.6em;
+    font-weight: bold;
+    color: #000;
+    text-shadow: 0 0 0.1em #fff, 0 0 0.2em #fff, 0 0 0.4em #fff, 0 0 0.4em #fff;
+    font-size: 100%;
+    left: 0.4em;
+    bottom: 2.8em;
+    z-index: 1;
+    font-size: 50%;
+}
+
+article#profile div.building_panel span.level::before {
+  content: "Lv. ";
+}
+
+
+
+
+article#profile div.item_panel{
+    display: inline-block;
+    width: 2em;
+    height: 2em;
+    margin: 0.2em 0em;
+    position: relative;
+    border-radius: 15%;
+    vertical-align: middle;
+}
+
+article#profile div#building h4, div#decoration h4{
+    display: block;
+}
+
+article#profile div.item_panel img.item{
+    width: 2em;
+    height: 2em;
+    border-style: solid;
+    border-width: 0.1em;
+    border-radius: 15%;
+}
+
+article#profile div.item_panel span.amount{
+    position: relative;
+    bottom: 1.6em;
+    font-weight: bold;
+    color: #000;
+    text-shadow: 0 0 0.1em #fff, 0 0 0.2em #fff, 0 0 0.4em #fff, 0 0 0.4em #fff;
+    font-size: 100%;
+    left: 0.4em;
+    bottom: 2.8em;
+    z-index: 1;
+    font-size: 50%;
+}

+ 39 - 3
public/css/monster.css

@@ -1,7 +1,7 @@
 section#monster{
 section#monster{
     max-width: 60%;
     max-width: 60%;
     display: inline-block;
     display: inline-block;
-    vertical-align: middle;
+    vertical-align: top;
     margin: 0.2em;
     margin: 0.2em;
     position: relative;
     position: relative;
 }
 }
@@ -15,9 +15,44 @@ section#monster{
     }
     }
 }
 }
 
 
+section#monster article#profile div#monster_info{
+    display: inline-block;
+    vertical-align: top;
+    max-width: 12em;
+}
+
+section#monster article#profile div#monster_info div#monster_details{
+    display: block;
+    font-size: 70%;
+    color: #ffffff;
+}
+
+section#monster article#profile div#monster_info div#exp{
+    border: 0.3em solid #f2c920;
+    border-radius: 1em;
+    height: 2em;
+    background-color: #00000088;
+    position: relative;
+    font-size: 90%;
+}
+section#monster article#profile div#monster_info div#exp span#exp_bar{
+    height: 2em;
+    border-radius: 0.7em;
+    display: block;
+    background-color: #ff0000;
+}
+section#monster article#profile div#monster_info div#exp span#exp_text{
+    display: block;
+    text-align: center;
+    margin-top: -1.5em;
+    font-weight: bold;
+    color: #ffffff;
+    text-shadow: 0 0 0.1em #000000, 0 0 0.1em #000000, 0 0 0.1em #000000, 0 0 0.1em #000000, 0 0 0.1em #000000;
+}
+
 section#monster article#profile table#stats{
 section#monster article#profile table#stats{
     font-size: 90%;
     font-size: 90%;
-    vertical-align: middle;
+    vertical-align: top;
     display: inline-block;
     display: inline-block;
     border: 0.1em solid black;
     border: 0.1em solid black;
     color: #ffffff;
     color: #ffffff;
@@ -112,8 +147,9 @@ section#monster article#profile div#skills div.skill span.skill_effects img.effe
 }
 }
 
 
 section#monster article#profile div#skills div.skill table.skill_up{
 section#monster article#profile div#skills div.skill table.skill_up{
-    margin: 0.5em 0 0 0;
+    margin: 0.5em auto 0 auto;
     border-collapse: collapse;
     border-collapse: collapse;
+    font-size: 70%;
 }
 }
 
 
 section#monster article#profile div#skills div.skill table.skill_up td{
 section#monster article#profile div#skills div.skill table.skill_up td{

+ 1 - 1
public/css/monster_info.css

@@ -165,7 +165,7 @@ article.stage div.skills div.skill span.skill_effects img.effect_img{
 
 
 article.stage div.skills div.skill table.skill_up{
 article.stage div.skills div.skill table.skill_up{
     font-size: 70%;
     font-size: 70%;
-    margin: 0.5em 0 0 0;
+    margin: 0.5em auto 0 auto;
     border-collapse: collapse;
     border-collapse: collapse;
 }
 }
 
 

+ 2 - 1
public/css/monsters.css

@@ -1,5 +1,6 @@
 section.list div.monster{
 section.list div.monster{
     display: inline-block;
     display: inline-block;
+    position: relative;
 }
 }
 
 
 section.list div.monster div.monster_tooltip{
 section.list div.monster div.monster_tooltip{
@@ -84,6 +85,6 @@ section.list div.monster div.monster_tooltip div.skills div.skill span.skill_lev
 
 
 section.list div.monster div.monster_tooltip div.skills div.skill span.skill_name{
 section.list div.monster div.monster_tooltip div.skills div.skill span.skill_name{
     text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.4em #000000;
     text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.4em #000000;
-    margin-top: -4em;
+    margin-top: -2.5em;
     display: block;
     display: block;
 }
 }

+ 8 - 251
public/css/report.css

@@ -1,30 +1,30 @@
 /* Main reports page. */
 /* Main reports page. */
-body#body_reports section.report{
+section.report{
     width: 40%;
     width: 40%;
     display: inline-block;
     display: inline-block;
     vertical-align: top;
     vertical-align: top;
     margin: 0.5em;
     margin: 0.5em;
 }
 }
 @media screen and (max-width : 990px){
 @media screen and (max-width : 990px){
-    body#body_reports section.report{
+    section.report{
         width: 90%;
         width: 90%;
         margin: 0.5em auto;
         margin: 0.5em auto;
         display: block;
         display: block;
     }
     }
 }
 }
 
 
-body#body_reports section.report article{
+section.report article{
     text-align: left;
     text-align: left;
 }
 }
 
 
-body#body_reports section.report article h3{
+section.report article h3{
     color: #ffffff;
     color: #ffffff;
     text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000;
     text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000;
     font-size: 190%;
     font-size: 190%;
     margin: 0.2em;
     margin: 0.2em;
 }
 }
 
 
-body#body_reports section.report article img{
+section.report article img{
     float: right;
     float: right;
     height: 5em;
     height: 5em;
     width: 5em;
     width: 5em;
@@ -34,256 +34,13 @@ body#body_reports section.report article img{
     border: 0.2em solid #777777;
     border: 0.2em solid #777777;
 }
 }
 
 
-body#body_reports section.report article p{
+section.report article p{
     color: #ffffff;
     color: #ffffff;
 }
 }
 
 
-body#body_reports section.report article div.report_filters{
-    width: 80%;
-    text-align:center;
-    margin: 1em auto 2em auto;
+section.report article form{
     border: 0.1em solid #000000;
     border: 0.1em solid #000000;
     border-radius: 0.5em;
     border-radius: 0.5em;
-    background-color: #aa8866;
-    display: block;
-}
-@media screen and (max-width : 990px){
-    body#body_reports section.report article div.report_filters{
-        width: 90%;
-        font-size: 80%;
-        margin: 1em auto;
-    }
-}
-body#body_reports section.report article div.report_filters table{
-    border-collapse: collapse;
-    margin: auto;
-}
-
-body#body_reports section.report article div.report_filters td.filter_separator{
-    border-top: 0.2em solid #ffffff;
-}
-
-body#body_reports section.report article div.report_filters div.filter{
-    vertical-align: top;
-    margin: 0.7em;
-    display: inline-block;
-    text-align: center;
-}
-body#body_reports section.report article div.report_filters div.filter span{
-    color: #ffffff;
-}
-body#body_reports section.report article div.report_filters div.filter input{
-    margin-top: 0.5em;
-}
-body#body_reports section.report article div.report_filters div#filter_stars input{
-    width: 3em;
-}
-body#body_reports section.report article div.report_filters div#filter_apply{
-    text-align: center;
-    margin: 2em auto 1em auto;
-}
-body#body_reports section.report article div.report_filters select#filter_slot{
-    height: 10em;
-}
-body#body_reports section.report article div.report_filters table td.filter{
-    padding: 0.2em;
-    text-align: center;
-    color: #ffffff;
-}
-body#body_reports section.report article div.report_filters table td.filter span{
-    display: block;
-    font-size: 80%;
-}
-body#body_reports section.report article div.report_filters td.filter_title{
-    font-weight: bold;
-    border-right: 0.2em solid #ffffff;
-    text-align: center;
-    vertical-align: middle;
-}
-body#body_reports section.report article div.report_filters td.filter_title span{
-    transform: rotate(-90deg);
-    display: block;
-    width: 2em;
-    margin: 2em 0.5em 0.5em 0.5em;
-}
-
-body#body_report_skillup section.content{
-    display: block;
-    text-align: left;
-}
-
-body#body_report_skillup section.content div.monster div.profile{
-    text-align: center;
-    display: inline-block;
-    vertical-align: top;
-}
-@media screen and (max-width : 990px){
-    body#body_report_skillup section.content div.monster div.profile{
-        text-align: center;
-        width: 30%;
-    }
-}
-
-body#body_report_skillup section.content div.monster div.skills{
-    text-align: center;
-    display: inline-block;
-    width: 60%;
-}
-@media screen and (max-width : 990px){
-    body#body_report_skillup section.content div.monster div.skills{
-        width: 65%;
-    }
-}
-
-body#body_report_skillup section.content div.monster div.skills div.skill{
-    display: inline-block;
-    vertical-align: top;
-    width: 22%;
-    margin: 0.5em;
-    color: #ffffff;
+    padding: 0.5em;
     text-align: center;
     text-align: center;
-    position: relative;
-}
-@media screen and (max-width : 990px){
-    body#body_report_skillup section.content div.monster div.skills div.skill{
-        font-size: 80%;
-    }
-}
-
-body#body_report_skillup section.content div.monster div.skills div.skill img{
-    width: 3em;
-    height: 3em;
-    border: 0.1em solid #f2c920;
-    border-radius: 0.5em;
-    margin: auto;
-    display: block;
-}
-body#body_report_skillup section.content div.monster div.skills div.skill span.skill_level{
-    font-size: 110%;
-    position: relative;
-    top: -1.5em;
-    right: -0.5em;
-    text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.4em #000000, 0 0 0.4em #000000, 0 0 0.6em #000000, 0 0 0.6em #000000, 0 0 0.8em #000000, 0 0 0.8em #000000;
-}
-
-body#body_report_skillup section.content div.monster div.skills div.skill span.skill_level.maxed{
-    color: #f2c920;
-}
-
-body#body_report_skillup section.content div.monster div.skills div.skill span.skill_name{
-    text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.4em #000000;
-    top: 3.2em;
-    display: block;
-    margin-top: -1.3em;
-    font-size: 80%;
-    line-height: 0.9em;
-}
-
-body#body_report_skillup section.content div.monster table#skill_averages{
-    margin: auto auto auto 2em;
-    color: #ffffff;
-    display: inline-block;
-    vertical-align: top;
-    max-width: 30%;
-}
-@media screen and (max-width : 990px){
-    body#body_report_skillup section.content div.monster table#skill_averages{
-        display: revert;
-        margin: -2em auto auto auto;
-        font-size: 100%;
-        width: 70%;
-        max-width: 90%;
-    }
-
-}
-
-body#body_report_skillup section.content div.monster table#skill_averages td.title{
-    text-align: right;
-}
-body#body_report_skillup section.content div.monstertable#skill_averages td.value{
-    text-align: left;
-    padding-left: 1em;
-}
-
-body#body_report_runeupgrade section.filters table{
-    border-collapse: collapse;
-}
-
-body#body_report_runeupgrade section.filters td.filter_title{
-    font-weight: bold;
-    border-right: 0.2em solid #ffffff;
-    text-align: center;
-    vertical-align: middle;
-}
-body#body_report_runeupgrade section.filters td.filter_title span{
-    transform: rotate(-90deg);
-    display: block;
-    width: 2em;
-    margin-top: 2em;
-}
-body#body_report_runeupgrade section.filters td.filter_separator{
-    border-top: 0.2em solid #ffffff;
-}
-body#body_report_runeupgrade section.filters select#filter_slot{
-    height: 10em;
-}
-
-body#body_report_runeupgrade section.content article{
-    text-align: left;
-}
-
-@media screen and (max-width : 990px){
-    body#body_report_runeupgrade section.content article{
-        width: 95%;
-        max-width: 95%;
-        margin: 0.2em auto;
-        display: block;
-    }
-}
-
-body#body_report_runeupgrade section.content article div.monster{
-    display:inline-block;
-    vertical-align: top;
-    width: 10em;
-    max-width: 15%;
-}
-@media screen and (max-width : 990px){
-    body#body_report_runeupgrade section.content article div.monster{
-        display: block;
-        max-width: 100%;
-        width: initial;
-    }
-}
-
-body#body_report_runeupgrade section.content article div.monster_runes{
-    display:inline-block;
-    vertical-align: top;
-    max-width: 80%;
-}
-@media screen and (max-width : 990px){
-    body#body_report_runeupgrade section.content article div.monster_runes{
-        display: block;
-        max-width: 100%;
-    }
-}
-
-body#body_report_runeupgrade section.content article div.monster_runes > table.rune{
-    font-size: 80%;
-}
-
-body#body_report_runeupgrade section.content article div.monster_runes div.alternatives{
-    padding: 1em;
-    margin-top: -0.6em;
-    margin-left: 2.5em;
-    margin-bottom: 1em;
-    border-left: 0.3em solid #ffffff;
-    border-bottom: 0.3em solid #ffffff;
-    border-bottom-left-radius: 1em;
-    border-bottom-right-radius: 1em;
-    font-size: 90%;
-    background: linear-gradient(47deg, rgba(255,255,255,0.3) 0%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 70%);
-}
-
-body#body_report_runeupgrade section.content article div.monster_runes div.alternatives table.alternative{
-
 }
 }

+ 54 - 0
public/css/report_runecraft.css

@@ -0,0 +1,54 @@
+section.content article{
+    text-align: left;
+}
+
+@media screen and (max-width : 990px){
+    section.content article{
+        width: 95%;
+        max-width: 95%;
+        margin: 0.2em auto;
+        display: block;
+    }
+}
+
+section.content article div.monster{
+    display: block;
+    width: 8em;
+}
+@media screen and (max-width : 990px){
+    section.content article div.monster{
+        display: block;
+        max-width: 100%;
+        width: initial;
+    }
+}
+
+section.content article div.monster_runes{
+    display:inline-block;
+    vertical-align: top;
+    width: 100%;
+}
+@media screen and (max-width : 990px){
+    section.content article div.monster_runes{
+        display: block;
+        max-width: 100%;
+    }
+}
+
+section.content article div.monster_runes > table.rune{
+    font-size: 80%;
+    max-width: 50%;
+    vertical-align: top;
+    margin: 0 -0.5em 0.5em 0.5em;
+}
+
+section.content article div.monster_runes div.craft{
+    display: inline-block;
+    vertical-align: top;
+    max-width: 45%;
+    min-width: 35%;
+    padding: 1em;
+    margin: 0 0 1em 0;
+    font-size: 80%;
+    background: linear-gradient(47deg, rgba(255,255,255,0.3) 0%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 70%);
+}

+ 46 - 0
public/css/report_runeupgrade.css

@@ -0,0 +1,46 @@
+section.content article{
+    text-align: left;
+}
+
+section.content article div.monster{
+    display:inline-block;
+    vertical-align: top;
+    width: 10em;
+    max-width: 15%;
+}
+@media screen and (max-width : 990px){
+    section.content article div.monster{
+        display: block;
+        max-width: 100%;
+        width: initial;
+    }
+}
+
+section.content article div.monster_runes{
+    display:inline-block;
+    vertical-align: top;
+    max-width: 80%;
+}
+@media screen and (max-width : 990px){
+    section.content article div.monster_runes{
+        display: block;
+        max-width: 100%;
+    }
+}
+
+section.content article div.monster_runes > table.rune{
+    font-size: 90%;
+}
+
+section.content article div.monster_runes div.alternatives{
+    padding: 0.5em;
+    margin-top: -0.6em;
+    margin-left: 1.5em;
+    margin-bottom: 0.5em;
+    border-left: 0.3em solid #ffffff;
+    border-bottom: 0.3em solid #ffffff;
+    border-bottom-left-radius: 1em;
+    border-bottom-right-radius: 1em;
+    font-size: 90%;
+    background: linear-gradient(47deg, rgba(255,255,255,0.3) 0%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 70%);
+}

+ 97 - 0
public/css/report_skillup.css

@@ -0,0 +1,97 @@
+section.content{
+    display: block;
+    text-align: left;
+}
+
+section.content div.monster div.profile{
+    text-align: center;
+    display: inline-block;
+    vertical-align: top;
+}
+@media screen and (max-width : 990px){
+    section.content div.monster div.profile{
+        text-align: center;
+        width: 30%;
+    }
+}
+
+section.content div.monster div.skills{
+    text-align: center;
+    display: inline-block;
+    width: 60%;
+}
+@media screen and (max-width : 990px){
+    section.content div.monster div.skills{
+        width: 65%;
+    }
+}
+
+section.content div.monster div.skills div.skill{
+    display: inline-block;
+    vertical-align: top;
+    width: 22%;
+    margin: 0.5em;
+    color: #ffffff;
+    text-align: center;
+    position: relative;
+}
+@media screen and (max-width : 990px){
+    section.content div.monster div.skills div.skill{
+        font-size: 80%;
+    }
+}
+
+section.content div.monster div.skills div.skill img{
+    width: 3em;
+    height: 3em;
+    border: 0.1em solid #f2c920;
+    border-radius: 0.5em;
+    margin: auto;
+    display: block;
+}
+section.content div.monster div.skills div.skill span.skill_level{
+    font-size: 110%;
+    position: relative;
+    top: -1.5em;
+    right: -0.5em;
+    text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.4em #000000, 0 0 0.4em #000000, 0 0 0.6em #000000, 0 0 0.6em #000000, 0 0 0.8em #000000, 0 0 0.8em #000000;
+}
+
+section.content div.monster div.skills div.skill span.skill_level.maxed{
+    color: #f2c920;
+}
+
+section.content div.monster div.skills div.skill span.skill_name{
+    text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.4em #000000;
+    top: 3.2em;
+    display: block;
+    margin-top: -1.3em;
+    font-size: 80%;
+    line-height: 0.9em;
+}
+
+section.content div.monster table#skill_averages{
+    margin: auto auto auto 2em;
+    color: #ffffff;
+    display: inline-block;
+    vertical-align: top;
+    max-width: 30%;
+}
+@media screen and (max-width : 990px){
+    section.content div.monster table#skill_averages{
+        display: revert;
+        margin: -2em auto auto auto;
+        font-size: 100%;
+        width: 70%;
+        max-width: 90%;
+    }
+
+}
+
+section.content div.monster table#skill_averages td.title{
+    text-align: right;
+}
+section.content div.monstertable#skill_averages td.value{
+    text-align: left;
+    padding-left: 1em;
+}

+ 112 - 51
public/css/ui.css

@@ -315,40 +315,6 @@ section h2{
     }
     }
 }
 }
 
 
-/* Filters section, for lists. */
-section.filters{
-    text-align:center;
-    background-color: #775533;
-    display: inline-block;
-    min-width: 40%;
-}
-@media screen and (max-width : 990px){
-    section.filters{
-        font-size: 80%;
-    }
-}
-section.filters table{
-    margin: auto;
-}
-section.filters table td.filter{
-    vertical-align: top;
-    padding: 0.2em;
-    text-align: center;
-    color: #ffffff;
-}
-section.filters table td.filter span{
-    display: block;
-    margin: 0.1em;
-    font-size: 80%;
-}
-
-
-section.filters div#filter_apply{
-    text-align: center;
-    margin: 0.5em auto 1em auto;
-}
-
-
 /* Main content, when it is a list of monsters, runes... */
 /* Main content, when it is a list of monsters, runes... */
 section.list{
 section.list{
     display: block;
     display: block;
@@ -365,10 +331,6 @@ section.content{
 
 
 
 
 
 
-
-
-
-
 /**
 /**
  * Rune boxes
  * Rune boxes
  */
  */
@@ -380,19 +342,19 @@ div.rune_panel{
     position: relative;
     position: relative;
     text-align: center;
     text-align: center;
 }
 }
-div.rune_panel.rune_quality_0{ /* Normal */
+div.rune_panel.rune_quality_normal{ /* Normal */
     background-image: repeating-radial-gradient(#ffffff, #cccccc 30%, #ffffff 60%);
     background-image: repeating-radial-gradient(#ffffff, #cccccc 30%, #ffffff 60%);
 }
 }
-div.rune_panel.rune_quality_1{ /* Magic */
+div.rune_panel.rune_quality_magic{ /* Magic */
     background-image: repeating-radial-gradient(#aaffaa, #88cc88 30%, #aaffaa 60%);
     background-image: repeating-radial-gradient(#aaffaa, #88cc88 30%, #aaffaa 60%);
 }
 }
-div.rune_panel.rune_quality_2{ /* Rare */
+div.rune_panel.rune_quality_rare{ /* Rare */
     background-image: repeating-radial-gradient(#aaaaff, #8888cc 30%, #aaaaff 60%);
     background-image: repeating-radial-gradient(#aaaaff, #8888cc 30%, #aaaaff 60%);
 }
 }
-div.rune_panel.rune_quality_3{ /* Hero */
+div.rune_panel.rune_quality_hero{ /* Hero */
     background-image: repeating-radial-gradient(#ffaacc, #cc88aa 30%, #ffaacc 60%);
     background-image: repeating-radial-gradient(#ffaacc, #cc88aa 30%, #ffaacc 60%);
 }
 }
-div.rune_panel.rune_quality_4{ /* Legend */
+div.rune_panel.rune_quality_legend{ /* Legend */
     background-image: repeating-radial-gradient(#f48200, #b76201 30%, #f48200 60%);
     background-image: repeating-radial-gradient(#f48200, #b76201 30%, #f48200 60%);
 }
 }
 div.rune_panel img.rune_base{
 div.rune_panel img.rune_base{
@@ -403,6 +365,9 @@ div.rune_panel img.rune_base{
     top: 0;
     top: 0;
     left: 0;
     left: 0;
 }
 }
+div.rune_panel.rune_ancient_1 img.rune_base{
+    filter: brightness(150%) contrast(90%) saturate(100%) drop-shadow(0 0 0.3em #ffffff) drop-shadow(0 0 0.1em #ffffff);
+}
 div.rune_panel.rune_slot_1 img.rune_base{
 div.rune_panel.rune_slot_1 img.rune_base{
     transform: rotate(0deg);
     transform: rotate(0deg);
 }
 }
@@ -449,19 +414,19 @@ div.rune_panel.rune_slot_6 img.rune_icon{
     top: 2.9em;
     top: 2.9em;
     left: 3.5em;
     left: 3.5em;
 }
 }
-div.rune_panel.rune_original_quality_0 img.rune_icon{
+div.rune_panel.rune_original_quality_normal img.rune_icon{
     filter: sepia(100%) saturate(500%) grayscale(100%);
     filter: sepia(100%) saturate(500%) grayscale(100%);
 }
 }
-div.rune_panel.rune_original_quality_1 img.rune_icon{
+div.rune_panel.rune_original_quality_magic img.rune_icon{
     filter: sepia(100%) saturate(500%) hue-rotate(60deg);
     filter: sepia(100%) saturate(500%) hue-rotate(60deg);
 }
 }
-div.rune_panel.rune_original_quality_2 img.rune_icon{
+div.rune_panel.rune_original_quality_rare img.rune_icon{
     filter: sepia(100%) saturate(500%) hue-rotate(120deg);
     filter: sepia(100%) saturate(500%) hue-rotate(120deg);
 }
 }
-div.rune_panel.rune_original_quality_3 img.rune_icon{
+div.rune_panel.rune_original_quality_hero img.rune_icon{
     filter: sepia(100%) saturate(500%) hue-rotate(230deg);
     filter: sepia(100%) saturate(500%) hue-rotate(230deg);
 }
 }
-div.rune_panel.rune_original_quality_4 img.rune_icon{
+div.rune_panel.rune_original_quality_legend img.rune_icon{
     filter: sepia(100%) saturate(500%) hue-rotate(330deg);
     filter: sepia(100%) saturate(500%) hue-rotate(330deg);
 }
 }
 div.rune_panel span.rune_stars{
 div.rune_panel span.rune_stars{
@@ -647,11 +612,25 @@ table.rune td.stats table td.stat{
 }
 }
 table.rune td.stats table td.value{
 table.rune td.stats table td.value{
     text-align: left;
     text-align: left;
-    padding-left: 1em;
+    padding-left: 0.2em;
+    vertical-align: middle;
+    white-space: nowrap;
 }
 }
-
-table.rune td.stats table td.craft{
+table.rune td.stats table td.value span.grind{
     color: #ff7700;
     color: #ff7700;
+    vertical-align: middle;
+    font-size: 90%;
+    font-weight: bold;
+    margin-left: -0.4em;
+}
+table.rune td.stats table td.value span.grind_{
+    display: none;
+}
+table.rune td.stats table td.value img{
+    width: 1em;
+    height: 1em;
+    margin: 0;
+    vertical-align: middle;
 }
 }
 
 
 table.rune td.details{
 table.rune td.details{
@@ -708,3 +687,85 @@ table.rune td.details table.table_details span.quality.quality_legend{
 /**
 /**
  * /Rune table
  * /Rune table
  */
  */
+
+
+
+/**
+ * Craft item panel
+ */
+div.craft_panel{
+    width: 3em;
+    height: 3em;
+    border: 0.2em solid #000000;
+    border-radius: 0.5em;
+    position: relative;
+    text-align: center;
+    display: inline-block;
+}
+div.craft_panel.craft_quality_normal{ /* Normal */
+    background-image: repeating-radial-gradient(#ffffff, #cccccc 30%, #ffffff 60%);
+}
+div.craft_panel.craft_quality_magic{ /* Magic */
+    background-image: repeating-radial-gradient(#aaffaa, #88cc88 30%, #aaffaa 60%);
+}
+div.craft_panel.craft_quality_rare{ /* Rare */
+    background-image: repeating-radial-gradient(#aaaaff, #8888cc 30%, #aaaaff 60%);
+}
+div.craft_panel.craft_quality_hero{ /* Hero */
+    background-image: repeating-radial-gradient(#ffaacc, #cc88aa 30%, #ffaacc 60%);
+}
+div.craft_panel.craft_quality_legend{ /* Legend */
+    background-image: repeating-radial-gradient(#f48200, #b76201 30%, #f48200 60%);
+}
+div.craft_panel img.craft_base{
+    position: absolute;
+    width: 3em;
+    height: 3em;
+    margin: -0.5em;
+    top: 0.1em;
+    left: 0.5em;
+}
+div.craft_panel img.craft_icon{
+    position: absolute;
+    width: 1em;
+    height: 1em;
+    top: 0.6em;
+    left: 1em;
+}
+div.craft_panel.craft_ancient_1 img.craft_base{
+    filter: brightness(150%) contrast(90%) saturate(100%) drop-shadow(0 0 0.3em #ffffff) drop-shadow(0 0 0.1em #ffffff);
+}
+div.craft_panel.craft_quality_normal img.craft_base{
+    filter: sepia(100%) saturate(500%) grayscale(100%);
+}
+div.craft_panel.craft_quality_magic img.craft_base{
+    filter: sepia(100%) saturate(500%) hue-rotate(60deg);
+}
+div.craft_panel.craft_quality_rare img.craft_base{
+    filter: sepia(100%) saturate(500%) hue-rotate(120deg);
+}
+div.craft_panel.craft_quality_hero img.craft_base{
+    filter: sepia(100%) saturate(500%) hue-rotate(230deg);
+}
+div.craft_panel.craft_quality_legend img.craft_base{
+    filter: sepia(100%) saturate(500%) hue-rotate(330deg);
+}
+div.craft_panel span.craft_stat{
+    display: block;
+    width: 100%;
+    text-align: center;
+    font-size: 60%;
+    color: #ffffff;
+    text-shadow: 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000, 0 0 0.2em #000000;
+    position: absolute;
+    top: 2.7em;
+}
+div.craft_panel span.craft_stat span.craft_stat_name{
+    display: block;
+    margin: 0;
+}
+div.craft_panel span.craft_stat span.craft_stat_value{
+    display: block;
+    font-weight: bold;
+    margin: 0;
+}

BIN
public/img/layout/currency/darkportalenergy.png


BIN
public/img/layout/essence/Fire_High.png


BIN
public/img/layout/essence/Light_High.png


BIN
public/img/layout/essence/Water_High.png


BIN
public/img/layout/essence/Wind_High.png


BIN
public/img/layout/icon/leader.png


BIN
public/img/layout/icon/lock.png


BIN
public/img/layout/icon/nok.png


BIN
public/img/layout/icon/ok.png


BIN
public/img/layout/icon/rank_beg.png


BIN
public/img/layout/icon/rank_cha1.png


BIN
public/img/layout/icon/rank_cha2.png


BIN
public/img/layout/icon/rank_cha3.png


BIN
public/img/layout/icon/rank_con1.png


BIN
public/img/layout/icon/rank_con2.png


BIN
public/img/layout/icon/rank_con3.png


BIN
public/img/layout/icon/rank_fig1.png


BIN
public/img/layout/icon/rank_fig2.png


BIN
public/img/layout/icon/rank_fig3.png


BIN
public/img/layout/icon/rank_gua1.png


BIN
public/img/layout/icon/rank_gua2.png


BIN
public/img/layout/icon/rank_gua3.png


BIN
public/img/layout/icon/rank_leg.png


BIN
public/img/layout/icon/viceleader.png


BIN
public/img/layout/rune/01.png


BIN
public/img/layout/rune/02.png


BIN
public/img/layout/rune/03.png


BIN
public/img/layout/rune/04.png


BIN
public/img/layout/rune/05.png


BIN
public/img/layout/rune/06.png


BIN
public/img/layout/rune/07.png


BIN
public/img/layout/rune/08.png


BIN
public/img/layout/rune/10.png


BIN
public/img/layout/rune/11.png


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно