diff --git a/data/battle_param/ep1_multi_hard.toml b/data/battle_param/ep1_multi_hard.toml new file mode 100644 index 0000000..3b86664 --- /dev/null +++ b/data/battle_param/ep1_multi_hard.toml @@ -0,0 +1,637 @@ +[Mothmant] +atp = 384 +mst = 0 +evp = 42 +hp = 204 +dfp = 118 +ata = 135 +lck = 40 +esp = 15 +exp = 36 + +[Monest] +atp = 337 +mst = 0 +evp = 20 +hp = 843 +dfp = 118 +ata = 60 +lck = 0 +esp = 15 +exp = 43 + +[SavageWolf] +atp = 445 +mst = 0 +evp = 170 +hp = 501 +dfp = 148 +ata = 150 +lck = 16 +esp = 20 +exp = 42 + +[BarbarousWolf] +atp = 457 +mst = 0 +evp = 197 +hp = 525 +dfp = 155 +ata = 150 +lck = 20 +esp = 20 +exp = 45 + +[PoisonLily] +atp = 438 +mst = 0 +evp = 210 +hp = 511 +dfp = 162 +ata = 155 +lck = 10 +esp = 20 +exp = 49 + +[NarLily] +atp = 628 +mst = 0 +evp = 210 +hp = 592 +dfp = 170 +ata = 180 +lck = 30 +esp = 20 +exp = 259 + +[SinowBeat] +atp = 603 +mst = 0 +evp = 246 +hp = 781 +dfp = 192 +ata = 160 +lck = 20 +esp = 35 +exp = 70 + +[Canadine] +atp = 539 +mst = 0 +evp = 222 +hp = 498 +dfp = 162 +ata = 170 +lck = 10 +esp = 15 +exp = 6 + +[Canane] +atp = 552 +mst = 0 +evp = 222 +hp = 641 +dfp = 162 +ata = 180 +lck = 10 +esp = 20 +exp = 60 + +[ChaosSorcerer] +atp = 666 +mst = 222 +evp = 206 +hp = 844 +dfp = 185 +ata = 180 +lck = 0 +esp = 47 +exp = 78 + +[BeeR] +atp = 552 +mst = 0 +evp = 108 +hp = 635 +dfp = 104 +ata = 120 +lck = 0 +esp = 100 +exp = 40 + +[BeeL] +atp = 552 +mst = 0 +evp = 108 +hp = 636 +dfp = 104 +ata = 120 +lck = 0 +esp = 100 +exp = 40 + +[ChaosBringer] +atp = 780 +mst = 0 +evp = 250 +hp = 1343 +dfp = 259 +ata = 190 +lck = 10 +esp = 52 +exp = 97 + +[DarkBelra] +atp = 805 +mst = 0 +evp = 166 +hp = 1491 +dfp = 384 +ata = 160 +lck = 16 +esp = 47 +exp = 84 + +[DeRolLe] +atp = 860 +mst = 10 +evp = 120 +hp = 8000 +dfp = 200 +ata = 230 +lck = 10 +esp = 100 +exp = 3200 + +[DeRolLeBody] +atp = 770 +mst = 10 +evp = 120 +hp = 1550 +dfp = 152 +ata = 210 +lck = 0 +esp = 100 +exp = 25 + +[DeRolLeMine] +atp = 500 +mst = 10 +evp = 26 +hp = 502 +dfp = 140 +ata = 110 +lck = 10 +esp = 100 +exp = 4 + +[Dragon] +atp = 550 +mst = 0 +evp = 120 +hp = 5000 +dfp = 100 +ata = 260 +lck = 16 +esp = 100 +exp = 2400 + +[SinowGold] +atp = 577 +mst = 0 +evp = 258 +hp = 701 +dfp = 266 +ata = 180 +lck = 0 +esp = 40 +exp = 75 + +[RagRappy] +atp = 419 +mst = 0 +evp = 190 +hp = 379 +dfp = 133 +ata = 130 +lck = 20 +esp = 15 +exp = 40 + +[EasterRappy] +atp = 527 +mst = 0 +evp = 90 +hp = 573 +dfp = 133 +ata = 160 +lck = 10 +esp = 15 +exp = 184 + +[NanoDragon] +atp = 520 +mst = 0 +evp = 137 +hp = 654 +dfp = 229 +ata = 160 +lck = 10 +esp = 40 +exp = 57 + +[Dubchic] +atp = 615 +mst = 0 +evp = 197 +hp = 574 +dfp = 192 +ata = 160 +lck = 10 +esp = 20 +exp = 11 + +[Gillchic] +atp = 622 +mst = 0 +evp = 197 +hp = 541 +dfp = 188 +ata = 170 +lck = 16 +esp = 20 +exp = 61 + +[Garanz] +atp = 691 +mst = 0 +evp = 157 +hp = 1245 +dfp = 273 +ata = 160 +lck = 20 +esp = 40 +exp = 67 + +[GalGryphon] +atp = 603 +mst = 0 +evp = 243 +hp = 686 +dfp = 236 +ata = 210 +lck = 10 +esp = 22 +exp = 64 + +[Bulclaw] +atp = 729 +mst = 0 +evp = 210 +hp = 655 +dfp = 207 +ata = 170 +lck = 12 +esp = 27 +exp = 77 + +[Claw] +atp = 615 +mst = 0 +evp = 183 +hp = 575 +dfp = 207 +ata = 100 +lck = 8 +esp = 12 +exp = 43 + +[VolOptPartA] +atp = 0 +mst = 0 +evp = 80 +hp = 4800 +dfp = 170 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptPillar] +atp = 100 +mst = 0 +evp = 70 +hp = 850 +dfp = 70 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptMonitor] +atp = 0 +mst = 0 +evp = 55 +hp = 221 +dfp = 100 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptAmp] +atp = 0 +mst = 0 +evp = 120 +hp = 700 +dfp = 100 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOpt] +atp = 0 +mst = 0 +evp = 140 +hp = 14500 +dfp = 200 +ata = 0 +lck = 5 +esp = 100 +exp = 3800 + +[VolOptTrap] +atp = 0 +mst = 0 +evp = 0 +hp = 650 +dfp = 165 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[PofuillySlime] +atp = 489 +mst = 0 +evp = 190 +hp = 492 +dfp = 162 +ata = 140 +lck = 10 +esp = 20 +exp = 49 + +[PanArms] +atp = 539 +mst = 0 +evp = 183 +hp = 1316 +dfp = 858 +ata = 180 +lck = 10 +esp = 20 +exp = 26 + +[Hidoom] +atp = 527 +mst = 0 +evp = 210 +hp = 642 +dfp = 140 +ata = 150 +lck = 28 +esp = 20 +exp = 23 + +[Migium] +atp = 565 +mst = 0 +evp = 197 +hp = 816 +dfp = 140 +ata = 150 +lck = 0 +esp = 20 +exp = 23 + +[PouillySlime] +atp = 717 +mst = 0 +evp = 210 +hp = 506 +dfp = 148 +ata = 210 +lck = 16 +esp = 20 +exp = 259 + +[Darvant] +atp = 190 +mst = 0 +evp = 100 +hp = 150 +dfp = 80 +ata = 160 +lck = 0 +esp = 100 +exp = 5 + +[DarkFalz1] +atp = 1100 +mst = 300 +evp = 170 +hp = 8500 +dfp = 230 +ata = 230 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz2] +atp = 1300 +mst = 300 +evp = 170 +hp = 9001 +dfp = 230 +ata = 230 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz3] +atp = 1400 +mst = 300 +evp = 170 +hp = 8001 +dfp = 230 +ata = 230 +lck = 30 +esp = 100 +exp = 8000 + +[UltDarvant] +atp = 500 +mst = 0 +evp = 100 +hp = 300 +dfp = 100 +ata = 100 +lck = 20 +esp = 100 +exp = 5 + +[Dubwitch] +atp = 0 +mst = 0 +evp = 0 +hp = 0 +dfp = 0 +ata = 0 +lck = 0 +esp = 0 +exp = 0 + +[Hildebear] +atp = 514 +mst = 0 +evp = 117 +hp = 735 +dfp = 162 +ata = 140 +lck = 20 +esp = 35 +exp = 56 + +[Hildeblue] +atp = 590 +mst = 0 +evp = 237 +hp = 842 +dfp = 118 +ata = 160 +lck = 20 +esp = 35 +exp = 184 + +[Booma] +atp = 438 +mst = 0 +evp = 170 +hp = 427 +dfp = 118 +ata = 120 +lck = 16 +esp = 5 +exp = 42 + +[Gobooma] +atp = 444 +mst = 0 +evp = 177 +hp = 468 +dfp = 125 +ata = 125 +lck = 16 +esp = 7 +exp = 43 + +[Gigobooma] +atp = 451 +mst = 0 +evp = 183 +hp = 508 +dfp = 162 +ata = 135 +lck = 10 +esp = 10 +exp = 45 + +[GrassAssassin] +atp = 527 +mst = 0 +evp = 210 +hp = 634 +dfp = 177 +ata = 150 +lck = 20 +esp = 40 +exp = 64 + +[EvilShark] +atp = 489 +mst = 0 +evp = 197 +hp = 469 +dfp = 192 +ata = 153 +lck = 8 +esp = 7 +exp = 49 + +[PalShark] +atp = 502 +mst = 0 +evp = 203 +hp = 493 +dfp = 192 +ata = 160 +lck = 16 +esp = 10 +exp = 52 + +[GuilShark] +atp = 514 +mst = 0 +evp = 210 +hp = 542 +dfp = 192 +ata = 170 +lck = 16 +esp = 10 +exp = 55 + +[Delsaber] +atp = 779 +mst = 0 +evp = 343 +hp = 1100 +dfp = 236 +ata = 195 +lck = 20 +esp = 27 +exp = 81 + +[Dimenian] +atp = 653 +mst = 0 +evp = 225 +hp = 782 +dfp = 236 +ata = 180 +lck = 16 +esp = 15 +exp = 67 + +[LaDimenian] +atp = 672 +mst = 0 +evp = 235 +hp = 830 +dfp = 244 +ata = 193 +lck = 16 +esp = 16 +exp = 70 + +[SoDimenian] +atp = 691 +mst = 0 +evp = 246 +hp = 878 +dfp = 251 +ata = 205 +lck = 20 +esp = 22 +exp = 73 diff --git a/data/battle_param/ep1_multi_normal.toml b/data/battle_param/ep1_multi_normal.toml new file mode 100644 index 0000000..5874331 --- /dev/null +++ b/data/battle_param/ep1_multi_normal.toml @@ -0,0 +1,637 @@ +[Mothmant] +atp = 53 +mst = 0 +evp = 30 +hp = 8 +dfp = 0 +ata = 75 +lck = 20 +esp = 0 +exp = 1 + +[Monest] +atp = 0 +mst = 0 +evp = 0 +hp = 400 +dfp = 0 +ata = 0 +lck = 0 +esp = 0 +exp = 6 + +[SavageWolf] +atp = 112 +mst = 0 +evp = 70 +hp = 95 +dfp = 20 +ata = 90 +lck = 8 +esp = 5 +exp = 5 + +[BarbarousWolf] +atp = 124 +mst = 0 +evp = 90 +hp = 118 +dfp = 25 +ata = 90 +lck = 10 +esp = 5 +exp = 7 + +[PoisonLily] +atp = 106 +mst = 0 +evp = 100 +hp = 154 +dfp = 30 +ata = 95 +lck = 5 +esp = 5 +exp = 10 + +[NarLily] +atp = 286 +mst = 0 +evp = 100 +hp = 214 +dfp = 35 +ata = 120 +lck = 20 +esp = 5 +exp = 150 + +[SinowBeat] +atp = 262 +mst = 0 +evp = 127 +hp = 354 +dfp = 50 +ata = 100 +lck = 10 +esp = 20 +exp = 25 + +[Canadine] +atp = 202 +mst = 0 +evp = 109 +hp = 145 +dfp = 30 +ata = 110 +lck = 5 +esp = 0 +exp = 3 + +[Canane] +atp = 214 +mst = 0 +evp = 109 +hp = 250 +dfp = 30 +ata = 120 +lck = 5 +esp = 10 +exp = 17 + +[ChaosSorcerer] +atp = 322 +mst = 111 +evp = 97 +hp = 401 +dfp = 45 +ata = 120 +lck = 0 +esp = 35 +exp = 29 + +[BeeR] +atp = 214 +mst = 0 +evp = 80 +hp = 200 +dfp = 20 +ata = 60 +lck = 0 +esp = 100 +exp = 4 + +[BeeL] +atp = 214 +mst = 0 +evp = 80 +hp = 201 +dfp = 20 +ata = 60 +lck = 0 +esp = 100 +exp = 4 + +[ChaosBringer] +atp = 555 +mst = 0 +evp = 130 +hp = 770 +dfp = 95 +ata = 130 +lck = 5 +esp = 40 +exp = 35 + +[DarkBelra] +atp = 581 +mst = 0 +evp = 67 +hp = 880 +dfp = 180 +ata = 100 +lck = 8 +esp = 35 +exp = 35 + +[DeRolLe] +atp = 320 +mst = 10 +evp = 100 +hp = 6000 +dfp = 80 +ata = 160 +lck = 5 +esp = 100 +exp = 890 + +[DeRolLeBody] +atp = 390 +mst = 10 +evp = 90 +hp = 1000 +dfp = 70 +ata = 150 +lck = 0 +esp = 100 +exp = 10 + +[DeRolLeMine] +atp = 300 +mst = 10 +evp = 5 +hp = 330 +dfp = 50 +ata = 50 +lck = 8 +esp = 100 +exp = 10 + +[Dragon] +atp = 250 +mst = 0 +evp = 0 +hp = 2500 +dfp = 0 +ata = 200 +lck = 8 +esp = 100 +exp = 400 + +[SinowGold] +atp = 238 +mst = 0 +evp = 136 +hp = 295 +dfp = 100 +ata = 120 +lck = 0 +esp = 25 +exp = 28 + +[RagRappy] +atp = 88 +mst = 0 +evp = 85 +hp = 56 +dfp = 10 +ata = 70 +lck = 10 +esp = 0 +exp = 4 + +[EasterRappy] +atp = 184 +mst = 0 +evp = 45 +hp = 260 +dfp = 75 +ata = 100 +lck = 5 +esp = 0 +exp = 100 + +[NanoDragon] +atp = 184 +mst = 0 +evp = 45 +hp = 261 +dfp = 75 +ata = 100 +lck = 5 +esp = 25 +exp = 15 + +[Dubchic] +atp = 274 +mst = 0 +evp = 90 +hp = 202 +dfp = 50 +ata = 100 +lck = 5 +esp = 5 +exp = 3 + +[Gillchic] +atp = 280 +mst = 0 +evp = 90 +hp = 176 +dfp = 47 +ata = 110 +lck = 8 +esp = 5 +exp = 18 + +[Garanz] +atp = 346 +mst = 0 +evp = 60 +hp = 698 +dfp = 105 +ata = 115 +lck = 10 +esp = 25 +exp = 22 + +[GalGryphon] +atp = 262 +mst = 0 +evp = 125 +hp = 284 +dfp = 80 +ata = 150 +lck = 5 +esp = 10 +exp = 20 + +[Bulclaw] +atp = 382 +mst = 0 +evp = 100 +hp = 262 +dfp = 60 +ata = 110 +lck = 6 +esp = 15 +exp = 27 + +[Claw] +atp = 274 +mst = 0 +evp = 80 +hp = 203 +dfp = 60 +ata = 110 +lck = 4 +esp = 0 +exp = 6 + +[VolOptPartA] +atp = 0 +mst = 0 +evp = 60 +hp = 3000 +dfp = 80 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptPillar] +atp = 100 +mst = 0 +evp = 40 +hp = 500 +dfp = 80 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptMonitor] +atp = 0 +mst = 0 +evp = 45 +hp = 220 +dfp = 70 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptAmp] +atp = 0 +mst = 0 +evp = 70 +hp = 450 +dfp = 40 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOpt] +atp = 0 +mst = 0 +evp = 115 +hp = 9500 +dfp = 120 +ata = 0 +lck = 5 +esp = 100 +exp = 1250 + +[VolOptTrap] +atp = 0 +mst = 0 +evp = 0 +hp = 263 +dfp = 50 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[PofuillySlime] +atp = 154 +mst = 0 +evp = 85 +hp = 140 +dfp = 30 +ata = 80 +lck = 5 +esp = 5 +exp = 10 + +[PanArms] +atp = 202 +mst = 0 +evp = 80 +hp = 750 +dfp = 500 +ata = 120 +lck = 5 +esp = 5 +exp = 6 + +[Hidoom] +atp = 190 +mst = 0 +evp = 100 +hp = 251 +dfp = 15 +ata = 90 +lck = 14 +esp = 5 +exp = 4 + +[Migium] +atp = 226 +mst = 0 +evp = 90 +hp = 380 +dfp = 15 +ata = 90 +lck = 0 +esp = 5 +exp = 4 + +[PouillySlime] +atp = 370 +mst = 0 +evp = 100 +hp = 15 +dfp = 20 +ata = 150 +lck = 8 +esp = 5 +exp = 150 + +[Darvant] +atp = 80 +mst = 0 +evp = 50 +hp = 125 +dfp = 0 +ata = 0 +lck = 0 +esp = 100 +exp = 5 + +[DarkFalz1] +atp = 700 +mst = 300 +evp = 150 +hp = 5900 +dfp = 120 +ata = 170 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz2] +atp = 750 +mst = 300 +evp = 150 +hp = 6500 +dfp = 120 +ata = 170 +lck = 20 +esp = 100 +exp = 3000 + +[DarkFalz3] +atp = 800 +mst = 0 +evp = 100 +hp = 9000 +dfp = 120 +ata = 170 +lck = 20 +esp = 100 +exp = 0 + +[UltDarvant] +atp = 220 +mst = 0 +evp = 90 +hp = 252 +dfp = 10 +ata = 100 +lck = 20 +esp = 100 +exp = 5 + +[Dubwitch] +atp = 0 +mst = 0 +evp = 0 +hp = 0 +dfp = 0 +ata = 0 +lck = 0 +esp = 0 +exp = 0 + +[Hildebear] +atp = 210 +mst = 0 +evp = 30 +hp = 320 +dfp = 30 +ata = 80 +lck = 10 +esp = 25 +exp = 13 + +[Hildeblue] +atp = 270 +mst = 0 +evp = 120 +hp = 399 +dfp = 0 +ata = 100 +lck = 10 +esp = 25 +exp = 100 + +[Booma] +atp = 106 +mst = 0 +evp = 70 +hp = 92 +dfp = 0 +ata = 60 +lck = 8 +esp = 0 +exp = 5 + +[Gobooma] +atp = 112 +mst = 0 +evp = 75 +hp = 122 +dfp = 5 +ata = 65 +lck = 8 +esp = 0 +exp = 6 + +[Gigobooma] +atp = 118 +mst = 0 +evp = 80 +hp = 152 +dfp = 30 +ata = 75 +lck = 5 +esp = 0 +exp = 7 + +[GrassAssassin] +atp = 277 +mst = 0 +evp = 100 +hp = 245 +dfp = 40 +ata = 90 +lck = 10 +esp = 25 +exp = 20 + +[EvilShark] +atp = 154 +mst = 0 +evp = 90 +hp = 123 +dfp = 50 +ata = 93 +lck = 8 +esp = 0 +exp = 10 + +[PalShark] +atp = 166 +mst = 0 +evp = 95 +hp = 141 +dfp = 50 +ata = 100 +lck = 8 +esp = 0 +exp = 12 + +[GuilShark] +atp = 178 +mst = 0 +evp = 100 +hp = 177 +dfp = 50 +ata = 110 +lck = 8 +esp = 0 +exp = 14 + +[Delsaber] +atp = 448 +mst = 0 +evp = 200 +hp = 590 +dfp = 80 +ata = 135 +lck = 10 +esp = 15 +exp = 30 + +[Dimenian] +atp = 346 +mst = 0 +evp = 111 +hp = 355 +dfp = 80 +ata = 115 +lck = 8 +esp = 10 +exp = 22 + +[LaDimenian] +atp = 382 +mst = 0 +evp = 119 +hp = 390 +dfp = 85 +ata = 125 +lck = 8 +esp = 10 +exp = 24 + +[SoDimenian] +atp = 418 +mst = 0 +evp = 127 +hp = 426 +dfp = 90 +ata = 140 +lck = 10 +esp = 10 +exp = 26 diff --git a/data/battle_param/ep1_multi_ultimate.toml b/data/battle_param/ep1_multi_ultimate.toml new file mode 100644 index 0000000..a4ab502 --- /dev/null +++ b/data/battle_param/ep1_multi_ultimate.toml @@ -0,0 +1,637 @@ +[Mothmant] +atp = 1000 +mst = 0 +evp = 477 +hp = 1502 +dfp = 600 +ata = 233 +lck = 35 +esp = 35 +exp = 145 + +[Monest] +atp = 0 +mst = 0 +evp = 390 +hp = 2897 +dfp = 600 +ata = 210 +lck = 0 +esp = 35 +exp = 270 + +[SavageWolf] +atp = 1100 +mst = 0 +evp = 593 +hp = 2300 +dfp = 650 +ata = 208 +lck = 40 +esp = 40 +exp = 275 + +[BarbarousWolf] +atp = 1350 +mst = 0 +evp = 651 +hp = 2346 +dfp = 663 +ata = 211 +lck = 50 +esp = 40 +exp = 280 + +[PoisonLily] +atp = 1750 +mst = 0 +evp = 680 +hp = 2058 +dfp = 676 +ata = 258 +lck = 30 +esp = 40 +exp = 295 + +[NarLily] +atp = 3500 +mst = 1500 +evp = 680 +hp = 3858 +dfp = 688 +ata = 340 +lck = 50 +esp = 40 +exp = 900 + +[SinowBeat] +atp = 2320 +mst = 0 +evp = 758 +hp = 3338 +dfp = 726 +ata = 280 +lck = 33 +esp = 55 +exp = 350 + +[Canadine] +atp = 1650 +mst = 0 +evp = 706 +hp = 2523 +dfp = 676 +ata = 273 +lck = 20 +esp = 30 +exp = 32 + +[Canane] +atp = 1700 +mst = 0 +evp = 706 +hp = 2513 +dfp = 676 +ata = 280 +lck = 20 +esp = 35 +exp = 325 + +[ChaosSorcerer] +atp = 1689 +mst = 2100 +evp = 671 +hp = 2597 +dfp = 713 +ata = 370 +lck = 0 +esp = 65 +exp = 363 + +[BeeR] +atp = 1527 +mst = 0 +evp = 622 +hp = 1646 +dfp = 650 +ata = 340 +lck = 0 +esp = 200 +exp = 100 + +[BeeL] +atp = 1527 +mst = 0 +evp = 622 +hp = 1647 +dfp = 650 +ata = 340 +lck = 0 +esp = 200 +exp = 100 + +[ChaosBringer] +atp = 3200 +mst = 0 +evp = 767 +hp = 4550 +dfp = 839 +ata = 368 +lck = 40 +esp = 70 +exp = 385 + +[DarkBelra] +atp = 3270 +mst = 0 +evp = 584 +hp = 3900 +dfp = 1054 +ata = 315 +lck = 50 +esp = 65 +exp = 372 + +[DeRolLe] +atp = 2500 +mst = 10 +evp = 680 +hp = 21000 +dfp = 802 +ata = 375 +lck = 25 +esp = 1000 +exp = 18800 + +[DeRolLeBody] +atp = 2500 +mst = 10 +evp = 651 +hp = 7000 +dfp = 776 +ata = 340 +lck = 0 +esp = 1000 +exp = 60 + +[DeRolLeMine] +atp = 2400 +mst = 10 +evp = 405 +hp = 1200 +dfp = 726 +ata = 345 +lck = 25 +esp = 1000 +exp = 16 + +[Dragon] +atp = 2000 +mst = 0 +evp = 390 +hp = 16501 +dfp = 500 +ata = 286 +lck = 25 +esp = 1000 +exp = 15900 + +[SinowGold] +atp = 2100 +mst = 0 +evp = 784 +hp = 2850 +dfp = 852 +ata = 280 +lck = 38 +esp = 60 +exp = 344 + +[RagRappy] +atp = 1250 +mst = 0 +evp = 637 +hp = 1964 +dfp = 625 +ata = 200 +lck = 30 +esp = 35 +exp = 256 + +[EasterRappy] +atp = 2100 +mst = 0 +evp = 419 +hp = 2546 +dfp = 625 +ata = 240 +lck = 50 +esp = 35 +exp = 700 + +[NanoDragon] +atp = 2100 +mst = 0 +evp = 521 +hp = 2813 +dfp = 789 +ata = 250 +lck = 30 +esp = 60 +exp = 320 + +[Dubchic] +atp = 1939 +mst = 0 +evp = 651 +hp = 3111 +dfp = 726 +ata = 278 +lck = 30 +esp = 40 +exp = 59 + +[Gillchic] +atp = 1989 +mst = 0 +evp = 651 +hp = 2996 +dfp = 718 +ata = 268 +lck = 35 +esp = 40 +exp = 321 + +[Garanz] +atp = 2500 +mst = 0 +evp = 564 +hp = 3788 +dfp = 865 +ata = 258 +lck = 40 +esp = 60 +exp = 355 + +[GalGryphon] +atp = 3000 +mst = 0 +evp = 753 +hp = 2700 +dfp = 802 +ata = 340 +lck = 30 +esp = 45 +exp = 334 + +[Bulclaw] +atp = 3000 +mst = 0 +evp = 753 +hp = 2701 +dfp = 802 +ata = 365 +lck = 50 +esp = 55 +exp = 334 + +[Claw] +atp = 2850 +mst = 0 +evp = 680 +hp = 2246 +dfp = 751 +ata = 330 +lck = 30 +esp = 40 +exp = 273 + +[VolOptPartA] +atp = 0 +mst = 2000 +evp = 506 +hp = 18002 +dfp = 802 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[VolOptPillar] +atp = 2275 +mst = 2000 +evp = 530 +hp = 3901 +dfp = 1000 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[VolOptMonitor] +atp = 0 +mst = 2000 +evp = 54 +hp = 4000 +dfp = 776 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[VolOptAmp] +atp = 0 +mst = 2000 +evp = 593 +hp = 1525 +dfp = 701 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[VolOpt] +atp = 0 +mst = 1000 +evp = 724 +hp = 27000 +dfp = 902 +ata = 0 +lck = 5 +esp = 1000 +exp = 23500 + +[VolOptTrap] +atp = 0 +mst = 550 +evp = 0 +hp = 2501 +dfp = 1000 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[PofuillySlime] +atp = 1374 +mst = 0 +evp = 637 +hp = 929 +dfp = 676 +ata = 249 +lck = 30 +esp = 40 +exp = 290 + +[PanArms] +atp = 1994 +mst = 0 +evp = 622 +hp = 3600 +dfp = 1860 +ata = 219 +lck = 30 +esp = 40 +exp = 195 + +[Hidoom] +atp = 1930 +mst = 0 +evp = 680 +hp = 2625 +dfp = 638 +ata = 268 +lck = 30 +esp = 45 +exp = 180 + +[Migium] +atp = 1930 +mst = 0 +evp = 651 +hp = 2626 +dfp = 638 +ata = 268 +lck = 30 +esp = 40 +exp = 180 + +[PouillySlime] +atp = 2219 +mst = 0 +evp = 680 +hp = 2334 +dfp = 650 +ata = 280 +lck = 30 +esp = 40 +exp = 880 + +[Darvant] +atp = 1390 +mst = 0 +evp = 535 +hp = 301 +dfp = 600 +ata = 305 +lck = 0 +esp = 1000 +exp = 25 + +[DarkFalz1] +atp = 2400 +mst = 2400 +evp = 825 +hp = 20000 +dfp = 902 +ata = 470 +lck = 20 +esp = 1000 +exp = 0 + +[DarkFalz2] +atp = 2980 +mst = 2700 +evp = 825 +hp = 16502 +dfp = 902 +ata = 470 +lck = 20 +esp = 1000 +exp = 0 + +[DarkFalz3] +atp = 2560 +mst = 3000 +evp = 750 +hp = 21001 +dfp = 960 +ata = 470 +lck = 20 +esp = 1000 +exp = 50000 + +[UltDarvant] +atp = 1550 +mst = 0 +evp = 651 +hp = 600 +dfp = 625 +ata = 305 +lck = 20 +esp = 1000 +exp = 20 + +[Dubwitch] +atp = 0 +mst = 0 +evp = 0 +hp = 0 +dfp = 0 +ata = 0 +lck = 0 +esp = 0 +exp = 0 + +[Hildebear] +atp = 1850 +mst = 0 +evp = 477 +hp = 2851 +dfp = 676 +ata = 240 +lck = 45 +esp = 60 +exp = 300 + +[Hildeblue] +atp = 3600 +mst = 0 +evp = 738 +hp = 6750 +dfp = 600 +ata = 290 +lck = 60 +esp = 60 +exp = 690 + +[Booma] +atp = 1250 +mst = 0 +evp = 593 +hp = 2335 +dfp = 600 +ata = 205 +lck = 25 +esp = 17 +exp = 271 + +[Gobooma] +atp = 1350 +mst = 0 +evp = 608 +hp = 2550 +dfp = 613 +ata = 209 +lck = 25 +esp = 20 +exp = 276 + +[Gigobooma] +atp = 1450 +mst = 0 +evp = 630 +hp = 2301 +dfp = 750 +ata = 313 +lck = 35 +esp = 25 +exp = 281 + +[GrassAssassin] +atp = 1800 +mst = 0 +evp = 680 +hp = 2524 +dfp = 701 +ata = 260 +lck = 40 +esp = 60 +exp = 333 + +[EvilShark] +atp = 1550 +mst = 0 +evp = 651 +hp = 2394 +dfp = 726 +ata = 236 +lck = 30 +esp = 20 +exp = 295 + +[PalShark] +atp = 1660 +mst = 0 +evp = 666 +hp = 2499 +dfp = 726 +ata = 239 +lck = 30 +esp = 25 +exp = 303 + +[GuilShark] +atp = 1770 +mst = 0 +evp = 680 +hp = 2533 +dfp = 726 +ata = 345 +lck = 40 +esp = 25 +exp = 318 + +[Delsaber] +atp = 3333 +mst = 0 +evp = 970 +hp = 3450 +dfp = 802 +ata = 350 +lck = 30 +esp = 45 +exp = 375 + +[Dimenian] +atp = 2700 +mst = 0 +evp = 712 +hp = 3002 +dfp = 802 +ata = 285 +lck = 35 +esp = 25 +exp = 339 + +[LaDimenian] +atp = 2800 +mst = 0 +evp = 735 +hp = 3150 +dfp = 814 +ata = 300 +lck = 35 +esp = 30 +exp = 345 + +[SoDimenian] +atp = 2900 +mst = 0 +evp = 758 +hp = 3750 +dfp = 827 +ata = 415 +lck = 45 +esp = 35 +exp = 356 diff --git a/data/battle_param/ep1_multi_veryhard.toml b/data/battle_param/ep1_multi_veryhard.toml new file mode 100644 index 0000000..d3d1c56 --- /dev/null +++ b/data/battle_param/ep1_multi_veryhard.toml @@ -0,0 +1,637 @@ +[Mothmant] +atp = 753 +mst = 0 +evp = 74 +hp = 451 +dfp = 190 +ata = 210 +lck = 40 +esp = 30 +exp = 82 + +[Monest] +atp = 697 +mst = 0 +evp = 50 +hp = 1500 +dfp = 190 +ata = 135 +lck = 0 +esp = 30 +exp = 92 + +[SavageWolf] +atp = 819 +mst = 0 +evp = 307 +hp = 905 +dfp = 288 +ata = 225 +lck = 28 +esp = 35 +exp = 90 + +[BarbarousWolf] +atp = 834 +mst = 0 +evp = 344 +hp = 950 +dfp = 297 +ata = 225 +lck = 30 +esp = 35 +exp = 94 + +[PoisonLily] +atp = 812 +mst = 0 +evp = 363 +hp = 1020 +dfp = 306 +ata = 230 +lck = 18 +esp = 35 +exp = 100 + +[NarLily] +atp = 1028 +mst = 0 +evp = 363 +hp = 1137 +dfp = 314 +ata = 255 +lck = 40 +esp = 35 +exp = 380 + +[SinowBeat] +atp = 999 +mst = 0 +evp = 414 +hp = 1410 +dfp = 341 +ata = 235 +lck = 35 +esp = 50 +exp = 137 + +[Canadine] +atp = 927 +mst = 0 +evp = 380 +hp = 1002 +dfp = 306 +ata = 245 +lck = 17 +esp = 25 +exp = 11 + +[Canane] +atp = 941 +mst = 0 +evp = 380 +hp = 1208 +dfp = 306 +ata = 255 +lck = 17 +esp = 30 +exp = 114 + +[ChaosSorcerer] +atp = 1071 +mst = 256 +evp = 357 +hp = 1501 +dfp = 332 +ata = 255 +lck = 0 +esp = 60 +exp = 148 + +[BeeR] +atp = 941 +mst = 0 +evp = 146 +hp = 1107 +dfp = 218 +ata = 195 +lck = 0 +esp = 100 +exp = 88 + +[BeeL] +atp = 941 +mst = 0 +evp = 146 +hp = 1108 +dfp = 218 +ata = 195 +lck = 0 +esp = 100 +exp = 88 + +[ChaosBringer] +atp = 1200 +mst = 0 +evp = 419 +hp = 2222 +dfp = 419 +ata = 265 +lck = 17 +esp = 65 +exp = 150 + +[DarkBelra] +atp = 1229 +mst = 0 +evp = 301 +hp = 2436 +dfp = 568 +ata = 235 +lck = 28 +esp = 60 +exp = 144 + +[DeRolLe] +atp = 1800 +mst = 10 +evp = 160 +hp = 18000 +dfp = 330 +ata = 290 +lck = 5 +esp = 100 +exp = 8700 + +[DeRolLeBody] +atp = 1160 +mst = 10 +evp = 151 +hp = 3680 +dfp = 270 +ata = 270 +lck = 0 +esp = 100 +exp = 30 + +[DeRolLeMine] +atp = 700 +mst = 10 +evp = 32 +hp = 751 +dfp = 255 +ata = 170 +lck = 5 +esp = 100 +exp = 8 + +[Dragon] +atp = 1000 +mst = 0 +evp = 145 +hp = 9900 +dfp = 210 +ata = 335 +lck = 8 +esp = 100 +exp = 7980 + +[SinowGold] +atp = 970 +mst = 0 +evp = 431 +hp = 1295 +dfp = 428 +ata = 255 +lck = 0 +esp = 55 +exp = 143 + +[RagRappy] +atp = 790 +mst = 0 +evp = 335 +hp = 829 +dfp = 271 +ata = 205 +lck = 35 +esp = 30 +exp = 88 + +[EasterRappy] +atp = 913 +mst = 0 +evp = 194 +hp = 1110 +dfp = 271 +ata = 235 +lck = 17 +esp = 30 +exp = 280 + +[NanoDragon] +atp = 905 +mst = 0 +evp = 260 +hp = 1227 +dfp = 384 +ata = 235 +lck = 17 +esp = 55 +exp = 120 + +[Dubchic] +atp = 1013 +mst = 0 +evp = 344 +hp = 1111 +dfp = 341 +ata = 235 +lck = 17 +esp = 35 +exp = 22 + +[Gillchic] +atp = 1020 +mst = 0 +evp = 344 +hp = 1063 +dfp = 335 +ata = 245 +lck = 28 +esp = 35 +exp = 116 + +[Garanz] +atp = 1100 +mst = 0 +evp = 288 +hp = 2081 +dfp = 437 +ata = 235 +lck = 30 +esp = 55 +exp = 124 + +[GalGryphon] +atp = 999 +mst = 0 +evp = 410 +hp = 1274 +dfp = 393 +ata = 285 +lck = 17 +esp = 35 +exp = 120 + +[Bulclaw] +atp = 1143 +mst = 0 +evp = 363 +hp = 1228 +dfp = 358 +ata = 245 +lck = 21 +esp = 40 +exp = 128 + +[Claw] +atp = 1013 +mst = 0 +evp = 325 +hp = 1101 +dfp = 358 +ata = 150 +lck = 14 +esp = 25 +exp = 92 + +[VolOptPartA] +atp = 0 +mst = 0 +evp = 100 +hp = 10000 +dfp = 300 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptPillar] +atp = 100 +mst = 0 +evp = 200 +hp = 3001 +dfp = 330 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptMonitor] +atp = 0 +mst = 0 +evp = 85 +hp = 222 +dfp = 250 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptAmp] +atp = 0 +mst = 0 +evp = 150 +hp = 951 +dfp = 150 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOpt] +atp = 0 +mst = 0 +evp = 170 +hp = 25000 +dfp = 360 +ata = 0 +lck = 5 +esp = 100 +exp = 11100 + +[VolOptTrap] +atp = 0 +mst = 0 +evp = 0 +hp = 1003 +dfp = 200 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[PofuillySlime] +atp = 870 +mst = 0 +evp = 335 +hp = 993 +dfp = 306 +ata = 215 +lck = 17 +esp = 35 +exp = 100 + +[PanArms] +atp = 927 +mst = 0 +evp = 325 +hp = 2183 +dfp = 1128 +ata = 255 +lck = 17 +esp = 35 +exp = 52 + +[Hidoom] +atp = 913 +mst = 0 +evp = 363 +hp = 1209 +dfp = 279 +ata = 225 +lck = 30 +esp = 40 +exp = 48 + +[Migium] +atp = 956 +mst = 0 +evp = 344 +hp = 1461 +dfp = 279 +ata = 225 +lck = 30 +esp = 35 +exp = 48 + +[PouillySlime] +atp = 1128 +mst = 0 +evp = 363 +hp = 1013 +dfp = 288 +ata = 285 +lck = 30 +esp = 35 +exp = 380 + +[Darvant] +atp = 350 +mst = 0 +evp = 100 +hp = 253 +dfp = 100 +ata = 200 +lck = 0 +esp = 100 +exp = 9 + +[DarkFalz1] +atp = 1900 +mst = 300 +evp = 200 +hp = 18001 +dfp = 320 +ata = 250 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz2] +atp = 2000 +mst = 300 +evp = 200 +hp = 10001 +dfp = 320 +ata = 250 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz3] +atp = 2100 +mst = 300 +evp = 200 +hp = 16500 +dfp = 320 +ata = 250 +lck = 20 +esp = 100 +exp = 16000 + +[UltDarvant] +atp = 700 +mst = 0 +evp = 110 +hp = 503 +dfp = 100 +ata = 100 +lck = 20 +esp = 100 +exp = 9 + +[Dubwitch] +atp = 0 +mst = 0 +evp = 0 +hp = 0 +dfp = 0 +ata = 0 +lck = 0 +esp = 0 +exp = 0 + +[Hildebear] +atp = 898 +mst = 0 +evp = 231 +hp = 1344 +dfp = 306 +ata = 215 +lck = 35 +esp = 55 +exp = 111 + +[Hildeblue] +atp = 985 +mst = 0 +evp = 401 +hp = 1498 +dfp = 253 +ata = 235 +lck = 35 +esp = 55 +exp = 280 + +[Booma] +atp = 812 +mst = 0 +evp = 307 +hp = 899 +dfp = 253 +ata = 195 +lck = 28 +esp = 12 +exp = 90 + +[Gobooma] +atp = 812 +mst = 0 +evp = 307 +hp = 900 +dfp = 253 +ata = 195 +lck = 28 +esp = 15 +exp = 92 + +[Gigobooma] +atp = 826 +mst = 0 +evp = 325 +hp = 1016 +dfp = 306 +ata = 210 +lck = 17 +esp = 20 +exp = 94 + +[GrassAssassin] +atp = 913 +mst = 0 +evp = 363 +hp = 1198 +dfp = 323 +ata = 225 +lck = 35 +esp = 55 +exp = 125 + +[EvilShark] +atp = 870 +mst = 0 +evp = 344 +hp = 958 +dfp = 341 +ata = 228 +lck = 28 +esp = 15 +exp = 100 + +[PalShark] +atp = 884 +mst = 0 +evp = 354 +hp = 994 +dfp = 341 +ata = 235 +lck = 28 +esp = 20 +exp = 104 + +[GuilShark] +atp = 898 +mst = 0 +evp = 363 +hp = 1064 +dfp = 341 +ata = 245 +lck = 28 +esp = 20 +exp = 108 + +[Delsaber] +atp = 1221 +mst = 0 +evp = 551 +hp = 1871 +dfp = 393 +ata = 270 +lck = 30 +esp = 40 +exp = 150 + +[Dimenian] +atp = 1056 +mst = 0 +evp = 384 +hp = 1411 +dfp = 393 +ata = 255 +lck = 28 +esp = 20 +exp = 124 + +[LaDimenian] +atp = 1078 +mst = 0 +evp = 399 +hp = 1481 +dfp = 402 +ata = 268 +lck = 28 +esp = 25 +exp = 128 + +[SoDimenian] +atp = 1100 +mst = 0 +evp = 414 +hp = 1551 +dfp = 411 +ata = 280 +lck = 35 +esp = 30 +exp = 132 diff --git a/data/battle_param/ep1_solo_hard.toml b/data/battle_param/ep1_solo_hard.toml new file mode 100644 index 0000000..6429557 --- /dev/null +++ b/data/battle_param/ep1_solo_hard.toml @@ -0,0 +1,637 @@ +[Mothmant] +atp = 311 +mst = 0 +evp = 45 +hp = 203 +dfp = 83 +ata = 135 +lck = 40 +esp = 15 +exp = 36 + +[Monest] +atp = 0 +mst = 0 +evp = 22 +hp = 650 +dfp = 83 +ata = 60 +lck = 0 +esp = 15 +exp = 43 + +[SavageWolf] +atp = 368 +mst = 0 +evp = 91 +hp = 370 +dfp = 111 +ata = 150 +lck = 16 +esp = 20 +exp = 42 + +[BarbarousWolf] +atp = 379 +mst = 0 +evp = 97 +hp = 392 +dfp = 118 +ata = 150 +lck = 20 +esp = 20 +exp = 45 + +[PoisonLily] +atp = 362 +mst = 0 +evp = 103 +hp = 397 +dfp = 124 +ata = 155 +lck = 10 +esp = 20 +exp = 49 + +[NarLily] +atp = 535 +mst = 0 +evp = 137 +hp = 398 +dfp = 131 +ata = 180 +lck = 30 +esp = 20 +exp = 259 + +[SinowBeat] +atp = 512 +mst = 0 +evp = 137 +hp = 562 +dfp = 152 +ata = 160 +lck = 20 +esp = 30 +exp = 64 + +[Canadine] +atp = 454 +mst = 0 +evp = 137 +hp = 406 +dfp = 124 +ata = 170 +lck = 10 +esp = 15 +exp = 6 + +[Canane] +atp = 465 +mst = 0 +evp = 137 +hp = 540 +dfp = 124 +ata = 180 +lck = 10 +esp = 20 +exp = 60 + +[ChaosSorcerer] +atp = 569 +mst = 200 +evp = 126 +hp = 651 +dfp = 118 +ata = 180 +lck = 0 +esp = 32 +exp = 70 + +[BeeR] +atp = 466 +mst = 0 +evp = 108 +hp = 487 +dfp = 104 +ata = 120 +lck = 0 +esp = 100 +exp = 40 + +[BeeL] +atp = 466 +mst = 0 +evp = 108 +hp = 488 +dfp = 104 +ata = 120 +lck = 0 +esp = 100 +exp = 40 + +[ChaosBringer] +atp = 673 +mst = 0 +evp = 143 +hp = 815 +dfp = 187 +ata = 190 +lck = 10 +esp = 47 +exp = 79 + +[DarkBelra] +atp = 675 +mst = 0 +evp = 94 +hp = 870 +dfp = 221 +ata = 160 +lck = 16 +esp = 42 +exp = 76 + +[DeRolLe] +atp = 805 +mst = 10 +evp = 120 +hp = 4610 +dfp = 180 +ata = 210 +lck = 10 +esp = 100 +exp = 2500 + +[DeRolLeBody] +atp = 700 +mst = 10 +evp = 120 +hp = 1550 +dfp = 152 +ata = 210 +lck = 0 +esp = 100 +exp = 25 + +[DeRolLeMine] +atp = 370 +mst = 10 +evp = 26 +hp = 305 +dfp = 140 +ata = 110 +lck = 10 +esp = 100 +exp = 4 + +[Dragon] +atp = 430 +mst = 0 +evp = 100 +hp = 2200 +dfp = 80 +ata = 260 +lck = 16 +esp = 100 +exp = 2000 + +[SinowGold] +atp = 488 +mst = 0 +evp = 150 +hp = 518 +dfp = 152 +ata = 180 +lck = 0 +esp = 35 +exp = 64 + +[RagRappy] +atp = 345 +mst = 0 +evp = 114 +hp = 353 +dfp = 97 +ata = 130 +lck = 20 +esp = 15 +exp = 40 + +[EasterRappy] +atp = 443 +mst = 0 +evp = 28 +hp = 485 +dfp = 97 +ata = 160 +lck = 10 +esp = 15 +exp = 184 + +[NanoDragon] +atp = 437 +mst = 0 +evp = 65 +hp = 541 +dfp = 152 +ata = 160 +lck = 10 +esp = 35 +exp = 57 + +[Dubchic] +atp = 523 +mst = 0 +evp = 126 +hp = 486 +dfp = 138 +ata = 160 +lck = 10 +esp = 20 +exp = 11 + +[Gillchic] +atp = 529 +mst = 0 +evp = 126 +hp = 463 +dfp = 134 +ata = 170 +lck = 16 +esp = 20 +exp = 61 + +[Garanz] +atp = 592 +mst = 0 +evp = 70 +hp = 771 +dfp = 200 +ata = 160 +lck = 20 +esp = 35 +exp = 67 + +[GalGryphon] +atp = 512 +mst = 0 +evp = 160 +hp = 563 +dfp = 193 +ata = 210 +lck = 10 +esp = 22 +exp = 64 + +[Bulclaw] +atp = 627 +mst = 0 +evp = 137 +hp = 542 +dfp = 152 +ata = 170 +lck = 12 +esp = 27 +exp = 70 + +[Claw] +atp = 523 +mst = 0 +evp = 114 +hp = 489 +dfp = 152 +ata = 100 +lck = 8 +esp = 12 +exp = 43 + +[VolOptPartA] +atp = 0 +mst = 0 +evp = 80 +hp = 3200 +dfp = 140 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptPillar] +atp = 100 +mst = 0 +evp = 70 +hp = 502 +dfp = 100 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptMonitor] +atp = 0 +mst = 0 +evp = 55 +hp = 223 +dfp = 100 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptAmp] +atp = 0 +mst = 0 +evp = 120 +hp = 350 +dfp = 100 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOpt] +atp = 0 +mst = 0 +evp = 140 +hp = 6001 +dfp = 200 +ata = 0 +lck = 5 +esp = 100 +exp = 3000 + +[VolOptTrap] +atp = 0 +mst = 0 +evp = 0 +hp = 401 +dfp = 60 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[PofuillySlime] +atp = 408 +mst = 0 +evp = 120 +hp = 430 +dfp = 124 +ata = 140 +lck = 10 +esp = 20 +exp = 49 + +[PanArms] +atp = 454 +mst = 0 +evp = 103 +hp = 980 +dfp = 773 +ata = 180 +lck = 10 +esp = 20 +exp = 26 + +[Hidoom] +atp = 443 +mst = 0 +evp = 126 +hp = 652 +dfp = 104 +ata = 150 +lck = 28 +esp = 20 +exp = 23 + +[Migium] +atp = 477 +mst = 0 +evp = 126 +hp = 653 +dfp = 104 +ata = 150 +lck = 0 +esp = 20 +exp = 23 + +[PouillySlime] +atp = 615 +mst = 0 +evp = 137 +hp = 490 +dfp = 111 +ata = 210 +lck = 16 +esp = 20 +exp = 259 + +[Darvant] +atp = 170 +mst = 0 +evp = 90 +hp = 120 +dfp = 80 +ata = 150 +lck = 0 +esp = 100 +exp = 5 + +[DarkFalz1] +atp = 900 +mst = 300 +evp = 170 +hp = 5000 +dfp = 230 +ata = 220 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz2] +atp = 1000 +mst = 300 +evp = 170 +hp = 6002 +dfp = 230 +ata = 230 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz3] +atp = 1100 +mst = 300 +evp = 170 +hp = 4001 +dfp = 230 +ata = 230 +lck = 30 +esp = 100 +exp = 6000 + +[UltDarvant] +atp = 350 +mst = 0 +evp = 100 +hp = 240 +dfp = 100 +ata = 100 +lck = 20 +esp = 20 +exp = 5 + +[Dubwitch] +atp = 160 +mst = 0 +evp = 25 +hp = 156 +dfp = 30 +ata = 120 +lck = 10 +esp = 0 +exp = 5 + +[Hildebear] +atp = 431 +mst = 0 +evp = 47 +hp = 519 +dfp = 124 +ata = 140 +lck = 20 +esp = 35 +exp = 49 + +[Hildeblue] +atp = 500 +mst = 0 +evp = 154 +hp = 595 +dfp = 83 +ata = 160 +lck = 20 +esp = 35 +exp = 184 + +[Booma] +atp = 362 +mst = 0 +evp = 91 +hp = 386 +dfp = 83 +ata = 120 +lck = 16 +esp = 5 +exp = 42 + +[Gobooma] +atp = 368 +mst = 0 +evp = 100 +hp = 414 +dfp = 90 +ata = 125 +lck = 16 +esp = 7 +exp = 43 + +[Gigobooma] +atp = 374 +mst = 0 +evp = 108 +hp = 441 +dfp = 124 +ata = 135 +lck = 10 +esp = 10 +exp = 45 + +[GrassAssassin] +atp = 443 +mst = 0 +evp = 120 +hp = 474 +dfp = 138 +ata = 150 +lck = 20 +esp = 35 +exp = 60 + +[EvilShark] +atp = 408 +mst = 0 +evp = 120 +hp = 415 +dfp = 152 +ata = 153 +lck = 8 +esp = 7 +exp = 49 + +[PalShark] +atp = 420 +mst = 0 +evp = 126 +hp = 431 +dfp = 152 +ata = 160 +lck = 16 +esp = 10 +exp = 52 + +[GuilShark] +atp = 431 +mst = 0 +evp = 131 +hp = 464 +dfp = 152 +ata = 170 +lck = 16 +esp = 10 +exp = 55 + +[Delsaber] +atp = 627 +mst = 0 +evp = 166 +hp = 760 +dfp = 193 +ata = 195 +lck = 20 +esp = 27 +exp = 72 + +[Dimenian] +atp = 558 +mst = 0 +evp = 134 +hp = 617 +dfp = 180 +ata = 180 +lck = 16 +esp = 15 +exp = 67 + +[LaDimenian] +atp = 575 +mst = 0 +evp = 146 +hp = 654 +dfp = 187 +ata = 193 +lck = 16 +esp = 16 +exp = 70 + +[SoDimenian] +atp = 592 +mst = 0 +evp = 159 +hp = 683 +dfp = 193 +ata = 205 +lck = 20 +esp = 22 +exp = 73 diff --git a/data/battle_param/ep1_solo_normal.toml b/data/battle_param/ep1_solo_normal.toml new file mode 100644 index 0000000..6d282fa --- /dev/null +++ b/data/battle_param/ep1_solo_normal.toml @@ -0,0 +1,637 @@ +[Mothmant] +atp = 53 +mst = 0 +evp = 20 +hp = 8 +dfp = 0 +ata = 75 +lck = 20 +esp = 0 +exp = 1 + +[Monest] +atp = 0 +mst = 0 +evp = 0 +hp = 300 +dfp = 0 +ata = 0 +lck = 0 +esp = 0 +exp = 6 + +[SavageWolf] +atp = 85 +mst = 0 +evp = 60 +hp = 45 +dfp = 20 +ata = 90 +lck = 8 +esp = 5 +exp = 5 + +[BarbarousWolf] +atp = 95 +mst = 0 +evp = 65 +hp = 65 +dfp = 25 +ata = 90 +lck = 10 +esp = 5 +exp = 7 + +[PoisonLily] +atp = 80 +mst = 0 +evp = 70 +hp = 70 +dfp = 30 +ata = 95 +lck = 5 +esp = 5 +exp = 10 + +[NarLily] +atp = 230 +mst = 0 +evp = 100 +hp = 71 +dfp = 35 +ata = 120 +lck = 20 +esp = 5 +exp = 150 + +[SinowBeat] +atp = 210 +mst = 0 +evp = 100 +hp = 220 +dfp = 50 +ata = 100 +lck = 10 +esp = 15 +exp = 20 + +[Canadine] +atp = 160 +mst = 0 +evp = 100 +hp = 78 +dfp = 30 +ata = 110 +lck = 5 +esp = 0 +exp = 3 + +[Canane] +atp = 170 +mst = 0 +evp = 100 +hp = 200 +dfp = 30 +ata = 120 +lck = 5 +esp = 10 +exp = 17 + +[ChaosSorcerer] +atp = 260 +mst = 100 +evp = 90 +hp = 301 +dfp = 25 +ata = 120 +lck = 0 +esp = 20 +exp = 24 + +[BeeR] +atp = 170 +mst = 0 +evp = 80 +hp = 150 +dfp = 20 +ata = 60 +lck = 0 +esp = 100 +exp = 4 + +[BeeL] +atp = 170 +mst = 0 +evp = 80 +hp = 151 +dfp = 20 +ata = 60 +lck = 0 +esp = 100 +exp = 4 + +[ChaosBringer] +atp = 400 +mst = 0 +evp = 105 +hp = 450 +dfp = 75 +ata = 130 +lck = 5 +esp = 35 +exp = 30 + +[DarkBelra] +atp = 430 +mst = 0 +evp = 63 +hp = 500 +dfp = 100 +ata = 100 +lck = 8 +esp = 30 +exp = 28 + +[DeRolLe] +atp = 280 +mst = 10 +evp = 90 +hp = 3900 +dfp = 80 +ata = 150 +lck = 5 +esp = 100 +exp = 700 + +[DeRolLeBody] +atp = 265 +mst = 10 +evp = 90 +hp = 1000 +dfp = 60 +ata = 150 +lck = 0 +esp = 100 +exp = 10 + +[DeRolLeMine] +atp = 150 +mst = 10 +evp = 5 +hp = 130 +dfp = 50 +ata = 50 +lck = 5 +esp = 100 +exp = 3 + +[Dragon] +atp = 160 +mst = 0 +evp = 0 +hp = 1300 +dfp = 0 +ata = 200 +lck = 8 +esp = 100 +exp = 350 + +[SinowGold] +atp = 190 +mst = 0 +evp = 111 +hp = 180 +dfp = 50 +ata = 120 +lck = 0 +esp = 20 +exp = 20 + +[RagRappy] +atp = 65 +mst = 0 +evp = 80 +hp = 30 +dfp = 10 +ata = 70 +lck = 10 +esp = 0 +exp = 4 + +[EasterRappy] +atp = 150 +mst = 0 +evp = 5 +hp = 152 +dfp = 10 +ata = 100 +lck = 5 +esp = 0 +exp = 100 + +[NanoDragon] +atp = 145 +mst = 0 +evp = 37 +hp = 201 +dfp = 50 +ata = 100 +lck = 5 +esp = 15 +exp = 15 + +[Dubchic] +atp = 220 +mst = 0 +evp = 90 +hp = 153 +dfp = 40 +ata = 100 +lck = 5 +esp = 5 +exp = 3 + +[Gillchic] +atp = 225 +mst = 0 +evp = 90 +hp = 131 +dfp = 37 +ata = 110 +lck = 8 +esp = 5 +exp = 18 + +[Garanz] +atp = 280 +mst = 0 +evp = 42 +hp = 410 +dfp = 85 +ata = 100 +lck = 10 +esp = 20 +exp = 22 + +[GalGryphon] +atp = 210 +mst = 0 +evp = 120 +hp = 221 +dfp = 80 +ata = 150 +lck = 5 +esp = 10 +exp = 20 + +[Bulclaw] +atp = 310 +mst = 0 +evp = 100 +hp = 202 +dfp = 50 +ata = 110 +lck = 6 +esp = 15 +exp = 24 + +[Claw] +atp = 220 +mst = 0 +evp = 80 +hp = 154 +dfp = 50 +ata = 110 +lck = 4 +esp = 0 +exp = 6 + +[VolOptPartA] +atp = 0 +mst = 0 +evp = 50 +hp = 2100 +dfp = 70 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptPillar] +atp = 100 +mst = 0 +evp = 40 +hp = 501 +dfp = 70 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptMonitor] +atp = 0 +mst = 0 +evp = 45 +hp = 222 +dfp = 60 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptAmp] +atp = 0 +mst = 0 +evp = 70 +hp = 181 +dfp = 0 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOpt] +atp = 0 +mst = 0 +evp = 115 +hp = 4000 +dfp = 120 +ata = 0 +lck = 5 +esp = 100 +exp = 1100 + +[VolOptTrap] +atp = 0 +mst = 0 +evp = 0 +hp = 250 +dfp = 35 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[PofuillySlime] +atp = 120 +mst = 0 +evp = 85 +hp = 100 +dfp = 30 +ata = 80 +lck = 5 +esp = 5 +exp = 10 + +[PanArms] +atp = 160 +mst = 0 +evp = 70 +hp = 600 +dfp = 500 +ata = 120 +lck = 5 +esp = 5 +exp = 6 + +[Hidoom] +atp = 150 +mst = 0 +evp = 90 +hp = 302 +dfp = 15 +ata = 90 +lck = 14 +esp = 5 +exp = 4 + +[Migium] +atp = 180 +mst = 0 +evp = 90 +hp = 303 +dfp = 15 +ata = 90 +lck = 0 +esp = 5 +exp = 4 + +[PouillySlime] +atp = 300 +mst = 0 +evp = 100 +hp = 155 +dfp = 20 +ata = 150 +lck = 8 +esp = 5 +exp = 150 + +[Darvant] +atp = 65 +mst = 0 +evp = 50 +hp = 50 +dfp = 0 +ata = 0 +lck = 0 +esp = 100 +exp = 5 + +[DarkFalz1] +atp = 600 +mst = 300 +evp = 150 +hp = 2500 +dfp = 120 +ata = 170 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz2] +atp = 650 +mst = 300 +evp = 150 +hp = 3500 +dfp = 120 +ata = 170 +lck = 20 +esp = 100 +exp = 2400 + +[DarkFalz3] +atp = 700 +mst = 0 +evp = 100 +hp = 6000 +dfp = 120 +ata = 170 +lck = 20 +esp = 100 +exp = 0 + +[UltDarvant] +atp = 180 +mst = 0 +evp = 90 +hp = 101 +dfp = 10 +ata = 100 +lck = 20 +esp = 10 +exp = 5 + +[Dubwitch] +atp = 0 +mst = 0 +evp = 0 +hp = 0 +dfp = 0 +ata = 0 +lck = 0 +esp = 0 +exp = 0 + +[Hildebear] +atp = 140 +mst = 0 +evp = 22 +hp = 182 +dfp = 30 +ata = 80 +lck = 10 +esp = 20 +exp = 10 + +[Hildeblue] +atp = 200 +mst = 0 +evp = 115 +hp = 251 +dfp = 0 +ata = 100 +lck = 10 +esp = 20 +exp = 100 + +[Booma] +atp = 80 +mst = 0 +evp = 60 +hp = 60 +dfp = 0 +ata = 60 +lck = 8 +esp = 0 +exp = 5 + +[Gobooma] +atp = 85 +mst = 0 +evp = 68 +hp = 85 +dfp = 5 +ata = 65 +lck = 8 +esp = 0 +exp = 6 + +[Gigobooma] +atp = 90 +mst = 0 +evp = 75 +hp = 110 +dfp = 30 +ata = 75 +lck = 5 +esp = 0 +exp = 7 + +[GrassAssassin] +atp = 150 +mst = 0 +evp = 85 +hp = 140 +dfp = 40 +ata = 90 +lck = 10 +esp = 20 +exp = 17 + +[EvilShark] +atp = 120 +mst = 0 +evp = 85 +hp = 86 +dfp = 50 +ata = 93 +lck = 8 +esp = 0 +exp = 10 + +[PalShark] +atp = 130 +mst = 0 +evp = 90 +hp = 102 +dfp = 50 +ata = 100 +lck = 8 +esp = 0 +exp = 12 + +[GuilShark] +atp = 140 +mst = 0 +evp = 95 +hp = 132 +dfp = 50 +ata = 110 +lck = 8 +esp = 0 +exp = 14 + +[Delsaber] +atp = 340 +mst = 0 +evp = 125 +hp = 400 +dfp = 80 +ata = 135 +lck = 10 +esp = 15 +exp = 25 + +[Dimenian] +atp = 280 +mst = 0 +evp = 97 +hp = 270 +dfp = 70 +ata = 115 +lck = 8 +esp = 10 +exp = 22 + +[LaDimenian] +atp = 310 +mst = 0 +evp = 108 +hp = 304 +dfp = 75 +ata = 120 +lck = 8 +esp = 10 +exp = 24 + +[SoDimenian] +atp = 340 +mst = 0 +evp = 119 +hp = 330 +dfp = 80 +ata = 140 +lck = 10 +esp = 10 +exp = 26 diff --git a/data/battle_param/ep1_solo_ultimate.toml b/data/battle_param/ep1_solo_ultimate.toml new file mode 100644 index 0000000..8ad9553 --- /dev/null +++ b/data/battle_param/ep1_solo_ultimate.toml @@ -0,0 +1,637 @@ +[Mothmant] +atp = 800 +mst = 0 +evp = 316 +hp = 950 +dfp = 451 +ata = 230 +lck = 35 +esp = 30 +exp = 140 + +[Monest] +atp = 0 +mst = 0 +evp = 262 +hp = 1931 +dfp = 451 +ata = 210 +lck = 0 +esp = 30 +exp = 264 + +[SavageWolf] +atp = 990 +mst = 0 +evp = 424 +hp = 1533 +dfp = 500 +ata = 205 +lck = 40 +esp = 30 +exp = 260 + +[BarbarousWolf] +atp = 1280 +mst = 0 +evp = 424 +hp = 1534 +dfp = 500 +ata = 208 +lck = 50 +esp = 35 +exp = 268 + +[PoisonLily] +atp = 1250 +mst = 0 +evp = 451 +hp = 1372 +dfp = 525 +ata = 253 +lck = 30 +esp = 35 +exp = 280 + +[NarLily] +atp = 1950 +mst = 1300 +evp = 532 +hp = 2572 +dfp = 537 +ata = 330 +lck = 50 +esp = 35 +exp = 840 + +[SinowBeat] +atp = 2120 +mst = 0 +evp = 532 +hp = 2225 +dfp = 574 +ata = 275 +lck = 30 +esp = 45 +exp = 320 + +[Canadine] +atp = 1500 +mst = 0 +evp = 532 +hp = 1682 +dfp = 525 +ata = 270 +lck = 20 +esp = 25 +exp = 31 + +[Canane] +atp = 1600 +mst = 0 +evp = 532 +hp = 1675 +dfp = 525 +ata = 270 +lck = 20 +esp = 30 +exp = 308 + +[ChaosSorcerer] +atp = 1529 +mst = 1600 +evp = 505 +hp = 1731 +dfp = 512 +ata = 365 +lck = 0 +esp = 45 +exp = 336 + +[BeeR] +atp = 1427 +mst = 0 +evp = 478 +hp = 1097 +dfp = 500 +ata = 335 +lck = 0 +esp = 100 +exp = 100 + +[BeeL] +atp = 1427 +mst = 0 +evp = 478 +hp = 1098 +dfp = 500 +ata = 335 +lck = 0 +esp = 100 +exp = 100 + +[ChaosBringer] +atp = 2770 +mst = 0 +evp = 546 +hp = 2700 +dfp = 635 +ata = 363 +lck = 40 +esp = 60 +exp = 360 + +[DarkBelra] +atp = 2500 +mst = 0 +evp = 432 +hp = 2800 +dfp = 696 +ata = 310 +lck = 50 +esp = 55 +exp = 352 + +[DeRolLe] +atp = 2100 +mst = 10 +evp = 535 +hp = 12000 +dfp = 840 +ata = 345 +lck = 25 +esp = 1000 +exp = 14500 + +[DeRolLeBody] +atp = 2000 +mst = 10 +evp = 505 +hp = 4500 +dfp = 598 +ata = 320 +lck = 0 +esp = 1000 +exp = 60 + +[DeRolLeMine] +atp = 1800 +mst = 10 +evp = 276 +hp = 505 +dfp = 574 +ata = 325 +lck = 25 +esp = 1000 +exp = 16 + +[Dragon] +atp = 1500 +mst = 0 +evp = 262 +hp = 9500 +dfp = 451 +ata = 266 +lck = 25 +esp = 1000 +exp = 12100 + +[SinowGold] +atp = 2000 +mst = 0 +evp = 562 +hp = 1900 +dfp = 574 +ata = 275 +lck = 35 +esp = 50 +exp = 320 + +[RagRappy] +atp = 1000 +mst = 0 +evp = 478 +hp = 1309 +dfp = 476 +ata = 197 +lck = 30 +esp = 30 +exp = 256 + +[EasterRappy] +atp = 1800 +mst = 0 +evp = 276 +hp = 1697 +dfp = 476 +ata = 240 +lck = 50 +esp = 30 +exp = 640 + +[NanoDragon] +atp = 1500 +mst = 0 +evp = 362 +hp = 1875 +dfp = 574 +ata = 245 +lck = 30 +esp = 50 +exp = 300 + +[Dubchic] +atp = 1590 +mst = 0 +evp = 505 +hp = 2074 +dfp = 549 +ata = 265 +lck = 30 +esp = 35 +exp = 50 + +[Gillchic] +atp = 1640 +mst = 0 +evp = 505 +hp = 1997 +dfp = 542 +ata = 265 +lck = 35 +esp = 35 +exp = 312 + +[Garanz] +atp = 2250 +mst = 0 +evp = 375 +hp = 2525 +dfp = 659 +ata = 255 +lck = 40 +esp = 50 +exp = 328 + +[GalGryphon] +atp = 2670 +mst = 0 +evp = 586 +hp = 1800 +dfp = 647 +ata = 335 +lck = 30 +esp = 35 +exp = 320 + +[Bulclaw] +atp = 2500 +mst = 0 +evp = 532 +hp = 2000 +dfp = 574 +ata = 355 +lck = 50 +esp = 40 +exp = 336 + +[Claw] +atp = 2240 +mst = 0 +evp = 478 +hp = 1497 +dfp = 574 +ata = 325 +lck = 30 +esp = 25 +exp = 264 + +[VolOptPartA] +atp = 0 +mst = 1000 +evp = 370 +hp = 12001 +dfp = 623 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[VolOptPillar] +atp = 1800 +mst = 1000 +evp = 262 +hp = 2701 +dfp = 451 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[VolOptMonitor] +atp = 0 +mst = 1300 +evp = 384 +hp = 2501 +dfp = 598 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[VolOptAmp] +atp = 0 +mst = 0 +evp = 451 +hp = 1002 +dfp = 451 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[VolOpt] +atp = 0 +mst = 0 +evp = 573 +hp = 16000 +dfp = 745 +ata = 0 +lck = 5 +esp = 1000 +exp = 16300 + +[VolOptTrap] +atp = 0 +mst = 0 +evp = 0 +hp = 1003 +dfp = 500 +ata = 0 +lck = 0 +esp = 1000 +exp = 0 + +[PofuillySlime] +atp = 1216 +mst = 0 +evp = 492 +hp = 619 +dfp = 525 +ata = 243 +lck = 30 +esp = 35 +exp = 280 + +[PanArms] +atp = 1694 +mst = 0 +evp = 451 +hp = 2400 +dfp = 1676 +ata = 216 +lck = 30 +esp = 35 +exp = 184 + +[Hidoom] +atp = 1720 +mst = 0 +evp = 505 +hp = 1750 +dfp = 488 +ata = 264 +lck = 30 +esp = 40 +exp = 176 + +[Migium] +atp = 1720 +mst = 0 +evp = 505 +hp = 1751 +dfp = 488 +ata = 264 +lck = 30 +esp = 35 +exp = 176 + +[PouillySlime] +atp = 2111 +mst = 0 +evp = 532 +hp = 1556 +dfp = 500 +ata = 280 +lck = 30 +esp = 35 +exp = 840 + +[Darvant] +atp = 990 +mst = 0 +evp = 397 +hp = 252 +dfp = 451 +ata = 300 +lck = 0 +esp = 1000 +exp = 20 + +[DarkFalz1] +atp = 2100 +mst = 2000 +evp = 600 +hp = 10000 +dfp = 745 +ata = 470 +lck = 20 +esp = 1000 +exp = 0 + +[DarkFalz2] +atp = 2700 +mst = 2250 +evp = 600 +hp = 8900 +dfp = 745 +ata = 470 +lck = 20 +esp = 1000 +exp = 0 + +[DarkFalz3] +atp = 2230 +mst = 2500 +evp = 720 +hp = 10001 +dfp = 960 +ata = 470 +lck = 20 +esp = 1000 +exp = 39000 + +[UltDarvant] +atp = 770 +mst = 0 +evp = 505 +hp = 506 +dfp = 476 +ata = 300 +lck = 20 +esp = 1000 +exp = 20 + +[Dubwitch] +atp = 160 +mst = 0 +evp = 25 +hp = 158 +dfp = 30 +ata = 120 +lck = 10 +esp = 0 +exp = 5 + +[Hildebear] +atp = 1450 +mst = 0 +evp = 321 +hp = 1901 +dfp = 525 +ata = 235 +lck = 45 +esp = 50 +exp = 280 + +[Hildeblue] +atp = 2000 +mst = 0 +evp = 573 +hp = 4501 +dfp = 451 +ata = 290 +lck = 60 +esp = 50 +exp = 640 + +[Booma] +atp = 1050 +mst = 0 +evp = 424 +hp = 1557 +dfp = 451 +ata = 202 +lck = 25 +esp = 12 +exp = 260 + +[Gobooma] +atp = 1150 +mst = 0 +evp = 446 +hp = 1700 +dfp = 463 +ata = 206 +lck = 25 +esp = 15 +exp = 264 + +[Gigobooma] +atp = 1250 +mst = 0 +evp = 465 +hp = 1535 +dfp = 525 +ata = 310 +lck = 35 +esp = 20 +exp = 268 + +[GrassAssassin] +atp = 1555 +mst = 0 +evp = 492 +hp = 1683 +dfp = 549 +ata = 255 +lck = 40 +esp = 50 +exp = 308 + +[EvilShark] +atp = 1300 +mst = 0 +evp = 492 +hp = 1596 +dfp = 574 +ata = 233 +lck = 30 +esp = 15 +exp = 280 + +[PalShark] +atp = 1370 +mst = 0 +evp = 505 +hp = 1619 +dfp = 574 +ata = 236 +lck = 30 +esp = 20 +exp = 288 + +[GuilShark] +atp = 1420 +mst = 0 +evp = 519 +hp = 1666 +dfp = 574 +ata = 342 +lck = 40 +esp = 20 +exp = 296 + +[Delsaber] +atp = 2800 +mst = 0 +evp = 600 +hp = 2300 +dfp = 647 +ata = 340 +lck = 30 +esp = 40 +exp = 340 + +[Dimenian] +atp = 1800 +mst = 0 +evp = 524 +hp = 2001 +dfp = 623 +ata = 275 +lck = 35 +esp = 20 +exp = 328 + +[LaDimenian] +atp = 1890 +mst = 0 +evp = 554 +hp = 2101 +dfp = 635 +ata = 290 +lck = 35 +esp = 25 +exp = 336 + +[SoDimenian] +atp = 1960 +mst = 0 +evp = 583 +hp = 2502 +dfp = 647 +ata = 405 +lck = 45 +esp = 30 +exp = 344 diff --git a/data/battle_param/ep1_solo_veryhard.toml b/data/battle_param/ep1_solo_veryhard.toml new file mode 100644 index 0000000..b5ce624 --- /dev/null +++ b/data/battle_param/ep1_solo_veryhard.toml @@ -0,0 +1,637 @@ +[Mothmant] +atp = 550 +mst = 0 +evp = 78 +hp = 480 +dfp = 193 +ata = 210 +lck = 40 +esp = 30 +exp = 82 + +[Monest] +atp = 0 +mst = 0 +evp = 47 +hp = 1025 +dfp = 193 +ata = 135 +lck = 0 +esp = 30 +exp = 92 + +[SavageWolf] +atp = 636 +mst = 0 +evp = 140 +hp = 706 +dfp = 228 +ata = 225 +lck = 28 +esp = 30 +exp = 90 + +[BarbarousWolf] +atp = 699 +mst = 0 +evp = 148 +hp = 731 +dfp = 237 +ata = 225 +lck = 30 +esp = 35 +exp = 94 + +[PoisonLily] +atp = 650 +mst = 0 +evp = 156 +hp = 738 +dfp = 246 +ata = 230 +lck = 18 +esp = 35 +exp = 100 + +[NarLily] +atp = 868 +mst = 0 +evp = 202 +hp = 739 +dfp = 254 +ata = 255 +lck = 40 +esp = 35 +exp = 380 + +[SinowBeat] +atp = 801 +mst = 0 +evp = 202 +hp = 740 +dfp = 254 +ata = 255 +lck = 35 +esp = 45 +exp = 120 + +[Canadine] +atp = 750 +mst = 0 +evp = 202 +hp = 826 +dfp = 246 +ata = 245 +lck = 17 +esp = 25 +exp = 11 + +[Canane] +atp = 763 +mst = 0 +evp = 202 +hp = 900 +dfp = 246 +ata = 255 +lck = 17 +esp = 30 +exp = 114 + +[ChaosSorcerer] +atp = 755 +mst = 300 +evp = 187 +hp = 1026 +dfp = 237 +ata = 255 +lck = 0 +esp = 45 +exp = 128 + +[BeeR] +atp = 793 +mst = 0 +evp = 146 +hp = 838 +dfp = 218 +ata = 195 +lck = 0 +esp = 100 +exp = 88 + +[BeeL] +atp = 793 +mst = 0 +evp = 146 +hp = 839 +dfp = 218 +ata = 195 +lck = 0 +esp = 100 +exp = 88 + +[ChaosBringer] +atp = 1000 +mst = 0 +evp = 210 +hp = 1213 +dfp = 324 +ata = 265 +lck = 17 +esp = 60 +exp = 140 + +[DarkBelra] +atp = 953 +mst = 0 +evp = 145 +hp = 1275 +dfp = 368 +ata = 235 +lck = 28 +esp = 55 +exp = 136 + +[DeRolLe] +atp = 1300 +mst = 10 +evp = 151 +hp = 9000 +dfp = 300 +ata = 270 +lck = 5 +esp = 100 +exp = 6300 + +[DeRolLeBody] +atp = 1055 +mst = 10 +evp = 151 +hp = 3680 +dfp = 270 +ata = 270 +lck = 0 +esp = 100 +exp = 60 + +[DeRolLeMine] +atp = 550 +mst = 10 +evp = 32 +hp = 503 +dfp = 255 +ata = 170 +lck = 5 +esp = 100 +exp = 60 + +[Dragon] +atp = 780 +mst = 0 +evp = 130 +hp = 4200 +dfp = 193 +ata = 335 +lck = 8 +esp = 100 +exp = 5000 + +[SinowGold] +atp = 787 +mst = 0 +evp = 219 +hp = 1001 +dfp = 281 +ata = 255 +lck = 0 +esp = 50 +exp = 120 + +[RagRappy] +atp = 590 +mst = 0 +evp = 171 +hp = 688 +dfp = 211 +ata = 205 +lck = 35 +esp = 30 +exp = 88 + +[EasterRappy] +atp = 707 +mst = 0 +evp = 55 +hp = 840 +dfp = 211 +ata = 235 +lck = 17 +esp = 30 +exp = 280 + +[NanoDragon] +atp = 721 +mst = 0 +evp = 104 +hp = 901 +dfp = 281 +ata = 235 +lck = 17 +esp = 50 +exp = 110 + +[Dubchic] +atp = 785 +mst = 0 +evp = 187 +hp = 841 +dfp = 263 +ata = 235 +lck = 17 +esp = 35 +exp = 22 + +[Gillchic] +atp = 812 +mst = 0 +evp = 187 +hp = 813 +dfp = 258 +ata = 245 +lck = 28 +esp = 35 +exp = 116 + +[Garanz] +atp = 950 +mst = 0 +evp = 112 +hp = 1500 +dfp = 342 +ata = 235 +lck = 30 +esp = 50 +exp = 124 + +[GalGryphon] +atp = 753 +mst = 0 +evp = 233 +hp = 925 +dfp = 333 +ata = 285 +lck = 17 +esp = 35 +exp = 120 + +[Bulclaw] +atp = 888 +mst = 0 +evp = 202 +hp = 902 +dfp = 281 +ata = 245 +lck = 21 +esp = 40 +exp = 128 + +[Claw] +atp = 775 +mst = 0 +evp = 171 +hp = 842 +dfp = 281 +ata = 150 +lck = 14 +esp = 25 +exp = 92 + +[VolOptPartA] +atp = 0 +mst = 0 +evp = 100 +hp = 5500 +dfp = 250 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptPillar] +atp = 100 +mst = 0 +evp = 100 +hp = 700 +dfp = 250 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptMonitor] +atp = 0 +mst = 0 +evp = 85 +hp = 224 +dfp = 150 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOptAmp] +atp = 0 +mst = 0 +evp = 150 +hp = 504 +dfp = 150 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[VolOpt] +atp = 0 +mst = 0 +evp = 170 +hp = 7700 +dfp = 280 +ata = 0 +lck = 5 +esp = 100 +exp = 7700 + +[VolOptTrap] +atp = 0 +mst = 0 +evp = 0 +hp = 655 +dfp = 80 +ata = 0 +lck = 0 +esp = 100 +exp = 0 + +[PofuillySlime] +atp = 700 +mst = 0 +evp = 179 +hp = 775 +dfp = 246 +ata = 215 +lck = 17 +esp = 35 +exp = 100 + +[PanArms] +atp = 720 +mst = 0 +evp = 156 +hp = 1400 +dfp = 1068 +ata = 255 +lck = 17 +esp = 35 +exp = 52 + +[Hidoom] +atp = 718 +mst = 0 +evp = 187 +hp = 1027 +dfp = 219 +ata = 225 +lck = 30 +esp = 40 +exp = 48 + +[Migium] +atp = 805 +mst = 0 +evp = 187 +hp = 1028 +dfp = 219 +ata = 225 +lck = 30 +esp = 35 +exp = 48 + +[PouillySlime] +atp = 900 +mst = 0 +evp = 202 +hp = 725 +dfp = 228 +ata = 285 +lck = 30 +esp = 35 +exp = 380 + +[Darvant] +atp = 300 +mst = 0 +evp = 90 +hp = 183 +dfp = 80 +ata = 200 +lck = 0 +esp = 100 +exp = 9 + +[DarkFalz1] +atp = 1600 +mst = 300 +evp = 200 +hp = 8800 +dfp = 320 +ata = 240 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz2] +atp = 1700 +mst = 300 +evp = 200 +hp = 7000 +dfp = 320 +ata = 250 +lck = 20 +esp = 100 +exp = 0 + +[DarkFalz3] +atp = 1800 +mst = 300 +evp = 200 +hp = 8300 +dfp = 320 +ata = 250 +lck = 20 +esp = 100 +exp = 12000 + +[UltDarvant] +atp = 550 +mst = 0 +evp = 110 +hp = 360 +dfp = 100 +ata = 100 +lck = 20 +esp = 30 +exp = 9 + +[Dubwitch] +atp = 160 +mst = 0 +evp = 25 +hp = 157 +dfp = 30 +ata = 120 +lck = 10 +esp = 0 +exp = 5 + +[Hildebear] +atp = 725 +mst = 0 +evp = 81 +hp = 875 +dfp = 246 +ata = 215 +lck = 35 +esp = 50 +exp = 100 + +[Hildeblue] +atp = 800 +mst = 0 +evp = 225 +hp = 962 +dfp = 193 +ata = 235 +lck = 35 +esp = 50 +exp = 280 + +[Booma] +atp = 610 +mst = 0 +evp = 140 +hp = 726 +dfp = 193 +ata = 195 +lck = 28 +esp = 12 +exp = 90 + +[Gobooma] +atp = 663 +mst = 0 +evp = 163 +hp = 788 +dfp = 246 +ata = 210 +lck = 28 +esp = 15 +exp = 92 + +[Gigobooma] +atp = 663 +mst = 0 +evp = 163 +hp = 789 +dfp = 246 +ata = 210 +lck = 17 +esp = 20 +exp = 94 + +[GrassAssassin] +atp = 738 +mst = 0 +evp = 179 +hp = 827 +dfp = 263 +ata = 225 +lck = 35 +esp = 50 +exp = 114 + +[EvilShark] +atp = 690 +mst = 0 +evp = 179 +hp = 757 +dfp = 281 +ata = 228 +lck = 28 +esp = 15 +exp = 100 + +[PalShark] +atp = 713 +mst = 0 +evp = 187 +hp = 776 +dfp = 281 +ata = 235 +lck = 28 +esp = 20 +exp = 104 + +[GuilShark] +atp = 735 +mst = 0 +evp = 194 +hp = 814 +dfp = 281 +ata = 245 +lck = 28 +esp = 20 +exp = 108 + +[Delsaber] +atp = 918 +mst = 0 +evp = 241 +hp = 1150 +dfp = 333 +ata = 270 +lck = 30 +esp = 40 +exp = 130 + +[Dimenian] +atp = 823 +mst = 0 +evp = 197 +hp = 988 +dfp = 316 +ata = 255 +lck = 28 +esp = 20 +exp = 124 + +[LaDimenian] +atp = 851 +mst = 0 +evp = 214 +hp = 1029 +dfp = 324 +ata = 268 +lck = 28 +esp = 25 +exp = 128 + +[SoDimenian] +atp = 880 +mst = 0 +evp = 231 +hp = 1063 +dfp = 333 +ata = 280 +lck = 35 +esp = 30 +exp = 132 diff --git a/src/common/leveltable.rs b/src/common/leveltable.rs index 997b83e..9d9f4c0 100644 --- a/src/common/leveltable.rs +++ b/src/common/leveltable.rs @@ -76,6 +76,20 @@ impl CharacterLevelTable { } } + pub fn get_level_from_exp(&self, ch_class: CharacterClass, exp: u32) -> u32 { + if let Some(statlist) = self.table.get(&ch_class) { + statlist + .iter() + .filter(|stat| { + stat.exp <= exp + }) + .count() as u32 + } + else { + 0 + } + } + pub fn get_stats_from_exp(&self, ch_class: CharacterClass, exp: u32) -> (u32, CharacterStats) { if let Some(statlist) = self.table.get(&ch_class) { statlist @@ -110,4 +124,12 @@ mod test { assert!(table.get_stats_from_exp(CharacterClass::FOmarl, 0) == (1, CharacterStats { hp: 20, atp: 13, mst: 53, evp: 35, dfp: 10, ata: 15, lck: 10 })); assert!(table.get_stats_from_exp(CharacterClass::FOmarl, 1 << 17) == (36, CharacterStats { hp: 125, atp: 114, mst: 219, evp: 182, dfp: 42, ata: 213, lck: 10 })); } + + #[test] + fn test_levels() { + let table = CharacterLevelTable::new(); + assert!(table.get_level_from_exp(CharacterClass::FOmarl, 0) == 1); + assert!(table.get_level_from_exp(CharacterClass::FOmarl, 3000) == 8); + assert!(table.get_level_from_exp(CharacterClass::FOmarl, 3200) == 9); + } } diff --git a/src/ship/character.rs b/src/ship/character.rs index 2d79e8c..b87fb1d 100644 --- a/src/ship/character.rs +++ b/src/ship/character.rs @@ -3,7 +3,6 @@ use crate::common::leveltable::CharacterStats; use crate::entity::character::CharacterEntity; use crate::ship::items::CharacterInventory; -// TODO: exp pub struct CharacterBytesBuilder<'a> { character: Option<&'a CharacterEntity>, stats: Option<&'a CharacterStats>, @@ -70,6 +69,7 @@ impl<'a> CharacterBytesBuilder<'a> { config: character.config.as_bytes(), techniques: character.techs.as_bytes(), meseta: character.meseta, + exp: character.exp, ..character::Character::default() } } diff --git a/src/ship/map.rs b/src/ship/map.rs index 34bc1fd..7bdc779 100644 --- a/src/ship/map.rs +++ b/src/ship/map.rs @@ -111,7 +111,7 @@ impl MapEnemy { (RawMapEnemy {id: 130, ..}, _) => MonsterType::SinowGold, (RawMapEnemy {id: 131, ..}, _) => MonsterType::Canadine, (RawMapEnemy {id: 132, ..}, _) => MonsterType::Canane, - (RawMapEnemy {id: 133, ..}, _) => MonsterType::DubchicSwitch, + (RawMapEnemy {id: 133, ..}, _) => MonsterType::Dubwitch, (RawMapEnemy {id: 160, ..}, _) => MonsterType::Delsaber, (RawMapEnemy {id: 161, ..}, _) => MonsterType::ChaosSorcerer, (RawMapEnemy {id: 162, ..}, _) => MonsterType::DarkGunner, diff --git a/src/ship/monster.rs b/src/ship/monster.rs index a474d01..95af791 100644 --- a/src/ship/monster.rs +++ b/src/ship/monster.rs @@ -1,5 +1,10 @@ #![allow(dead_code)] +use std::collections::HashMap; +use std::fs::File; +use std::io::Read; +use std::path::PathBuf; use serde::{Serialize, Deserialize}; +use crate::ship::room::{Difficulty, Episode, RoomMode}; #[derive(Debug)] @@ -47,7 +52,7 @@ pub enum MonsterType { Canadine, RingCanadine, Canane, - DubchicSwitch, + Dubwitch, Delsaber, ChaosSorcerer, BeeR, @@ -74,6 +79,7 @@ pub enum MonsterType { VolOptCore, VolOptUnused, VolOpt, + VolOptTrap, DarkFalz, DarkFalz1, DarkFalz2, @@ -123,3 +129,41 @@ pub enum MonsterType { SaintMillion, Shambertin, } + + +#[derive(serde::Deserialize, Debug)] +pub struct MonsterStats { + pub atp: u16, + pub mst: u16, + pub evp: u16, + pub hp: u16, + pub dfp: u16, + pub ata: u16, + pub lck: u16, + pub esp: u16, + pub exp: u32, +} + +fn load_battle_param(filename: &str) -> HashMap { + let mut path = PathBuf::from("data/battle_param/"); + path.push(filename); + + let mut f = File::open(path).unwrap(); + let mut s = String::new(); + f.read_to_string(&mut s).unwrap(); + toml::from_str::>(s.as_str()).unwrap() + .into_iter() + .map(|(monster_name, stats)| { + (monster_name.parse().unwrap(), stats) + }).collect() +} + +pub fn load_monster_stats_table(mode: &RoomMode) -> HashMap { + match mode { + RoomMode::Multi {episode: Episode::One, difficulty: Difficulty::Normal} => load_battle_param("ep1_multi_normal.toml"), + RoomMode::Multi {episode: Episode::One, difficulty: Difficulty::Hard} => load_battle_param("ep1_multi_hard.toml"), + RoomMode::Multi {episode: Episode::One, difficulty: Difficulty::VeryHard} => load_battle_param("ep1_multi_veryhard.toml"), + RoomMode::Multi {episode: Episode::One, difficulty: Difficulty::Ultimate} => load_battle_param("ep1_multi_ultimate.toml"), + _ => panic!(), + } +} diff --git a/src/ship/packet/builder/message.rs b/src/ship/packet/builder/message.rs index 30202a7..14ca50f 100644 --- a/src/ship/packet/builder/message.rs +++ b/src/ship/packet/builder/message.rs @@ -1,4 +1,5 @@ use libpso::packet::messages::*; +use crate::common::leveltable::CharacterStats; use crate::ship::ship::{ShipError}; use crate::ship::items::{FloorItem}; use crate::ship::location::AreaClient; @@ -63,3 +64,25 @@ pub fn drop_split_stack(area_client: AreaClient, item: &FloorItem) -> Result GiveCharacterExp { + GiveCharacterExp { + client: area_client.local_client.id(), + target: 0, + exp: exp, + } +} + +pub fn character_leveled_up(area_client: AreaClient, level: u32, before_stats: CharacterStats, after_stats: CharacterStats) -> PlayerLevelUp { + PlayerLevelUp { + client: area_client.local_client.id(), + target: 0, + atp: after_stats.atp - before_stats.atp, + mst: after_stats.mst - before_stats.mst, + evp: after_stats.evp - before_stats.evp, + hp: after_stats. hp - before_stats. hp, + dfp: after_stats.dfp - before_stats.dfp, + ata: after_stats.ata - before_stats.ata, + lvl: level, + } +} diff --git a/src/ship/packet/handler/message.rs b/src/ship/packet/handler/message.rs index 52f22e2..1e21884 100644 --- a/src/ship/packet/handler/message.rs +++ b/src/ship/packet/handler/message.rs @@ -1,28 +1,66 @@ -use log::warn; use libpso::packet::ship::*; use libpso::packet::messages::*; use crate::entity::gateway::EntityGateway; use crate::common::serverstate::ClientId; +use crate::common::leveltable::CharacterLevelTable; use crate::ship::ship::{SendShipPacket, ShipError, Rooms, Clients, ItemDropLocation}; -use crate::ship::location::{ClientLocation, ClientLocationError, RoomLobby}; +use crate::ship::location::{ClientLocation, ClientLocationError}; use crate::ship::map::{MapArea}; use crate::ship::items::{ItemManager, ClientItemId}; use crate::ship::packet::builder; -pub fn request_exp(id: ClientId, - request_exp: &RequestExp, - client_location: &ClientLocation, - rooms: &Rooms) - -> Box + Send> { - - match client_location.get_area(id).unwrap() { - RoomLobby::Room(room) => { - let r = rooms[room.0].as_ref().unwrap(); - warn!("killed a {:?}", r.maps.enemy_by_id(request_exp.enemy_id as usize).unwrap().monster); - }, - _ => {} +pub async fn request_exp(id: ClientId, + request_exp: &RequestExp, + entity_gateway: &mut EG, + client_location: &ClientLocation, + clients: &mut Clients, + rooms: &mut Rooms, + level_table: &CharacterLevelTable) + -> Result + Send>, ShipError> { + let client = clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?; + let area_client = client_location.get_local_client(id).map_err(|err| -> ClientLocationError { err.into() })?; + let room_id = client_location.get_room(id).map_err(|err| -> ClientLocationError { err.into() })?; + let room = rooms.get_mut(room_id.0) + .ok_or_else(|| ShipError::InvalidRoom(room_id.0 as u32))? + .as_mut() + .ok_or_else(|| ShipError::InvalidRoom(room_id.0 as u32))?; + + let monster = room.maps.enemy_by_id(request_exp.enemy_id as usize)?; + let monster_stats = room.monster_stats.get(&monster.monster).unwrap(); + + let exp_gain = if request_exp.last_hitter == 1 { + monster_stats.exp + } + else { + ((monster_stats.exp as f32) * 0.8) as u32 }; - Box::new(None.into_iter()) + + let clients_in_area = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?; + let gain_exp_pkt = builder::message::character_gained_exp(area_client, exp_gain); + let mut exp_pkts: Box + Send> = Box::new(clients_in_area.clone().into_iter() + .map(move |c| { + (c.client, SendShipPacket::Message(Message::new(GameMessage::GiveCharacterExp(gain_exp_pkt.clone())))) + })); + + let before_level = level_table.get_level_from_exp(client.character.char_class, client.character.exp); + let after_level = level_table.get_level_from_exp(client.character.char_class, client.character.exp + exp_gain); + let level_up = before_level != after_level; + + if level_up { + let (_, before_stats) = level_table.get_stats_from_exp(client.character.char_class, client.character.exp); + let (after_level, after_stats) = level_table.get_stats_from_exp(client.character.char_class, client.character.exp + exp_gain); + + let level_up_pkt = builder::message::character_leveled_up(area_client, after_level, before_stats, after_stats); + exp_pkts = Box::new(exp_pkts.chain(clients_in_area.into_iter() + .map(move |c| { + (c.client, SendShipPacket::Message(Message::new(GameMessage::PlayerLevelUp(level_up_pkt.clone())))) + }))) + } + + client.character.exp += exp_gain; + entity_gateway.save_character(&client.character).await; + + Ok(exp_pkts) } pub async fn player_drop_item(id: ClientId, diff --git a/src/ship/room.rs b/src/ship/room.rs index 25d3fa3..ee6909f 100644 --- a/src/ship/room.rs +++ b/src/ship/room.rs @@ -1,9 +1,11 @@ +use std::collections::HashMap; use std::convert::{From, Into, TryFrom, TryInto}; use rand::Rng; use crate::ship::map::Maps; use crate::ship::drops::DropTable; use crate::entity::character::SectionID; +use crate::ship::monster::{load_monster_stats_table, MonsterType, MonsterStats}; #[derive(Debug)] pub enum RoomCreationError { @@ -161,6 +163,7 @@ pub struct RoomState { pub section_id: SectionID, pub random_seed: u32, pub bursting: bool, + pub monster_stats: Box>, // items on ground // enemy info } @@ -226,6 +229,7 @@ impl RoomState { }; Ok(RoomState { + monster_stats: Box::new(load_monster_stats_table(&room_mode)), mode: room_mode, random_seed: rand::thread_rng().gen(), name: String::from_utf16_lossy(&create_room.name).trim_matches(char::from(0)).into(), diff --git a/src/ship/ship.rs b/src/ship/ship.rs index 97c4aa4..ba97417 100644 --- a/src/ship/ship.rs +++ b/src/ship/ship.rs @@ -242,7 +242,7 @@ pub struct ShipServerState { client_location: ClientLocation, level_table: CharacterLevelTable, name: String, - rooms: Rooms, + pub rooms: Rooms, pub item_manager: items::ItemManager, quests: quests::QuestList, } @@ -264,7 +264,7 @@ impl ShipServerState { async fn message(&mut self, id: ClientId, msg: &Message) -> Result + Send>, ShipError> { match &msg.msg { GameMessage::RequestExp(request_exp) => { - Ok(handler::message::request_exp(id, request_exp, &self.client_location, &self.rooms)) + handler::message::request_exp(id, request_exp, &mut self.entity_gateway, &self.client_location, &mut self.clients, &mut self.rooms, &self.level_table).await }, GameMessage::PlayerDropItem(player_drop_item) => { handler::message::player_drop_item(id, player_drop_item, &mut self.entity_gateway, &mut self.client_location, &mut self.clients, &mut self.rooms, &mut self.item_manager).await diff --git a/tests/common.rs b/tests/common.rs new file mode 100644 index 0000000..29f33d0 --- /dev/null +++ b/tests/common.rs @@ -0,0 +1,79 @@ +use std::time::SystemTime; + +use elseware::common::serverstate::{ClientId, ServerState}; +use elseware::entity::gateway::EntityGateway; +use elseware::entity::account::{UserAccountEntity, NewUserAccountEntity, NewUserSettingsEntity}; +use elseware::entity::character::{CharacterEntity, NewCharacterEntity}; +use elseware::ship::ship::{ShipServerState, RecvShipPacket}; + +use libpso::packet::ship::*; +use libpso::packet::login::{Login, Session}; +use libpso::{utf8_to_array, utf8_to_utf16_array}; + + +pub async fn new_user_character(entity_gateway: &mut EG, username: &str, password: &str) -> (UserAccountEntity, CharacterEntity) { + let new_user = NewUserAccountEntity { + username: username.into(), + password: bcrypt::hash(password, 5).unwrap(), + guildcard: 1, + team_id: None, + banned: false, + muted_until: SystemTime::now(), + created_at: SystemTime::now(), + flags: 0, + }; + + let user = entity_gateway.create_user(new_user).await.unwrap(); + let new_settings = NewUserSettingsEntity::new(user.id); + let _settings = entity_gateway.create_user_settings(new_settings).await.unwrap(); + let new_character = NewCharacterEntity::new(user.id); + let character = entity_gateway.create_character(new_character).await.unwrap(); + + (user, character) +} + +pub async fn log_in_char(ship: &mut ShipServerState, id: ClientId, username: &str, password: &str) { + let username = username.to_string(); + let password = password.to_string(); + ship.handle(id, &RecvShipPacket::Login(Login { + tag: 0, + guildcard: 0, + version: 0, + unknown1: [0; 6], + team: 0, + username: utf8_to_array!(username, 16), + unknown2: [0; 32], + password: utf8_to_array!(password, 16), + unknown3: [0; 40], + hwinfo: [0; 8], + session: Session::new(), + })).await.unwrap().for_each(drop); +} + +pub async fn join_lobby(ship: &mut ShipServerState, id: ClientId) { + ship.handle(id, &RecvShipPacket::CharData(CharData { + _unknown: [0; 0x828] + })).await.unwrap().for_each(drop); +} + +pub async fn create_room(ship: &mut ShipServerState, id: ClientId, name: &str, password: &str) { + ship.handle(id, &RecvShipPacket::CreateRoom(CreateRoom { + unknown: [0; 2], + name: utf8_to_utf16_array!(name, 16), + password: utf8_to_utf16_array!(password, 16), + difficulty: 0, + battle: 0, + challenge: 0, + episode: 1, + single_player: 0, + padding: [0; 3], + })).await.unwrap().for_each(drop); + ship.handle(id, &RecvShipPacket::DoneBursting(DoneBursting {})).await.unwrap().for_each(drop); +} + +pub async fn join_room(ship: &mut ShipServerState, id: ClientId, room_id: u32) { + ship.handle(id, &RecvShipPacket::MenuSelect(MenuSelect { + menu: ROOM_MENU_ID, + item: room_id, + })).await.unwrap().for_each(drop); +} diff --git a/tests/test_exp_gain.rs b/tests/test_exp_gain.rs new file mode 100644 index 0000000..57c410a --- /dev/null +++ b/tests/test_exp_gain.rs @@ -0,0 +1,184 @@ +use elseware::common::serverstate::{ClientId, ServerState}; +use elseware::entity::gateway::{EntityGateway, InMemoryGateway}; +use elseware::common::leveltable::CharacterLevelTable; +use elseware::ship::ship::{ShipServerState, SendShipPacket, RecvShipPacket}; +use elseware::ship::monster::MonsterType; + +use libpso::packet::ship::*; +use libpso::packet::messages::*; + +#[path = "common.rs"] +mod common; +use common::*; + +#[async_std::test] +async fn test_character_gains_exp() { + let mut entity_gateway = InMemoryGateway::new(); + + let (_user1, _char1) = new_user_character(&mut entity_gateway, "a1", "a").await; + + let mut ship = ShipServerState::new(entity_gateway.clone()); + log_in_char(&mut ship, ClientId(1), "a1", "a").await; + join_lobby(&mut ship, ClientId(1)).await; + create_room(&mut ship, ClientId(1), "room", "").await; + + let (enemy_id, exp) = { + let room = ship.rooms[0].as_ref().unwrap(); + let (enemy_id, map_enemy) = (0..).filter_map(|i| { + room.maps.enemy_by_id(i).map(|enemy| { + (i, enemy) + }).ok() + }).next().unwrap(); + let map_enemy_stats = room.monster_stats.get(&map_enemy.monster).unwrap(); + (enemy_id, map_enemy_stats.exp) + }; + + ship.handle(ClientId(1), &RecvShipPacket::Message(Message::new(GameMessage::RequestExp(RequestExp{ + client: enemy_id as u8, + target: 16, + enemy_id: enemy_id as u16, + client_id: 0, + unused: 0, + last_hitter: 1, + })))).await.unwrap().for_each(drop); + + let c1 = ship.clients.get(&ClientId(1)).unwrap(); + assert!(exp == c1.character.exp); +} + +#[async_std::test] +async fn test_character_levels_up() { + let mut entity_gateway = InMemoryGateway::new(); + + let (_user1, mut char1) = new_user_character(&mut entity_gateway, "a1", "a").await; + char1.exp = 49; + entity_gateway.save_character(&char1).await; + + let mut ship = ShipServerState::new(entity_gateway.clone()); + log_in_char(&mut ship, ClientId(1), "a1", "a").await; + join_lobby(&mut ship, ClientId(1)).await; + create_room(&mut ship, ClientId(1), "room", "").await; + + let enemy_id = { + let room = ship.rooms[0].as_ref().unwrap(); + (0..).filter_map(|i| { + room.maps.enemy_by_id(i).map(|_| { + i + }).ok() + }).next().unwrap() + }; + + let levelup_pkt = ship.handle(ClientId(1), &RecvShipPacket::Message(Message::new(GameMessage::RequestExp(RequestExp{ + client: enemy_id as u8, + target: 16, + enemy_id: enemy_id as u16, + client_id: 0, + unused: 0, + last_hitter: 1, + })))).await.unwrap().collect::>(); + + assert!(matches!(levelup_pkt[1].1, SendShipPacket::Message(Message {msg: GameMessage::PlayerLevelUp(PlayerLevelUp {lvl: 2, ..})}))); + + let leveltable = CharacterLevelTable::new(); + let c1 = ship.clients.get(&ClientId(1)).unwrap(); + assert!(leveltable.get_level_from_exp(c1.character.char_class, c1.character.exp) == 2); +} + +#[async_std::test] +async fn test_character_levels_up_multiple_times() { + let mut entity_gateway = InMemoryGateway::new(); + + let (_user1, _char1) = new_user_character(&mut entity_gateway, "a1", "a").await; + + let mut ship = ShipServerState::new(entity_gateway.clone()); + log_in_char(&mut ship, ClientId(1), "a1", "a").await; + join_lobby(&mut ship, ClientId(1)).await; + create_room(&mut ship, ClientId(1), "room", "").await; + + let (enemy_id, exp) = { + let room = ship.rooms[0].as_ref().unwrap(); + let (enemy_id, map_enemy) = (0..).filter_map(|i| { + room.maps.enemy_by_id(i).ok().and_then(|enemy| { + if enemy.monster == MonsterType::DarkFalz2 { + Some((i, enemy)) + } + else { + None + } + }) + }).next().unwrap(); + let map_enemy_stats = room.monster_stats.get(&map_enemy.monster).unwrap(); + (enemy_id, map_enemy_stats.exp) + }; + + let levelup_pkt = ship.handle(ClientId(1), &RecvShipPacket::Message(Message::new(GameMessage::RequestExp(RequestExp{ + client: enemy_id as u8, + target: 16, + enemy_id: enemy_id as u16, + client_id: 0, + unused: 0, + last_hitter: 1, + })))).await.unwrap().collect::>(); + + assert!(matches!(levelup_pkt[1].1, SendShipPacket::Message(Message {msg: GameMessage::PlayerLevelUp(PlayerLevelUp {lvl: 8, ..})}))); + + let c1 = ship.clients.get(&ClientId(1)).unwrap(); + assert!(exp == c1.character.exp); +} + +#[async_std::test] +async fn test_one_character_gets_full_exp_and_other_attacker_gets_partial() { + let mut entity_gateway = InMemoryGateway::new(); + + let (_user1, _char1) = new_user_character(&mut entity_gateway, "a1", "a").await; + let (_user2, _char2) = new_user_character(&mut entity_gateway, "a2", "a").await; + + let mut ship = ShipServerState::new(entity_gateway.clone()); + log_in_char(&mut ship, ClientId(1), "a1", "a").await; + log_in_char(&mut ship, ClientId(2), "a2", "a").await; + + join_lobby(&mut ship, ClientId(1)).await; + join_lobby(&mut ship, ClientId(2)).await; + + create_room(&mut ship, ClientId(1), "room", "").await; + join_room(&mut ship, ClientId(2), 0).await; + + let (enemy_id, exp) = { + let room = ship.rooms[0].as_ref().unwrap(); + let (enemy_id, map_enemy) = (0..).filter_map(|i| { + room.maps.enemy_by_id(i).ok().and_then(|enemy| { + if enemy.monster == MonsterType::DarkFalz2 { + Some((i, enemy)) + } + else { + None + } + }) + }).next().unwrap(); + let map_enemy_stats = room.monster_stats.get(&map_enemy.monster).unwrap(); + (enemy_id, map_enemy_stats.exp) + }; + + ship.handle(ClientId(1), &RecvShipPacket::Message(Message::new(GameMessage::RequestExp(RequestExp{ + client: enemy_id as u8, + target: 16, + enemy_id: enemy_id as u16, + client_id: 0, + unused: 0, + last_hitter: 1, + })))).await.unwrap().for_each(drop); + + ship.handle(ClientId(2), &RecvShipPacket::Message(Message::new(GameMessage::RequestExp(RequestExp{ + client: enemy_id as u8, + target: 16, + enemy_id: enemy_id as u16, + client_id: 0, + unused: 0, + last_hitter: 0, + })))).await.unwrap().for_each(drop); + + let c1 = ship.clients.get(&ClientId(1)).unwrap(); + let c2 = ship.clients.get(&ClientId(2)).unwrap(); + assert!(c1.character.exp == exp); + assert!(c2.character.exp == (exp as f32 * 0.8) as u32); +} diff --git a/tests/test_item_pickup.rs b/tests/test_item_pickup.rs index c3e4c77..5466ee4 100644 --- a/tests/test_item_pickup.rs +++ b/tests/test_item_pickup.rs @@ -1,87 +1,15 @@ -use std::time::SystemTime; - use elseware::common::serverstate::{ClientId, ServerState}; use elseware::entity::gateway::{EntityGateway, InMemoryGateway}; -use elseware::entity::account::{UserAccountEntity, NewUserAccountEntity, NewUserSettingsEntity}; -use elseware::entity::character::{CharacterEntity, NewCharacterEntity}; -//use elseware::entity::item::{NewItemEntity, ItemDetail, ItemLocation}; use elseware::entity::item; use elseware::ship::ship::{ShipServerState, RecvShipPacket}; use elseware::ship::items::{ClientItemId, ActiveItemEntityId, HeldItemType, FloorItemType}; use libpso::packet::ship::*; use libpso::packet::messages::*; -use libpso::packet::login::{Login, Session}; -use libpso::{utf8_to_array, utf8_to_utf16_array}; - - -pub async fn new_user_character(entity_gateway: &mut EG, username: &str, password: &str) -> (UserAccountEntity, CharacterEntity) { - let new_user = NewUserAccountEntity { - username: username.into(), - password: bcrypt::hash(password, 5).unwrap(), - guildcard: 1, - team_id: None, - banned: false, - muted_until: SystemTime::now(), - created_at: SystemTime::now(), - flags: 0, - }; - - let user = entity_gateway.create_user(new_user).await.unwrap(); - let new_settings = NewUserSettingsEntity::new(user.id); - let _settings = entity_gateway.create_user_settings(new_settings).await.unwrap(); - let new_character = NewCharacterEntity::new(user.id); - let character = entity_gateway.create_character(new_character).await.unwrap(); - - (user, character) -} - -pub async fn log_in_char(ship: &mut ShipServerState, id: ClientId, username: &str, password: &str) { - let username = username.to_string(); - let password = password.to_string(); - ship.handle(id, &RecvShipPacket::Login(Login { - tag: 0, - guildcard: 0, - version: 0, - unknown1: [0; 6], - team: 0, - username: utf8_to_array!(username, 16), - unknown2: [0; 32], - password: utf8_to_array!(password, 16), - unknown3: [0; 40], - hwinfo: [0; 8], - session: Session::new(), - })).await.unwrap().for_each(drop); -} - -pub async fn join_lobby(ship: &mut ShipServerState, id: ClientId) { - ship.handle(id, &RecvShipPacket::CharData(CharData { - _unknown: [0; 0x828] - })).await.unwrap().for_each(drop); -} - -pub async fn create_room(ship: &mut ShipServerState, id: ClientId, name: &str, password: &str) { - ship.handle(id, &RecvShipPacket::CreateRoom(CreateRoom { - unknown: [0; 2], - name: utf8_to_utf16_array!(name, 16), - password: utf8_to_utf16_array!(password, 16), - difficulty: 0, - battle: 0, - challenge: 0, - episode: 1, - single_player: 0, - padding: [0; 3], - })).await.unwrap().for_each(drop); - ship.handle(id, &RecvShipPacket::DoneBursting(DoneBursting {})).await.unwrap().for_each(drop); -} - -pub async fn join_room(ship: &mut ShipServerState, id: ClientId, room_id: u32) { - ship.handle(id, &RecvShipPacket::MenuSelect(MenuSelect { - menu: ROOM_MENU_ID, - item: room_id, - })).await.unwrap().for_each(drop); -} +#[path = "common.rs"] +mod common; +use common::*; #[async_std::test] async fn test_pick_up_item_stack_of_items_already_in_inventory() {