mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +00:00
Compare commits
33 Commits
cantTarget
...
migrate-sp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9bf567a966 | ||
|
|
a0be5e25cb | ||
|
|
f2e3cdc111 | ||
|
|
7384aada40 | ||
|
|
1a8a4f63ae | ||
|
|
530d1efcd8 | ||
|
|
d8b1d76f42 | ||
|
|
830b145e88 | ||
|
|
51ed06d60a | ||
|
|
ac9b73935f | ||
|
|
fe2f49fbcc | ||
|
|
3d31494a1b | ||
|
|
ff42e730a2 | ||
|
|
a66fb8791c | ||
|
|
2ad5d20e83 | ||
|
|
4790394698 | ||
|
|
8b1c427809 | ||
|
|
c0b667c373 | ||
|
|
ca61627f5b | ||
|
|
c3e2a5b5ea | ||
|
|
0d26b499d3 | ||
|
|
bbbc5e0ee6 | ||
|
|
714d9442f1 | ||
|
|
d199765e6d | ||
|
|
e5156d8999 | ||
|
|
c0d5397541 | ||
|
|
444897d0f9 | ||
|
|
f2cb7956d3 | ||
|
|
e0c2a49c6b | ||
|
|
d64e5ebc13 | ||
|
|
9bea1bc717 | ||
|
|
bdf9573467 | ||
|
|
042eb4bf79 |
@@ -442,11 +442,9 @@ public class CountersPutAi extends CountersAi {
|
||||
}
|
||||
sa.addDividedAllocation(c, amount);
|
||||
return decision;
|
||||
} else {
|
||||
if (!hasSacCost) {
|
||||
// for Sacrifice costs, evaluate further to see if it's worth using the ability before the card dies
|
||||
return decision;
|
||||
}
|
||||
} else if (!hasSacCost) {
|
||||
// for Sacrifice costs, evaluate further to see if it's worth using the ability before the card dies
|
||||
return decision;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -684,14 +682,12 @@ public class CountersPutAi extends CountersAi {
|
||||
|| (sa.getRootAbility().isTrigger() && !sa.getRootAbility().isOptionalTrigger());
|
||||
|
||||
if (sa.usesTargeting()) {
|
||||
CardCollection list = null;
|
||||
|
||||
CardCollection list;
|
||||
if (sa.isCurse()) {
|
||||
list = ai.getOpponents().getCardsIn(ZoneType.Battlefield);
|
||||
} else {
|
||||
list = new CardCollection(ai.getCardsIn(ZoneType.Battlefield));
|
||||
}
|
||||
|
||||
list = CardLists.getTargetableCards(list, sa);
|
||||
|
||||
if (list.isEmpty() && isMandatoryTrigger) {
|
||||
@@ -707,9 +703,8 @@ public class CountersPutAi extends CountersAi {
|
||||
|| sa.getTargets().isEmpty()) {
|
||||
sa.resetTargets();
|
||||
return new AiAbilityDecision(0, AiPlayDecision.TargetingFailed);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (sa.isCurse()) {
|
||||
@@ -752,8 +747,6 @@ public class CountersPutAi extends CountersAi {
|
||||
final SpellAbility root = sa.getRootAbility();
|
||||
final Card source = sa.getHostCard();
|
||||
final String aiLogic = sa.getParamOrDefault("AILogic", "");
|
||||
boolean preferred = true;
|
||||
CardCollection list;
|
||||
final String amountStr = sa.getParamOrDefault("CounterNum", "1");
|
||||
final boolean divided = sa.isDividedAsYouChoose();
|
||||
final int amount = AbilityUtils.calculateAmount(source, amountStr, sa);
|
||||
@@ -775,11 +768,11 @@ public class CountersPutAi extends CountersAi {
|
||||
AiAbilityDecision decision = doChargeToCMCLogic(ai, sa);
|
||||
if (decision.willingToPlay()) {
|
||||
return decision;
|
||||
} else if (mandatory) {
|
||||
return new AiAbilityDecision(50, AiPlayDecision.MandatoryPlay);
|
||||
} else {
|
||||
return new AiAbilityDecision(0, AiPlayDecision.CantPlayAi);
|
||||
}
|
||||
if (mandatory) {
|
||||
return new AiAbilityDecision(50, AiPlayDecision.MandatoryPlay);
|
||||
}
|
||||
return new AiAbilityDecision(0, AiPlayDecision.CantPlayAi);
|
||||
}
|
||||
|
||||
if (!sa.usesTargeting()) {
|
||||
@@ -830,19 +823,19 @@ public class CountersPutAi extends CountersAi {
|
||||
}
|
||||
}
|
||||
|
||||
if (sa.isCurse()) {
|
||||
list = ai.getOpponents().getCardsIn(ZoneType.Battlefield);
|
||||
} else {
|
||||
list = new CardCollection(ai.getCardsIn(ZoneType.Battlefield));
|
||||
}
|
||||
list = CardLists.getTargetableCards(list, sa);
|
||||
|
||||
// Filter AI-specific targets if provided
|
||||
list = ComputerUtil.filterAITgts(sa, ai, list, false);
|
||||
|
||||
int totalTargets = list.size();
|
||||
|
||||
sa.resetTargets();
|
||||
|
||||
Iterable<Card> filteredField;
|
||||
if (sa.isCurse()) {
|
||||
filteredField = ai.getOpponents().getCardsIn(ZoneType.Battlefield);
|
||||
} else {
|
||||
filteredField = ai.getCardsIn(ZoneType.Battlefield);
|
||||
}
|
||||
CardCollection list = CardLists.getTargetableCards(filteredField, sa);
|
||||
list = ComputerUtil.filterAITgts(sa, ai, list, false);
|
||||
int totalTargets = list.size();
|
||||
boolean preferred = true;
|
||||
|
||||
while (sa.canAddMoreTarget()) {
|
||||
if (mandatory) {
|
||||
// When things are mandatory, gotta handle a little differently
|
||||
@@ -879,27 +872,21 @@ public class CountersPutAi extends CountersAi {
|
||||
if (choice == null && mandatory) {
|
||||
choice = Aggregates.random(list);
|
||||
}
|
||||
} else if (type.equals("M1M1")) {
|
||||
choice = ComputerUtilCard.getWorstCreatureAI(list);
|
||||
} else {
|
||||
if (type.equals("M1M1")) {
|
||||
choice = ComputerUtilCard.getWorstCreatureAI(list);
|
||||
} else {
|
||||
choice = Aggregates.random(list);
|
||||
}
|
||||
choice = Aggregates.random(list);
|
||||
}
|
||||
} else if (preferred) {
|
||||
list = ComputerUtil.getSafeTargets(ai, sa, list);
|
||||
choice = chooseBoonTarget(list, type);
|
||||
if (choice == null && mandatory) {
|
||||
choice = Aggregates.random(list);
|
||||
}
|
||||
} else if (type.equals("P1P1")) {
|
||||
choice = ComputerUtilCard.getWorstCreatureAI(list);
|
||||
} else {
|
||||
if (preferred) {
|
||||
list = ComputerUtil.getSafeTargets(ai, sa, list);
|
||||
choice = chooseBoonTarget(list, type);
|
||||
if (choice == null && mandatory) {
|
||||
choice = Aggregates.random(list);
|
||||
}
|
||||
} else {
|
||||
if (type.equals("P1P1")) {
|
||||
choice = ComputerUtilCard.getWorstCreatureAI(list);
|
||||
} else {
|
||||
choice = Aggregates.random(list);
|
||||
}
|
||||
}
|
||||
choice = Aggregates.random(list);
|
||||
}
|
||||
if (choice != null && divided) {
|
||||
int alloc = Math.max(amount / totalTargets, 1);
|
||||
@@ -1094,8 +1081,7 @@ public class CountersPutAi extends CountersAi {
|
||||
Player ai = sa.getActivatingPlayer();
|
||||
GameEntity e = (GameEntity) params.get("Target");
|
||||
// for Card try to select not useless counter
|
||||
if (e instanceof Card) {
|
||||
Card c = (Card) e;
|
||||
if (e instanceof Card c) {
|
||||
if (c.getController().isOpponentOf(ai)) {
|
||||
if (options.contains(CounterEnumType.M1M1) && !c.hasKeyword(Keyword.UNDYING)) {
|
||||
return CounterEnumType.M1M1;
|
||||
@@ -1112,8 +1098,7 @@ public class CountersPutAi extends CountersAi {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (e instanceof Player) {
|
||||
Player p = (Player) e;
|
||||
} else if (e instanceof Player p) {
|
||||
if (p.isOpponentOf(ai)) {
|
||||
if (options.contains(CounterEnumType.POISON)) {
|
||||
return CounterEnumType.POISON;
|
||||
@@ -1247,9 +1232,8 @@ public class CountersPutAi extends CountersAi {
|
||||
if (numCtrs < optimalCMC) {
|
||||
// If the AI has less counters than the optimal CMC, it should play the ability.
|
||||
return new AiAbilityDecision(100, AiPlayDecision.WillPlay);
|
||||
} else {
|
||||
// If the AI has enough counters or more than the optimal CMC, it should not play the ability.
|
||||
return new AiAbilityDecision(0, AiPlayDecision.CantPlayAi);
|
||||
}
|
||||
// If the AI has enough counters or more than the optimal CMC, it should not play the ability.
|
||||
return new AiAbilityDecision(0, AiPlayDecision.CantPlayAi);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -639,7 +639,7 @@ public final class CardEdition implements Comparable<CardEdition> {
|
||||
* name - grouping #3
|
||||
* artist name - grouping #5
|
||||
*/
|
||||
"(^(.?[0-9A-Z-]+\\S?[A-Z]*)\\s)?([^@]*)( @(.*))?$"
|
||||
"(^(.?[0-9A-Z-]+\\S?[A-Z☇]*)\\s)?([^@]*)( @(.*))?$"
|
||||
);
|
||||
|
||||
ListMultimap<String, EditionEntry> cardMap = ArrayListMultimap.create();
|
||||
|
||||
@@ -577,9 +577,6 @@ public class Player extends GameEntity implements Comparable<Player> {
|
||||
}
|
||||
|
||||
public final boolean payLife(final int lifePayment, final SpellAbility cause, final boolean effect) {
|
||||
return payLife(lifePayment, cause, effect, null);
|
||||
}
|
||||
public final boolean payLife(final int lifePayment, final SpellAbility cause, final boolean effect, Map<AbilityKey, Object> params) {
|
||||
// fast check for pay zero life
|
||||
if (lifePayment <= 0) {
|
||||
cause.setPaidLife(0);
|
||||
@@ -599,9 +596,6 @@ public class Player extends GameEntity implements Comparable<Player> {
|
||||
if (cause.isReplacementAbility() && effect) {
|
||||
replaceParams.putAll(cause.getReplacingObjects());
|
||||
}
|
||||
if (params != null) {
|
||||
replaceParams.putAll(params);
|
||||
}
|
||||
switch (getGame().getReplacementHandler().run(ReplacementType.PayLife, replaceParams)) {
|
||||
case Replaced:
|
||||
return true;
|
||||
|
||||
@@ -83,6 +83,8 @@ public class StaticAbilityCantTarget {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (stAb.hasParam("AffectedZone")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final Card source = spellAbility.getHostCard();
|
||||
|
||||
@@ -22,7 +22,6 @@ import java.util.Map;
|
||||
import com.google.common.collect.Iterables;
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardLists;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.util.Localizer;
|
||||
|
||||
@@ -60,17 +59,8 @@ public class TriggerAttackerBlocked extends Trigger {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hasParam("ValidBlocker")) {
|
||||
@SuppressWarnings("unchecked")
|
||||
int count = CardLists.getValidCardCount(
|
||||
(Iterable<Card>) runParams.get(AbilityKey.Blockers),
|
||||
getParam("ValidBlocker"),
|
||||
getHostCard().getController(), getHostCard(), this
|
||||
);
|
||||
|
||||
if (count == 0) {
|
||||
return false;
|
||||
}
|
||||
if (!matchesValidParam("ValidBlocker", runParams.get(AbilityKey.Blockers))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
770
forge-gui-android/assets/database.json
Normal file
770
forge-gui-android/assets/database.json
Normal file
@@ -0,0 +1,770 @@
|
||||
{
|
||||
"a32x":{
|
||||
"CPU":"2x Cortex-A76 @ 2GHz 6x Cortex-A55 @ 2GHz",
|
||||
"SoC":"MediaTek Dimensity 720 (MT6853)"
|
||||
},
|
||||
"angler":{
|
||||
"CPU":"4x Cortex-A57 @ 1.95GHz 4x Cortex-A53 @ 1.55GHz",
|
||||
"SoC":"Snapdragon 810 MSM8994"
|
||||
},
|
||||
"ane":{
|
||||
"CPU":"4x Cortex-A54 @ 2.3GHz 4x Cortex-A54 @ 1.7GHz",
|
||||
"SoC":"HiSilicon Kirin 659"
|
||||
},
|
||||
"amar_row_wifi":{
|
||||
"CPU":"8x Cortex-A53 @ 1.8GHz",
|
||||
"SoC":"Mediatek MT8768"
|
||||
},
|
||||
"atlas":{
|
||||
"CPU":"-",
|
||||
"SoC":"Intel(R) Core(TM) i5-8200Y @ 1.3GHz"
|
||||
},
|
||||
"apq8084":{
|
||||
"CPU":"4x Krait 450 @ 2.65GHz",
|
||||
"SoC":"Snapdragon 805 APQ8084"
|
||||
},
|
||||
"atoll":{
|
||||
"CPU":"2x Kryo 465 Gold @ 2.3GHz 6x Kryo 465 Silver @ 1.8GHz",
|
||||
"SoC":"Snapdragon 720G (SM7125)"
|
||||
},
|
||||
"art-l29":{
|
||||
"CPU":"4x Cortex-A73 @ 2.2GHz 4x Cortex-A53 @ 1.7GHz",
|
||||
"SoC":"HiSilicon Kirin 710F"
|
||||
},
|
||||
"baylake":{
|
||||
"CPU":"Atom Z3745 @ 1.3GHz",
|
||||
"SoC":"Intel Atom Z3745"
|
||||
},
|
||||
"begonia":{
|
||||
"CPU":"2x Cortex-176 @ 2GHz 6x Cortex-A55 @ 2GHz",
|
||||
"SoC":"MediaTek Helios G90T MT6785T"
|
||||
},
|
||||
"blueline":{
|
||||
"CPU":"4x Kryo 385 Gold @ 2.8GHz 4x Kryo 385 Silver @ 1.75GHz",
|
||||
"SoC":"Snapdragon 845"
|
||||
},
|
||||
"bullhead":{
|
||||
"CPU":"4x Cortex-A57 @ 1.8GHz 4x Cortex-A53 @ 1.44GHz",
|
||||
"SoC":"Snapdragon 808"
|
||||
},
|
||||
"capri":{
|
||||
"CPU":"2x Cortex-A9 @ 1.2GHz",
|
||||
"SoC":"Broadcom BCM28155"
|
||||
},
|
||||
"cepheus":{
|
||||
"CPU":"1x Kryo 485 Gold @ 2.8GHz 3x Kryo 485 Gold @ 2.4GHz 4x Kryo 485 Silver @ 1.7GHz",
|
||||
"SoC":"Snapdragon 855 SM8150"
|
||||
},
|
||||
"cheryl":{
|
||||
"CPU":"4x Kryo 280 HP @ 2.45GHz 4x Kryo 280 LP @ 1.9GHz",
|
||||
"SoC":"Snapdragon 835 MSM8998"
|
||||
},
|
||||
"cheryl2":{
|
||||
"CPU":"4x Kryo 385 Gold @ 2.8GHz 4x Kryo 385 Silver @ 1.8GHz",
|
||||
"SoC":"Snapdragon 845 SDM845"
|
||||
},
|
||||
"cheetah":{
|
||||
"CPU":"2x Cortex-X1 @ 2.8GHz 2x Cortex-A78 @ 2.3GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Google Tensor G2 (GS201)"
|
||||
},
|
||||
"comet":{
|
||||
"CPU":"1x Cortex-X4 @ 31.GHz 3x Cortex-A720 @ 2.6GHz 4x Cortex-A520 @ 1.95GHz",
|
||||
"SoC":"Google Tensor G4 (GS401)"
|
||||
},
|
||||
"eureka":{
|
||||
"CPU":"6x Cortex-A78C @ 2.3 GHz",
|
||||
"SoC":"Snapdragon XR2 Gen 2 (SM8550)"
|
||||
},
|
||||
"felix":{
|
||||
"CPU":"2x Cortex-X1 @ 2.8GHz 2x Cortex-A78 @ 2.3GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Google Tensor G2 (GS201)"
|
||||
},
|
||||
"tangorpro":{
|
||||
"CPU":"2x Cortex-X1 @ 2.8GHz 2x Cortex-A78 @ 2.3GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Google Tensor G2 (GS201)"
|
||||
},
|
||||
"codina":{
|
||||
"CPU":"2x Cortex-A9 @ 1.0GHz",
|
||||
"SoC":"NovaThor U8500"
|
||||
},
|
||||
"clovertrail":{
|
||||
"CPU":"2x Atom Z2560 @ 1.6GHz",
|
||||
"SoC":"Intel Atom Z2560"
|
||||
},
|
||||
"clt":{
|
||||
"CPU":"4x Cortex-A73 @ 2.36GHz 4x Cortex-A53 @ 1.8GHz",
|
||||
"SoC":"HiSilicon Kirin 970"
|
||||
},
|
||||
"els":{
|
||||
"CPU":"4x Cortex-A76 @ 2.8GHz 4x Cortex-A55 @ 1.9GHz",
|
||||
"SoC":"HiSilicon Kirin 990 5G"
|
||||
},
|
||||
"dandelion":{
|
||||
"CPU":"8x Cortex-A54 @ 1.5GHz",
|
||||
"SoC":"MediaTek Helio G25 (MT6762G)"
|
||||
},
|
||||
"darcy":{
|
||||
"CPU":"4x ARM Cortex-A53 4x ARM Cortex-A57",
|
||||
"SoC":"nVIDIA Tegra X1 T210"
|
||||
},
|
||||
"db8520h":{
|
||||
"CPU":"2x Cortex-A9 @ 1.0GHz",
|
||||
"SoC":"NovaThor U8500"
|
||||
},
|
||||
"dragon":{
|
||||
"CPU":"4x Cortex-A57 @ 1.9GHz 4x Cortex-A53 @ 1.3GHz",
|
||||
"SoC":"nVIDIA Tegra X1 T210"
|
||||
},
|
||||
"douglas":{
|
||||
"CPU":"4x Cortex-A53 @ 1.3GHz",
|
||||
"SoC":"MediaTek MT8163"
|
||||
},
|
||||
"eeepad":{
|
||||
"CPU":"4x Atom Z2520 @ 1.2GHz",
|
||||
"SoC":"Intel Atom Z2520"
|
||||
},
|
||||
"endeavoru":{
|
||||
"CPU":"4x Cortex-A9 @ 1.5GHz 1x Cortex-A9 @ 0.5GHz",
|
||||
"SoC":"nVIDIA Tegra 3 AP33"
|
||||
},
|
||||
"eml":{
|
||||
"CPU":"4x Cortex-A73 @ 2.36GHz 4x Cortex-A53 @ 1.8GHz",
|
||||
"SoC":"HiSilicon Kirin 970"
|
||||
},
|
||||
"eve":{
|
||||
"CPU":"i5-7Y56 @ 1.2GHz",
|
||||
"SoC":"Ambel Lake-Y / Kaby Lake-U/Y"
|
||||
},
|
||||
"eva-l19":{
|
||||
"CPU":"4x Cortex-A72 @ 2.5GHz 4x Cortex-A53 @ 1.8GHz",
|
||||
"SoC":"HiSilicon Kirin 955"
|
||||
},
|
||||
"exynos990":{
|
||||
"CPU":"4x Cortex-A55 @ 2GHz 2x Cortex-A76 @ 2.5GHz 2x Exynos M5 @ 2.7GHz",
|
||||
"SoC":"Exynos 990"
|
||||
},
|
||||
"exynos9611":{
|
||||
"CPU":"4x Cortex-A73 @ 2.3GHz 4x Cortex-A53 @ 1.7GHz",
|
||||
"SoC":"Exynos 7 Octa (9611)"
|
||||
},
|
||||
"exynos2100":{
|
||||
"CPU":"1x Cortex-X1 @ 2.9GHz 3x Cortex-A78 @ 2.8GHz 4x Cortex-A55 @ 2.2GHz",
|
||||
"SoC":"Exynos 2100"
|
||||
},
|
||||
"exynos9810":{
|
||||
"CPU":"4x Exynos M3 @ 2.7GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Exynos 9 (9810)"
|
||||
},
|
||||
"exynos9820":{
|
||||
"CPU":"2 Exynos M4 @ 2.7GHz 2x Cortex-A75 @ 2.3GHz 4x Cortex-A55 @ 1.9GHz",
|
||||
"SoC":"Exynos 9 (9820)"
|
||||
},
|
||||
"ford":{
|
||||
"CPU":"4x Cortex-A7 @ 1.3GHz",
|
||||
"SoC":"MediaTek MT8127"
|
||||
},
|
||||
"flo":{
|
||||
"CPU":"4x Krait 300 @ 1.5GHz",
|
||||
"SoC":"Snapdragon 600 APQ8064-FLO"
|
||||
},
|
||||
"flame":{
|
||||
"CPU":"1x Kryo 485 Gold @ 2.8GHz 3x Kryo 485 Gold @ 2.4GHz 4x Kryo 485 Silver @ 1.7GHz",
|
||||
"SoC":"Snapdragon 855 SM8150"
|
||||
},
|
||||
"fleur":{
|
||||
"CPU":"2x Cortex-A76 @ 2GHz 6x Cortex-A55 @ 2GHz",
|
||||
"SoC":"MediaTek Helio G96 (MT6781)"
|
||||
},
|
||||
"flounder":{
|
||||
"CPU":"2x nVidia Denver @ 2.5GHz",
|
||||
"SoC":"nVIDIA Tegra K1 T132"
|
||||
},
|
||||
"g3u":{
|
||||
"CPU":"2x Cortex-A5 @ 1.0GHz",
|
||||
"SoC":"Snapdragon S4 Play MSM8225"
|
||||
},
|
||||
"gee":{
|
||||
"CPU":"4x Krait 300 @ 1.5GHz",
|
||||
"SoC":"Snapdragon S4 Pro APQ8064"
|
||||
},
|
||||
"grouper":{
|
||||
"CPU":"4x Cortex-A9 @ 1.3GHz 1x Cortex-A9 @ 0.5GHz",
|
||||
"SoC":"nVIDIA Tegra 3 T30L"
|
||||
},
|
||||
"hammerhead":{
|
||||
"CPU":"4x Krait 400 @ 2.26GHz",
|
||||
"SoC":"Snapdragon 800 MSM8974"
|
||||
},
|
||||
"hawaii_ss_kylepro":{
|
||||
"CPU":"2x Cortex-A9 @ 1.2GHz",
|
||||
"SoC":"Broadcom BCM21664T"
|
||||
},
|
||||
"herring":{
|
||||
"CPU":"1x Cortex-A8 @ 1.0GHz",
|
||||
"SoC":"Exynos 3 Single 3110"
|
||||
},
|
||||
"hollywood":{
|
||||
"CPU":"4x Kryo 280 HP @ 2.4GHz 4x Kryo 280 LP @ 1.9GHz",
|
||||
"SoC":"Snapdragon XR2"
|
||||
},
|
||||
"k6853v1_64_titan":{
|
||||
"CPU":"2x Cortex-A76 @ 2Ghz 6x Cortex-A55 @ 2GHz",
|
||||
"SoC":"MediaTek Dimensity 720 (MT6853)"
|
||||
},
|
||||
"kalama":{
|
||||
"CPU":"1x Cortex-X3 @ 3.3GHz 2x Cortex-A710 @ 2.8GHz 2x Cortex-A715 @ 2.8GHz 3x Cortex-A510 @ 2.0GHz",
|
||||
"SoC":"Snapdragon 8 Gen 2 (SM8550)"
|
||||
},
|
||||
"kona":{
|
||||
"CPU":"1x Cortex-A77 @ 3.1GHz 3x Cortex-A77 @ 2.4GHz 4x Kryo 585 Silver @ 1.8GHz",
|
||||
"SoC":"Snapdragon 865 SM8250"
|
||||
},
|
||||
"kohaku":{
|
||||
"CPU":"i5-10210U @ 1.6GHz",
|
||||
"SoC":"Comet Lake-U"
|
||||
},
|
||||
"lahaina":{
|
||||
"CPU":"1x Cortex-X1 @ 2.8GHz 3x Cortex-A78 @ 2.4GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Snapdragon 888"
|
||||
},
|
||||
"liara":{
|
||||
"CPU":"5 Compute cores 2C+3G",
|
||||
"SoC":"AMD A4-9120C Radeon R4"
|
||||
},
|
||||
"lito":{
|
||||
"CPU":"2x Cortex-A77 @ 2.1GHz 6x Kryo 560 Silver @ 1.7GHz",
|
||||
"SoC":"Snapdragon 690 SM6350"
|
||||
},
|
||||
"lya":{
|
||||
"CPU":"2x Cortex-A76 @ 2.6GHz 2x Cortex-A76 @ 1.9GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"HiSilicon Kirin 980"
|
||||
},
|
||||
"lyo-l01":{
|
||||
"CPU":"4x Cortex-153 @ 1.3GHz",
|
||||
"SoC":"MediaTek MT6735"
|
||||
},
|
||||
"mako":{
|
||||
"CPU":"4x Krait @ 1.5GHz",
|
||||
"SoC":"Snapdragon S4 Pro APQ8064"
|
||||
},
|
||||
"marlin":{
|
||||
"CPU":"2x Kryo HP @ 2.15GHz 2x Kryo @ 1.6GHz",
|
||||
"SoC":"Snapdragon 821 MSM8996 Pro"
|
||||
},
|
||||
"med":{
|
||||
"CPU":"8x Cortex-A54 @ 1.5GHz",
|
||||
"SoC":"MediaTek MT6762R"
|
||||
},
|
||||
"mocha":{
|
||||
"CPU":"4x Cortex-A15 @2.2GHz",
|
||||
"SoC":"nVIDIA Tegra K1 T124"
|
||||
},
|
||||
"msm8225":{
|
||||
"CPU":"2x Cortex-A5 @ 1.2GHz",
|
||||
"SoC":"Snapdragon S4 MSM8225"
|
||||
},
|
||||
"msm8226":{
|
||||
"CPU":"4x Cortex-A7 @ 1.19GHz",
|
||||
"SoC":"Snapdragon 400 MSM8226"
|
||||
},
|
||||
"msm8625":{
|
||||
"CPU":"2x Cortex-A5 @ 1.2GHz",
|
||||
"SoC":"Snapdragon S4 MSM8625"
|
||||
},
|
||||
"MSM8227":{
|
||||
"CPU":"2x Krait @ 1GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8227"
|
||||
},
|
||||
"msm8627":{
|
||||
"CPU":"2x Krait @ 1GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8627"
|
||||
},
|
||||
"apq8030":{
|
||||
"CPU":"2x Krait @ 1.2GHz",
|
||||
"SoC":"Snapdragon S4 Plus APQ8030"
|
||||
},
|
||||
"msm8230":{
|
||||
"CPU":"2x Krait @ 1.2GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8230"
|
||||
},
|
||||
"msm8660_surf":{
|
||||
"CPU":"2x Scorpion @ 1.5GHz",
|
||||
"SoC":"Snapdragon S3 MSM8260"
|
||||
},
|
||||
"msm8630":{
|
||||
"CPU":"2x Krait @ 1.2GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8630"
|
||||
},
|
||||
"msm8930":{
|
||||
"CPU":"2x Krait @ 1.2GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8930"
|
||||
},
|
||||
"msm8937":{
|
||||
"CPU":"4x Cortex-A53 @ 1.4GHz",
|
||||
"SoC":"Snapdragon 425 MSM8917"
|
||||
},
|
||||
"apq8060a":{
|
||||
"CPU":"2x Krait @ 1.5GHz",
|
||||
"SoC":"Snapdragon S4 Plus APQ8060A"
|
||||
},
|
||||
"msm8260a":{
|
||||
"CPU":"2x Krait @ 1.5GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8260A"
|
||||
},
|
||||
"msm8660a":{
|
||||
"CPU":"2x Krait @ 1.5GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8660A"
|
||||
},
|
||||
"msm8960":{
|
||||
"CPU":"2x Krait @ 1.5GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8960"
|
||||
},
|
||||
"msm8260a-pro":{
|
||||
"CPU":"2x Krait 300 @ 1.7GHz",
|
||||
"SoC":"Snapdragon S4 Pro MSM8260A Pro"
|
||||
},
|
||||
"msm8960t":{
|
||||
"CPU":"2x Krait 300 @ 1.7GHz",
|
||||
"SoC":"Snapdragon S4 Pro MSM8960T"
|
||||
},
|
||||
"msm8960t-pro":{
|
||||
"CPU":"2x Krait 300 @ 1.7GHz",
|
||||
"SoC":"Snapdragon S4 Pro MSM8960T Pro"
|
||||
},
|
||||
"msm8960ab":{
|
||||
"CPU":"2x Krait 300 @ 1.7GHz",
|
||||
"SoC":"Snapdragon S4 Pro MSM8960AB"
|
||||
},
|
||||
"msm8960dt":{
|
||||
"CPU":"2x Krait 300 @ 1.7GHz",
|
||||
"SoC":"Snapdragon S4 Pro MSM8960DT"
|
||||
},
|
||||
"apq8064":{
|
||||
"CPU":"4x Krait 300 @ 1.5GHz",
|
||||
"SoC":"Snapdragon 600 APQ8064"
|
||||
},
|
||||
"msm8916":{
|
||||
"CPU":"4x Cortex-A53 @ 1.2GHz",
|
||||
"SoC":"Snapdragon 410 MSM8916"
|
||||
},
|
||||
"msm8953":{
|
||||
"CPU":"8x Cortex-A53 @ 2.0GHz",
|
||||
"SoC":"Snapdragon 625 MSM8953"
|
||||
},
|
||||
"msm8952":{
|
||||
"CPU":"8x Cortex-A53 @ 1.2GHz",
|
||||
"SoC":"Snapdragon 617 MSM8952"
|
||||
},
|
||||
"msm8956":{
|
||||
"CPU":"2x Cortex-A72 @ 1.8GHz 4x Cortex-A53 @ 1.4GHz",
|
||||
"SoC":"Snapdragon 650 MSM8956"
|
||||
},
|
||||
"msm8974":{
|
||||
"CPU":"4x Krait 400 @ 2.15GHz",
|
||||
"SoC":"Snapdragon 800 MSM8974"
|
||||
},
|
||||
"msm8974pro-ab":{
|
||||
"CPU":"4x Krait 400 @ 2.26GHz",
|
||||
"SoC":"Snapdragon 801 MSM8974PRO-AB"
|
||||
},
|
||||
"msm8974pro-ac":{
|
||||
"CPU":"4x Krait 400 @ 2.45GHz",
|
||||
"SoC":"Snapdragon 801 MSM8974AC"
|
||||
},
|
||||
"msm8976":{
|
||||
"CPU":"4x Cortex-A53 @ 1.4GHz 4x Cortex-A72 @ 1.8GHz",
|
||||
"SoC":"Snapdragon 652 MSM8976"
|
||||
},
|
||||
"msm8976pro":{
|
||||
"CPU":"4x Cortex-A53 @ 1.4GHz 4x Cortex-A72 @ 1.9GHz",
|
||||
"SoC":"Snapdragon 653 MSM8976 Pro"
|
||||
},
|
||||
"msm8992":{
|
||||
"CPU":"4x Cortex-A57 @ 1.8GHz 4x Cortex-A53 @ 1.4GHz",
|
||||
"SoC":"Snapdragon 808 MSM8992"
|
||||
},
|
||||
"msm8994":{
|
||||
"CPU":"4x Cortex-A57 @ 1.95GHz 4x Cortex-A53 @ 1.5GHz",
|
||||
"SoC":"Snapdragon 810 MSM8994"
|
||||
},
|
||||
"msm8996":{
|
||||
"CPU":"2x Kryo HP @ 1.8GHz 2x Kryo LP @ 1.36GHz",
|
||||
"SoC":"Snapdragon 820 MSM8996"
|
||||
},
|
||||
"msm8996pro":{
|
||||
"CPU":"2x Kryo HP @ 2.34GHz 2x Kryo LP @ 2.18GHz",
|
||||
"SoC":"Snapdragon 821 MSM8996 Pro"
|
||||
},
|
||||
"msm8998":{
|
||||
"CPU":"4x Kryo 280 HP @ 2.4GHz 4x Kryo 280 LP @ 1.9GHz",
|
||||
"SoC":"Snapdragon 835 MSM8998"
|
||||
},
|
||||
"msmnile":{
|
||||
"CPU":"1x Kryo 485 Gold @ 2.8GHz 3x Kryo 485 Gold @ 2.4GHz 4x Kryo 485 Silver @ 1.8GHz",
|
||||
"SoC":"Snapdragon 855 SM8150"
|
||||
},
|
||||
"mt6795t":{
|
||||
"CPU":"8x Cortex-A53 @ 2.1GHz",
|
||||
"SoC":"MediaTek Helio X10 MT6795T"
|
||||
},
|
||||
"mt6797m":{
|
||||
"CPU":"2x Cortex-A72 @ 2.1GHz 4x Cortex-A53 @ 1.85GHz 4x Cortex-A53 @ 1.4GHz",
|
||||
"SoC":"MediaTek Helio X20 MT6797M"
|
||||
},
|
||||
"mt6750t":{
|
||||
"CPU":"8x Cortex-A53 @ 1.5GHz",
|
||||
"SoC":"MediaTek MT6750T"
|
||||
},
|
||||
"mx5":{
|
||||
"CPU":"8x Cortex-A53 @ 2.1GHz",
|
||||
"SoC":"MediaTek Helio X10 MT6795T"
|
||||
},
|
||||
"mtk6575":{
|
||||
"CPU":"1x Cortex-A9 @ 1.0GHz",
|
||||
"SoC":"MediaTek MT6575"
|
||||
},
|
||||
"noh":{
|
||||
"CPU":"4x Cortex-A77 @ 3.1GHz 4x Cortex-A55 @ 2.0GHz",
|
||||
"SoC":"HiSilicon Kirin 9000"
|
||||
},
|
||||
"sdm710":{
|
||||
"CPU":"2x Kryo 385 Gold @ 2.2GHz 6x Kryo 385 Silver @ 1.7GHz",
|
||||
"SoC":"Snapdragon 710 SDM710"
|
||||
},
|
||||
"sdm845":{
|
||||
"CPU":"4x Kryo 385 Gold @ 2.8GHz 4x Kryo 385 Silver @ 1.7GHz",
|
||||
"SoC":"Snapdragon 845 SDM845"
|
||||
},
|
||||
"monterey":{
|
||||
"CPU":"4x Kryo 280 HP @ 2.45GHz 4x Kryo 280 LP @ 1.9GHz",
|
||||
"SoC":"Snapdragon 835 MSM8998"
|
||||
},
|
||||
"oriole":{
|
||||
"CPU":"2x Cortex-X1 @ 2.8GHz 2x Cortex-A76 @ 2.2GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Google Tensor (Whitechapel)"
|
||||
},
|
||||
"oppo6779_18073":{
|
||||
"CPU":"2x Cortex-A75 @ 2.2GHz 6x Cortex-A55 @ 2GHz",
|
||||
"SoC":"Mediatek MT6779 Helio P90"
|
||||
},
|
||||
"gt-p7510":{
|
||||
"CPU":"2x Cortex-A9 @ 1.0GHz",
|
||||
"SoC":"nVIDIA Tegra 2 T20"
|
||||
},
|
||||
"pacific":{
|
||||
"CPU":"2x @ 2.1GHz 2x @ 1.6GHz",
|
||||
"SoC":"Snapdragon 820E Embedded"
|
||||
},
|
||||
"piranha":{
|
||||
"CPU":"2x Cortex-A9 @ 1.0GHz",
|
||||
"SoC":"Texas Instruments OMAP4430"
|
||||
},
|
||||
"pro5":{
|
||||
"CPU":"4xCortex-56 @ 2.1GHz 4x Cortex-53 @ 1.5GHz",
|
||||
"SoC":"Exynos 7 Octa 7420"
|
||||
},
|
||||
"pro7plus":{
|
||||
"CPU":"2x Cortex-A73 @ 2.6GHz 4x Cortex-A53 @ 2.2GHz 4x Cortex-A35 @ 1.9GHz",
|
||||
"SoC":"MediaTek Helio X30 MT6799"
|
||||
},
|
||||
"pxa986":{
|
||||
"CPU":"2x Cortex-A9 @ 1.2GHz",
|
||||
"SoC":"Marvell PXA988"
|
||||
},
|
||||
"pxa19xx":{
|
||||
"CPU":"4x Cortex-A53 @ 1.25GHz",
|
||||
"SoC":"Maxvell Armada PXA1908"
|
||||
},
|
||||
"rhea_ss_corsicass":{
|
||||
"CPU":"1x Cortex-A9 @ 0.9GHz",
|
||||
"SoC":"Broadcom BCM21654"
|
||||
},
|
||||
"panther":{
|
||||
"CPU":"1x Cortex-X1 @ 2.8GHz 2x Cortex-A78 @ 2.3GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Google Tensor G2"
|
||||
},
|
||||
"prada":{
|
||||
"CPU":"4x Cortex-A53 @ 1.4 GHz 4x Cortex-A53 @ 1.1GHz",
|
||||
"SoC":"Snapdragon 430 MSM8937"
|
||||
},
|
||||
"pro6plus":{
|
||||
"CPU":"4x Exynos M1 @ 1.97GHz 4x Cortex-A53 @ 1.48GHz",
|
||||
"SoC":"Exynos 8 Octa 8890"
|
||||
},
|
||||
"universal3110":{
|
||||
"CPU":"1x Cortex-A8 @ 1.2GHz",
|
||||
"SoC":"Exynos 3 Single 3110"
|
||||
},
|
||||
"universal9820":{
|
||||
"CPU":"2x Exynos M4 @ 2.7GHz 2x Cortex-A75 @ 2.3GHz 4x Cortex-A55 @ 1.95GHz",
|
||||
"SoC":"Exynos 9 9820"
|
||||
},
|
||||
"redfin":{
|
||||
"CPU":"2x Kryo 475 Gold @ 2.4GHz 2x Kryo 475 Gold 2.2GHz 6x Kryo 475 Silver @ 1.8GHz ",
|
||||
"SoC":"Snapdragon 765/765G"
|
||||
},
|
||||
"s5e9925":{
|
||||
"CPU":"1x Cortex-X2 @ 2.8GHZ 3x Cortex-A710 @ 2.5GHz 4x Cortex-A510 @ 1.8GHz",
|
||||
"SoC":"Exynos 2200"
|
||||
},
|
||||
"saturn":{
|
||||
"CPU":"4x Krait 450 @ 2.45GHz",
|
||||
"SoC":"Snapdragon 805 APQ8084"
|
||||
},
|
||||
"sailfish":{
|
||||
"CPU":"2x Kryo HP @ 2.15GHz 2x Kryo @ 1.6GHz",
|
||||
"SoC":"Snapdragon 821 MSM8996 Pro"
|
||||
},
|
||||
"sdm660":{
|
||||
"CPU":"4x Kryo 260 HP @ 2.2GHz 4x Kryo 260 LP @ 1.8GHz",
|
||||
"SoC":"Snapdragon 660"
|
||||
},
|
||||
"sc-02b":{
|
||||
"CPU":"1x Cortex-A8 @ 1.2GHz",
|
||||
"SoC":"Exynos 3 Single 3110"
|
||||
},
|
||||
"sch-i905":{
|
||||
"CPU":"2x Cortex-A9 @ 1.0GHz",
|
||||
"SoC":"nVIDIA Tegra 2 T20"
|
||||
},
|
||||
"sc7730s":{
|
||||
"CPU":"4x Cortex-A7 @ 1.3GHz",
|
||||
"SoC":"Spreadtrum SC7730S"
|
||||
},
|
||||
"shamu":{
|
||||
"CPU":"4x Krai 450 @ 2.65GHz",
|
||||
"SoC":"Snapdragon 805 APQ8084AB"
|
||||
},
|
||||
"shiba":{
|
||||
"CPU":"1x Cortex-X3 @ 2.9GHz 4x Cortex-A715 @ 2.3GHz 4x Cortex-A510 @ 1.7GHz",
|
||||
"SoC":"Google Tensor G3 (GS301)"
|
||||
},
|
||||
"sm6150":{
|
||||
"CPU":"2x Kryo 460 Gold @ 2GHz 6x 460 Kryo Silver @ 1.7GHz",
|
||||
"SoC":"Snapdragon 675 SM6150"
|
||||
},
|
||||
"smdkc110":{
|
||||
"CPU":"1x Cortex-A8 @ 1.2GHz",
|
||||
"SoC":"Exynos 3 Single 3110"
|
||||
},
|
||||
"sun":{
|
||||
"CPU":"2x Oryon @ 4.5GHz 6x Oryon @ 3.5GHz",
|
||||
"SoC":"Snapdragon 9 Elite (SM8750)"
|
||||
},
|
||||
"ums512_25c10": {
|
||||
"CPU":"2 Cortex-A75 @2GHz 6x Cortex-A55 @ 2 GHz",
|
||||
"SoC":"Unisoc Tiger T618"
|
||||
},
|
||||
"universal3250":{
|
||||
"CPU":"2x Cortex-A7 @ 1.0GHz",
|
||||
"SoC":"Exynos 2 Dual 3250"
|
||||
},
|
||||
"universal3470":{
|
||||
"CPU":"4x Cortex-A7 @ 1.4GHz",
|
||||
"SoC":"Exynos 3 Quad 3470"
|
||||
},
|
||||
"universal3475":{
|
||||
"CPU":"4x Cortex-A7 @ 1.3GHz",
|
||||
"SoC":"Exynos 3 Quad 3475"
|
||||
},
|
||||
"universal4210":{
|
||||
"CPU":"2x Cortex-A9 @ 1.4GHz",
|
||||
"SoC":"Exynos 4 Dual 4210"
|
||||
},
|
||||
"universal4212":{
|
||||
"CPU":"2x Cortex-A9 @ 1.5GHz",
|
||||
"SoC":"Exynos 4 Dual 4212"
|
||||
},
|
||||
"universal4412":{
|
||||
"CPU":"4x Cortex-A9 @ 1.4GHz",
|
||||
"SoC":"Exynos 4 Quad 4412"
|
||||
},
|
||||
"smdk4x12":{
|
||||
"CPU":"4x Cortex-A9 @ 1.4GHz",
|
||||
"SoC":"Exynos 4 Quad 4412"
|
||||
},
|
||||
"universal4415":{
|
||||
"CPU":"4x Cortex-A9 @ 1.5GHz",
|
||||
"SoC":"Exynos 4 Quad 4415"
|
||||
},
|
||||
"universal5250":{
|
||||
"CPU":"2x Cortex-A15 @ 1.7GHz",
|
||||
"SoC":"Exynos 5 Dual 5250"
|
||||
},
|
||||
"universal5260":{
|
||||
"CPU":"2x Cortex-A15 @ 1.7GHz 4x Cortex-A7 @ 1.3GHz",
|
||||
"SoC":"Exynos 5 Hexa 5260"
|
||||
},
|
||||
"universal5410":{
|
||||
"CPU":"4x Cortex-A15 @ 1.6GHz 4x Cortex-A7 @ 1.2GHz",
|
||||
"SoC":"Exynos 5 Octa 5410"
|
||||
},
|
||||
"universal5420":{
|
||||
"CPU":"4x Cortex-A15 @ 1.9GHz 4x Cortex-A7 @ 1.3GHz",
|
||||
"SoC":"Exynos 5 Octa 5420"
|
||||
},
|
||||
"universal5422":{
|
||||
"CPU":"4x Cortex-A15 @ 2.1GHz 4x Cortex-A7 @ 1.5GHz",
|
||||
"SoC":"Exynos 5 Octa 5422"
|
||||
},
|
||||
"universal5430":{
|
||||
"CPU":"4x Cortex-A15 @ 1.8GHz 4x Cortex-A7 @ 1.3GHz",
|
||||
"SoC":"Exynos 5 Octa 5430"
|
||||
},
|
||||
"universal5800":{
|
||||
"CPU":"4x Cortex-A15 @ 2.0GHz 4x Cortex-A7 @ 1.3GHz",
|
||||
"SoC":"Exynos 5 Octa 5800"
|
||||
},
|
||||
"universal5433":{
|
||||
"CPU":"4x Cortex-A57 @ 1.9GHz 4x Cortex-A53 @ 1.3GHz",
|
||||
"SoC":"Exynos 7 Octa 5433"
|
||||
},
|
||||
"universal7420":{
|
||||
"CPU":"4x Cortex-A57 @ 2.1GHz 4x Cortex-A53 @ 1.5GHz",
|
||||
"SoC":"Exynos 7 Octa 7420"
|
||||
},
|
||||
"universal7570":{
|
||||
"CPU":"8x Cortex-A53 @ 1.4GHz",
|
||||
"SoC":"Exynos 7 Quad 7570"
|
||||
},
|
||||
"universal7580":{
|
||||
"CPU":"8x Cortex-A53 @ 1.6GHz",
|
||||
"SoC":"Exynos 7 Octa 7580"
|
||||
},
|
||||
"universal7870":{
|
||||
"CPU":"8x Cortex-A53 @ 1.6GHz",
|
||||
"SoC":"Exynos 7 Octa 7870"
|
||||
},
|
||||
"universal7880":{
|
||||
"CPU":"8x Cortex-A53 @ 1.9GHz",
|
||||
"SoC":"Exynos 7 Octa 7880"
|
||||
},
|
||||
"universal7872":{
|
||||
"CPU":"2x Cortex-A73 @ 2.0GHz 4x Cortex-A53 @ 1.6GHz",
|
||||
"SoC":"Exynos 7 Hexa 7872"
|
||||
},
|
||||
"universal7885":{
|
||||
"CPU":"2x Cortex-A73 @ 2.2GHz 6x Cortex-A53 @ 1.6GHz",
|
||||
"SoC":"Exynos 7 Octa 7885"
|
||||
},
|
||||
"universal8890":{
|
||||
"CPU":"4x Cortex-A53 @ 1.6GHz 4x Samsung Exynos M1 @ 2.6GHz",
|
||||
"SoC":"Exynos 8 Octa 8890"
|
||||
},
|
||||
"universal8895":{
|
||||
"CPU":"4x Samsung Exynos M1 @ 2.3GHz 4x Cortex-A53 @ 1.6GHz",
|
||||
"SoC":"Exynos 9 Octa 8895"
|
||||
},
|
||||
"universal9810":{
|
||||
"CPU":"4x Samsung Exynos M3 @ 2.8GHz 4x Cortex-A55 @ 1.7GHz",
|
||||
"SoC":"Exynos 9 Series 9810"
|
||||
},
|
||||
"universal9825":{
|
||||
"CPU":"2x Samsung Exynos M4 @ 2.7GHz 2x Cortex-A75 @ 2.4GHz 4x Cortex-A55 @ 1.9GHz",
|
||||
"SoC":"Exynos 9 Series 9825"
|
||||
},
|
||||
"ville":{
|
||||
"CPU":"2x Krait @ 1.5GHz",
|
||||
"SoC":"Snapdragon S4 MSM8290"
|
||||
},
|
||||
"vog":{
|
||||
"CPU":"2x Cortex-A76 @ 2.6GHz 2x Cortex-A76 @ 1.9GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"HiSilicon Kirin 980"
|
||||
},
|
||||
"venus":{
|
||||
"CPU":"1x Cortex-X1 @ 2.8GHz 3x Cortex-A78 @ 2.4GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Snapdragon 888 SM8350"
|
||||
},
|
||||
"vtr":{
|
||||
"CPU":"4x Cortex-A73 @ 2.4GHz 4x Cortex-A53 @ 1.8GHz",
|
||||
"SoC":"HiSilicon Kirin 960"
|
||||
},
|
||||
"taimen":{
|
||||
"CPU":"4x Kryo 280 HP @ 2.45GHz 4x Kryo 280 LP @ 1.9GHz",
|
||||
"SoC":"Snapdragon 835 MSM8998"
|
||||
},
|
||||
"tn8":{
|
||||
"CPU":"4x Cortex-A15 @2.2GHz",
|
||||
"SoC":"nVIDIA Tegra K1 T124"
|
||||
},
|
||||
"taro":{
|
||||
"CPU":"1x Cortex-X2 @ 3GHz 3x Cortex-A710 @ 2.5GHz 4x Cortex-A510 @ 1.8GHz",
|
||||
"SoC":"Snapdragon 8 Gen 1 (SM8450)"
|
||||
},
|
||||
"thebes":{
|
||||
"CPU":"2x Cortex-A15 @ 1.5GHz 2x Cortex-A7 @ 1.2GHz",
|
||||
"SoC":"MediaTek MT8135"
|
||||
},
|
||||
"trinket":{
|
||||
"CPU":"4x Kryo 260 HP @ 2GHz 4x Kryo 260 LP @ 1.8GHz",
|
||||
"SoC":"Snapdragon 665 SM6125"
|
||||
},
|
||||
"tuna":{
|
||||
"CPU":"2x Cortex-A9 @ 1.2GHz",
|
||||
"SoC":"TI OMAP 4460"
|
||||
},
|
||||
"vu2kt":{
|
||||
"CPU":"2x Krait @ 1.5GHz",
|
||||
"SoC":"Snapdragon S4 Plus MSM8960"
|
||||
},
|
||||
"walleye":{
|
||||
"CPU":"4x Kryo 280 HP @ 2.45GHz 4x Kryo 280 LP @ 1.9GHz",
|
||||
"SoC":"Snapdragon 835 MSM8998"
|
||||
},
|
||||
"wikipad":{
|
||||
"CPU":"4x Cortex-A9 @ 1.3GHz 1x Cortex-A9 @ 0.5GHz",
|
||||
"SoC":"nVIDIA Tegra 3 T30L"
|
||||
},
|
||||
"qc_reference_phone":{
|
||||
"CPU":"2x Kryo HP @ 2.15GHz 2x Kryo LP @ 1.36GHz",
|
||||
"SoC":"Snapdragon 820 MSM8996"
|
||||
},
|
||||
"z4u":{
|
||||
"CPU":"4x Cortex-A5 @ 1.2GHz",
|
||||
"SoC":"Snapdragon 200 MSM8225Q"
|
||||
},
|
||||
"zs600kl":{
|
||||
"CPU":"4x Kryo 385 Gold @ 3GHz 4x Kryo 385 Silver @ 1.8GHz",
|
||||
"SoC":"Snapdragon 845"
|
||||
},
|
||||
"mt6765v":{
|
||||
"CPU":"4x Cortex-A53 @ 2.3GHz 4x Cortex-A53 @ 1.8GHz",
|
||||
"SoC":"Mediatek MT6765G Helio G35 (12 nm)"
|
||||
},
|
||||
"k65v1_64_bsp_titan_rat":{
|
||||
"CPU":"4x Cortex-A53 @ 2.3GHz 4x Cortex-A53 @ 1.8GHz",
|
||||
"SoC":"Mediatek MT6765 Helio P35 (12nm)"
|
||||
},
|
||||
"careena":{
|
||||
"CPU":"AMD 670F00h",
|
||||
"SoC":"AMD A4-9120C RADEON R4, 5 COMPUTE CORES 2C+3G"
|
||||
},
|
||||
"sion":{
|
||||
"CPU":"i3-8130U CPU 2.2GHz SoC",
|
||||
"SoC":"i3-8130U CPU 2,2 GHz soc"
|
||||
},
|
||||
"biloba":{
|
||||
"CPU":"2x Cortex-A75 @ 2.0GHz 6x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Mediatek MT6769Z Helio G85 (12nm)"
|
||||
},
|
||||
"ele":{
|
||||
"CPU":"2x Cortex-A76 @ 2.6GHz 2x Cortex-A76 @ 1.9GHz 4x Cortex-A55 @ 1.8GHz",
|
||||
"SoC":"Kirin 980 (7 nm)"
|
||||
},
|
||||
"krane":{
|
||||
"CPU":"4x Cortex-A73 @ 2.0GHz + 4x Cortex-A53 @ 2.0GHz",
|
||||
"SoC":"MediaTekHelio P60T (12nm)"
|
||||
},
|
||||
"pineapple":{
|
||||
"CPU":"1x Cortex-X4 @ 3.3GHz 3x Cortex-A720 @ 3.2GHz 2x Cortex-A720 @ 2.6GHz 4x Cortex-A520 @ 2.3GHz",
|
||||
"SoC":"Qualcomm SM8650-AB Snapdragon 8 Gen 3"
|
||||
},
|
||||
"s5e9945":{
|
||||
"CPU":"1x Cortex-X4 @ 3.2GHz 2x Cortex-A720 @ 2.9GHz 3x Cortex-A720 @ 2.6GHz 4x Cortex-A520 @ 2.0GHz",
|
||||
"SoC":"Exynos 2400"
|
||||
},
|
||||
"a12":{
|
||||
"CPU":"4x Cortex-A53 @ 2.35GHz 4x Cortex-A53 @ 1.8GHz",
|
||||
"SoC":"MediaTek Helio P35 (MT6765)"
|
||||
}
|
||||
}
|
||||
@@ -67,10 +67,12 @@ import forge.util.ThreadUtil;
|
||||
import io.sentry.protocol.Device;
|
||||
import io.sentry.protocol.OperatingSystem;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
import org.json.JSONObject;
|
||||
import org.jupnp.DefaultUpnpServiceConfiguration;
|
||||
import org.jupnp.android.AndroidUpnpServiceConfiguration;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
|
||||
@@ -188,7 +190,26 @@ public class Main extends AndroidApplication {
|
||||
|
||||
boolean permissiongranted = checkPermission();
|
||||
Gadapter = new AndroidAdapter(getContext());
|
||||
|
||||
String cpu = "";
|
||||
String soc = "";
|
||||
boolean getChipset = false;
|
||||
// database.json source: https://github.com/xTheEc0/Android-Device-Hardware-Specs-Database
|
||||
try {
|
||||
InputStream is = getAssets().open("database.json");
|
||||
int size = is.available();
|
||||
byte[] buffer = new byte[size];
|
||||
is.read(buffer);
|
||||
is.close();
|
||||
JSONObject db = new JSONObject(new String(buffer, StandardCharsets.UTF_8));
|
||||
JSONObject board = db.getJSONObject(Build.BOARD);
|
||||
cpu = board.get("CPU").toString();
|
||||
soc = board.get("SoC").toString();
|
||||
getChipset = true;
|
||||
} catch (Exception e) {
|
||||
cpu = getCpuName();
|
||||
soc = Build.BOARD;
|
||||
getChipset = false;
|
||||
}
|
||||
// Device Info
|
||||
Device device = new Device();
|
||||
device.setId(Build.ID);
|
||||
@@ -197,8 +218,8 @@ public class Main extends AndroidApplication {
|
||||
device.setBrand(Build.BRAND);
|
||||
device.setManufacturer(Build.MANUFACTURER);
|
||||
device.setMemorySize(memInfo.totalMem);
|
||||
device.setCpuDescription(getCpuName());
|
||||
device.setChipset(Build.HARDWARE + " " + Build.BOARD);
|
||||
device.setCpuDescription(cpu);
|
||||
device.setChipset(soc);
|
||||
// OS Info
|
||||
OperatingSystem os = new OperatingSystem();
|
||||
os.setName("Android");
|
||||
@@ -206,7 +227,7 @@ public class Main extends AndroidApplication {
|
||||
os.setBuild(Build.DISPLAY);
|
||||
os.setRawDescription(getAndroidOSName());
|
||||
|
||||
initForge(Gadapter, new HWInfo(device, os), permissiongranted, totalMemory, isTabletDevice(getContext()));
|
||||
initForge(Gadapter, new HWInfo(device, os, getChipset), permissiongranted, totalMemory, isTabletDevice(getContext()));
|
||||
}
|
||||
|
||||
private void crossfade(View contentView, View previousView) {
|
||||
|
||||
@@ -51,7 +51,7 @@ public class GameLauncher {
|
||||
os.setBuild(si.getOperatingSystem().getVersionInfo().getBuildNumber());
|
||||
os.setRawDescription(si.getOperatingSystem() + " x" + si.getOperatingSystem().getBitness());
|
||||
totalRAM = Math.round(si.getHardware().getMemory().getTotal() / 1024f / 1024f);
|
||||
hw = new HWInfo(device, os);
|
||||
hw = new HWInfo(device, os, false);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
captureException(e, key, subData);
|
||||
}
|
||||
}
|
||||
@@ -33,6 +34,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -45,6 +47,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -57,6 +60,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -69,6 +73,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -81,6 +86,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -95,6 +101,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
stream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -107,6 +114,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
captureException(e, key, subData);
|
||||
}
|
||||
}
|
||||
@@ -119,6 +127,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
captureException(e, key, subData);
|
||||
}
|
||||
}
|
||||
@@ -132,6 +141,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -147,6 +157,7 @@ public class SaveFileData extends HashMap<String, byte[]> {
|
||||
objStream.flush();
|
||||
put(key, stream.toByteArray());
|
||||
} catch (IOException e) {
|
||||
put("IOException", e.toString().getBytes());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,53 +26,50 @@ import java.util.zip.InflaterInputStream;
|
||||
/**
|
||||
* Represents everything that will be saved, like the player and the world.
|
||||
*/
|
||||
public class WorldSave {
|
||||
public class WorldSave {
|
||||
|
||||
static final public int AUTO_SAVE_SLOT =-1;
|
||||
static final public int QUICK_SAVE_SLOT =-2;
|
||||
static final public int INVALID_SAVE_SLOT =-3;
|
||||
static final WorldSave currentSave=new WorldSave();
|
||||
static final public int AUTO_SAVE_SLOT = -1;
|
||||
static final public int QUICK_SAVE_SLOT = -2;
|
||||
static final public int INVALID_SAVE_SLOT = -3;
|
||||
static final WorldSave currentSave = new WorldSave();
|
||||
public WorldSaveHeader header = new WorldSaveHeader();
|
||||
private final AdventurePlayer player=new AdventurePlayer();
|
||||
private final World world=new World();
|
||||
private final PointOfInterestChanges.Map pointOfInterestChanges= new PointOfInterestChanges.Map();
|
||||
private final AdventurePlayer player = new AdventurePlayer();
|
||||
private final World world = new World();
|
||||
private final PointOfInterestChanges.Map pointOfInterestChanges = new PointOfInterestChanges.Map();
|
||||
|
||||
|
||||
private final SignalList onLoadList=new SignalList();
|
||||
private final SignalList onLoadList = new SignalList();
|
||||
|
||||
public final World getWorld()
|
||||
{
|
||||
public final World getWorld() {
|
||||
return world;
|
||||
}
|
||||
public AdventurePlayer getPlayer()
|
||||
{
|
||||
|
||||
public AdventurePlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public void onLoad(Runnable run)
|
||||
{
|
||||
public void onLoad(Runnable run) {
|
||||
onLoadList.add(run);
|
||||
}
|
||||
public PointOfInterestChanges getPointOfInterestChanges(String id)
|
||||
{
|
||||
if(!pointOfInterestChanges.containsKey(id))
|
||||
pointOfInterestChanges.put(id,new PointOfInterestChanges());
|
||||
|
||||
public PointOfInterestChanges getPointOfInterestChanges(String id) {
|
||||
if (!pointOfInterestChanges.containsKey(id))
|
||||
pointOfInterestChanges.put(id, new PointOfInterestChanges());
|
||||
return pointOfInterestChanges.get(id);
|
||||
}
|
||||
|
||||
static public boolean load(int currentSlot) {
|
||||
|
||||
String fileName = WorldSave.getSaveFile(currentSlot);
|
||||
if(!new File(fileName).exists())
|
||||
if (!new File(fileName).exists())
|
||||
return false;
|
||||
new File(getSaveDir()).mkdirs();
|
||||
try {
|
||||
try(FileInputStream fos = new FileInputStream(fileName);
|
||||
InflaterInputStream inf = new InflaterInputStream(fos);
|
||||
ObjectInputStream oos = new ObjectInputStream(inf))
|
||||
{
|
||||
try (FileInputStream fos = new FileInputStream(fileName);
|
||||
InflaterInputStream inf = new InflaterInputStream(fos);
|
||||
ObjectInputStream oos = new ObjectInputStream(inf)) {
|
||||
currentSave.header = (WorldSaveHeader) oos.readObject();
|
||||
SaveFileData mainData=(SaveFileData)oos.readObject();
|
||||
SaveFileData mainData = (SaveFileData) oos.readObject();
|
||||
currentSave.player.load(mainData.readSubData("player"));
|
||||
GamePlayerUtil.getGuiPlayer().setName(currentSave.player.getName());
|
||||
try {
|
||||
@@ -95,9 +92,11 @@ public class WorldSave {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean isSafeFile(String name) {
|
||||
return filenameToSlot(name)!= INVALID_SAVE_SLOT;
|
||||
return filenameToSlot(name) != INVALID_SAVE_SLOT;
|
||||
}
|
||||
|
||||
static public int filenameToSlot(String name) {
|
||||
if (name.equals("auto_save.sav"))
|
||||
return AUTO_SAVE_SLOT;
|
||||
@@ -131,10 +130,10 @@ public class WorldSave {
|
||||
public static WorldSave generateNewWorld(String name, boolean male, int race, int avatarIndex, ColorSet startingColorIdentity, DifficultyData diff, AdventureModes mode, int customDeckIndex, CardEdition starterEdition, long seed) {
|
||||
currentSave.world.generateNew(seed);
|
||||
currentSave.pointOfInterestChanges.clear();
|
||||
boolean chaos=mode==AdventureModes.Chaos;
|
||||
boolean custom=mode==AdventureModes.Custom;
|
||||
Deck starterDeck = Config.instance().starterDeck(startingColorIdentity,diff,mode,customDeckIndex,starterEdition);
|
||||
currentSave.player.create(name, starterDeck, male, race, avatarIndex, chaos, custom, diff);
|
||||
boolean chaos = mode == AdventureModes.Chaos;
|
||||
boolean custom = mode == AdventureModes.Custom;
|
||||
Deck starterDeck = Config.instance().starterDeck(startingColorIdentity, diff, mode, customDeckIndex, starterEdition);
|
||||
currentSave.player.create(name, starterDeck, male, race, avatarIndex, chaos, custom, diff);
|
||||
currentSave.player.setWorldPosY((int) (currentSave.world.getData().playerStartPosY * currentSave.world.getData().height * currentSave.world.getTileSize()));
|
||||
currentSave.player.setWorldPosX((int) (currentSave.world.getData().playerStartPosX * currentSave.world.getData().width * currentSave.world.getTileSize()));
|
||||
currentSave.onLoadList.emit();
|
||||
@@ -142,46 +141,103 @@ public class WorldSave {
|
||||
}
|
||||
|
||||
public boolean autoSave() {
|
||||
return save("auto save"+ SaveLoadScene.instance().getSaveFileSuffix(),AUTO_SAVE_SLOT);
|
||||
return save("auto save" + SaveLoadScene.instance().getSaveFileSuffix(), AUTO_SAVE_SLOT);
|
||||
}
|
||||
|
||||
public boolean quickSave() {
|
||||
return save("quick save"+ SaveLoadScene.instance().getSaveFileSuffix(),QUICK_SAVE_SLOT);
|
||||
return save("quick save" + SaveLoadScene.instance().getSaveFileSuffix(), QUICK_SAVE_SLOT);
|
||||
}
|
||||
|
||||
public boolean quickLoad() {
|
||||
return load(QUICK_SAVE_SLOT);
|
||||
}
|
||||
|
||||
public boolean save(String text, int currentSlot) {
|
||||
header.name = text;
|
||||
|
||||
String fileName = WorldSave.getSaveFile(currentSlot);
|
||||
String oldFileName = fileName.replace(".sav", ".old");
|
||||
new File(getSaveDir()).mkdirs();
|
||||
File currentFile = new File(fileName);
|
||||
File backupFile = new File(oldFileName);
|
||||
if (currentFile.exists())
|
||||
currentFile.renameTo(backupFile);
|
||||
|
||||
try {
|
||||
try(FileOutputStream fos = new FileOutputStream(fileName);
|
||||
DeflaterOutputStream def= new DeflaterOutputStream(fos);
|
||||
ObjectOutputStream oos = new ObjectOutputStream(def))
|
||||
{
|
||||
header.saveDate= new Date();
|
||||
oos.writeObject(header);
|
||||
SaveFileData mainData=new SaveFileData();
|
||||
mainData.store("player",currentSave.player.save());
|
||||
mainData.store("world",currentSave.world.save());
|
||||
mainData.store("worldStage", WorldStage.getInstance().save());
|
||||
mainData.store("pointOfInterestChanges",currentSave.pointOfInterestChanges.save());
|
||||
try (FileOutputStream fos = new FileOutputStream(fileName);
|
||||
DeflaterOutputStream def = new DeflaterOutputStream(fos);
|
||||
ObjectOutputStream oos = new ObjectOutputStream(def)) {
|
||||
SaveFileData player = currentSave.player.save();
|
||||
SaveFileData world = currentSave.world.save();
|
||||
SaveFileData worldStage = WorldStage.getInstance().save();
|
||||
SaveFileData poiChanges = currentSave.pointOfInterestChanges.save();
|
||||
|
||||
String message = getExceptionMessage(player, world, worldStage, poiChanges);
|
||||
if (!message.isEmpty()) {
|
||||
oos.close();
|
||||
fos.close();
|
||||
restoreBackup(oldFileName, fileName);
|
||||
announceError(message);
|
||||
return true;
|
||||
}
|
||||
|
||||
SaveFileData mainData = new SaveFileData();
|
||||
mainData.store("player", player);
|
||||
mainData.store("world", world);
|
||||
mainData.store("worldStage", worldStage);
|
||||
mainData.store("pointOfInterestChanges", poiChanges);
|
||||
|
||||
if (mainData.readString("IOException") != null) {
|
||||
oos.close();
|
||||
fos.close();
|
||||
restoreBackup(oldFileName, fileName);
|
||||
announceError("Please check forge.log for errors.");
|
||||
return true;
|
||||
}
|
||||
|
||||
header.saveDate = new Date();
|
||||
oos.writeObject(header);
|
||||
oos.writeObject(mainData);
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
restoreBackup(oldFileName, fileName);
|
||||
announceError("Please check forge.log for errors.");
|
||||
return true;
|
||||
}
|
||||
|
||||
Config.instance().getSettingData().lastActiveSave = WorldSave.filename(currentSlot);
|
||||
Config.instance().saveSettings();
|
||||
if (backupFile.exists())
|
||||
backupFile.delete();
|
||||
return true;
|
||||
}
|
||||
|
||||
public void restoreBackup(String oldFilename, String currentFilename) {
|
||||
File f = new File(currentFilename);
|
||||
if (f.exists())
|
||||
f.delete();
|
||||
File b = new File(oldFilename);
|
||||
if (b.exists())
|
||||
b.renameTo(new File(currentFilename));
|
||||
}
|
||||
|
||||
public String getExceptionMessage(SaveFileData... datas) {
|
||||
StringBuilder message = new StringBuilder();
|
||||
|
||||
for (SaveFileData data : datas) {
|
||||
String s = data.readString("IOException");
|
||||
if (s != null)
|
||||
message.append(s).append("\n");
|
||||
}
|
||||
|
||||
return message.toString();
|
||||
}
|
||||
|
||||
private void announceError(String message) {
|
||||
currentSave.player.getCurrentGameStage().setExtraAnnouncement("Error Saving File!\n" + message);
|
||||
}
|
||||
|
||||
public void clearChanges() {
|
||||
pointOfInterestChanges.clear();
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Coal Hill School
|
||||
ManaCost:no cost
|
||||
Types:Plane Earth
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Historic | Execute$ TrigDraw | TriggerZones$ Command | TriggerDescription$ Whenever a player casts a historic spell, that player draws a card. (Artifacts, legendaries, and Sagas are historic.)
|
||||
SVar:TrigDraw:DB$ Draw | Defined$ TriggeredPlayer | NumCards$ 1
|
||||
SVar:TrigDraw:DB$ Draw | Defined$ TriggeredActivator | NumCards$ 1
|
||||
T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ TrigReturn | TriggerDescription$ Whenever chaos ensues, return target historic card from your graveyard to your hand.
|
||||
SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.Historic+YouOwn | TgtPrompt$ Select target historic card
|
||||
DeckHints:Type$Artifact|Saga|Legendary
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user