From 303e02d24360e5b6c8e7de7624655eb5d0071dd3 Mon Sep 17 00:00:00 2001 From: Hansoo Date: Sun, 5 Feb 2023 19:39:35 +0900 Subject: [PATCH] added some more changes --- package-lock.json | 27 ++ package.json | 1 + src-tauri/src/main.rs | 23 ++ src-tauri/src/model.rs | 10 + src-tauri/tauri.conf.json | 3 +- src/App.svelte | 1 + src/assets/buturi.png | Bin 0 -> 4998 bytes src/assets/henka.png | Bin 0 -> 4164 bytes src/assets/tokushu.png | Bin 0 -> 18879 bytes src/lib/DisplayData.svelte | 540 ++++++++++++++++++++++++++----------- src/lib/MainWrapper.svelte | 14 +- src/model/PokemonData.ts | 22 ++ src/style.css | 1 + 13 files changed, 479 insertions(+), 163 deletions(-) create mode 100644 src/assets/buturi.png create mode 100644 src/assets/henka.png create mode 100644 src/assets/tokushu.png create mode 100644 src/model/PokemonData.ts diff --git a/package-lock.json b/package-lock.json index e91f4aa..3fffaf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "@tauri-apps/api": "^1.2.0", + "carbon-components-svelte": "^0.72.2", "simple-svelte-autocomplete": "^2.5.1" }, "devDependencies": { @@ -737,6 +738,14 @@ "node": ">=6" } }, + "node_modules/carbon-components-svelte": { + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.72.2.tgz", + "integrity": "sha512-fTwRQ+bQ+0lZooS2FOkERIaZGoBzWNPn2Ksq8+3K4x+E/pU9EFEnFH7PadYMpuxih2o5N0Dbn0YC9JyZbZrQJw==", + "dependencies": { + "flatpickr": "4.6.9" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -885,6 +894,11 @@ "node": ">=8" } }, + "node_modules/flatpickr": { + "version": "4.6.9", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", + "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2031,6 +2045,14 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "carbon-components-svelte": { + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.72.2.tgz", + "integrity": "sha512-fTwRQ+bQ+0lZooS2FOkERIaZGoBzWNPn2Ksq8+3K4x+E/pU9EFEnFH7PadYMpuxih2o5N0Dbn0YC9JyZbZrQJw==", + "requires": { + "flatpickr": "4.6.9" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -2141,6 +2163,11 @@ "to-regex-range": "^5.0.1" } }, + "flatpickr": { + "version": "4.6.9", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", + "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", diff --git a/package.json b/package.json index d733b6c..068409a 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "@tauri-apps/api": "^1.2.0", + "carbon-components-svelte": "^0.72.2", "simple-svelte-autocomplete": "^2.5.1" }, "devDependencies": { diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index d2df74e..99de0db 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -110,6 +110,27 @@ fn search_move(index: i64) -> MoveSearchResult { #[tauri::command] fn search(index: i64) -> SearchResult { let connection = sqlite::open("./pokemon.db").unwrap(); + let mut learnset: Vec = vec![]; + let move_query = "SELECT pl.id, pl.learnset_id, l.name, l.types, l.power, l.category FROM pokemon__learnset pl JOIN learnset l on pl.learnset_id = l.id WHERE pl.pokemon_id = ? ORDER BY usage"; + for row in connection + .prepare(move_query) + .unwrap() + .into_iter() + .bind((1, index)) + .unwrap() + .map(|row| row.unwrap()) + { + let row_result = PokemonDataLearnset { + id: row.read::("id"), + learset_id: row.read::("learnset_id"), + name: row.read::<&str, _>("name").to_string(), + types: serde_json::from_str(row.read::<&str, _>("types")).unwrap_or(vec![0]), + power: row.read::("power"), + category: row.read::("category"), + }; + learnset.push(row_result) + } + println!("Get Thing2"); let query = "SELECT * FROM pokemon WHERE id = ?"; for row in connection .prepare(query) @@ -131,6 +152,7 @@ fn search(index: i64) -> SearchResult { special_attack: row.read::("special_attack"), special_defense: row.read::("special_defense"), speed: row.read::("speed"), + learnset: learnset, }; return row_result } @@ -146,6 +168,7 @@ fn search(index: i64) -> SearchResult { special_attack: 0, special_defense: 0, speed: 0, + learnset: vec![], } } fn main() { diff --git a/src-tauri/src/model.rs b/src-tauri/src/model.rs index ca07c7a..bc60d5b 100644 --- a/src-tauri/src/model.rs +++ b/src-tauri/src/model.rs @@ -13,8 +13,18 @@ pub struct SearchResult { pub speed: i64, pub abilities: String, pub thumbnail: String, + pub learnset: Vec, } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PokemonDataLearnset { + pub id: i64, + pub learset_id: i64, + pub name: String, + pub types: Vec, + pub power: i64, + pub category: i64, +} #[derive(Serialize, Deserialize, Debug, Clone)] pub struct MoveSearchResult { pub id: i64, diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index fc61036..2cb4592 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -60,10 +60,11 @@ "windows": [ { "fullscreen": false, + "maximized": true, "height": 950, "resizable": true, "title": "pokemon-data-displayer", - "width": 1000, + "width": 1200, "alwaysOnTop": false } ] diff --git a/src/App.svelte b/src/App.svelte index 1570f62..ff2829c 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -1,6 +1,7 @@ diff --git a/src/assets/buturi.png b/src/assets/buturi.png new file mode 100644 index 0000000000000000000000000000000000000000..c9832adf3d3f25ef780e33290ac3480cbab811fd GIT binary patch literal 4998 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 O00007Kvuf3 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 - import defense_types from "../const/defense_types.json" - export let pokemonData + import defense_types from "../const/defense_types.json"; + import type { PokemonDBData } from "src/model/PokemonData"; + import { Accordion, AccordionItem } from "carbon-components-svelte"; + import PhysicalIcon from "../assets/buturi.png"; + import SpecialIcon from "../assets/tokushu.png"; + import BuffIcon from "../assets/henka.png"; + export let pokemonData: PokemonDBData | undefined; function v_validator(v) { if (typeof v !== "number") { return null; @@ -43,8 +48,8 @@ { id: 15 }, { id: 16 }, { id: 17 }, - { id: 18 } - ] + { id: 18 }, + ]; function d_validator(d) { if (typeof d !== "number") { return null; @@ -109,100 +114,110 @@ hp_final = calculate_hp(pokemonData.hp, hp_v, hp_d); atk_final = other_stats(pokemonData.attack, atk_v, atk_d, atk_p); def_final = other_stats(pokemonData.defense, def_v, def_d, def_p); - spatk_final = other_stats(pokemonData.special_attack, spatk_v, spatk_d, spatk_p); - spdef_final = other_stats(pokemonData.special_defense, spdef_v, spdef_d, spdef_p); + spatk_final = other_stats( + pokemonData.special_attack, + spatk_v, + spatk_d, + spatk_p + ); + spdef_final = other_stats( + pokemonData.special_defense, + spdef_v, + spdef_d, + spdef_p + ); spd_final = other_stats(pokemonData.speed, spd_v, spd_d, spd_p); } } function generate_type(types) { - let result = [] - types.forEach(type => { + let result = []; + types.forEach((type) => { switch (type) { case 1: { - result.push(`
ノーマル
`) + result.push(`
ノーマル
`); break; } case 2: { - result.push(`
ほのお
`) + result.push(`
ほのお
`); break; } case 3: { - result.push(`
みず
`) + result.push(`
みず
`); break; } case 4: { - result.push(`
でんき
`) + result.push(`
でんき
`); break; } case 5: { - result.push(`
くさ
`) + result.push(`
くさ
`); break; } case 6: { - result.push(`
こおり
`) + result.push(`
こおり
`); break; } case 7: { - result.push(`
かくとう
`) + result.push(`
かくとう
`); break; } case 8: { - result.push(`
どく
`) + result.push(`
どく
`); break; } case 9: { - result.push(`
じめん
`) + result.push(`
じめん
`); break; } case 10: { - result.push(`
ひこう
`) + result.push(`
ひこう
`); break; } case 11: { - result.push(`
エスパー
`) + result.push(`
エスパー
`); break; } case 12: { - result.push(`
むし
`) + result.push(`
むし
`); break; } case 13: { - result.push(`
いわ
`) + result.push(`
いわ
`); break; } case 14: { - result.push(`
ゴースト
`) + result.push(`
ゴースト
`); break; } case 15: { - result.push(`
ドラゴン
`) + result.push(`
ドラゴン
`); break; } case 16: { - result.push(`
あく
`) + result.push(`
あく
`); break; } case 17: { - result.push(`
はがね
`) + result.push(`
はがね
`); break; } case 18: { - result.push(`
フェアリー
`) + result.push(`
フェアリー
`); break; } } - }) - if (result.length > 0) - return result.join(' ') + }); + if (result.length > 0) return result.join(" "); return " "; } function generate_weakness(types) { let parsed_types = JSON.parse(types); - console.log(parsed_types) + console.log(parsed_types); let type_compatibility = defense_types[parsed_types[0] - 1]; if (parsed_types.length > 1) { let second_type_compatibility = defense_types[parsed_types[1] - 1]; - type_compatibility = type_compatibility.map((v, i) => v * second_type_compatibility[i] + type_compatibility = type_compatibility.map( + (v, i) => v * second_type_compatibility[i] ); } let super_weakness = []; @@ -229,7 +244,7 @@ immune.push(i + 1); break; } - }) + }); console.log("super_weakness", super_weakness); console.log("weakness", weakness); console.log("super_resist", super_resist); @@ -249,7 +264,8 @@ return "x1/4"; case 4: return "x0"; - default: return ""; + default: + return ""; } } // 個体値 (V) 0-31 @@ -274,8 +290,11 @@ export let spdef_final = 0; export let spd_final = 0; export let terastype = [0]; + export let item = 0; let level = 50; let selected_terastype = 0; + let selected_item = 0; + let atk_plus = false; let def_plus = false; let spatk_plus = false; @@ -289,11 +308,11 @@ let spd_minus = false; function calculate_hp(stat, v, d) { // floor({(種族値+個体値)×2+min(63,floor(floor(1+√努力値)÷4))}×レベル÷100)+レベル+10 - return Math.floor(((stat*2+v+(d/4))*(level/100))+level+10) + return Math.floor((stat * 2 + v + d / 4) * (level / 100) + level + 10); } function other_stats(stat, v, d, p) { // floor({(種族値+個体値)×2+min(63,floor(floor(1+√努力値)÷4))}×レベル÷100)+5 - return Math.floor((((stat*2+v+(d/4))*(level/100))+5)*p) + return Math.floor(((stat * 2 + v + d / 4) * (level / 100) + 5) * p); } let abilities = []; let abilities_description = []; @@ -301,134 +320,330 @@
{#if pokemonData && pokemonData.id && pokemonData.id > 0} -
- - - - - - - - - - - - -
{pokemonData.jap_name}名前{pokemonData.name}
タイプ{@html generate_type(JSON.parse(pokemonData.types))}
テラスタル - + + + + + + + + + + + + + + + + + +
{pokemonData.name}名前{pokemonData.name}
タイプ{@html generate_type(JSON.parse(pokemonData.types))}
テラスタル + +
アイテム + +
+ + + + {#each generate_weakness(terastype[0] === 0 ? pokemonData.types : JSON.stringify(terastype)) as row, i} + + + + {/each} - - - -
{generate_damage_value(i)} + {@html generate_type(row)} +
- -
- - {#each generate_weakness(terastype[0] === 0 ? pokemonData.types : JSON.stringify(terastype)) as row, i} - - - - - {/each} -
{generate_damage_value(i)} - {@html generate_type(row)} -
-
-
- - {#each abilities as ability, i} - - - - - {/each} -
{ability}{abilities_description[i]}
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HP{pokemonData.hp}{hp_final}+-
ATK{pokemonData.attack}{atk_final}
DEF{pokemonData.defense}{def_final}
S.ATK{pokemonData.special_attack}{spatk_final}
S.DEF{pokemonData.special_defense}{spdef_final}
SPD{pokemonData.speed}{spd_final}
TOTAL{pokemonData.hp + pokemonData.attack + pokemonData.defense + pokemonData.special_attack + pokemonData.special_defense + pokemonData.speed}
Level
-
+
+ + + + {#each abilities as ability, i} + + + + + {/each} +
{ability}{abilities_description[i]}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HP{pokemonData.hp}{hp_final}+-
ATK{pokemonData.attack}{atk_final}
DEF{pokemonData.defense}{def_final}
S.ATK{pokemonData.special_attack}{spatk_final}
S.DEF{pokemonData.special_defense}{spdef_final}
SPD{pokemonData.speed}{spd_final}
TOTAL{pokemonData.hp + + pokemonData.attack + + pokemonData.defense + + pokemonData.special_attack + + pokemonData.special_defense + + pokemonData.speed} +
Level +
+
+ + + {#each pokemonData.learnset as learnset} + + + + + + + {/each} +
a{@html generate_type(learnset.types)}{learnset.name}{learnset.power}
+
+ +
{:else} -
- No data -
+
No data
{/if}
\ No newline at end of file + diff --git a/src/lib/MainWrapper.svelte b/src/lib/MainWrapper.svelte index 56fae2d..4365872 100644 --- a/src/lib/MainWrapper.svelte +++ b/src/lib/MainWrapper.svelte @@ -3,11 +3,12 @@ import AutoComplete from "simple-svelte-autocomplete"; import DisplayData from "./DisplayData.svelte"; import type { PokemonData } from "../model/PokemonStatus"; + import type { PokemonDBData } from "src/model/PokemonData"; $: { if (myValue > 0 && myValue !== currentValue) { invoke("search", { index: myValue }).then((r) => { currentValue = myValue; - pokemonData = r; + pokemonData = r as PokemonDBData; console.log(pokemonData); }); } @@ -25,7 +26,7 @@ } let myValue; let currentValue = 0; - let pokemonData; + let pokemonData: PokemonDBData | undefined; let terastype = [0]; let hp_final = 0; let atk_final = 0; @@ -67,7 +68,7 @@ bind:value={myValue} /> -
+
+ + \ No newline at end of file diff --git a/src/model/PokemonData.ts b/src/model/PokemonData.ts new file mode 100644 index 0000000..bd11278 --- /dev/null +++ b/src/model/PokemonData.ts @@ -0,0 +1,22 @@ +export interface PokemonDBData { + id: number; + name: string; + types: string; + thumbnail: string; + abilities: string; + hp: number; + attack: number; + defense: number; + special_attack: number; + special_defense: number; + speed: number; + learnset: PokemonLearnsetDBData[]; +}; +export interface PokemonLearnsetDBData { + id: number; + learnset_id: number; + name: string; + types: number[]; + power: number; + category: number; +} diff --git a/src/style.css b/src/style.css index 66a70c7..ff9e894 100644 --- a/src/style.css +++ b/src/style.css @@ -95,6 +95,7 @@ input::-webkit-inner-spin-button { .type { font-size: small; font-weight: bold; + padding-top: 4px; width: 75px; height: 23px; border-radius: 10px;