Compare commits
2 Commits
3d0b79bbde
...
1350007e1d
Author | SHA1 | Date |
---|---|---|
dan63047 | 1350007e1d | |
dan63047 | 24ad72c029 |
|
@ -229,26 +229,33 @@ enum CalcCards{
|
||||||
damage
|
damage
|
||||||
}
|
}
|
||||||
|
|
||||||
// class Damage{
|
class Damage{
|
||||||
// final int clear;
|
final int clear;
|
||||||
// final int combo;
|
final double combo;
|
||||||
// final int b2b;
|
final double b2b;
|
||||||
// final int surge;
|
final int surge;
|
||||||
// final int pc;
|
final int pc;
|
||||||
|
final double multiplier;
|
||||||
|
|
||||||
|
int get total => ((clear + combo + b2b + surge + pc) * multiplier).floor();
|
||||||
|
|
||||||
|
const Damage(this.clear, this.combo, this.b2b, this.surge, this.pc, this.multiplier);
|
||||||
|
|
||||||
// const Damage(this.clear, this.combo, this.b2b, this.surge, this.pc);
|
@override
|
||||||
|
String toString(){
|
||||||
|
return total.toString();
|
||||||
|
}
|
||||||
|
|
||||||
// Damage operator+(Damage other){
|
Damage operator+(Damage other){
|
||||||
// return Damage(
|
return Damage(
|
||||||
// clear+other.clear,
|
clear+other.clear,
|
||||||
// combo+other.combo,
|
combo+other.combo,
|
||||||
// b2b+other.b2b,
|
b2b+other.b2b,
|
||||||
// surge+other.b2b,
|
surge+other.surge,
|
||||||
// pc+other.pc);
|
pc+other.pc,
|
||||||
// }
|
multiplier);
|
||||||
// }
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ClearData{
|
class ClearData{
|
||||||
final String title;
|
final String title;
|
||||||
|
@ -276,18 +283,18 @@ class ClearData{
|
||||||
perfectClear = !perfectClear;
|
perfectClear = !perfectClear;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dealsDamage(int combo, int b2b, Rules rules){
|
Damage dealsDamage(int combo, int b2b, Rules rules){
|
||||||
if (lines == 0) return 0;
|
if (lines == 0) return Damage(0,0,0,0,0,rules.multiplier);
|
||||||
double damage = 0;
|
int clearDamage = 0;
|
||||||
|
|
||||||
if (spin){
|
if (spin){
|
||||||
if (lines <= 5) damage += garbage[lineclear]!;
|
if (lines <= 5) clearDamage += garbage[lineclear]!;
|
||||||
else damage += garbage[Lineclears.TSPIN_PENTA]! + 2 * (lines - 5);
|
else clearDamage += garbage[Lineclears.TSPIN_PENTA]! + 2 * (lines - 5);
|
||||||
} else if (miniSpin){
|
} else if (miniSpin){
|
||||||
damage += garbage[lineclear]!;
|
clearDamage += garbage[lineclear]!;
|
||||||
} else {
|
} else {
|
||||||
if (lines <= 5) damage += garbage[lineclear]!;
|
if (lines <= 5) clearDamage += garbage[lineclear]!;
|
||||||
else damage += garbage[Lineclears.PENTA]! + (lines - 5);
|
else clearDamage += garbage[Lineclears.PENTA]! + (lines - 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ok i can't figure out how b2b and combo works
|
// Ok i can't figure out how b2b and combo works
|
||||||
|
@ -296,9 +303,17 @@ class ClearData{
|
||||||
// const n = e.cm.constants.garbage.BACKTOBACK_BONUS * (Math.floor(1 + Math.log1p((t.stats.btb - 1) * e.cm.constants.garbage.BACKTOBACK_BONUS_LOG)) + (t.stats.btb - 1 == 1 ? 0 : (1 + Math.log1p((t.stats.btb - 1) * e.cm.constants.garbage.BACKTOBACK_BONUS_LOG) % 1) / 3));
|
// const n = e.cm.constants.garbage.BACKTOBACK_BONUS * (Math.floor(1 + Math.log1p((t.stats.btb - 1) * e.cm.constants.garbage.BACKTOBACK_BONUS_LOG)) + (t.stats.btb - 1 == 1 ? 0 : (1 + Math.log1p((t.stats.btb - 1) * e.cm.constants.garbage.BACKTOBACK_BONUS_LOG) % 1) / 3));
|
||||||
// if (h && (d += n),
|
// if (h && (d += n),
|
||||||
|
|
||||||
|
double b2bDamage = 0;
|
||||||
|
|
||||||
if (difficultClear && b2b >= 1 && rules.b2b){
|
if (difficultClear && b2b >= 1 && rules.b2b){
|
||||||
if (rules.b2bChaining) damage += BACKTOBACK_BONUS * ((1 + log((b2b+1) * BACKTOBACK_BONUS_LOG)).floor() + (b2b+1 == 1 ? 0 : (1 + log((b2b+1) * BACKTOBACK_BONUS_LOG) % 1) / 3)); // but it should be b2b-1 ???
|
if (rules.b2bChaining) b2bDamage += BACKTOBACK_BONUS * ((1 + log((b2b+1) * BACKTOBACK_BONUS_LOG)).floor() + (b2b+1 == 1 ? 0 : (1 + log((b2b+1) * BACKTOBACK_BONUS_LOG) % 1) / 3)); // but it should be b2b-1 ???
|
||||||
else damage += 1; // if b2b chaining off
|
else b2bDamage += 1; // if b2b chaining off
|
||||||
|
}
|
||||||
|
|
||||||
|
int surgeDamage = 0;
|
||||||
|
|
||||||
|
if (!difficultClear && rules.surge){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// From tetrio.js:
|
// From tetrio.js:
|
||||||
|
@ -312,19 +327,23 @@ class ClearData{
|
||||||
// d += n[Math.max(0, Math.min(t.stats.combo - 2, n.length - 1))]
|
// d += n[Math.max(0, Math.min(t.stats.combo - 2, n.length - 1))]
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
double comboDamage = 0;
|
||||||
|
|
||||||
if (rules.combo) {
|
if (rules.combo) {
|
||||||
if (combo >= 1){
|
if (combo > 1){
|
||||||
if (lines == 1) damage += combotable[rules.comboTable]![max(0, min(combo - 1, combotable[rules.comboTable]!.length - 1))];
|
if (lines == 1 && rules.comboTable != ComboTables.multiplier) comboDamage += combotable[rules.comboTable]![max(0, min(combo - 1, combotable[rules.comboTable]!.length - 1))];
|
||||||
else damage *= 1 + COMBO_BONUS * (combo - 1);
|
else comboDamage = (clearDamage + b2bDamage) * (1 + COMBO_BONUS * (combo-1));
|
||||||
}
|
}
|
||||||
if (combo > 2) {
|
if (combo > 2) {
|
||||||
damage = max(log(COMBO_MINIFIER * (combo - 1) * COMBO_MINIFIER_LOG), damage);
|
comboDamage = max(log(COMBO_MINIFIER * (combo-1) * COMBO_MINIFIER_LOG), comboDamage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (perfectClear) damage += rules.pcDamage;
|
int pcDamage = 0;
|
||||||
|
|
||||||
return (damage * rules.multiplier).floor();
|
if (perfectClear) pcDamage += rules.pcDamage;
|
||||||
|
|
||||||
|
return Damage(clearDamage, comboDamage, b2bDamage, surgeDamage, pcDamage, rules.multiplier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,6 +404,8 @@ class _DestinationCalculatorState extends State<DestinationCalculator> {
|
||||||
int idCounter = 0;
|
int idCounter = 0;
|
||||||
Rules rules = Rules();
|
Rules rules = Rules();
|
||||||
|
|
||||||
|
CalcCards card = CalcCards.calc;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
@ -534,12 +555,13 @@ class _DestinationCalculatorState extends State<DestinationCalculator> {
|
||||||
|
|
||||||
int combo = -1;
|
int combo = -1;
|
||||||
int b2b = -1;
|
int b2b = -1;
|
||||||
int totalDamage = 0;
|
Damage totalDamage = Damage(0,0,0,0,0,rules.multiplier);
|
||||||
|
int totalDamageNumber = 0;
|
||||||
|
|
||||||
for (ClearData lineclear in clears){
|
for (ClearData lineclear in clears){
|
||||||
if (lineclear.difficultClear) b2b++; else if (lineclear.lines > 0) b2b = -1;
|
if (lineclear.difficultClear) b2b++; else if (lineclear.lines > 0) b2b = -1;
|
||||||
if (lineclear.lines > 0) combo++; else combo = -1;
|
if (lineclear.lines > 0) combo++; else combo = -1;
|
||||||
int dmg = lineclear.dealsDamage(combo, b2b, rules);
|
Damage dmg = lineclear.dealsDamage(combo, b2b, rules);
|
||||||
lSideWidgets.add(
|
lSideWidgets.add(
|
||||||
ListTile(
|
ListTile(
|
||||||
key: ValueKey(lineclear.id),
|
key: ValueKey(lineclear.id),
|
||||||
|
@ -551,7 +573,7 @@ class _DestinationCalculatorState extends State<DestinationCalculator> {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
title: Text("${lineclear.title}${lineclear.perfectClear ? " PC" : ""}${combo > 0 ? ", ${combo} combo" : ""}${b2b > 0 ? ", B2Bx${b2b}" : ""}"),
|
title: Text("${lineclear.title}${lineclear.perfectClear ? " PC" : ""}${combo > 0 ? ", ${combo} combo" : ""}${b2b > 0 ? ", B2Bx${b2b}" : ""}"),
|
||||||
subtitle: lineclear.lines > 0 ? Text("${dmg} damage${lineclear.difficultClear ? ", difficult" : ""}", style: TextStyle(color: Colors.grey)) : null,
|
subtitle: lineclear.lines > 0 ? Text("${dmg.clear} from clear, ${dmg.combo} from combo, ${dmg.b2b} from B2B, ${dmg.surge} from Surge and ${dmg.pc} from PC", style: TextStyle(color: Colors.grey)) : null,
|
||||||
trailing: lineclear.lines > 0 ? Padding(
|
trailing: lineclear.lines > 0 ? Padding(
|
||||||
padding: const EdgeInsets.only(right: 10.0),
|
padding: const EdgeInsets.only(right: 10.0),
|
||||||
child: Text(dmg.toString(), style: TextStyle(fontSize: 36, fontWeight: ui.FontWeight.w100)),
|
child: Text(dmg.toString(), style: TextStyle(fontSize: 36, fontWeight: ui.FontWeight.w100)),
|
||||||
|
@ -559,6 +581,7 @@ class _DestinationCalculatorState extends State<DestinationCalculator> {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
totalDamage += dmg;
|
totalDamage += dmg;
|
||||||
|
totalDamageNumber += dmg.total;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
|
@ -705,10 +728,11 @@ class _DestinationCalculatorState extends State<DestinationCalculator> {
|
||||||
children: [
|
children: [
|
||||||
Text("Total damage:", style: TextStyle(fontSize: 36, fontWeight: ui.FontWeight.w100)),
|
Text("Total damage:", style: TextStyle(fontSize: 36, fontWeight: ui.FontWeight.w100)),
|
||||||
Spacer(),
|
Spacer(),
|
||||||
Text(totalDamage.floor().toString(), style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 36, fontWeight: ui.FontWeight.w100))
|
Text(totalDamageNumber.toString(), style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 36, fontWeight: ui.FontWeight.w100))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Text(totalDamage.toString(), style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 36, fontWeight: ui.FontWeight.w100)),
|
||||||
ElevatedButton.icon(onPressed: (){setState((){clears.clear();});}, icon: const Icon(Icons.clear), label: Text("Clear all"), style: const ButtonStyle(shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12.0))))))
|
ElevatedButton.icon(onPressed: (){setState((){clears.clear();});}, icon: const Icon(Icons.clear), label: Text("Clear all"), style: const ButtonStyle(shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12.0))))))
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -728,7 +752,10 @@ class _DestinationCalculatorState extends State<DestinationCalculator> {
|
||||||
children: [
|
children: [
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: widget.constraints.maxHeight -32,
|
height: widget.constraints.maxHeight -32,
|
||||||
child: getDamageCalculator(),
|
child: switch (card){
|
||||||
|
CalcCards.calc => getCalculator(),
|
||||||
|
CalcCards.damage => getDamageCalculator()
|
||||||
|
}
|
||||||
),
|
),
|
||||||
SegmentedButton<CalcCards>(
|
SegmentedButton<CalcCards>(
|
||||||
showSelectedIcon: false,
|
showSelectedIcon: false,
|
||||||
|
@ -742,11 +769,10 @@ class _DestinationCalculatorState extends State<DestinationCalculator> {
|
||||||
label: Text('Damage Calculator'),
|
label: Text('Damage Calculator'),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
selected: <CalcCards>{CalcCards.damage},
|
selected: <CalcCards>{card},
|
||||||
onSelectionChanged: (Set<CalcCards> newSelection) {
|
onSelectionChanged: (Set<CalcCards> newSelection) {
|
||||||
setState(() {
|
setState(() {
|
||||||
// cardMod = CardMod.info;
|
card = newSelection.first;
|
||||||
// rightCard = newSelection.first;
|
|
||||||
});})
|
});})
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue