Compare commits

..

33 Commits

Author SHA1 Message Date
Chris H
9bf567a966 Migrate SPM (and some other early spoilers) 2025-09-10 19:01:19 -04:00
Hans Mackowiak
a0be5e25cb CardEdition: fix tokenCN with ☇ 2025-09-10 22:10:00 +02:00
Hans Mackowiak
f2e3cdc111 fix c_1_1_myr to c_1_1_a_myr 2025-09-10 22:02:38 +02:00
Hans Mackowiak
7384aada40 Update pictures_of_spider_man.txt 2025-09-10 06:34:11 +02:00
Eradev
1a8a4f63ae Update Recruit Instructor 2025-09-10 06:31:01 +02:00
Eradev
530d1efcd8 Fix tokens and some images ID (#8684)
* Fig hags ID

* Double sided tokens should now be supported

* Fix zombie ID
2025-09-10 06:30:15 +02:00
tool4ever
d8b1d76f42 Update silk_web_weaver.txt 2025-09-09 21:40:24 +00:00
kevlahnota
830b145e88 Merge pull request #8680 from kevlahnota/master4
update android hwinfo
2025-09-09 22:52:21 +08:00
Anthony Calosa
51ed06d60a update android hwinfo 2025-09-09 22:36:09 +08:00
Eradev
ac9b73935f Tokens cleanup (F-G sets) (#8049)
* Update FEM

* Update PIP

* Update FRF

* Update 5DN

* Update 5ED

* Update FDN

* Update 4ED

* Update F12

* Update V15

* Update V14

* Update DRB

* Update V11

* Update V16

* Update V12

* Update V10

* Update V17

* Update FUT

* Update F17

* Update GDY

* Update GNT

* Update GN2

* Update GTC

* Update GS1

* Update PGPX

* Update GPT

* Update GK1

* Update GRN

* Update GK1

* Added old numbers back for now.

* Rename Fallout set
2025-09-09 13:35:19 +02:00
Eradev
fe2f49fbcc Tokens cleanup (D-E sets) (#8046)
* Update DKA

* Update DST

* Update DIS

* Update WHO

* Update DMR

* Update DMU

* Update DOM

* Update 2X2

* Update 2XM

* Update DGM

* Update DTK

* Update DS0

* Update DDQ

* Update DDC

* Update DDO

* Update DDU

* Update DDT

* Update DDS

* Update TD2

* Update DDN

* Update DDP

* Update DPA

* Update AFR

* Update DSC

* Update P8ED

* Update 8ED

* Update EMN

* Update EMA

* Update EVE

* Update EXO

* Update E02

* Fixed emblem name

* Add u_2_1_a_myr back

* Add b_0_0_germ back

* Update NPH
2025-09-09 13:24:40 +02:00
Eradev
3d31494a1b Tokens cleanup (N-P sets) (#8056)
* Update NMS

* Update NPH

* Update 9ED

* Update OGW

* Update ODY

* Update ONS

* Update PHEL

* Update OTJ

* Update ONE

* Update PLC

* Update PC2

* Re-add planes

* Update HOP

* Update PLS

* Update PCA

* Update PWCS

* Update PCY

* Update PD3
2025-09-09 13:15:57 +02:00
Eradev
ff42e730a2 Tokens cleanup (R-S sets) (#8138)
* Update SOK

* Update SCG

* Update ALA

* Update SOM

* Update SHM

* Update SOI

* Update SCD

* Update SNC

* Update STX

* Update STH

* Update PSVC

* Update RNA

* Update RAV

* Update RTR

* Update REV

* Update ROE

* Update PRIX

* Update RIX

* Fix RNA
2025-09-09 13:00:12 +02:00
Paul Hammerton
a66fb8791c Merge pull request #8678 from paulsnoops/sld-update
Edition updates: OM1, SLD
2025-09-09 10:49:43 +01:00
Paul Hammerton
2ad5d20e83 Edition updates: OM1, SLD 2025-09-09 10:45:32 +01:00
Hans Mackowiak
4790394698 Update miles_morales_ultimate_spider_man.txt
Fix typo
2025-09-09 08:42:16 +02:00
Eradev
8b1c427809 Fix crash when equipping 2025-09-09 05:42:46 +02:00
tool4ever
c0b667c373 Some clean up (#8673) 2025-09-08 20:40:03 +00:00
kevlahnota
ca61627f5b Merge pull request #8671 from kevlahnota/master4
restore backup save for errors
2025-09-08 19:28:52 +08:00
Anthony Calosa
c3e2a5b5ea update 2025-09-08 19:23:58 +08:00
Anthony Calosa
0d26b499d3 restore backup save for errors 2025-09-08 19:17:51 +08:00
kevlahnota
bbbc5e0ee6 Merge pull request #8669 from kevlahnota/master4
return extra info for save errors
2025-09-08 15:46:43 +08:00
Anthony Calosa
714d9442f1 return extra info for save errors 2025-09-08 15:41:16 +08:00
tool4ever
d199765e6d Update coal_hill_school.txt 2025-09-08 08:47:27 +02:00
kevlahnota
e5156d8999 Merge pull request #8668 from kevlahnota/master4
revert save read
2025-09-08 14:34:46 +08:00
Anthony Calosa
c0d5397541 revert save read
- todo find a better way to inform player with save error
2025-09-08 14:34:10 +08:00
kevlahnota
444897d0f9 Update lizard_connorss_curse.txt 2025-09-08 14:20:43 +08:00
kevlahnota
f2cb7956d3 Merge pull request #8667 from kevlahnota/master4
announce savefile error
2025-09-08 12:10:10 +08:00
Anthony Calosa
e0c2a49c6b don't write data with errors 2025-09-08 12:06:23 +08:00
Anthony Calosa
d64e5ebc13 announce savefile error 2025-09-08 12:01:32 +08:00
xanxer6rB
9bea1bc717 Update the_reaver_cleaver.txt (#8661) 2025-09-07 12:43:19 +00:00
Hans Mackowiak
bdf9573467 CantTarget: fix AffectedZone not for Players 2025-09-07 11:25:35 +02:00
Hans Mackowiak
042eb4bf79 CantTarget: return the StaticAbility 2025-09-07 10:35:05 +02:00
459 changed files with 1383 additions and 549 deletions

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -83,6 +83,8 @@ public class StaticAbilityCantTarget {
return false;
}
}
} else if (stAb.hasParam("AffectedZone")) {
return false;
}
final Card source = spellAbility.getHostCard();

View File

@@ -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;

View 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)"
}
}

View File

@@ -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) {

View File

@@ -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();
}

View File

@@ -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();
}
}

View File

@@ -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();
}

View File

@@ -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